Base URL
Response envelope
Every successful response:Idempotency
Every credit-spendingPOST (currently: POST /v1/content, POST /v1/schedules) requires an Idempotency-Key header — a UUID you generate per logical operation, reused on retries:
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, withnextCursor: 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.