Each endpoint page shows which method it uses in a note at the top.
Your access ID must belong to an API key that is linked to an outlet (agent).
Requests made with a key that has no outlet are rejected with
401 INVALID_REQUEST_SIGNATURE,
on both Signed and Basic endpoints.Basic (Access ID) Authentication
Payment and System endpoints (/v1/api/payment/* and /v1/api/system/*) only require your access ID:
Signed (HMAC) Authentication
All other endpoints require an HMAC-SHA256 signature. Each request must include these headers:What is signed
The signature covers a JSON string built from the three header values, with the keys in exactly this order and no whitespace:JSON.stringify({ timeStamp, requestId, accessId }). Use the exact strings you send in the headers: if you sign one timestamp and send another, the signature won’t match.
Signature algorithm
+, / and = padding), not hex and not URL-safe Base64.
Signed request example
Each example below signs a request and registers a webhook withPOST /v1/api/webhook.
Authentication errors
Authentication failures use the standard error envelope.
Example:
Troubleshooting INVALID_REQUEST_SIGNATURE
- Check your clock. Sync your server with NTP; a drift of more than 5 minutes fails every request.
- Sign the exact header values. Build the timestamp once and use the same string in the header and in the signed JSON.
- Check the JSON string. It must be
{"timeStamp":…,"requestId":…,"accessId":…}in that order, with no spaces. In Python useseparators=(',', ':'). - Use Base64, not hex. In Node.js,
digest('base64'); in PHP, passtrueas the fourth argument tohash_hmacbefore Base64-encoding. - Use the right environment. Sandbox credentials only work against
https://sandbox-api.tender.cash, and production credentials only againsthttps://secureapi.tender.cash.
Important notes
- Keep your Access Secret secure. Never expose it in client-side code or public repositories.
- Generate a new request ID (UUID v4) for every request.
- Rate limits apply per merchant. See Rate limits.
- Payout requests need an
Idempotency-Keyheader in addition to the signed headers. See Idempotency.