# Arketa Developer Docs

> Arketa for developers and AI agents: the Partner API for studio data, the website content API (REST, GraphQL, markdown mirrors, llms.txt), the OpenAPI spec, the MCP server, and rate limits.

Canonical: https://www.arketa.com/developers

---

## Overview

Arketa is booking, payments and marketing software for fitness and wellness businesses. There are two programmatic surfaces: the **Partner API**, which gives a studio access to its own data (locations, classes, clients, reservations, purchases), and the **website content API**, which exposes everything published on this marketing site in machine-readable form for AI agents, crawlers and integrations.

| Resource | URL |
| --- | --- |
| OpenAPI 3.1 spec (both surfaces) | [https://www.arketa.com/openapi.json](https://www.arketa.com/openapi.json) |
| OpenAPI spec, YAML | [https://www.arketa.com/api/openapi.yaml](https://www.arketa.com/api/openapi.yaml) |
| API catalog (RFC 9727) | [https://www.arketa.com/.well-known/api-catalog](https://www.arketa.com/.well-known/api-catalog) |
| llms.txt | [https://www.arketa.com/llms.txt](https://www.arketa.com/llms.txt) |
| llms-full.txt | [https://www.arketa.com/llms-full.txt](https://www.arketa.com/llms-full.txt) |
| Partner API reference (Swagger UI) | [https://sutrafitness.github.io/api-docs/](https://sutrafitness.github.io/api-docs/) |
| Sitemap | [https://www.arketa.com/sitemap.xml](https://www.arketa.com/sitemap.xml) |
| Blog RSS feed | [https://www.arketa.com/blog/feed.xml](https://www.arketa.com/blog/feed.xml) |

## Partner API (studio data)

The Partner API is a REST API for reading and managing a studio's own Arketa data: locations, rooms, classes, clients, purchases, referrals and reservations (including creating reservations and checking clients in). Base URL: `https://us-central1-sutra-prod.cloudfunctions.net/partnerApi/v0`. Every path is scoped by your partner ID.

Authentication is by API key, sent as `Authorization: Bearer {api_key}` or `X-API-Key: {api_key}`. Studio owners generate a key in the Arketa dashboard under Settings → Integrations → Generate API Key. Treat it like a password; there is no public, unauthenticated access to studio data.

```bash
curl -H "Authorization: Bearer $ARKETA_API_KEY" \
  "https://us-central1-sutra-prod.cloudfunctions.net/partnerApi/v0/{partnerId}/classes?limit=10"
```

List endpoints use cursor-based pagination and date-range filters. The full reference, with request and response schemas for every operation, is the Swagger UI at [https://sutrafitness.github.io/api-docs/](https://sutrafitness.github.io/api-docs/); the same operations are included in [https://www.arketa.com/openapi.json](https://www.arketa.com/openapi.json) under the `Partner API` tag. Partner API requests are rate limited; back off on HTTP 429.

## Markdown mirrors and content negotiation

Every public page on this site is available as clean markdown — the prose without layout, navigation or scripts. There are two ways to get it:

- Append `.md` to any page URL: `https://www.arketa.com/pricing.md`, `https://www.arketa.com/features/branded-mobile-app.md`, `https://www.arketa.com/blog/{slug}.md`. The homepage is `https://www.arketa.com/index.md`.
- Send `Accept: text/markdown` to the normal URL. The response is `Content-Type: text/markdown; charset=utf-8` with `Vary: Accept`; the same URL keeps serving HTML to browsers (`Accept: text/html`).

```bash
curl -H "Accept: text/markdown" https://www.arketa.com/
curl https://www.arketa.com/pricing.md
```

Each markdown document starts with the page title, its meta description as a blockquote, and a `Canonical:` line pointing at the HTML page. A request for a page that does not exist returns HTTP 404 with a short markdown body linking back to the sitemap and llms.txt, so an agent can recover without parsing HTML.

## llms.txt

[https://www.arketa.com/llms.txt](https://www.arketa.com/llms.txt) is the index for language models: a one-paragraph summary, guidance on when Arketa is the right tool, and a categorised list of every page with its description, each linking to the markdown mirror. [https://www.arketa.com/llms-full.txt](https://www.arketa.com/llms-full.txt) concatenates the whole site into one markdown document for agents that want everything in a single fetch. Both regenerate within an hour of a CMS change.

## Website content API (REST)

Published pages and blog posts are also available as JSON. No authentication is needed for published content; drafts are never returned to anonymous requests. Base URL: `https://www.arketa.com/api`.

| Endpoint | Description |
| --- | --- |
| `GET /api/blog/posts` | Paginated published blog posts. Query: `page`, `limit` (max 50), `category` (slug), `search`. |
| `GET /api/blog-posts` | Blog posts with full query support (`where`, `sort`, `limit`, `page`, `depth`, `select`). |
| `GET /api/blog-posts/{id}` | One blog post by id. |
| `GET /api/pages` | CMS pages: title, slug, parent, meta and the ordered `sections` that make up the page. |
| `GET /api/pages/{id}` | One page by id. |
| `GET /api/blog-categories` | Blog categories. |
| `GET /api/authors` | Blog authors. |

The collection endpoints accept the Payload CMS query syntax: `where[field][operator]=value` (operators `equals`, `not_equals`, `in`, `contains`, `like`, `exists`, `greater_than`, `less_than`), `sort=-publishedDate`, `limit`, `page`, `depth` (how deep to populate relationships, `0` for ids only) and `select[field]=true`. Responses are paginated: `docs`, `totalDocs`, `page`, `totalPages`, `hasNextPage`, `hasPrevPage`.

```bash
# Latest three blog posts, titles and slugs only
curl "https://www.arketa.com/api/blog-posts?sort=-publishedDate&limit=3&depth=0&select[title]=true&select[slug]=true"

# Find the pricing page
curl "https://www.arketa.com/api/pages?where[slug][equals]=pricing&depth=0"
```

## GraphQL

The same content is queryable over GraphQL at `POST https://www.arketa.com/api/graphql`. Introspection is disabled in production; the types mirror the REST collections above (`Pages`, `BlogPosts`, `BlogCategories`, `Authors`) and the OpenAPI spec documents the request and response envelope.

```bash
curl -X POST https://www.arketa.com/api/graphql \
  -H "Content-Type: application/json" \
  -d '{"query":"{ BlogPosts(limit: 3, sort: \"-publishedDate\") { docs { title slug publishedDate } } }"}'
```

## Rate limits

The GraphQL endpoint allows **60 requests per client IP per 60 seconds**. Every response carries the IETF RateLimit header fields so a client can pace itself without guessing, and the older three-header form for SDKs that only read those. When the limit is exceeded the endpoint returns HTTP 429 with `Retry-After`.

| Header | Meaning |
| --- | --- |
| `RateLimit-Policy` | The policy: `"graphql";q=60;w=60` (quota 60 per 60-second window). |
| `RateLimit` | Current state: `"graphql";r=<remaining>;t=<seconds until reset>`. |
| `RateLimit-Limit` / `RateLimit-Remaining` / `RateLimit-Reset` | Same values as plain integers. |
| `Retry-After` | On a 429 only: seconds to wait before retrying. |

Limits are enforced per serving instance, so the exact counter can differ between regions; treat the headers as the source of truth for the connection you are on. The REST content endpoints and markdown mirrors are cached at the edge and are not rate limited today, but please keep crawls polite (one request at a time is plenty — the whole site fits in llms-full.txt). Partner API limits are applied per API key; back off on 429 there as well.

## MCP server

This site runs a Model Context Protocol server at `https://www.arketa.com/api/mcp` (Streamable HTTP transport). It exposes the CMS — pages, blog posts, media and site settings — as MCP tools for editing content with an AI assistant. Access requires an API key issued by an Arketa administrator; it is for the Arketa team and is not a public endpoint. Agents that only need to read the site should use the markdown mirrors, llms.txt or the REST API above, none of which need a key.

## Crawling and attribution

[https://www.arketa.com/robots.txt](https://www.arketa.com/robots.txt) explicitly allows the major AI crawlers and user-triggered fetchers (GPTBot, ClaudeBot, PerplexityBot and others) across the whole site; only the admin panel, the raw `/md/` route and `/api/` are excluded from indexing. When you cite Arketa content, link to the canonical HTML URL given in each markdown document, not the `.md` mirror.

## Support

Questions about the Partner API, keys or integrations: [support@arketa.com](mailto:support@arketa.com). Something wrong with the content API or the markdown mirrors? Tell us the URL and the `Accept` header you sent and we will take a look.
