Error codes and retry guidance
API
Error codes
Retry
HTTP status
This article covers the status codes the ReceiptRoller API returns when a call fails, the shape of the response body, and which errors are safe to retry. Error bodies do not share one format across all endpoints: most are a simple JSON object {"error": "..."}, and 401 and 403 come back with no body at all. Decide what happened from the status code first, and use the body to find the cause.
The shape of an error body
- Most errors are JSON with a short description or code in
error. Some endpoints add fields such asmessage,error_descriptionorreason. - A
400caused by malformed JSON, or by a non-number in a numeric field, has a body whoseerrorslists the reason for each field. 401and403come back with no body.- An unexpected error inside the server returns
500with{"error": "an unexpected error occurred"}.
{ "error": "product not found in this business account" }
{ "error": "slot_unavailable", "reason": "...", "message": "..." }
There is no shared list of error codes and no request ID field for support enquiries.
Status codes
| Code | Meaning | Retry |
|---|---|---|
200 | Success. Most creates also return 200 (for example, creating a product) | — |
201 | Created, on some create endpoints (for example, store posts) | — |
204 | Success with no body, for example on delete | — |
400 | A required field is missing, or a value or format is wrong | No (fix the request) |
401 | No token, or the token is invalid or expired | Once, after refreshing the token |
402 | The business account's plan does not include the feature (for example, Google Business Profile) | No |
403 | Missing scope, an organizationId that differs from the token's, not a member, or a role that is not enough | No |
404 | The item does not exist in the business account | No |
409 | A conflict with the current state (for example, a coupon code already in use, or a booking slot that is full) | No (read the current state and decide) |
429 | Too many requests, on the few endpoints that have a limit | After waiting (Rate limiting and throttling) |
500 | An unexpected error inside the server | A few times, with growing waits |
502 / 503 | An outside service failed, or a temporary clash (for example, two redemptions of the same pass at once) | A few times, with growing waits |
The statuses each endpoint can return are listed in the API reference.
Token endpoint errors
POST /api/v1/auth/token returns errors in the OAuth format.
| Status | error | Cause |
|---|---|---|
400 | invalid_request | The body could not be read, or code or refresh_token is missing |
400 | unsupported_grant_type | grant_type has a value that is not supported |
401 | invalid_grant, invalid_client and others | The code or refresh token is not valid, or client authentication failed. error_description has the detail |
If refreshing with a refresh token returns 401, don't retry; ask the user to authorize again.
Retry guidance
- Retry only on
429,5xx, timeouts and connection errors. For5xx, double the wait each time (1 s, 2 s, 4 s and so on), add some random jitter, and stop after a few attempts. - For
429, wait the number of seconds inRetry-Afterif it is present, or about a minute if it is not. - Any
4xxother than401gives the same result however many times you send it. - There is no general
Idempotency-Keyheader. Resending a createPOSTafter a timeout can create a duplicate, so check whether the item was created before sending it again. - Pass redemption and its undo (
POST /api/v1/reservations/passes/{passId}/redeemand.../unredeem) and time-clock punches (POST /api/v1/stores/{storeId}/timecards/punch) take anidempotencyKeyin the body. Resending with the same key returns the result already recorded, with"replayed": true, and nothing is applied twice.
Related articles
Published: 2026-04-27
Updated: 2026-10-26
Category
Tags
API (23)
OAuth (18)
Android (10)
iOS (8)
Webhook (5)
App registration (4)
Node.js (4)
PIM (4)
POS Integration (4)
Quickstart (4)
Related articles
-
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.
-
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.
-
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.
-
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.
-
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.