Early access is openRequest access
Mowa

Developers

Build on Mowa.

Mowa is the system of record for AI behavior: versioned prompts with typed input and output interfaces, test datasets, and per-workspace usage. Everything the dashboard can do to prompts and datasets, your code can do over REST, and your agents can do over MCP.

01

Two surfaces, one substrate

The REST API speaks JSON over HTTPS at https://mowa.dev/api/v1 and fits CI pipelines, backends, and scripts. The MCP server exposes the same operations as tools for AI clients such as Claude and Cursor. Both act inside exactly one workspace and share one permission model: workspace membership gates every read and write, and publishing requires an owner or admin role.

02

Authentication

Workspace API keys

Create keys on the dashboard developer page. A key is bound to the workspace that is active when it is created, and every request acts inside that workspace with the key owner's role. Send it in the x-api-key header, or as Authorization: Bearer.

Base URL
https://mowa.dev/api/v1
Rate limit
100 requests / minute / key
First request
curl https://mowa.dev/api/v1/prompts \
  -H "x-api-key: $MOWA_API_KEY"

Keys created before a workspace was active are rejected with 403 and the code key_not_org_scoped. Create a fresh key inside the workspace you want to reach.

03

Errors

Every error shares one envelope. The code is a stable machine string, the message is for humans.

Error envelope
{ "error": { "code": "not_found", "message": "Prompt not found" } }
StatusCodesMeaning
400invalid_request, bad_requestThe body or query failed validation
401unauthorizedMissing, invalid, or expired API key
402plan_limitThe workspace hit a plan limit
403forbidden, key_not_org_scopedThe key or role cannot do this
404not_foundThe resource is not in this workspace
429rate_limitedToo many requests for this key
500internal_errorSomething failed on our side

The 402 deserves special attention. When a Free workspace hits a plan cap, writes fail with plan_limit and an extra limit field naming the cap that was hit. Treat it as a signal to upgrade or clean up, not to retry.

402 plan_limit
{
  "error": {
    "code": "plan_limit",
    "limit": "prompts",
    "message": "The free plan includes 2 prompts. Upgrade to Pro for unlimited prompts."
  }
}

04

Plans

The API and MCP are available on every plan. Free workspaces are subject to plan limits on prompts, datasets, rows, and synthetic generation, and requests past a cap return the 402 above. Pro removes the caps. The exact numbers live on the limits page, and plans are compared on pricing.