The request
Every delivery is aPOST with a JSON body.
data carries ids and immutable values, not full records. Fetch the record if
you need its current state – the payload is a fact about a moment, not a snapshot of
your database.Headers
Verifying the signature
Each endpoint has its own signing secret, shown once when you create it and again when you rotate it.1
Read the header
Split
X-TimeTracker-Signature on the comma. You get t=<timestamp> and
v1=<hex>.2
Build the signed string
Join the timestamp and the raw request body with a full stop:
<t>.<raw body>. Use the bytes exactly as received – do not re-serialise the
JSON, or the signature will not match.3
Compute the HMAC
HMAC-SHA256 the signed string with your endpoint secret, hex-encoded.
4
Compare
Compare against the
v1 value using a constant-time comparison.Deduplicate on deliveryId
Delivery is at least once. The same logical event can arrive twice – after a
network timeout, or when someone resends it by hand.
deliveryId is stable for a given event and endpoint. Store it and ignore a repeat.
Event names
Names arearea.event. Sixty-six events are published today.
Timesheets
Time Clock
Time off
Expenses
Invoices and payments
Tasks
Projects
People and access
Client portal
Reminders and comms
Billing, security and exports
Filtering what you receive
An endpoint with no filters receives every event. Otherwise you pick from these categories, and an event matches if its own name or its category is in your list.Endpoint rules
Retries and failures
Return a
2xx quickly. Do your own work after you have acknowledged, not before.
Delivery states you see in the app
The endpoint itself shows Active, Failing or Disabled.
When the app is off
Switching the Webhooks & API app off stops deliveries. Events raised while it is off are queued, not dropped, and deliver when you switch it back on. Expect a burst after a long pause.Permissions
Webhooks also need the Webhooks & API app switched on and a Pro plan.
Common questions
Can I see my secret again later?
Can I see my secret again later?
No. The secret is shown once, when you create the endpoint or rotate it. Store it
somewhere safe. If you lose it, rotate to get a new one.
Why did my signature check fail?
Why did my signature check fail?
Almost always because the body was re-serialised before signing. Sign the raw
bytes exactly as received. The second cause is a timestamp tolerance that is too
narrow for retries.
Why was my endpoint disabled?
Why was my endpoint disabled?
Twenty consecutive failed deliveries. Fix the endpoint, then re-enable it in
Settings → Webhooks.
Can I send events to localhost while testing?
Can I send events to localhost while testing?
No. Private and loopback addresses are refused. Use a public HTTPS tunnel.
How do I test an endpoint?
How do I test an endpoint?
Send a test delivery from the endpoint’s row in Settings → Webhooks. It uses the
same signing and the same headers as a real event.
Related guides
Webhooks
Setting one up, step by step.
Webhook settings
The screen itself.
Notification types
The same events as in-app and email notices.
Integrations
Everything TimeTracker connects to.