Authentication
Requests are authenticated per POS terminal. Each terminal is issued an apiKey (a shared secret) when it is created. The secret is never transmitted, it only signs requests, which gives integrity and replay-attack protection.
A signed request carries two extra fields inside params:
ts, Unix timestamp in milliseconds when the request was created.signature, hex-encoded HMAC of the request payload.
Computing the signature (client side):
- Take the request
paramsobject and remove thesignaturefield. - Sort the remaining entries by key (ascending) and serialize with
JSON.stringify, this is the canonical message. signature = HMAC-SHA256(key = terminal apiKey, message = canonical JSON), hex-encoded.
Validation (server side):
- The server resolves the terminal, recomputes the HMAC and rejects the request unless it equals
signature. tsmust be at most 60s in the future and no older than 5 minutes.