Skip to main content

Error Handling

RxScale APIs share most of their error formats. This page documents the error formats, HTTP status codes, and common error scenarios, and says where an API differs.

HTTP Status Codes

For security reasons, unauthorized access returns 404 instead of 403 on resource endpoints. This prevents attackers from discovering which resources exist. If you receive a 404, verify both that the resource UID is correct and that your API key has the required permissions.

Error Response Formats

RxScale APIs use three error response formats depending on the error type.
Some responses are not JSON at all: a rate-limited 429, and the 404 or 405 returned for a path or HTTP method an API does not have, come back as Content-Type: text/html with a short HTML error page. Always branch on the HTTP status code before parsing the body — a client that calls response.json() unconditionally fails on exactly the response its retry logic was written for. See Rate Limits.

Standard Error

Most errors return a simple error string:
Common messages:
  • "Resource not found" — Resource doesn’t exist or you lack access
  • "Bad request" — Generic error; the reason is recorded only in RxScale’s logs, not in the response. In the External Pharmacy API it also covers requests RxScale refuses, such as changing the status of a cancelled order — see External Pharmacy API Error Responses
  • "Missing required parameters: from and to" — Specific missing parameter info

Authentication Error

Authentication failures, and permission failures in the Management API and the Public API, return a code and description:
The External Pharmacy API does not use permission_denied: a key without the required permission gets 403 with {"error": "Permission denied"}. See External Pharmacy API Error Responses.

Validation Error

Schema validation failures return field-level error details:
Each key is the field name, and the value is an array of error messages for that field. Fix all listed fields and retry.

External Pharmacy API Error Responses

The External Pharmacy API returns the error responses below. Rely on the HTTP status code, and treat the body as additional information. {"error": "Bad request"} is a generic error. The reason is recorded only in RxScale’s logs, not in the response. Besides unexpected errors, it covers:
  • requests RxScale refuses, for example changing the status of a cancelled order;
  • on endpoints that take a request body (except complete_order), a body that is not valid JSON or is sent without Content-Type: application/json;
  • a group-wide API key without a pharmacy_uid, or with a pharmacy_uid outside its pharmacy group.
Do not retry these requests automatically. Contact RxScale support with the endpoint, HTTP method, timestamp, and request body (without secrets such as your API key). PATCH /pharmacy_orders/{uid}/complete_order has three more 400 variants:
  • {"error": ["Invalid JSON in request body"]} — the request body is not valid JSON. Here error is a list.
  • {"error": {...}, "pharmacy": {"uid": "...", "display_name": "..."}} — the request body failed validation, for example because of an unsupported carrier. pharmacy identifies the pharmacy the request was for.
  • {"error": "<message>"} — you sent tracking links for an order that is already completed.

Common Error Scenarios

Request:
Response:
Fix: Include the X-API-Key header in your request.
Request: Trying to write with a read-only API key.Management API and Public API — use code to detect this error; description is human-readable text:
External Pharmacy API:
Fix: Check your API key’s permissions. You may need to create a new key with the required permissions.
Request: Accessing a resource with an invalid UID or without access.
Fix: Verify the resource UID is correct. If you’re sure the UID is valid, check that your API key has permission to access the resource.
Request: Submitting an invalid request body.
Fix: Check each field listed in the error and provide valid values.
Request: Creating a resource that already exists.
Fix: The resource already exists. Use a GET request to retrieve it, or use PATCH to update it.
Request: A body above the 32 MiB cap.
Fix: Split the payload across several requests.
You’ve exceeded the rate limit. The response body is HTML, not JSON:
No Retry-After or X-RateLimit-* headers are sent. Fix: Wait at least one second — a full rate-limit window — then retry. See Rate Limits for details and best practices.

Best Practices

The status code tells you the error category. Parse the response body for details only after checking the status.
A 404 can mean the resource doesn’t exist OR you lack access. Don’t assume which — verify your API key permissions alongside the resource UID.
When rate limited, wait and retry with increasing delays. Never retry immediately in a tight loop.
For debugging, log the entire response body including status code and headers. RxScale support may ask for these details.