HOCO B2B
SRSAPI reference

Error codes

Registry of every error code the HOCO API returns, with its HTTP status, meaning, typical operations and the handling expected from each client.

Every error answers with an HTTP status and the envelope defined in the API conventions:

{
  "error": {
    "code": "STOCK_INSUFFICIENT",
    "message": "Quantité non disponible pour HOCO N32. Réduisez la quantité ou retirez l'article.",
    "details": { "variantId": "01a1a2b0-3c4d-7e5f-8a9b-0c1d2e3f4a5b", "requestedQty": 40, "availability": "IN_STOCK" },
    "requestId": "req_01J9Z4K7M2"
  }
}
  • code is the contract. Clients branch on code (and details), never on message. Codes are UPPER_SNAKE_CASE, stable, and never reused with another meaning; a new code is an additive change announced in the API-contract changelog.
  • message is safe to show. Localised by Accept-Language (fr default, ar, en), written for the end user, without internal detail. Clients may replace it with their own copy for the codes they handle explicitly.
  • details is structured. Field errors, limits, conflicting state, ids — documented per code below and per operation on each page. Unknown details keys must be ignored.
  • requestId is also returned in the X-Request-Id header and written in the server logs and the audit log; support screens show it (« Référence : req_01J9Z4K7M2 »).
  • Unknown codes. A client that receives a code it does not know handles it by its HTTP status (table below) and shows message.

The registry lists the codes of every API page. Codes marked † were introduced with the authentication, me & reference, files, notifications and invitations pages; the others come from the pages linked in Typical operations.

Handling by HTTP status

StatusMeaningDefault client handling
400Malformed or invalid inputShow field errors from details.fields next to the inputs; never retry unchanged.
401No valid sessionClear the stored token and go to sign-in (the reseller app falls back to guest browsing). Exceptions: INVALID_CREDENTIALS on sign-in, AUTH_REQUIRED_FOR_PRICES (show the sign-up prompt).
403Not allowedShow the message; do not retry. Account codes (ACCOUNT_SUSPENDED, PASSWORD_CHANGE_REQUIRED…) route to their dedicated screens.
404Not found or not visible to the callerShow « Élément introuvable », remove it from local caches, go back.
409State conflictRefetch the resource, show its current state, let the user redo the action. IDEMPOTENCY_IN_PROGRESS alone is retried automatically after 1 s.
410Gone (expired)Show the message; offer to restart the flow.
422Business rule refused valid inputShow the message and the guidance from details; the user changes something before retrying.
426App too oldForced-update screen with details.storeUrl (RA-36, DA-28).
429Too many requestsWait Retry-After seconds (countdown when user-visible); never hammer.
500Server errorGeneric error with requestId; mutations with an Idempotency-Key may be retried with the same key.
501Contracted but not implemented yet (staging only)Developer-facing banner; never in production.
503Maintenance or a provider downMaintenance screen when MAINTENANCE; otherwise retry with backoff.

Offline replays from the delegate app follow the same codes inside each item of sync.batch: 4xx items are REJECTED (or CONFLICT for 409) and shown in the sync centre (DA-27), 5xx items are retried.

Registry

Platform

CodeHTTPMeaningTypical operationsClient handling
INTERNAL_ERROR500Unexpected server failureanyGeneric error with requestId; retry idempotent calls with the same key
MAINTENANCE503The app is in maintenance (details.until, details.message)any except appConfig.getMaintenance screen; poll appConfig.get
UPGRADE_REQUIRED426X-App-Version below minVersion, or missing on a mobile session (details.minVersion, details.storeUrl)any except appConfig.get, auth.logout, sync.batch during its 72 h graceForced-update screen
RATE_LIMITED429Request rate above the limit (Retry-After)any; auth.otp.send hourly capsWait and retry later
NOT_FOUND404Unknown resource, or one the caller may not see (existence is never revealed)any read or action on an idRemove from caches, go back
NOT_IMPLEMENTED501Operation present in the contract, not yet implemented on stagingany (staging only)Developer banner; the release checklist forbids it in production
FEATURE_DISABLED403A switchable feature is off (details.feature, e.g. packs)cart.packs.add, packs.*Hide the feature
PAYLOAD_TOO_LARGE †413JSON body above 1 MB (files go to storage, never in JSON)any mutationDeveloper error — fix the client

