error.code to handle errors programmatically and error.message for user-facing display. The shape is identical across all endpoints, so you can build a single error-handling layer for your entire integration.
Error response shape
details is optional and may contain extra context. For example, a failed
cancel request includes currentStatus so you can branch your logic without
making an additional GET request.HTTP status codes
Error codes
Common validation messages
The API returns plain-language messages alongside everyVALIDATION_ERROR. Use the table below to map a message to its root cause and fix.
Troubleshooting
400 on order create
400 on order create
The most common cause is an invalid or free-text zone name. Call
GET /delivery-zones and build your address form from the areas[].value strings in that response — zone names like "Nasr City" are rejected; you must use the full catalog value (e.g. "Nasr City - ElHay 06 (Nasr City)"). Also confirm that orderType is exactly Deliver, Return, or Exchange.403 on order update
403 on order update
An order may no longer be editable once a courier has been assigned or the order moves past the editable stage. Fetch the order with
GET /orders/{orderNumber} and check the response before attempting an update. If canChangeAddress is false, the address and order details are locked.429 RATE_LIMITED
429 RATE_LIMITED
You have exceeded 120 requests per minute on this API key. Reduce your request rate and implement exponential backoff when you receive a
429 response — start with a 1-second delay, double it on each retry, and cap at 30 seconds. Contact your Now Shipping account manager if you consistently need a higher limit.400 MERCHANT_REQUIRED
400 MERCHANT_REQUIRED
Company API keys must include Then pass the merchant’s
X-Merchant-Id on every order and pickup request. Retrieve your merchants first:businessAccountCode or externalMerchantId in the header:403 MERCHANT_NOT_FOUND
403 MERCHANT_NOT_FOUND
The merchant ID you sent in
X-Merchant-Id either does not exist or is not linked to your company account. Verify the merchant appears in GET /merchants and that the correct company API key is in use. If the merchant is missing, contact your Now Shipping account manager to confirm the linkage in admin.409 MERCHANT_ALREADY_EXISTS
409 MERCHANT_ALREADY_EXISTS
A merchant with the same
email, phone, or externalMerchantId is already registered under your company. Call GET /merchants?search=<email_or_id> to retrieve the existing merchant record and store the returned businessAccountCode instead of creating a duplicate.403 SCOPE_DENIED
403 SCOPE_DENIED
Your API key does not have the scope required by the endpoint you called. Scopes map to endpoint groups:
orders → /orders/*, pickups → /pickups/*, merchants → /merchants/*. Create a new API key in the Now Shipping admin with the missing scope included and rotate your integration to the new key.