To ensure a stable and reliable experience for all users, our services include rate limits on API requests to maintain fair resource distribution. This guide explains our rate limit policy and provides best practices to help you avoid hitting limits and manage exceeded requests effectively.
What are rate limits?
Rate limits help ensure a smooth and reliable experience by preventing excessive API requests from impacting system performance. They define the maximum number of API calls allowed within a specific time frame. If you exceed this limit, additional requests will be temporarily blocked until the cooldown period ends, allowing you to resume usage. The following rate limit policies are applied in our services:
- RPS (Requests per second): The maximum number of API requests allowed per second.
- RPM (Requests per minute): The maximum number of API requests allowed per minute.
- TPM (Tokens per minute): The maximum number of tokens allowed per minute (applied to text-based models like Solar LLMs).
- PPM (Pages per minute): The maximum number of pages allowed per minute (applied to document processing models like Document Parse).
What happens when the rate limit is exceeded?
If the rate limit is exceeded, the server responds with an HTTP status code 429 Too Many Requests.
When this happens, you must wait for a designated cooldown period before retrying your request.
Rate limits by capability
The following table provides a comprehensive overview of rate limits across all our capabilities, organized by commitment tier:
Rate limits are automatically assigned based on your commitment tier. For detailed information about commitment tiers and pricing, please visit our Pricing page. To raise your rate limits, purchase credits on the Credit page to upgrade your commitment tier. If no commitment tier covers the limits you need, contact us with your requirements.
Legacy Tiers: Legacy tiers represent the rate limit structure prior to our pricing policy update on November 4, 2025. For more details about the update, see our Changelog. To check your current rate limit tier, visit the Credit page and refer to the Rate limit section under Commitment.
Generate (Chat / Reasoning / Structured outputs)
Decide (Structured decisions)
Solar Decide is served on Solar Mini 4 and shares its rate limits.
Embed
Parse (Document parsing / Document OCR)
Extract (Universal information extraction)
Classify (Document classification)
Rate limit response headers
Upstage API includes HTTP response headers in all responses to indicate the rate limit status. You can use these headers to programmatically monitor your current usage and remaining allowance, helping you proactively prevent exceeding the rate limits.
Note: For rate limit values (RPM/TPM/PPM values by Tier), refer to the Rate limits by capability section above.
Header categories
Depending on the characteristics of the API endpoint, up to three categories of rate limit headers are included in the response.
| Category | Description | Target | Header Suffix |
|---|---|---|---|
| RPS / RPM (Requests Per Second / Minute) | Limit on the number of requests per second or minute | All API requests | -Requests |
| TPM (Tokens Per Minute) | Limit on the number of tokens per minute | Token-based models like Chat and Embedding | -Tokens |
| PPM (Pages Per Minute) | Limit on the number of pages per minute | Document processing models like Document Parse and OCR | -Pages |
- The RPS/RPM headers are always included.
- The TPM headers are included only if a TPM limit is set for the model.
- The PPM headers are included only if a PPM limit is set for the model.
Complete list of headers
Limit (Maximum allowance)
Indicates the maximum allowance within the current rate limit window.
| Header | Value Type | Description | Example |
|---|---|---|---|
X-Upstage-RateLimit-Limit-Requests | integer (string) | Maximum requests per second or minute | 500 |
X-Upstage-RateLimit-Limit-Tokens | integer (string) | Maximum tokens per minute | 200000 |
X-Upstage-RateLimit-Limit-Pages | integer (string) | Maximum pages per minute | 500 |
Remaining (Remaining allowance)
Indicates the remaining allowance within the current rate limit window.
| Header | Value Type | Description | Example |
|---|---|---|---|
X-Upstage-RateLimit-Remaining-Requests | integer (string) | Remaining requests | 499 |
X-Upstage-RateLimit-Remaining-Tokens | integer (string) | Remaining tokens | 195000 |
X-Upstage-RateLimit-Remaining-Pages | integer (string) | Remaining pages | 490 |
Reset (Reset time)
Indicates the time when the rate limit window resets as a Unix timestamp (in seconds).
| Header | Value Type | Description | Example |
|---|---|---|---|
X-Upstage-RateLimit-Reset-Requests | Unix timestamp (string) | RPS/RPM reset time | 1742300460 |
X-Upstage-RateLimit-Reset-Tokens | Unix timestamp (string) | TPM reset time | 1742300460 |
X-Upstage-RateLimit-Reset-Pages | Unix timestamp (string) | PPM reset time | 1742300460 |
Interval (Window period)
Indicates the duration unit of the rate limit window.
| Header | Value Type | Possible Values | Description |
|---|---|---|---|
X-Upstage-RateLimit-Interval-Requests | string | "second", "minute" | RPS/RPM window period |
X-Upstage-RateLimit-Interval-Tokens | string | "minute" | TPM window period |
X-Upstage-RateLimit-Interval-Pages | string | "minute" | PPM window period |
Retry-After (Retry possible time)
Included only when the rate limit is exceeded (HTTP status code 429). It indicates the time when you can retry the request as a Unix timestamp (in seconds).
| Header | Value Type | Description | Example |
|---|---|---|---|
X-Upstage-RateLimit-Retry-After-Requests | Unix timestamp (string) | RPS/RPM retry possible time | 1742300445 |
X-Upstage-RateLimit-Retry-After-Tokens | Unix timestamp (string) | TPM retry possible time | 1742300445 |
X-Upstage-RateLimit-Retry-After-Pages | Unix timestamp (string) | PPM retry possible time | 1742300445 |
Note: The Retry-After header is included in the response only when the rate limit for that category is exceeded (Retry-After > 0). It is not included in successful responses (HTTP 200).
Response examples
Successful response (Chat API — RPM + TPM applied)
Successful response (Document Parse API — RPM + PPM applied)
Rate limit exceeded response (HTTP 429 — RPM exceeded)
Note: Even if the RPM is exceeded, the TPM/PPM headers will still return the current status of their respective categories. The Retry-After header is only included for the exceeded category (Requests in this case).
Programming examples
Python
cURL
FAQ
Q: Are all 15 headers included in every API response?
No. Only the rate limit headers configured for the specific model are included by category.
- Chat, Embedding models: RPM + TPM headers (up to 10 headers)
- Document Parse, OCR models: RPM + PPM headers (up to 10 headers)
- RPM headers are always included in all API requests.
Q: What is the difference between Reset and Retry-After?
- Reset: The time when the rate limit window completely resets. After this time, the entire allowance is fully restored.
- Retry-After: Included only when the rate limit is exceeded (429), indicating the earliest time you can retry the request. It is earlier than or equal to the Reset time.
Q: Can the Interval value be anything other than minute?
In the code, two values are possible: second and minute. Currently, most rate limits are set in minute units, but this may change in the future.
Q: Can header values be negative?
No. The Remaining value does not go below 0. When you reach the limit, it shows 0, and the X-Upstage-RateLimit-Retry-After-* header tells you when you can retry.
Best practices to handle rate limits
Implement retry logic with backoff
Implement a retry logic that pauses API calls for a certain period before attempting another request. This ensures that your requests are spaced out enough to avoid hitting the rate limit repeatedly. For instance, if the limit is per minute, you can set a delay before the next request or use exponential backoff, where the wait time increases progressively after each retry.
Use asynchronous APIs
Asynchronous APIs typically support higher rate limits, making them a more efficient option for handling large volumes of requests. Asynchronous APIs are available for some of our models such as Document Parse. This approach helps distribute API calls over time, reducing the risk of exceeding rate limits while optimizing performance.
Batch processing
Instead of sending frequent individual API requests, consider using batch processing. By grouping multiple requests into a single batch, you can reduce the number of API calls and stay within the rate limit. This is particularly useful for large-scale embeddings operations where multiple requests need to be sent in a short time.
Caching strategy
If your API requests frequently return the same data, implementing a caching strategy can greatly reduce the number of requests. This is particularly beneficial in scenarios like embeddings.
Store the results of frequent requests and serve them from the cache instead of making repeated API calls. This reduces the load on the API and helps in staying within the allowed limits.
Still need a higher rate limit?
Rate limits are provided based on your commitment tier. Higher tiers unlock increased rate limits and additional benefits.
If you need higher limits right away, you can upgrade your tier by purchasing credits:
- One-time purchase: Benefits last for one month from the time the tier is activated.
- Monthly/Annual auto-recharge: Benefits renew with each billing cycle, keeping your tier active continuously.
For custom enterprise agreements, please contact us with your requirements and we'll have a business representative reach out to you.
Snowflake Native App
Run Upstage Document Parse inside your Snowflake account as a serverless Native App — prerequisites, installation, usage from a stage or base64, and cost management tips.
Counting tokens
Estimate token usage before calling the API. Upstage helps developers optimize cost and prompt design with clear token counts.