Validation

CodeHTTPMeaningTypical operationsClient handling
VALIDATION_FAILED400Invalid input; details.fields[] = { path, code, message } with the field codesanyInline field errors
REASON_REQUIRED422A reason (code from a reference list, or text) is mandatory for this actioncancellations, refusals, status changes, not-done visits, overridesOpen the reason picker
FIELD_NOT_EDITABLE403A field the caller may never change (details.fields[] with { field, reason }, e.g. customerType)profile.update, delegate.resellers.updateShow the field read-only with « Contactez HOCO »
DUPLICATE_VALUE409A unique value is already used (name, slug, code, SKU)back-office creationsHighlight the field
RESOURCE_IN_USE409Archiving or deleting something still referencedadmin catalog, CRM, stock CRUDExplain what still uses it
BULK_TOO_LARGE422A bulk action matches too many records (details.matched, details.max)admin.resellers.bulkAsk to narrow the filter
EXPORT_TOO_LARGE422Export above the row limitadmin exportsAsk to narrow the filter
REPORT_RANGE_TOO_LARGE422Period longer than allowed (details.maxDays)dashboards, reportsShorten the period

Auth & accounts

CodeHTTPMeaningTypical operationsClient handling
UNAUTHENTICATED401No session, or expired or revoked (details.reason: MISSING, EXPIRED, REVOKED); also a guest calling a signed-in operationany session operation, cart.*Clear the token; sign-in (reseller app: guest mode with the RA-41 prompt). REVOKED → « Vous avez été déconnecté de cet appareil »
INVALID_CREDENTIALS401Unknown identifier or wrong password (same message for both)auth.loginInline error; keep the identifier
WRONG_APP †403Correct credentials for an account of another type (details.userType)auth.login, me.devices.register« Ce compte est un compte délégué : utilisez l'application HOCO Délégué »
ACCOUNT_SUSPENDED403Account SUSPENDED or DISABLED (details.status, details.supportPhone, details.supportWhatsapp)auth.login and every session operationBlocked screen with support contacts; sessions are gone
ACCOUNT_PENDING_VALIDATION403Reseller account not validated yetcart.checkout, orders.confirmAssisted, returns.create, payment declarationsPending banner / RA-06
PASSWORD_CHANGE_REQUIRED403Temporary password not changed yeteverything except auth.password.change, auth.logout, auth.session, me.getForced change-password screen
REAUTH_REQUIRED403Sensitive back-office action without a fresh sign-in (15 min)role, setting, credit, user-status changes; personal or financial exportsAsk the password again, then retry
AUTH_LOCKED429Sign-in locked 15 minutes after 5 consecutive failures (details.lockedUntil, Retry-After)auth.loginCountdown and « Mot de passe oublié »
TOO_MANY_ATTEMPTS429Attempts exhausted on a one-time code or on the current passwordauth.otp.verify, auth.password.changeRequest a new code / wait 15 minutes
OTP_RESEND_TOO_SOON429Less than 60 s since the last code (details.retryAfterSeconds)auth.otp.sendResend countdown
OTP_INVALID †422Wrong code (details.attemptsLeft)auth.otp.verifyClear the input, show attempts left
OTP_EXPIRED †422No pending code: expired, replaced or usedauth.otp.verifyOffer « Renvoyer le code »
OTP_DELIVERY_FAILED †503SMS gateway or mail server failure (nothing counted)auth.otp.sendRetry after Retry-After
VERIFICATION_TOKEN_INVALID †422Verification token unknown, expired, used, of another purpose or another phone (details.reason)auth.signup.reseller, auth.password.reset, me.updateRestart the OTP step
INVALID_CURRENT_PASSWORD †422Current password wrong; the session stays valid (details.attemptsLeft)auth.password.changeInline error
TERMS_NOT_ACCEPTED †422Terms version accepted is not the current oneme.update (also a field code of auth.signup.reseller)Show the current terms again
PHONE_ALREADY_EXISTS409The phone belongs to another account or point of saleauth.signup.reseller, me.update, auth.otp.send (PHONE_CHANGE), reseller creationsSign-up: offer sign-in; CRM: open the existing record
CUSTOMER_TYPE_REQUIRED422Approving an account without a customer typeadmin.resellers.validateAsk the validator to choose the type

