Skip to main content

Base URL

There is one environment — production and staging frontends both call this same backend.

Response envelope

Every successful response:
List endpoints:
Every error:
See Errors for the full code list.

Idempotency

Every credit-spending POST (currently: POST /v1/content, POST /v1/schedules) requires an Idempotency-Key header — a UUID you generate per logical operation, reused on retries:
Omitting it on a route that requires it returns 400 missing_idempotency_key. Replaying the same key within the dedup window returns the original response verbatim — no re-execution, no second charge.

Pagination

List endpoints currently return up to 100 rows, newest first, with nextCursor: null (cursor pagination beyond 100 rows isn’t implemented yet — flagged here rather than implied by the envelope shape alone).

Rate limits

Every /v1/* request is rate-limited per API key: 120 requests/minute overall, and a tighter 10 requests/minute specifically on POST /v1/content (the one route that spends credits and calls a real model). A blanket per-IP floor (300 requests/minute) also applies before your key is even checked, so a flood of invalid keys never reaches the database. Exceeding a limit returns 429 with a Retry-After header (seconds until the window resets) and:
429
There’s no X-RateLimit-Remaining header yet — only the hard 429 once you hit the ceiling. Your credit balance (GET /v1/credits) and the account’s daily generation ceiling are separate, spend-based limits enforced independently on every credit-spending call.