Rate limiting and throttling
For developers implementing batch or bulk processing that calls the ReceiptRoller API heavily.
The unit of rate limiting
Rate limiting is applied per app × store combination. Even for the same app, a different store is a separate count.
Per-plan limits (store-side plan)
| Plan | Per second | Per day |
|---|---|---|
| Starter | 10 req/s | 100,000 req |
| Growth | 50 req/s | 1,000,000 req |
| Enterprise | Individually contracted | Individually contracted |
Short bursts are allowed up to 2x via a token-bucket scheme.
Response headers
Every API response includes the current rate-limit status.
X-RateLimit-Limit: 10 ← per-second upper limit X-RateLimit-Remaining: 7 ← remaining X-RateLimit-Reset: 1745740001 ← reset time (Unix seconds) X-RateLimit-Resource: receipts ← the target of the limit
When you hit the limit:
HTTP/1.1 429 Too Many Requests
Retry-After: 1
X-RateLimit-Remaining: 0
{ "error": { "code": "rate_limited", "message": "..." } }
Implementation to avoid hitting the limit
1. Client-side throttling
Have a mechanism to limit the send rate on the client side as well. Rather than waiting for a 429, controlling throughput from the start is more stable.
// A simple token-bucket example
class RateLimiter {
constructor(perSecond) {
this.tokens = perSecond;
this.max = perSecond;
setInterval(() => { this.tokens = this.max; }, 1000);
}
async acquire() {
while (this.tokens <= 0) await sleep(50);
this.tokens--;
}
}
2. Use batch endpoints
ReceiptRoller provides batch APIs that handle multiple resources in one request. They are more favorable for rate limits than calling one at a time.
POST /v1/products/batch
{
"products": [
{ "sku": "A001", "name": "..." },
{ "sku": "A002", "name": "..." }
]
}
3. Caching and delta retrieval
- Cache data that rarely changes (store information, product master) on the client side
- For list retrieval, fetch only the delta with
updated_after - Receive notifications via Webhook and then fetch details via the API (drop polling entirely)
4. Controlling concurrency
Keep the number of concurrent requests at or below the per-second limit. Firing all of them concurrently with Promise.all results in a 429 in no time. Control the number of concurrent executions with something like p-limit.
Consulting about relaxing the limit
If your workload characteristics unavoidably exceed the limit, it can be relaxed via an individual contract on the Enterprise plan. Consult the sales desk or support.
Related guides
-
Using the Store Information APIA guide to the REST API for fetching and updating a store's basic information (store name, store type, contact details, and address). Lets you implement a store information editing screen from token-authenticated clients such as staff apps.
-
PosTransactionDto specification — field reference for transaction dataA complete field reference for PosTransactionDto, the canonical model for the transaction data ReceiptRoller handles. For each category — identifiers, dates, amounts, line items, payments, staff, status, and CRM linkage — it summarizes the field names, types, meanings, and how each POS vendor populates them. A reference for developers and external-system integrators. Also referenced from the Smaregi and Square mapping articles.
-
Purchase and receipt data integrationExplains the structure of the purchase and receipt data ReceiptRoller handles, how to retrieve it, related scopes, Webhooks, and common use cases.
-
Using the Business Hours APIA guide to ReceiptRoller's Business Hours API (/api/v1/stores/{storeId}/business-hours). Covers retrieving and updating per-day business hours, registering special business days (temporary closures and hour changes), configuring a store's workable hours (the upper bound for shift creation), and determining whether the store is currently open.
-
Using the Orders / OMS APIA guide to CRUD operations on the orders under a business account using ReceiptRoller's Orders / OMS API (/api/v1/orders). Covers creating, updating, transitioning status (confirm, process, cancel), and deleting orders, plus the flow for Android / iOS apps and server integrations.