POST containing the event envelope.
Read the original request body as bytes before JSON middleware changes it.
Get your signing secret
Finosu provides the endpoint’s signing secret when it is created or rotated. Store it in a secret manager or server environment variable. It is not your API key and must not appear in browser code or logs.Request headers
The signature covers the timestamp and raw body, not the other headers. Verify
company and environment using the signed body and use its
id for event-level
deduplication. If using a header identifier, confirm it matches the body or store
it alongside the verified event identity. A bearer token does not replace
signature verification.
Verify the signature
- Extract
tandv1fromX-Finosu-Signature. - Reject malformed headers and timestamps outside your tolerance. Five minutes is a suggested receiver policy, not a sender-enforced setting. Check both old and future timestamps and keep your server clock synchronized.
- Compute HMAC-SHA256 using the signing secret’s UTF-8 bytes as the key. The signed message is the ASCII timestamp, a period, and the original request-body bytes. Do not base64-decode the secret or parse/re-serialize the JSON before verifying.
- Compare the hexadecimal digest in constant time. Only then parse and process the JSON.
verification.py. The
quickstart imports this function in a working
test receiver. Business events also need durable acceptance.
Troubleshooting
See delivery and retries for acknowledgment,
deduplication, and recovery behavior.