Physical POS
Error Codes

Error Codes

Errors come back in the common error envelope. Branch on code, not on message; envelope fields and general rules: Error Handling.

{
  "status": "failure",
  "code": "physical_pos.input.text_invalid",
  "message": "The text cannot be empty or contain invisible or formatting characters.",
  "statusCode": 400,
  "requestId": "00000000-0000-0000-0000-000000000000",
  "details": { "field": "name", "reason": "forbidden_character" },
  "docsUrl": "https://docs.lunixi.com/physical-pos/errors#physical_pos.input.text_invalid"
}
  • message is returned in Turkish or English depending on the request language; the descriptions in the tables below are these texts. → Error Handling › Choosing a language
  • details is not present on every error. When present it may carry the field name (field) and the cause (reason); for physical_pos.validation.invalid the details are in the details.errors array, each item { field, errors: [<reason>] }. Values are never written to details.
  • For the codes below the response carries a docsUrl field that links to the code's row on this page.
  • 4xx errors are not fixed by retrying. The retryable class is 503 and the other 5xx errors. → Common Rules › Retries

physical_pos.* codes

Request and common rules

HTTPcodeDescriptionWhat to do
400physical_pos.validation.invalidThe physical POS request contains invalid fields — check the submitted fields.Fix the field named in details.errors.
400physical_pos.cursor.invalidThe pagination cursor is invalid; request the list again from the first page.Start again from the first page.
400physical_pos.idempotency.key_requiredThe Idempotency-Key header is required for this operation.Add the Idempotency-Key header.
400physical_pos.idempotency.key_invalidIdempotency-Key must be 8-200 printable ASCII characters without spaces.Use an 8–200 character value without spaces (e.g. a UUID).
409physical_pos.idempotency_mismatchThis Idempotency-Key was already used with a different request.Use a new key for a new operation.
409physical_pos.version_conflictThe record changed while you were editing it; reload the latest version and apply your change again.Read the record again and resend with the current rowVersion.
400physical_pos.input.code_invalidThe code format is invalid.Write the code with A-Z, 0-9, ., _, -; for fields with a fixed set, send a value from the list.
400physical_pos.input.text_invalidThe text cannot be empty or contain invisible or formatting characters.Check details.field and details.reason; fix the text.
400physical_pos.input.ref_invalidThe reference value is invalid: it must be printable ASCII without spaces.Use only the allowed characters.
400physical_pos.input.reason_code_invalidThe reason code is invalid.Send a reason code that fits the operation.
400physical_pos.input.vendor_code_invalidThe vendor code is invalid.Use a vendor code from the catalog.
400physical_pos.input.virtual_serial_invalidThe virtual serial number is invalid.Use only A-Z and 0-9, at most 64 characters.
400physical_pos.input.bank_terminal_number_invalidThe bank merchant or terminal number is invalid (uppercase letters and digits only).Write the MID and TID with A-Z and 0-9, at most 32 characters.
404physical_pos.record.reference_not_foundThe referenced record was not found.Check the IDs you sent.
409physical_pos.record.already_existsThis record already exists.Read the record; do not repeat the request with a new key.
409physical_pos.record.field_immutableThis field cannot be changed after creation.Do not change this field; create a new record if needed.
409physical_pos.record.interval_conflictThe record was changed by another request at the same time; reload it and try again.Read the record again and retry.
400physical_pos.input.empty_patchThere is no field to update.Send at least one field to change.
400physical_pos.input.filter_invalidA list filter value is invalid; correct the value of the field in details.field.Fix the filter named in details.field.
400physical_pos.input.serial_invalidThe device serial number is invalid.Write the serial number in the vendor's format.
400physical_pos.input.channel_variant_invalidThe integration channel variant is invalid.Use only A-Z, 0-9 and _, at most 32 characters.

Identity and environment