Access

CodeHTTPMeaningTypical operationsClient handling
PERMISSION_DENIED403The caller's roles lack the permission, or the user type cannot use the operationany back-office operation; staff on reseller/delegate operations« Accès refusé »; the UI should not have offered it
OUT_OF_SCOPE403Record outside the delegate's zones or not the reseller's own (writes; reads answer 404)delegate.*, reseller operations with idsRefetch the list; the record left the scope
NOT_ASSIGNED_DELEGATE403The tour belongs to another delegate now (details.assignedTo)delegate.tours.*Refresh the day; drop local actions on it
PERMISSION_ESCALATION403Granting more than the actor holdsadmin.roles.updatePermissions, admin.users.updateExplain; ask a super administrator
PERMISSION_NOT_GRANTABLE422roles.administer / users.administer to a role other than SUPER_ADMINadmin.roles.updatePermissionsInline error
SELF_MODIFICATION_FORBIDDEN403Changing one's own roles or statusadmin.users.*Explain
LAST_SUPER_ADMIN409The change would leave no active super administratoradmin.users.setStatus, role changesExplain
ROLE_PROTECTED409Deleting a system role or editing a locked oneadmin.roles.*Explain
ROLE_INCOMPATIBLE422A staff role on a delegate or reseller user, or the reverseadmin.users.*Inline error

CRM, zones & invitations

CodeHTTPMeaningTypical operationsClient handling
RESELLER_TRANSITION_NOT_ALLOWED409Status change not allowed (automatic funnel statuses, same status)admin.resellers.setStatus, delegate.resellers.updateShow allowed statuses from details
RESELLER_INCOMPLETE422Minimum data (cahier §15.5) missing (details.missing)admin.resellers.validateList missing fields
RESELLER_HAS_ACCOUNT409The store already has an account — nothing to invitedelegate.invitations.createShow the account state
VALIDATION_NOT_PENDING409The record is not waiting for validationadmin.resellers.validateRefresh the queue
DUPLICATE_SUSPECTED409Near-identical record found (details.hints)admin.resellers.createShow the candidates; confirm with ignoreDuplicateHints
LOCATION_REQUIRED422Approval or creation needs a GPS positionadmin.resellers.validate, delegate.resellers.createAsk for the position
DELEGATE_INACTIVE422The delegate's account is not activeassignmentsPick another delegate
DELEGATE_ZONE_MISMATCH422The delegate does not cover the communeadmin.resellers.update, assignmentsUse the out-of-zone option or another delegate
DELEGATE_HAS_OPEN_TOURS409Deactivating a delegate with open toursadmin.users.setStatus, admin.delegates.crudReassign or cancel the tours
TASK_TRANSITION_NOT_ALLOWED · TASK_NOT_OPEN409Follow-up not in a state allowing the changeadmin.tasks.update, delegate.tasks.*Refresh the task
ZONE_OVERLAP409A commune would belong to two active zonesadmin.zones.crudHighlight the communes
ZONE_IN_USE409Deleting a zone that still has delegates or points of saleadmin.zones.crudReassign first
INVITATION_NOT_FOUND †404No invitation with this codeinvitations.resolve, invitations.attribute« Code invalide » inline
INVITATION_EXPIRED †410Invitation expired or replaced (details.reason: EXPIRED, REVOKED)invitations.resolve, invitations.attribute« Demandez un nouveau lien à votre délégué »
INVITATION_ALREADY_USED †409The invited point of sale already has an accountinvitations.resolve, invitations.attributeOffer « Se connecter »
INVITATION_INACTIVE409Sharing an expired or revoked invitationdelegate.invitations.markSharedCreate a new invitation

auth.signup.reseller never fails because of an invitation code: an invalid one is ignored and reported in invitationCodeIgnored.

Catalog, pricing & stock

