Skip to main content
Register an endpoint and KeyPair posts an event the moment something happens — a deposit clears, a withdrawal lands, reconciliation finds drift — instead of you polling for it.

The envelope

Every delivery has the same shape:

Verify the signature

Signed over the raw request body — re-serialising the parsed JSON changes the bytes and breaks the check:
Verify against the raw bytes your framework received, before any JSON parsing. Most frameworks parse the body before your handler runs by default — you likely need to opt into the raw body for this route specifically.

Deduplicate

Delivery is at-least-once. Key your dedup on x-keypair-delivery (also present as the event’s id), not on the event type plus timestamp — a redelivered event reuses the same id.

Respond fast

Return 2xx as soon as you’ve durably queued the event — do the actual work afterward. Anything else is treated as a failed attempt and retried with backoff.

Every event and its payload