API docs

Error codes & limits

Every error is a JSON object with a single field — { "detail": "..." } — plus the HTTP status code.

Status codes

CodeMeaning
400Validation error — e.g. a profile or template with fewer than 7 themes, or a template with an invalid slide layout.
401Missing, invalid, or revoked API key — or a missing/invalid session JWT on the key-management endpoints.
402Tier gate: your plan does not include API access (it requires Pro or above), the generation format is not available on your plan, or the generation costs more credits (one per language) than your monthly allowance and purchased credits have left.
403API key is valid but the account has been deactivated.
404Profile, template, generation, or key not found — including resources that exist but do not belong to the key's user (ownership is never revealed).
429Rate limit exceeded — see Limits below for the budgets. The response carries a Retry-After header in seconds.
Example error body
{
  "detail": "This generation costs 3 credits (one per language). You have 0 of your 40 monthly credits left and not enough purchased credits to cover the rest — buy a credit pack, upgrade, or generate in fewer languages."
}

Limits

TierCredits / billing periodFormats
Free3 creditssquare
Starter10 creditssquare, portrait, landscape
Pro40 creditssquare, portrait, landscape
Growth300 creditssquare, portrait, landscape
EnterprisePer contractsquare, portrait, landscape
  • → API access is included on Pro and above. Creating an API key and using one both require it, so a key cannot outlive a downgrade — an account below Pro gets 402 on both. Existing keys stay listable and revocable at any tier.
  • → Profiles and templates used through the API need at least 7 themes (each a gradient + image query pair) — the same gate as the web UI.
  • → The allowance is counted in credits, and one credit is one language of one carousel: a generation costs as many credits as it has distinct languages, because that is how many LLM calls it makes. The count covers the web UI and the API combined, and is enforced per user. On a paid plan it resets at the start of each Stripe billing period, which is the day you subscribed rather than the 1st; on Free, which has no subscription and so no billing period, it resets on the 1st of the calendar month. Credits bought in a top-up pack never expire and are spent only after the monthly allowance is gone.
  • → Request rate limits are enforced, and a request over budget is answered with 429: 30 generations per hour per API key, 10 key creations per hour per account, and a ceiling of 100 requests per hour per IP address across the API-key surface. These are per-hour budgets and are separate from the monthly credit allowance above — a request can be refused by either.