CodeHTTPMeaningTypical operationsClient handling
AUTH_REQUIRED_FOR_PRICES401A guest asked for something that depends on prices (price range, price sort, price facet, price-only view)catalog.products.list, catalog.facetsShow the RA-41 sign-up prompt — not a session expiry. The catalog page currently answers 400 VALIDATION_FAILED with field code SIGN_IN_REQUIRED; to reconcile on one form
FAVORITES_LIMIT_REACHED422500 favorites alreadyfavorites.addExplain
ATTRIBUTE_VALUE_INVALID422A variant attribute value not allowed by its definition (type, unit, allowed values)admin.variants.crud, admin.products.*, product importInline error on the attribute
PRICE_ORDER_INVALID422Prices not ordered priceSuperGros ≤ priceDemiGros ≤ priceDetailadmin.variants.crudInline error
PRODUCT_INCOMPLETE422An active product would lack mandatory data (image…)admin.products.update, setStatusList what is missing
PRODUCT_TRANSITION_NOT_ALLOWED409Product status change not allowedadmin.products.setStatusShow allowed statuses
VARIANT_LAST_ACTIVE409Hiding the last active variant of an active productadmin.variants.crudHide the product instead
CATEGORY_CYCLE · CATEGORY_DEPTH_EXCEEDED422Invalid category tree (cycle, deeper than category › sub-category)admin.categories.*Inline error
IMPORT_FILE_INVALID422Unreadable import file, missing columns, too many rowsadmin.products.import, admin.imports.createShow details
IMPORT_DRY_RUN_REQUIRED · IMPORT_DRY_RUN_EXPIRED · IMPORT_ALREADY_APPLIED422 · 409 · 409Import applied without a valid dry run, dry run too old, or applied twiceimportsRun the dry run again
STOCK_BELOW_RESERVED422New physical stock below the reserved quantityadmin.stock.adjustRelease or change orders first
INVENTORY_SESSION_CONFLICT · INVENTORY_TRANSITION_NOT_ALLOWED · INVENTORY_LINES_INCOMPLETE409 · 409 · 422Inventory session conflicts or incomplete countsadmin.inventory.*Follow details
VARIANT_NOT_IN_SCOPE422Variant not in the inventory sessionadmin.inventory.*Inline error
MULTI_WAREHOUSE_DISABLED · WAREHOUSE_INACTIVE422Warehouse rulesadmin.warehouses.crud, stock and delivery operationsExplain

Cart & orders

CodeHTTPMeaningTypical operationsClient handling
CART_EMPTY422Checkout of an empty cartcart.checkoutBack to the catalog
CART_CHANGED409The re-validated total differs from expectedTotalTtccart.checkoutShow the new total and ask to confirm again
CART_LINE_LIMIT_REACHED422100 lines already (details.limit)cart.items.add, orders.reorderExplain
PRODUCT_UNAVAILABLE422A variant is not orderable for this reseller (details.lines)cart.*, cart.checkout, assisted orders, admin.orders.createRemove the line
QUANTITY_NOT_ALLOWED422Minimum, step or maximum quantity brokencart.*, cart.checkout, assisted ordersAdjust the stepper to details
STOCK_INSUFFICIENT422Not enough available stock — never a quantity in detailscart.*, cart.checkout, admin.orders.validateLower the quantity or remove the line
ORDER_MIN_AMOUNT_NOT_MET422Total below orders.minAmount (details.minAmount, currentAmount)cart.checkout, assisted ordersProgress bar « Plus que … DA »
ADDRESS_NOT_DELIVERABLE · ADDRESS_MISSING422Address not served or incompletecart.checkout, admin.orders.*Choose or complete an address
PACK_UNAVAILABLE422Pack outside its dates or an item not orderable (V2)cart.packs.addExplain
NOTHING_TO_REORDER422No line of the order can be added againorders.reorderShow details.unavailableLines
RESELLER_SUSPENDED403Commercial suspension: ordering blocked, account still usablecart.checkout, assisted orders, admin.orders.createSuspended banner with support contacts
RESELLER_NOT_VALIDATED422Back-office action on an order of a non-validated reselleradmin.orders.validateValidate the account first
ORDER_TRANSITION_NOT_ALLOWED409Status change not allowed from the current statusorders.cancel, admin.orders.transition, admin.orders.cancelRefetch the order
ORDER_NOT_MODIFIABLE · ORDER_INVOICED409Order lines can no longer change / an invoice existsadmin.orders.modify, admin.orders.cancelExplain
ASSISTED_ORDER_ALREADY_PENDING409An assisted order already awaits this reseller's confirmationdelegate.assisted.submitOpen the pending one
ASSISTED_ORDER_EXPIRED409The confirmation delay has passedorders.confirmAssisted, orders.rejectAssisted, admin.orders.confirmAssistedRefetch; the order is cancelled
ASSISTED_CONFIRMATION_NOT_PENDING409Not an assisted order awaiting the reselleradmin.orders.confirmAssistedRefetch
DOCUMENT_NOT_AVAILABLE409Invoice or delivery note not produced yet (details.availableFrom)orders.document, admin.orders.documentsHide the download until then
DELIVERY_INFO_REQUIRED · DELIVERY_PROOF_REQUIRED422Shipping data or proof of delivery missingadmin.orders.transition, admin.deliveries.*Ask for the data
DELIVERY_NOT_EDITABLE · CARRIER_INACTIVE409 · 422Delivery in a final state / carrier deactivatedadmin.deliveries.updateExplain

