/orders request carries an HMAC-SHA256 signature over a canonical
string. The catalogue is open; everything else is signed. The secret never
travels.
Credentials
Both halves are replaced together on rotation. A key carries a fixed set of
scopes, so polling and retrieval can use different keys.
Request headers
The canonical string
Four components, joined by a single newline. Nothing else is signed.Four rules decide whether it verifies
Worked example
Secretwhsec_example_do_not_use, timestamp 1758470400. These values are
reproducible — run your signer against them before sending a real request.
POST with a body
GET with no body
Reference implementation
Clock skew and replay
Because the timestamp is whole seconds, two identical replay-protected requests
inside the same second produce the same signature and the second is refused.
Space them, or let the retry carry a fresh timestamp.
Scopes
Authentication failures
The first two are deliberately indistinguishable in several cases: an unknown
key, a revoked key and a bad signature all answer alike, so an attacker learns
nothing about which half was wrong. Both mean fix the credential or the signing
code.