Skip to main content
Every /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

Secret whsec_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.