Verifying Striker webhooks

Striker can send events about your conversations to your own systems: a CRM, Zapier, Microsoft Teams or your own code. You add endpoints in the console under Setup, Developer webhooks. This page explains what Striker sends, how your endpoint proves it's ready for Striker's data, and how to check that a request really came from Striker.

What Striker sends

Each event is an HTTPS POST with a JSON body like this:

{"id": "evt_123", "type": "escalation.created", "created_at": "2026-11-08T10:15:00Z", "tenant_id": "…", "test": false, "data": {…}}

Verify your endpoint

A new endpoint gets nothing, not even test events, until it proves it expects Striker's data. Striker checks it straight after you add it, and again whenever you press Verify in the console.

What Striker sends: one signed POST, with the same headers as every event, whose body is like this:

{"id": "evt_verify_1762851600", "type": "endpoint.verify", "created_at": "2026-11-11T09:00:00Z", "tenant_id": "…", "test": true, "data": {"challenge": "q3Vx…"}}

How to answer:

  1. Check the signature as below (when you first add the endpoint your server may not have the secret yet: add the secret, then press Verify).
  2. Reply with a 2xx status within 10 seconds, with the challenge value as the body: either JSON {"challenge": "<the value>"} or the value on its own as plain text.
  3. Keep the answer short (under 1 KB) and don't redirect.

In Python (Flask), after checking the signature:

In Node.js (Express), after checking the signature:

The console shows Verified once it passes, or why it didn't (for example HTTP 404 or "the answer didn't include the code"). Endpoints added before verification existed keep receiving events; the console marks them Not verified so you can verify them too.

Headers

Checking the signature

Your signing secret starts with whsec_. The console shows it once, when you add the endpoint or rotate the secret. Keep it on your server only.

  1. Read the raw request body exactly as received, before any JSON parsing.
  2. Join the X-Timestamp value, a full stop, and the raw body: {timestamp}.{body}.
  3. Compute the HMAC-SHA256 of that string with your signing secret as the key, and write it as lowercase hex.
  4. Compare sha256= plus your result with the X-Signature-256 header, using a constant-time comparison.
  5. Reject the request if the timestamp is more than 5 minutes away from your server's clock. This stops someone replaying an old request.

In Python:

In Node.js:

Responding

Who is told

When anyone adds an endpoint, changes its events or its message text setting, or deletes it, Striker posts a system notice saying who did it and where the data goes. It also reaches your Slack alerts channel, if you have one, so the other admins know.

Rotating the secret

Press Rotate secret in the console. The new secret works straight away and the old one stops, so update your server at the same time.

Questions: support@hoshoai.com.