Skip to main content

Error messages and codes

Every error IDM returns carries a stable code (for example QUOTE_EXPIRED) and a request ID. People using the apps never see the code: they see the title and message in the table below. Developers receive the code, the HTTP status, an operator-facing message and the request_id.

Quote the request ID

When you report a problem, give the request ID shown with the error (or the X-Request-Id response header). Support can find exactly what happened from it. Never send passwords, secrets, full card details or one-time codes.

Signing in and access​

INVALID_API_CREDENTIAL​

What people seeNot available: You do not have access to this.
Shown asMessage box
HTTP status401
What it meansThe API key ID is unknown, revoked or expired, the tenant is suspended, or a key was used in the wrong environment (a test key against production, a live key anywhere else).
What to doDo not retry. Check which key and environment your integration uses; rotate the credential in IDM Admin if it was revoked.

SIGNATURE_INVALID​

What people seeNot available: You do not have access to this.
Shown asMessage box
HTTP status401
What it meansThe request signature, its timestamp window or its nonce was rejected. detail.reason says which: signature, timestamp or nonce.
What to doFor timestamp, fix the clock (use NTP). For nonce, never reuse a nonce. For signature, check the canonical string: method, request URI, body, timestamp and nonce joined by new lines.

TENANT_ACCESS_DENIED​

What people seeNot available: You do not have access to this.
Shown asMessage box
HTTP status403
What it meansThe resource belongs to another tenant, or the credential lacks the scope. IDM never says which, so the existence of other tenants' records is not disclosed.
What to doCheck the reference and the credential's scopes. Repeated denials from one credential are throttled.

NOT_AUTHORISED​

What people seeNot available: You do not have access to this.
Shown asMessage box
HTTP status403
What it meansThe signed-in account does not hold the permission this action needs.
What to doAsk an administrator who can grant the role. Hiding a menu item is never the control: the server checks every request.

SCOPE_MISSING​

What people seeNot available: You do not have access to this.
Shown asMessage box
HTTP status403
What it meansThe credential or session is missing the operational scope this route needs.
What to doAsk your tenant administrator to issue a credential with the scope (for example delivery.create).

MFA_REQUIRED​

What people seeVerification required: Enter the code from your authenticator app to continue.
Shown asMessage box
HTTP status403
What it meansThe account must finish signing in with its authenticator app before it can act.
What to doEnter the six-digit code from your authenticator app. If you lost the device, ask an administrator to reset your second factor.

STEP_UP_REQUIRED​

What people seeConfirm it is you: Enter a fresh code from your authenticator app to continue.
Shown asMessage box
HTTP status403
What it meansA sensitive action (pricing activation, emergency controls, credential issuance and similar) needs a fresh authenticator code.
What to doEnter a fresh code from your authenticator app, then repeat the action.

SESSION_EXPIRED​

What people seePlease sign in again: Your session has ended. Sign in to continue.
Shown asMessage box
HTTP status401
What it meansThe session ended: it was idle too long, reached its absolute lifetime or was revoked.
What to doSign in again. Nothing you had already saved is lost.

AUTHENTICATION_FAILED​

What people seeSign-in failed: The email or password is not right, or the account cannot sign in. Try again or contact your administrator.
Shown asUnder the field
HTTP status401
What it meansThe email and password did not match an account that can sign in. IDM gives the same answer for every failure on purpose.
What to doCheck the email and password. After several failures the account is locked for a while; ask your administrator if it stays locked.

PARTNER_BLOCKED​

What people seeNew deliveries are paused: Settle the outstanding platform fee to resume accepting work. Active deliveries are unaffected.
Shown asMessage box
HTTP status403
What it meansThe delivery company cannot take new work, usually because a platform fee is unpaid. Deliveries already under way continue.
What to doDelivery companies: settle the outstanding fee in Platform fees. Tenants: choose another partner or wait for settlement.

MODULE_DISABLED​

What people seeNot available right now: This option is currently switched off.
Shown asMessage box
HTTP status403
What it meansThe feature is switched off (for example Bulk Delivery, or a module under an emergency control).
What to doTry again later or use the normal flow. Administrators can see why on the Emergency controls and System settings pages.

RATE_LIMIT_EXCEEDED​

What people seeToo many requests: Please wait a moment and try again.
Shown asShort notice
HTTP status429
What it meansToo many requests from this tenant, credential, device or address in a short time.
What to doWait for the Retry-After seconds, then retry. Integrations should honour the RateLimit-* headers.

