Webhooks

Subscribe an endpoint to events. We sign every delivery; verify it before trusting anything.

Your endpoint

Must be https, and must not resolve to a private network. We refuse those when you subscribe rather than when we deliver, so you find out while you are looking at the form.

Verifying a delivery

Headers: tryme-event-id, tryme-event-type, tryme-signature.

The signature is t=<seconds>,v1=<hex>, an HMAC-SHA256 over timestamp + "." + rawBody using your signing secret. Verify the raw bytes: parsing and re-serialising changes key order, and the signature is over what we sent.

const [t, v1] = header.split(',').map((p) => p.split('=')[1]);
const expected = hmacSha256Hex(secret, `${t}.${rawBody}`);
if (!timingSafeEqual(expected, v1)) return reject();
if (Math.abs(Date.now() / 1000 - Number(t)) > 300) return reject();

Check the timestamp too. Verifying the body alone leaves a captured request replayable for as long as your secret lives.

Delivery is at-least-once

You will eventually see the same event twice. Deduplicate on tryme-event-id: a handler that ships a sample without checking will one day ship two.

Retries

Any 2xx is success. Anything else is retried 6 times over roughly 19 hours, then given up on. Redirects are not followed. After enough consecutive failures a subscription is disabled, and we tell you why rather than going quiet.