Rate Limits
Understand the rate limiting applied to API requests.
Overview
The Ssemble API enforces rate limits to ensure fair usage and service stability. Limits vary by endpoint type — heavier operations like creating shorts have stricter limits than read-only endpoints.
Rate limits are applied per API key. If you have multiple API keys on the same account, each key has its own independent rate limit counters.
Rate limit layers
The API enforces rate limits at two levels:
- Per-endpoint limits — Each endpoint type has its own request-per-minute cap (see table below). These limits are per API key.
- Account-level limits — Hourly and daily caps applied across all endpoints. Default limits are 100 requests/hour and 1,000 requests/day. Higher-tier subscriptions receive increased limits (up to 2,000/hour and 20,000/day).
Both layers must pass for a request to succeed.
Limits by endpoint
| Endpoint | Rate limiter | Limit | Window |
|---|---|---|---|
POST /shorts/create | Video creation | 500 requests | 1 minute |
GET /shorts/:id/status | Status check | 500 requests | 1 minute |
GET /shorts/:id | Status check | 500 requests | 1 minute |
GET /shorts | List requests | 500 requests | 1 minute |
GET /music | Status check | 500 requests | 1 minute |
GET /game-videos | Status check | 500 requests | 1 minute |
GET /meme-hooks | Status check | 500 requests | 1 minute |
DELETE /shorts/:id | Standard | 1,000 requests | 15 minutes |
GET /templates | Standard | 1,000 requests | 15 minutes |
Different endpoints use different rate limiter pools. Hitting the limit on POST /shorts/create does not affect your ability to call GET /shorts/:id/status.
Rate limit headers
Every API response includes these headers, regardless of whether the request succeeded or failed:
| Header | Type | Description |
|---|---|---|
X-RateLimit-Limit-Hour | number | Maximum requests allowed per hour |
X-RateLimit-Remaining-Hour | number | Requests remaining in the current hour window |
X-RateLimit-Limit-Day | number | Maximum requests allowed per day |
X-RateLimit-Remaining-Day | number | Requests remaining today |
X-RateLimit-Reset | string | ISO 8601 timestamp when the hourly limit resets |
Reading headers in JavaScript
Reading headers in Python
Rate limit exceeded response
When you exceed a rate limit, the API returns a 429 Too Many Requests response:
Per-endpoint limit exceeded
Hourly account limit exceeded
Daily account limit exceeded
The details object provides information about when you can retry. Use the retryAfter or reset timestamp to schedule your next request.
Handling rate limits
Exponential backoff
When you receive a 429 response, implement exponential backoff to avoid hammering the API:
Pre-emptive rate limit checking
Instead of waiting for a 429 error, check remaining limits before making requests:
Best practices
-
Poll at 10-second intervals — When checking status, don't poll faster than every 10 seconds. Faster polling wastes your rate limit budget without gaining useful information.
-
Use the list endpoint for batch monitoring — If you have many active requests, use
GET /shortswith status filtering instead of polling each request individually. One call to the list endpoint replaces many individual status calls. -
Cache stable data — Template lists (
GET /templates) and asset lists (GET /music,GET /game-videos,GET /meme-hooks) change infrequently. Cache these responses for at least 1 hour to reduce API calls. -
Check remaining quota — Read
X-RateLimit-Remaining-HourandX-RateLimit-Remaining-Dayheaders to plan your request volume. Spread requests over time instead of sending bursts. -
Handle
429gracefully — Always implement retry logic with backoff. Never loop without delay when receiving rate limit errors. -
Use the reset timestamp — The
X-RateLimit-Resetheader (ISO 8601 format) tells you exactly when the hourly limit resets. Schedule your retries to align with this time instead of guessing.