Returns, after-sales & support

CodeHTTPMeaningTypical operationsClient handling
ORDER_NOT_DELIVERED409Return requested on an order that is not DELIVERED (details.status)returns.createHide « Demander un retour »
RETURN_WINDOW_EXPIRED422More than returns.windowDays after delivery (details.returnableUntil)returns.createDialog with the window and the WhatsApp button; offer an after-sales claim
RETURN_QTY_EXCEEDS_DELIVERED422Quantity above delivered minus already returned (details.lines)returns.createCap the quantity
RETURN_TRANSITION_NOT_ALLOWED409Return status change not allowedadmin.returns.decide, admin.returns.receiveRefetch
AFTER_SALES_WINDOW_EXPIRED422After-sales claim outside its window (afterSales.windowDays or the product warranty)tickets.create (type AFTER_SALES)Dialog with the window and the WhatsApp button
TICKET_TRANSITION_NOT_ALLOWED409Ticket status change not allowedtickets.close, admin.tickets.*Refetch
NOTIFICATION_PREFERENCE_LOCKED †422Changing a locked channel (transactional, security, in-app)notifications.preferences.updateKeep the switch disabled

Finance

CodeHTTPMeaningTypical operationsClient handling
CREDIT_LIMIT_EXCEEDED422CREDIT order above the available credit with policy BLOCKcart.checkout, admin.orders.validateSuggest another payment method
CREDIT_ACCOUNT_BLOCKED422Credit account blockedadmin.orders.validateExplain; override with permission
PAYMENT_METHOD_NOT_ALLOWED422Method disabled, or CREDIT without a credit line (details.reason)cart.checkout, payments.declareRefresh the method list
PAYMENT_METHOD_DISABLED422Method not in payments.enabledMethodsadmin.payments.recordExplain
PAYMENT_ALREADY_DECLARED409Same method and reference already declared (details.paymentNumber)payments.declareOpen the existing declaration
PAYMENT_NOT_PENDING · PAYMENT_NOT_CONFIRMED409Payment not in the required stateadmin.payments.verify, admin.payments.allocateRefetch
ALLOCATION_EXCEEDS_BALANCE · ALLOCATION_EXCEEDS_PAYMENT · ALLOCATION_RESELLER_MISMATCH422Invalid allocation of a payment to invoicesadmin.payments.allocateInline error per invoice
INVOICE_ALREADY_CANCELLED · INVOICE_HAS_PAYMENTS409Invoice cannot be cancelledadmin.invoices.cancel, admin.orders.cancelDeallocate first
INVOICE_CANCELLED422Allocation to a cancelled invoiceadmin.payments.allocateRemove the invoice

Field