REQUEST_EXPIRED​

What people seeLink expired: This delivery request has expired.
Shown asMessage box
HTTP status410
What it meansThe customer request, recipient link or tracking link has expired, was replaced or is not valid. Unknown and expired links get the same answer.
What to doAsk the sender or delivery company for a new link. Senders can start a new request.

Input, retries and duplicates​

VALIDATION_FAILED​

What people seeCheck the details: Some details are missing or not valid.
Shown asUnder the field
HTTP status400
What it meansSome details are missing or not valid. detail names the fields.
What to doCorrect the highlighted fields and submit again.

SERVER_CONTROLLED_FIELD​

What people seeSomething went wrong: Something went wrong. Please try again.
Shown asMessage box
HTTP status422
What it meansThe request body contained a field only the server may set: fee, amount, distance, status, rider, assignment, zone, gateway, classification, tenant, delivery partner, pricing version or platform fee.
What to doRemove the field. IDM calculates these values itself; sending them is an error so an integration never believes it set them.

IDEMPOTENCY_KEY_REQUIRED​

What people seeSomething went wrong: Something went wrong. Please try again.
Shown asMessage box
HTTP status400
What it meansThis action changes state and needs an Idempotency-Key header.
What to doSend a new random key for each new intent, and the same key for every retry of that intent.

IDEMPOTENCY_KEY_REUSED​

What people seeSomething went wrong: Something went wrong. Please try again.
Shown asMessage box
HTTP status409
What it meansThe same idempotency key was sent with a different body. Nothing was executed.
What to doFix the client: one key per intent. Do not retry blindly.

REQUEST_IN_FLIGHT​

What people seeStill working: Your request is being processed.
Shown asShort notice
HTTP status409
What it meansThe first request with this idempotency key is still running.
What to doWait a second (Retry-After: 1) and retry with the same key; you will receive the original result.

Locations and routes​

LOCATION_NOT_SUPPORTED​

