Skip to main content
Webhooks send your booking updates to a URL as they happen, so you don’t have to poll GET /bookings. They’re a Pro feature: deliveries go out while the Tikk account is on Pro.

Set up a webhook

You create webhooks through the API with POST /webhooks. The credential needs webhooks.write and bookings.read, because every delivery carries the full booking.
A credential only sees the webhooks it created. Webhooks created with an API key appear under Settings → API Keys, where the account owner can remove them. Webhooks created by a partner app aren’t listed there; disconnecting the app removes them. Revoking an API key removes its webhooks too.

Events

A paid booking is only confirmed once it’s paid. If the payment fails, you receive booking.cancelled for a booking you never saw confirmed. Group sessions send one event per booked seat.

Payload

Each delivery is a POST with a JSON body. data.booking has the same shape as GET /bookings/{id}, as it was at the moment of the event.
previous_scheduled_at is only included on booking.rescheduled. Every delivery carries these headers:

Verify the signature

Every delivery has a Tikk-Signature header:
t is when Tikk sent the request. v1 is an HMAC-SHA256 of t, a dot and the raw request body, signed with your webhook secret. To check a delivery, compute the same HMAC and compare it to v1. Then reject requests older than a few minutes, so a captured request can’t be replayed. Your secret is the signing_secret returned by POST /webhooks if you use an API key, or your app’s webhook signing secret from the developer portal if you’re a partner app.
Use the raw body, before your framework parses the JSON: re-encoded JSON won’t match. When a partner app rotates its secret, the header carries a v1 for the old and the new secret for 24 hours, which is why the examples accept any matching v1.

Respond and retry

  • Answer with any 2xx within 10 seconds. Do slow work after you respond.
  • 408, 429, 5xx, timeouts and connection errors are retried: after 1 minute, 5 minutes, 30 minutes, 2 hours, 6 hours and 12 hours.
  • Any other response is final for that event. Answering 410 Gone also switches the webhook off.
  • Redirects are not followed. Use the final URL.
Delivery is at least once and unordered. The same event can arrive twice, and a later event can arrive before an earlier one. Deduplicate on Tikk-Webhook-Id, order by created_at, and fetch GET /bookings/{id} when you need the current state. After 5 events in a row fail for good, the webhook is switched off and the account owner is emailed. Fix your endpoint, then switch it back on with PATCH /webhooks/{id} and {"active": true}, which also clears the failure count.

URL rules

The URL must use HTTPS and resolve only to public addresses. Tikk refuses:
  • private, loopback, link-local and other reserved IP ranges, in IPv4 and IPv6
  • hostnames like localhost or *.internal, and Tikk’s own domains
  • URLs with a username, password or fragment
The URL is checked when you save it and again before every delivery, so a hostname that later resolves to a private address stops receiving. To test locally, expose your machine through a tunnel such as ngrok or Cloudflare Tunnel.

Plans

Webhooks need Pro on the Tikk account they belong to. On Free, the webhook endpoints return plan_required. If the account downgrades, its webhooks pause: nothing is sent and nothing is deleted. Deliveries resume after an upgrade, but events from the paused period aren’t replayed.