Rate Limits

Understand API rate limits and how to handle them.

The Bitrefill API uses rate limiting to ensure fair usage and system stability. This page documents the limits and how to work within them.

Rate Limit Overview

Rate limits are applied per endpoint and measured over a rolling time window. When you exceed a limit, you'll receive a 429 Too Many Requests response.

Endpoint Limits

EndpointLimitWindow
GET /ping1 request3 seconds
GET /check_phone_number10 requests1 minute
GET /accounts/balance60 requests10 minutes
GET /products60 requests1 minute
GET /products/{id}60 requests1 minute
GET /products/esims60 requests1 minute
GET /products/esims/{id}60 requests1 minute
GET /products/search60 requests1 minute
GET /invoices20 requests1 minute
GET /invoices/{id}60 requests10 minutes
POST /invoices60 requests10 minutes
POST /invoices/{id}/pay60 requests10 minutes
GET /esims/invoice/{id}60 requests10 minutes
POST /esims60 requests10 minutes
POST /esims/invoice/{id}/pay60 requests10 minutes
GET /orders20 requests1 minute
GET /orders/{id}60 requests10 minutes
GET /esims20 requests1 minute
GET /esims/{id}60 requests10 minutes

Product Quota Limiter

In addition to per-endpoint rate limits, there's a quota limiter for product-related requests:

  • Limit: 1000 requests per hour
  • Applies to: /products and /products/search endpoints

This quota is separate from the per-endpoint rate limits.

Rate Limit Headers

Every response includes rate limit information:

X-RateLimit-Limit: 60
X-RateLimit-Remaining: 45
X-RateLimit-Reset: 1704067200
HeaderDescription
X-RateLimit-LimitMaximum requests in the current window
X-RateLimit-RemainingRequests remaining in current window
X-RateLimit-ResetUnix timestamp when the window resets

Use Webhooks Instead of Polling

Instead of repeatedly checking invoice status, use webhooks:

// Good: Use webhooks
const invoice = await createInvoice({
  products: [...],
  webhook_url: 'https://your-server.com/webhook'
});