CodeHTTPMeaningTypical operationsClient handling
GPS_OUT_OF_TOLERANCE422Check-in farther than field.gpsToleranceMeters (details.distanceMeters)delegate.visits.arriveDA-28 « Vous êtes à 320 m du point de vente »; justified check-in when allowed
GPS_ACCURACY_TOO_LOW422Position less precise than field.gpsMaxAccuracyMetersdelegate.visits.arrive, delegate.resellers.createWait for a better fix
GPS_MOCK_LOCATION422The device reports a mocked positiondelegate.visits.arrive, delegate.tours.startAsk to disable fake GPS apps
TOUR_TRANSITION_NOT_ALLOWED · TOUR_NOT_STARTABLE409Tour not in a state allowing the actiondelegate.tours.start, suspend, resumeRefresh the day
TOUR_ALREADY_IN_PROGRESS · TOUR_NOT_IN_PROGRESS · TOUR_NOT_TODAY · TOUR_DATE_TAKEN409Tour state or date conflictdelegate.tours.*, admin.tours.*Follow details
TOUR_ORDER_IMPOSED409Reordering stops of an imposed tourdelegate.tours.reorderDisable drag and drop
TOUR_CLOSING_BLOCKED409Closing blocked (details.blockingItems[].code: UNSYNCED_DATA, VISIT_NOT_ENDED, UNVISITED_STOPS_WITHOUT_REASON)delegate.tours.closeOpen DA-20 with the blockers
VISIT_TRANSITION_NOT_ALLOWED · VISIT_NOT_CHECKED_IN · VISIT_IN_PROGRESS · VISIT_ALREADY_PLANNED409Visit state conflictdelegate.visits.*, delegate.tours.addVisitRefresh the visit
VISIT_LOCKED409Finished visit locked (unlock needs field.validate)delegate.visits.*Read-only visit
VISIT_REQUIREMENTS_NOT_MET422Ending a visit without what its type requires (details.missing[].code: REPORT_REQUIRED, PHOTO_REQUIRED, CHECKLIST_INCOMPLETE)delegate.visits.endGo to the missing step
PHOTO_LIMIT_REACHED422Maximum photos reached (details.max)delegate.visits.addPhoto, delegate.resellers.addPhotoDisable the camera button

Sync & idempotency

CodeHTTPMeaningTypical operationsClient handling
IDEMPOTENCY_KEY_REQUIRED400Idempotency-Key missing where it is mandatorycart.checkout, sync.batch, delegate.* mutations, every operation flagged idemDeveloper error — always send it
IDEMPOTENCY_KEY_REUSED409Same key with a different body (also a reused client file id)any mutationDeveloper error — new action needs a new key
IDEMPOTENCY_IN_PROGRESS409The first request with this key is still runningany mutationRetry automatically after 1 s
OCCURRED_AT_OUT_OF_RANGE422occurredAt more than 5 min in the future or older than 72 hoffline-capable delegate.*, sync.batch itemsSync centre: « Action enregistrée il y a plus de 72 h »
CLIENT_ID_CONFLICT409A client-generated id already used by another recorddelegate.resellers.create, offline creationsRegenerate the id; keep the data
VERSION_CONFLICT409Optimistic concurrency: the record changed since it was readPATCH operations with a version, sync.batch itemsShow the server version; let the user merge

Files

CodeHTTPMeaningTypical operationsClient handling
FILE_PURPOSE_NOT_ALLOWED †403The caller may not upload this purposefiles.createUploadDeveloper error
FILE_TYPE_NOT_ALLOWED †422Declared or detected type not accepted for the purpose (details.allowed)files.createUpload, files.completeUpload« Format non accepté »
FILE_TOO_LARGE †422Above the purpose's limit (details.maxSize)files.createUpload, files.completeUploadCompress (images) or pick a smaller file
FILE_NOT_UPLOADED †422Completion before the object exists in storagefiles.completeUpload, operations attaching a fileRetry the PUT, then complete
FILE_SIZE_MISMATCH †422Stored size differs from the declared sizefiles.completeUploadStart a new upload
FILE_UNREADABLE †422Corrupt image or PDF, or an image above 40 megapixelsfiles.completeUploadPick another file
FILE_NOT_READY422Attaching or reading a file whose upload was not completedevery operation taking a fileId, files.downloadUrlComplete the upload first
FILE_PURPOSE_MISMATCH422The attached file has another purposeevery operation taking a fileIdDeveloper error

