Physical POS
API Reference
Catalog

Catalog

Who calls these endpoints?External API (s2s)
Base path
/api/v1/physical-pos
Identity
Ed25519 request signature on every request — X-Key-Id, X-Date, X-Nonce, X-Signature, plus Digest on requests with a body. ±5 min clock window, single-use nonce. A Bearer token or a panel session is not accepted here.
Authorization
The key must carry the Physical POS product (PHYSICAL_POS) and the scope for the endpoints on this page: physical_pos:view. Without the product the call gets 403 PRODUCT_NOT_ENABLED; without the scope 403 API_INSUFFICIENT_SCOPE. See Authentication and Scopes.
Cross-surface
These endpoints are the s2s surface — call them from your own server with a signed request. The same records have screens in the panel, but panel endpoints cannot be called with an API key, and these endpoints cannot be called with a panel session.

The catalog lists the POS vendors, device models and banks usable on physical POS that are defined on the platform. The catalog is shared by all businesses; it is read-only and independent of the environment (test and live keys see the same list).

Catalog endpoints are not paginated: data is an array with the whole list. → Common Rules › Response envelope

Vendors

GET /api/v1/physical-pos/catalog/vendors

Takes no query parameters; an undefined parameter returns 400 VALIDATION_ERROR. The list returns every vendor, including disabled ones, ordered by code.

source lunixi-sign.sh
REQ_PATH="/api/v1/physical-pos/catalog/vendors"
lunixi_sign GET "$REQ_PATH"
 
curl "https://api-gateway.lunixi.com$REQ_PATH" \
  -H "X-Key-Id: $LUNIXI_KEY_ID" \
  -H "X-Date: $DATE" \
  -H "X-Nonce: $NONCE" \
  -H "X-Signature: $SIGNATURE"

lunixi-sign.sh: Authentication › Signing helper.

{
  "status": "success",
  "code": "SUCCESS",
  "data": [
    {
      "code": "PAVO",
      "displayName": "Pavo",
      "status": "ACTIVE",
      "fallbackImage": {
        "assetId": "00000000-0000-4000-8000-000000000a01",
        "url": "https://img.lunixi.com/00000000-0000-4000-8000-000000000a01"
      }
    },
    {
      "code": "PLUSPAY",
      "displayName": "PlusPay",
      "status": "ACTIVE",
      "fallbackImage": null
    }
  ],
  "statusCode": 200,
  "requestId": "00000000-0000-0000-0000-000000000000"
}
FieldTypeDescription
codestringVendor code. You put this value in vendorCode when creating a terminal.
displayNamestringVendor display name.
statusstringACTIVE or DISABLED. A disabled vendor cannot be used on a new terminal.
fallbackImageobject | nullThe vendor's fallback image, shown when a model has no image of its own. → Image object

Device models

GET /api/v1/physical-pos/catalog/device-models

Query parameterTypeDescription
vendorCodestringOnly this vendor's models. Case-insensitive. A well-formed code that is not in the catalog returns an empty list; a malformed code returns 400 physical_pos.input.filter_invalid.
deviceTypestringPHYSICAL or SOFTPOS.
statusstringACTIVE or DEPRECATED. If omitted, both are returned.

If deviceType or status is outside its set (case-sensitive), the request gets 400 physical_pos.input.filter_invalid; details.field names the filter.

source lunixi-sign.sh
REQ_PATH="/api/v1/physical-pos/catalog/device-models?vendorCode=PAVO&status=ACTIVE"
lunixi_sign GET "$REQ_PATH"
 
curl "https://api-gateway.lunixi.com$REQ_PATH" \
  -H "X-Key-Id: $LUNIXI_KEY_ID" \
  -H "X-Date: $DATE" \
  -H "X-Nonce: $NONCE" \
  -H "X-Signature: $SIGNATURE"
{
  "status": "success",
  "code": "SUCCESS",
  "data": [
    {
      "id": "00000000-0000-4000-8000-000000000b01",
      "vendorCode": "PAVO",
      "modelCode": "EXAMPLE-M1",
      "displayName": "Example Model M1",
      "deviceType": "PHYSICAL",
      "formFactor": "COUNTERTOP",
      "fiscalCapable": true,
      "status": "ACTIVE",
      "image": {
        "assetId": "00000000-0000-4000-8000-000000000a02",
        "url": "https://img.lunixi.com/00000000-0000-4000-8000-000000000a02"
      },
      "vendorFallbackImage": {
        "assetId": "00000000-0000-4000-8000-000000000a01",
        "url": "https://img.lunixi.com/00000000-0000-4000-8000-000000000a01"
      }
    }
  ],
  "statusCode": 200,
  "requestId": "00000000-0000-0000-0000-000000000000"
}
FieldTypeDescription
idstring (UUID)Model ID.
vendorCodestringCode of the model's vendor.
modelCodestringModel code within the vendor.
displayNamestringModel display name.
deviceTypestringPHYSICAL: dedicated POS hardware. SOFTPOS: a mobile device that accepts cards.
formFactorstringCOUNTERTOP, PORTABLE, MOBILE, UNATTENDED (e.g. kiosk) or PINPAD.
fiscalCapablebooleantrue if the model can be used as a fiscal device (electronic cash register).
statusstringACTIVE or DEPRECATED. A DEPRECATED model stays in the catalog but should not be chosen for new installations.
imageobject | nullThe model's own image. → Image object
vendorFallbackImageobject | nullThe vendor's fallback image (same as fallbackImage in the vendor list).

Banks

GET /api/v1/physical-pos/catalog/acquirers

Takes no query parameters; an undefined parameter returns 400 VALIDATION_ERROR. The list returns only active banks, ordered by acquirerCode.

source lunixi-sign.sh
REQ_PATH="/api/v1/physical-pos/catalog/acquirers"
lunixi_sign GET "$REQ_PATH"
 
curl "https://api-gateway.lunixi.com$REQ_PATH" \
  -H "X-Key-Id: $LUNIXI_KEY_ID" \
  -H "X-Date: $DATE" \
  -H "X-Nonce: $NONCE" \
  -H "X-Signature: $SIGNATURE"
{
  "status": "success",
  "code": "SUCCESS",
  "data": [
    { "acquirerCode": "0000", "providerCode": "EXAMPLEBANK", "displayName": "Example Bank" }
  ],
  "statusCode": 200,
  "requestId": "00000000-0000-0000-0000-000000000000"
}
FieldTypeDescription
acquirerCodestringThe bank's four-digit bank code. The acquirerCode field on a terminal's bank rows carries this value.
providerCodestringThe provider code Lunixi uses for this bank.
displayNamestringBank display name.

When you add a bank row you identify the bank not by acquirerCode but by the code the POS vendor gives the bank (vendorAcquirerRef); Lunixi maps that code to the bank in the catalog. → Bank Rows

Image object

Images are always returned as an { assetId, url } object; when there is no image the field is null.

FieldTypeDescription
assetIdstring (UUID)Image ID. A replaced image gets a new ID, so you can use it as a cache key.
urlstringThe image's public https address. Use the address as is; do not build it yourself.

Images are PNG, JPEG or WebP. When showing a model, we recommend this order: image → vendorFallbackImage → your own generic image (by device type and form factor).

Errors

HTTPcodeWhen
400VALIDATION_ERRORUndefined query parameter.
400physical_pos.input.filter_invalidInvalid vendorCode, deviceType or status filter.
400physical_pos.input.environment_invalidenvironment was sent in the query.
403PRODUCT_NOT_ENABLED / API_INSUFFICIENT_SCOPEThe key lacks the product or physical_pos:view.

All codes: Error Codes.