HTTPcodeDescriptionWhat to do
403physical_pos.environment.test_key_read_onlyA TEST API key can only read physical POS records; use a LIVE key or the panel to make changes.Use a live key or the panel for every physical POS write request.
400physical_pos.input.environment_invalidInvalid environment: do not send an environment with an API key; the panel works only with the live environment.Do not send environment in the request; your key determines the environment.
403physical_pos.auth.scope_missingYou do not have the permission required for this physical POS operation.Add the required scope to the key.
403physical_pos.auth.organization_missingThe organization for this request could not be verified.Check that the key is valid; contact support if it persists.
403physical_pos.auth.environment_missingThe environment for this request could not be verified.Check that the key is valid; contact support if it persists.
403physical_pos.auth.actor_missingThe user performing this operation could not be verified.Check that the key is valid; contact support if it persists.

Stores and registers

HTTPcodeDescriptionWhat to do
404physical_pos.store.not_foundStore not found.Check the store ID.
404physical_pos.register.not_foundRegister not found.Check the register ID.
409physical_pos.store.code_takenA store with this code already exists (archived stores keep their codes).Choose another code or restore the archived store.
409physical_pos.store.external_ref_takenA store with this external reference already exists.Use another externalRef.
409physical_pos.store.archivedThe store is archived; reopen the store first.Restore the store first.
409physical_pos.store.has_devicesA store with assigned devices cannot be archived; move the devices to another store, move them to storage, or retire them.Move the devices to another store or register, move them to storage or retire them.
409physical_pos.store.too_many_active_registersThe store has too many active registers to archive at once; archive the registers first.Archive the registers one by one first.
409physical_pos.store.invalid_transitionThe store status cannot be changed this way.Read the current status of the store.
409physical_pos.store.has_active_registersA store with active registers cannot be archived; archive the registers first.Archive the registers first.
409physical_pos.store.has_open_assignmentsA store with assigned devices cannot be archived; move the devices to another store, move them to storage, or retire them.Move the devices to another store or register, move them to storage or retire them.
409physical_pos.register.code_takenA register with this code already exists in this store.Choose another register code in this store.
409physical_pos.register.archivedThe register is archived; reopen the register first.Restore the register first.
409physical_pos.register.has_devicesA register with assigned devices cannot be archived; move the devices to another store or register, move them to storage, or retire them.Move the devices to another store or register, move them to storage or retire them.
409physical_pos.register.invalid_transitionThe register status cannot be changed this way.Read the current status of the register.
409physical_pos.register.has_open_assignmentsA register with assigned devices cannot be archived; move the devices to another store or register, move them to storage, or retire them.Move the devices to another store or register, move them to storage or retire them.
409physical_pos.register.store_archivedA register of an archived store cannot be opened; reopen the store first.Restore the store first.
409physical_pos.device_assignment.target_archivedA device cannot be assigned to an archived store or register.Assign to an active store or register.

Logical terminals, bank rows and device link

HTTPcodeDescriptionWhat to do
404physical_pos.terminal.not_foundTerminal not found.Check the terminal ID and your key's environment.
409physical_pos.terminal.code_takenA terminal with this code already exists.Choose another terminal code in this environment.
409physical_pos.terminal.vendor_ref_takenAn open terminal with this vendor terminal reference already exists.Check the terminal that uses this value.
409physical_pos.terminal.virtual_serial_takenAn open terminal with this virtual serial already exists.Check the terminal that uses this value.
409physical_pos.terminal.closedThe terminal is closed and can no longer be changed.A closed terminal cannot be changed; create a new terminal if needed.
400physical_pos.terminal.vendor_requiredThe terminal must have a vendor for this operation.Assign a vendor to the terminal first, or send vendorCode.
400physical_pos.device.vendor_unknownThe device vendor is not recognised.Use the code of an active vendor in the catalog.
400physical_pos.terminal.device_vendor_mismatchThe terminal and the device belong to different vendors and cannot be linked.Use a device of the terminal's vendor, or assign the device's vendor.
409physical_pos.logical_terminal.invalid_transitionThe terminal status cannot be changed this way.Read the current status of the terminal.
404physical_pos.acquirer.not_foundBank record not found.Check the bank row ID and the environment.
409physical_pos.acquirer.duplicateA record with this bank and terminal number already exists.Use the existing row or reactivate it.
400physical_pos.acquirer.currency_invalidInvalid currency list: ISO 4217 codes, no duplicates, at most 16.Send unique ISO 4217 codes, at most 16.
409physical_pos.terminal.link_conflictThe device is linked to another terminal; that link must be closed first.Unlink the device from the other terminal first.
409physical_pos.terminal.device_already_linkedThe device is already linked to this terminal.Nothing to do; read the terminal.
409physical_pos.terminal.device_not_linkedNo device is linked to this terminal.Nothing to do; read the terminal.
409physical_pos.terminal.environment_mismatchThe terminal and the device must be in the same environment (test / live).Use a device in the same environment as the terminal.

