API docs
Error codes & limits
Every error is a JSON object with a single field — { "detail": "..." } — plus the
HTTP status code.
Status codes
| Code | Meaning |
|---|---|
400 | Validation error — e.g. a profile or template with fewer than 7 themes, or a template with an invalid slide layout. |
401 | Missing, invalid, or revoked API key — or a missing/invalid session JWT on the key-management endpoints. |
402 | Tier 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. |
403 | API key is valid but the account has been deactivated. |
404 | Profile, template, generation, or key not found — including resources that exist but do not belong to the key's user (ownership is never revealed). |
429 | Rate 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
| Tier | Credits / billing period | Formats |
|---|---|---|
| Free | 3 credits | square |
| Starter | 10 credits | square, portrait, landscape |
| Pro | 40 credits | square, portrait, landscape |
| Growth | 300 credits | square, portrait, landscape |
| Enterprise | Per contract | square, 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
402on 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.