Field codes

Codes inside details.fields[].code of 400 VALIDATION_FAILED (and of the per-item results of sync.batch). Generic ones come from the Zod schemas of the contract; specific ones from the pages shown.

Field codeMeaningExamples
REQUIRED · UNKNOWN_FIELDMissing mandatory field · field not in the schemaany body
INVALID_FORMAT · INVALID_ENUM · TOO_SHORT · TOO_LONG · OUT_OF_RANGE · NOT_POSITIVEGeneric type, enum, length and range checksany body or query
IN_FUTURE · TOO_OLDDate outside the accepted windowpayments.declare (paidAt)
INVALID_PHONE · INVALID_EMAIL · INVALID_IDENTIFIERPhone not an Algerian mobile in any accepted format · email · neither phone nor emailauth.*, sign-up, profiles
PASSWORD_TOO_SHORT · PASSWORD_TOO_WEAK · PASSWORD_TOO_COMMON · PASSWORD_REUSEDPassword policy (AUTH-07)auth.signup.reseller, auth.password.*
TERMS_NOT_ACCEPTEDTerms version not the current oneauth.signup.reseller
COMMUNE_NOT_IN_WILAYACommune of another wilayasign-up, addresses, reseller forms
UNKNOWN_REFERENCE_CODE · UNKNOWN_REFERENCE_ITEMCode not in the reference list or inactivesign-up (businessTypeCode), visit reports
DEVICE_ID_MISMATCHBody deviceId differs from X-Device-Idme.devices.register, invitations.attribute
INVALID_INVITATION_CODENot 8 characters of the code alphabetinvitations.resolve
SIGN_IN_REQUIREDGuest using a price filter or sortcatalog.products.list, catalog.facets
UNKNOWN_ATTRIBUTE · INVALID_RANGE · CURSOR_MISMATCH · INVALID_BARCODECatalog query checkscatalog.*
MISSING_VISIT · UNKNOWN_VISIT · VISIT_NOT_PLANNEDTour stop list checksdelegate.tours.reorder

Cart and order issue codes

Not errors: values of Issue.code returned inside carts and assisted orders (see cart issues). A BLOCKING issue makes cart.checkout answer with the error of the same code.

Issue codeSeverity
PRICE_CHANGED · PROMOTION_ENDEDWARNING
PRODUCT_UNAVAILABLE · STOCK_INSUFFICIENT · QUANTITY_NOT_ALLOWED · ORDER_MIN_AMOUNT_NOT_MET · ACCOUNT_PENDING_VALIDATION · RESELLER_SUSPENDEDBLOCKING

Variants to retire

Spellings found in other pages or in the plan for the same situation as a registry code. The registry spelling is the one to implement; the pages listed are to be aligned.

FoundUseWhere
CUSTOMER_TYPE_LOCKED (422)FIELD_NOT_EDITABLE (403)requirements › authentication, delegate-app screens index, mobile API integration and architecture
FIELD_NOT_EDITABLE with status 422status 403, as in the permissions matrixAPI › delegate resellers
RETURN_WINDOW_CLOSED, AFTER_SALES_WINDOW_CLOSEDRETURN_WINDOW_EXPIRED, AFTER_SALES_WINDOW_EXPIREDAPI › orders, lifecycles and statuses
RETURN_QTY_EXCEEDEDRETURN_QTY_EXCEEDS_DELIVEREDplan task SRV-20
MOCK_LOCATION_DETECTEDGPS_MOCK_LOCATIONrequirements › geography
OTP_RATE_LIMITEDRATE_LIMITED (hourly caps) · OTP_RESEND_TOO_SOON (60 s cooldown)plan task SRV-05
TOO_MANY_ATTEMPTS for the sign-in lockAUTH_LOCKED (sign-in lock only; TOO_MANY_ATTEMPTS stays for codes and current passwords)requirements › authentication (AUTH-07)
FILE_NOT_READY with status 409status 422API › finance
SIGN_IN_REQUIRED field code vs AUTH_REQUIRED_FOR_PRICESone form to chooseAPI › catalog

On this page