# Errors & Rate Limits

## Error format

All errors return a JSON body with a `code` and `message` field:

    {
      "error": {
        "code": "RENDER_LIMIT_EXCEEDED",
        "message": "Monthly render limit reached",
        "details": { "current": 100, "max": 100 }
      }
    }

## Error codes

Status | Code | Description
--- | --- | ---
`400` | `INVALID_JSON` | Request body is not valid JSON
`400` | `MISSING_SOURCE` | Neither `project_id` nor `template_id` was provided
`401` | `UNAUTHORIZED` | Missing or invalid API key
`403` | `NO_API_ACCESS` | Plan does not include API access
`403` | `ACCESS_DENIED` | Project exists but belongs to another user
`403` | `RESOLUTION_LIMIT` | Requested resolution exceeds your plan limit
`404` | `PROJECT_NOT_FOUND` | Project does not exist
`404` | `TEMPLATE_NOT_FOUND` | Template does not exist
`429` | `RATE_LIMITED` | Too many requests per minute
`429` | `RENDER_LIMIT_EXCEEDED` | Monthly render quota exhausted

## Rate limits & plans

Feature | Free | Creator ($9/mo) | Pro ($29/mo)
--- | --- | --- | ---
API Access | — | Yes | Yes
Renders / month | — | 100 | 1,000
API Keys | — | 3 | 10
Rate limit | — | 30 req/min | 120 req/min
Max resolution | — | 1080p | 4K
Webhooks | — | Yes | Yes
Watermark | — | No | No

Upgrade your plan →