What people seeLocation outside service area: This location is outside our service area.
Shown asMessage box
HTTP status422
What it meansThe location resolved, but it is outside every area IDM serves (or past the tenant's maximum distance).
What to doChoose a location inside the service area. The delivery company can tell you where it delivers.

LOCATION_NOT_CONFIRMED​

What people seeLocation could not be confirmed: This location could not be confirmed. Please move the pin.
Shown asMessage box
HTTP status422
What it meansThe location is ambiguous: the pin sits on a boundary or the map data disagrees.
What to doMove the pin a little, or pick the area again.

LOCATION_VERIFICATION_FAILED​

What people seeLocation verification failed: We could not confirm this location. Please try again.
Shown asMessage box
HTTP status422
What it meansA technical failure stopped IDM checking the location (provider, database or timeout).
What to doTry again in a moment. Nothing was saved.

GEOGRAPHY_CONFLICT​

What people seeBoundary conflict: This boundary overlaps an active one. Review the boundary and try again.
Shown asMessage box
HTTP status409
What it meansAn administrator's boundary overlaps an active boundary. Overlaps are rejected when written, never repaired later.
What to doAdministrators: review the boundary in Geography and remove the overlap.

ROUTING_UNAVAILABLE​

What people seeRoute unavailable: We could not calculate the route right now. Please try again shortly.
Shown asMessage box
HTTP status503
What it meansNo approved routing provider could measure the road distance right now.
What to doTry again shortly. Operators: see the Routing degraded runbook.

Prices and quotes​

QUOTE_EXPIRED​

What people seeQuote expired: This delivery quote has expired. Calculate a new quote.
Shown asMessage box · the screen reloads the latest state
HTTP status409
What it meansThe quote passed its expiry by the server's clock. An expired quote can never be confirmed.
What to doCalculate a new quote. Never reuse the old fee.

PRICING_UNAVAILABLE​

What people seePricing unavailable: We could not price this delivery right now. Please try again shortly.
Shown asMessage box
HTTP status503
What it meansPricing or routing failed and no approved fallback price applies.
What to doRetry with backoff. Operators: check routing health and fallback prices.

PRICING_CONFIGURATION_UNAVAILABLE​

What people seePricing unavailable: Pricing configuration unavailable for this delivery route. Please try again or contact the delivery company.
Shown asMessage box
HTTP status503
What it meansNo single valid distance multiplier is active for this route classification, so IDM refuses to price rather than guess.
What to doTry again later or contact the delivery company. Administrators: check Distance multipliers for an active row covering now.

PRICING_CONFIGURATION_CONFLICT​

What people seeConfiguration conflict: This overlaps an active configuration. Review the dates and try again.
Shown asMessage box
HTTP status409
What it meansA pricing or multiplier configuration overlaps one that is already active for the same scope and dates.
What to doAdministrators: adjust the effective dates or retire the active version first.

VEHICLE_UNAVAILABLE​

What people seeVehicle unavailable: This vehicle is currently unavailable for this delivery.
Shown asUnder the field · the screen reloads the latest state
HTTP status422
What it meansThis vehicle type cannot serve this delivery (company, area, load or status).
What to doChoose another vehicle from the list the screen shows; the list is always live.

Deliveries, offers and relays​

INVALID_DELIVERY_STATE​

What people seeThis has changed: This delivery has changed. Please review the latest details.
Shown asShort notice · the screen reloads the latest state
HTTP status409
What it meansThe action is not allowed from the delivery's current state, usually because someone else changed it first.
What to doReload and look at the latest state before deciding again.

DUPLICATE_JOB_INTENT​

What people seeThis has changed: This delivery was already created.
Shown asShort notice · the screen reloads the latest state
HTTP status409
What it meansThis delivery was already created from the same intent.
What to doUse the existing delivery; no second one was made.

EXTERNAL_REFERENCE_IN_USE​

What people seeReference in use: This order reference is already linked to a delivery.
Shown asMessage box
HTTP status409
What it meansYour external order reference is already linked to another delivery of your tenant.
What to doUse a unique order reference, or look up the existing delivery.

DELIVERY_ALREADY_ASSIGNED​

What people seeDelivery no longer available: This delivery has already been assigned.
Shown asScreen refreshes · the screen reloads the latest state
HTTP status409
What it meansAnother rider accepted first. This is normal, not a fault.
What to doRiders: nothing to do, the app returns to waiting for offers.

OFFER_NO_LONGER_AVAILABLE​

What people seeDelivery no longer available: This delivery has already been assigned.
Shown asScreen refreshes · the screen reloads the latest state
HTTP status409
What it meansThe offer expired by the server's clock or was replaced.
What to doRiders: nothing to do, the app returns to waiting for offers.

NO_ELIGIBLE_PARTNER​

What people seeNo delivery partner available: No delivery partner can take this delivery right now. Please try again later.
Shown asMessage box
HTTP status422
What it meansNo delivery company satisfies coverage, vehicle, capacity and permission for this delivery right now.
What to doRetry later. Tenants can widen their allowed partners; administrators can check partner status and coverage.

RELAY_ALREADY_CLAIMED​

What people seeRelay already claimed: Another rider has taken this relay.
Shown asShort notice · the screen reloads the latest state
HTTP status409
What it meansAnother rider took this relay first.
What to doRiders: nothing to do, the app returns to idle.

HANDOFF_VERIFICATION_FAILED​

What people seeCode did not match: Check the handoff code and try again.
Shown asUnder the field
HTTP status422
What it meansThe relay handoff code did not match. Repeated failures are limited and audited.
What to doCheck the code on the other rider's screen and try again, or ask them to show a new code.

HDZE_ORDER_ALREADY_BATCHED​

What people seeThis has changed: This delivery has changed. Please review the latest details.
Shown asShort notice · the screen reloads the latest state
HTTP status409
What it meansThe delivery is already in a shared delivery route.
What to doReload to see the latest state.
What people seeThis has changed: This delivery has changed. Please review the latest details.
Shown asShort notice · the screen reloads the latest state
HTTP status409
What it meansA rider search for this dispatch attempt already ran.
What to doReload to see the latest state.

GPS_NOT_PERMITTED​

What people seeLocation sharing stopped: Location is only shared during an active delivery.
Shown asScreen refreshes
HTTP status403
What it meansLocation is accepted only while the rider holds an active delivery.
What to doNothing to do: the app stops sending location until the next delivery.

Bulk Delivery​

BULK_RECIPIENT_LIMIT​

What people seeMaximum of 5 recipients allowed: A Bulk Delivery includes two to five recipients.
Shown asMessage box
HTTP status422
What it meansA Bulk Delivery has two to five recipients. Fewer or more are refused and nothing is created.
What to doSend to between two and five people, or use a single delivery.

BULK_RECIPIENTS_PENDING​

What people seeWaiting for recipients: Some recipients have not confirmed their delivery location yet.
Shown asMessage box
HTTP status409
What it meansAt least one recipient has not confirmed their delivery location.
What to doResend their link, wait, or remove them, then continue.

BULK_QUOTE_CHANGED​

What people seeQuote updated: Your delivery quote has changed. Please review the updated quote before continuing.
Shown asMessage box · the screen reloads the latest state
HTTP status409
What it meansA recipient's quote changed after you reviewed the total.
What to doReview the updated quote, then confirm again.

BULK_STATE_CHANGED​

What people seeRequest changed: This delivery request has changed. Please refresh and try again.
Shown asMessage box · the screen reloads the latest state
HTTP status409
What it meansThe Bulk Delivery or one of its recipients changed since the screen last loaded.
What to doRefresh and try again.

BULK_CANCELLED​

What people seeBulk Delivery cancelled: This Bulk Delivery has been cancelled.
Shown asMessage box · the screen reloads the latest state
HTTP status409
What it meansThe Bulk Delivery has been cancelled.
What to doStart a new request if you still need the deliveries.

BULK_CHILD_EXISTS​

What people seeThis has changed: This delivery has changed. Please review the latest details.
Shown asShort notice · the screen reloads the latest state
HTTP status409
What it meansThat recipient position already exists in this Bulk Delivery.
What to doReload to see the current recipients.

Payments, fees and accounting​

ACCOUNTING_PERIOD_EXISTS​

What people seeThis has changed: This delivery has changed. Please review the latest details.
Shown asShort notice · the screen reloads the latest state
HTTP status409
What it meansThe accounting period for that company and month already exists.
What to doReload; the period was created by an earlier run.

ACCOUNTING_PERIOD_UNAVAILABLE​

What people seeCompletion on hold: This delivery cannot be completed until the company account is checked. Contact IDM support.
Shown asMessage box
HTTP status503
What it meansThe company has no open accounting period to record the earning in, so completion is held rather than recorded wrongly.
What to doContact IDM support. Operators: see the Reconciliation finding runbook.

PAYMENT_EVENT_ALREADY_SEEN​

What people seeThis has changed: This delivery has changed. Please review the latest details.
Shown asShort notice · the screen reloads the latest state
HTTP status409
What it meansThe payment provider event was already processed.
What to doNothing to do; the first delivery of the event counted.

INVALID_PAYMENT_STATE​

What people seeThis has changed: This delivery has changed. Please review the latest details.
Shown asShort notice · the screen reloads the latest state
HTTP status409
What it meansThat payment change is not allowed from the payment's current state.
What to doReload to see the payment's latest state.

PAYMENT_PROVIDER_UNAVAILABLE​

What people seePayment not started: Paystack could not be reached, so nothing was charged. Please try again shortly.
Shown asMessage box
HTTP status503
What it meansPaystack could not be reached, so no payment was started and nothing was charged.
What to doTry again shortly.

Platform and connection​

NOT_FOUND​

What people seeNot found: This page or item could not be found.
Shown asMessage box
HTTP status404
What it meansThe page or item does not exist, or is not visible to you.
What to doCheck the link or reference.

PAYLOAD_TOO_LARGE​

What people seeFile too large: The upload is too large. Choose a smaller file.
Shown asUnder the field
HTTP status413
What it meansThe upload or request body is over the size limit.
What to doChoose a smaller photo or file.

REQUEST_TIMEOUT​

What people seeThis is taking too long: Something went wrong. Please try again.
Shown asShort notice
HTTP status503
What it meansThe request took longer than its time budget.
What to doTry again. If it keeps happening, quote the request ID to support.

RETRYABLE​

What people seePlease try again: Something went wrong. Please try again.
Shown asShort notice
HTTP status503
What it meansA short conflict inside the database (for example two changes at once). Nothing was half-done.
What to doRetry once with the same idempotency key.

INTERNAL_ERROR​

What people seeSomething went wrong: Something went wrong. Please try again.
Shown asMessage box
HTTP status500
What it meansAn unexpected failure. The response holds only a request ID; details stay in IDM's logs.
What to doRetry once. If it persists, report the request ID.