Physical POS
API Reference
Overview Counts

Overview Counts

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.

Returns summary counts of your physical POS records in one request. A test key can call this endpoint too.

GET /api/v1/physical-pos/overview

Takes no query parameters; an undefined parameter returns 400 VALIDATION_ERROR and environment returns 400 physical_pos.input.environment_invalid. Your key determines the environment.

source lunixi-sign.sh
REQ_PATH="/api/v1/physical-pos/overview"
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": {
    "overview": {
      "stores": { "active": 12, "archived": 2 },
      "registers": { "active": 31, "archived": 4 },
      "terminals": { "environment": "LIVE", "open": 28, "closed": 3 },
      "devices": {
        "environment": "LIVE",
        "total": 35,
        "active": 0,
        "pending": 33,
        "suspended": 0,
        "maintenance": 0,
        "retired": 2,
        "unverified": 33
      },
      "transactions": null,
      "generatedAt": "2026-01-10T09:00:00.000Z"
    }
  },
  "statusCode": 200,
  "requestId": "00000000-0000-0000-0000-000000000000"
}
FieldTypeDescription
stores.activeintegerNumber of ACTIVE stores. Environment-less; test and live keys see the same number.
stores.archivedintegerNumber of ARCHIVED stores.
registers.activeintegerNumber of ACTIVE registers. Environment-less.
registers.archivedintegerNumber of ARCHIVED registers.
terminals.environmentstringThe environment the terminal counts belong to: your key's environment (TEST or LIVE).
terminals.openintegerNumber of terminals in this environment that are not closed (ACTIVE and SUSPENDED).
terminals.closedintegerNumber of CLOSED terminals in this environment.
devices.environmentstringThe environment the device counts belong to: your key's environment.
devices.totalintegerAll devices in this environment (retired included).
devices.activeintegerNumber of ACTIVE devices.
devices.pendingintegerNumber of PENDING devices.
devices.suspendedintegerNumber of SUSPENDED devices.
devices.maintenanceintegerNumber of MAINTENANCE devices.
devices.retiredintegerNumber of RETIRED devices.
devices.unverifiedintegerNumber of devices with unverified ownership that are not retired.
transactionsnullAlways null.
generatedAtstringThe moment the counts were taken.
  • All counts are read at the same moment and are consistent with each other.
  • Counts are not cached: a request right after you create, archive or close a record sees the new count.

Do not interpret transactions as 0. New fields and values may be added to responses; your code should ignore fields it does not recognize.

Errors

HTTPcodeWhen
403PRODUCT_NOT_ENABLEDThe key lacks the Physical POS product.
403API_INSUFFICIENT_SCOPEThe key lacks physical_pos:view.
400physical_pos.input.environment_invalidenvironment was sent in the query.
400VALIDATION_ERRORUndefined query parameter.

All codes: Error Codes.