Rate Limits
API key rate limits and how to handle 429 responses.
Rate Limits
Moviie applies rate limits to protect service stability and to keep expensive operations bounded. Limits can be scoped by API key, organization, video, playback session, or source address depending on the endpoint.
Default limits
Authenticated REST API traffic is limited per API key:
| Scope | Window | Max requests |
|---|---|---|
| API key | 60 seconds | 600 requests |
| API key write operations | 60 seconds | 120 requests |
| API key write operations on Enterprise | 60 seconds | 240 requests |
Some endpoints also have stricter limits because they start generation jobs, create uploads, or perform high-volume search/interactive work. Write operations that create, update, delete, upload, or start generation work can receive stricter per-organization and per-video budgets.
| Endpoint category | Additional scope | Window | Max requests |
|---|---|---|---|
| Reels, ebook, and translation generation | Organization burst | 10 seconds | 8 requests |
| Reels and translation generation | Organization | 60 seconds | 30 requests |
| Reels and translation generation | Video | 60 seconds | 15 requests |
| Upload reservation and upload presign | Organization | 60 seconds | 60 requests |
| Upload reservation and upload presign | Video | 60 seconds | 12 requests |
| Ebook generation | Video | 60 seconds | 10 requests |
| Lip sync generation | Organization burst | 10 seconds | 4 requests |
| Lip sync generation | Organization | 60 seconds | 10 requests |
| Lip sync generation | Video | 60 seconds | 6 requests |
| Dubbing generation and audio upload/presign | Organization | 60 seconds | 10 requests |
| Dubbing generation and audio upload/presign | Video | 60 seconds | 3 requests |
| Authenticated embed transcript search | Source burst | 2 seconds | 20 requests |
| Authenticated embed transcript search | Source | 60 seconds | 200 requests |
| Authenticated embed transcript search | Organization burst | 2 seconds | 30 requests |
| Authenticated embed transcript search | Organization | 60 seconds | 600 requests |
| Playback session transcript search | Source burst | 2 seconds | 15 requests |
| Playback session transcript search | Source | 60 seconds | 120 requests |
| Playback session transcript search | Playback session burst | 2 seconds | 5 requests |
| Playback session transcript search | Playback session | 60 seconds | 60 requests |
| Playback session transcript search | Video | 60 seconds | 600 requests |
| Playback session transcript search | Organization | 60 seconds | 6,000 requests |
| Embed quiz retrieval | Source burst | 2 seconds | 10 requests |
| Embed quiz retrieval | Source | 60 seconds | 120 requests |
| Embed quiz retrieval | Organization | 60 seconds | 600 requests |
Requests can be denied when any applicable scope exceeds its limit. For example, an organization can remain within the default API-key limit while a single video or generation category is temporarily limited.
Rate limit exceeded
When a limit is exceeded, the API returns:
HTTP/1.1 429 Too Many Requests
Retry-After: 60{ "error": "rate_limited" }The Retry-After header is expressed in seconds. Some authentication-level
limits may return a different human-readable error string, but clients should
treat any 429 response as a rate-limit response and wait for Retry-After
before retrying.
Best practices
- Implement exponential backoff when you receive a
429response. Wait before retrying. - For batch operations (e.g., fetching analytics for many videos), throttle your requests or batch them where the API supports it.
- Use server-side caching for frequently accessed data (e.g., collection lists) to avoid redundant API calls.
- Avoid immediately retrying generation or upload requests from multiple workers.
Queue them client-side and respect the longest
Retry-Aftervalue you receive.