Skip to main content

Rate limits

Rate limits restrict how many requests you can make per minute to prevent abuse and ensure fair usage.
PlanRequests per minute
Free
Starter20
Plus60
Pro120
Ultra300
Agency300

Monthly quotas

Monthly quotas cap the total number of API requests per calendar month.
PlanAPI accessRequests per month
FreeNot available
StarterYes500
PlusYes3,000
ProYes10,000
UltraYes50,000
AgencyYes50,000
The API is not available on the Free plan. Upgrade to Starter or above to access the API.
Per-minute limits apply per API key. The monthly quota applies to your whole workspace — creating extra keys does not increase it. If you need higher limits, contact us about a custom plan.

Response headers

Every API response includes rate limit headers:
HeaderDescription
X-RateLimit-LimitMaximum requests allowed per window
X-RateLimit-RemainingRequests remaining in current window
X-RateLimit-ResetUnix timestamp when the window resets
Retry-AfterSeconds to wait before retrying (only on 429 responses)
Example headers:
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 45
X-RateLimit-Reset: 1705312800

Handling 429 errors

When you exceed the rate limit, the API returns a 429 status with a Retry-After header:
{
  "error": {
    "code": "rate_limit_exceeded",
    "message": "Rate limit exceeded. Retry after 30 seconds.",
    "doc_url": "https://docs.useqrkit.com/errors#rate_limit_exceeded",
    "request_id": "req_abc123"
  }
}

Retry with backoff

import time
import requests

def make_request(url, headers, json=None):
    for attempt in range(5):
        response = requests.post(url, headers=headers, json=json)

        if response.status_code != 429:
            return response

        retry_after = int(response.headers.get("Retry-After", 2 ** attempt))
        print(f"Rate limited. Retrying in {retry_after}s...")
        time.sleep(retry_after)

    return response

Best practices

1

Check remaining quota

Monitor X-RateLimit-Remaining to avoid hitting the limit.
2

Use exponential backoff

When retrying after a 429, use the Retry-After header value or exponential backoff.
3

Use batch creation

Use the Batches API to create up to 1,000 QR codes in a single request instead of making individual calls.
4

Cache responses

Cache GET responses to reduce unnecessary API calls.