Devices

HTTPcodeDescriptionWhat to do
404physical_pos.device.not_foundDevice not found.Check the device ID and its environment.
404physical_pos.device_model.not_foundDevice model not found.Use a model ID from the catalog.
400physical_pos.device.model_vendor_mismatchThe device model does not belong to the selected vendor.Choose a model of the same vendor as vendorCode.
409physical_pos.device.model_deprecatedThis device model is deprecated; new devices cannot be added with it.Choose an active model.
400physical_pos.device.app_mode_invalidAn app mode can only be set for app-based integration channels (APP2APP, LOCAL_REST).Send appMode only with the APP2APP or LOCAL_REST channel.
409physical_pos.device.serial_takenYou already have a device registered with this serial number.Use the device already registered with this serial.
409physical_pos.device.external_ref_takenThis external reference is already used by another of your devices.Use another externalRef.
409physical_pos.device.already_assignedThe device is already assigned to this store and register.Nothing to do; read the device.
409physical_pos.device.not_assignedThe device is not assigned to any store.Nothing to do; read the device.
409physical_pos.device.invalid_transitionThe device status cannot be changed this way.Read the device's current status.
409physical_pos.device.ownership_unverifiedA device cannot be activated before its ownership is verified.The status of a device with unverified ownership cannot be changed.
409physical_pos.device.identity_activeThe device has an active identity key or an open activation code; revoke the identity first.A device with an active identity cannot be retired.
409physical_pos.device.retiredThe device has been retired; this operation is not possible.A retired device cannot be changed; use another device.

Server

HTTPcodeDescriptionWhat to do
503physical_pos.service.busyThe record is busy with another operation; please retry shortly.Retry the same request after a short wait.
503physical_pos.dependency.unavailableA dependent service is not responding right now; please retry shortly.Retry with backoff.
503physical_pos.service.not_configuredThe physical POS service is currently unavailable. Please try again later.Retry with backoff.
500physical_pos.internal.integrityThe operation cannot be completed right now. Please try again later.Retry with backoff; if it persists, contact support with the requestId.
500physical_pos.gateway.response_invalidAn unexpected response was received from the physical POS service. Please try again later.Retry with backoff; if it persists, contact support with the requestId.

A record that belongs to another organization gets the same 404 as a record that does not exist; malformed IDs get the same answer too. This keeps the existence of records from being inferred from outside.

Platform codes

These codes come from the signature, product, scope, validation and rate-limit layers and are the same across products:

HTTPcodeWhen
400VALIDATION_ERRORUndefined field or query parameter; filter outside its value set; wrong type.
401AUTH_HEADERS_MISSING, INVALID_KID, INVALID_SIGNATURE, NONCE_REPLAY, INVALID_DATE, DIGEST_MISSING, INVALID_DIGESTThe request signature is missing or invalid. → Authentication and Scopes
403IP_NOT_ALLOWED, MERCHANT_SUSPENDEDThe request came from outside the key's IP allowlist, or your account is not active.
403PRODUCT_NOT_ENABLEDThe key lacks the Physical POS product (PHYSICAL_POS).
403API_INSUFFICIENT_SCOPEThe key lacks the endpoint's scope. → Scopes
429RATE_LIMITEDRate limit exceeded; wait for Retry-After. → Rate limits
503PRODUCT_ENTITLEMENT_UNAVAILABLEYour product entitlement could not be verified right now; retry with backoff.
503gateway.downstream_unavailableThe service cannot be reached right now; retry with backoff.
504gateway.downstream_timeoutThe service did not respond in time; retry with backoff. For create requests, reuse the same Idempotency-Key.

Code details: Error Handling › Code dictionary.