Deliveries from Signalist are signed with a secret that only you and Signalist know. Your receiver can use the signature to check that a request came from Signalist and that nobody changed it on the way. New webhooks are signed from the start. A webhook that was created before 14 October 2026 keeps delivering unsigned, as before, until you switch signing on for it (see "Your signing secret"). This article explains how to get your secret, how to check a delivery, and how to rotate the secret. For creating a webhook and for payload formats, see Use API keys and webhooks safely.
Each signed request has these headers:
X-Signalist-Signature: t=<unix seconds>,v1=<hex>: the signature.X-Signalist-Webhook-Id: the webhook that sent it.X-Signalist-Delivery-Id: one id per lead and event. A retry repeats the id and carries a fresh t.Content-Type: application/jsonAn older webhook that has not been switched over sends none of the X-Signalist- headers.
The secret starts with whsec_. Signalist shows it once, in the Webhook created: copy your signing secret dialog right after you create the webhook. Copy it into your receiver. The dialog can only be closed with I have copied the secret.
You lost the secret. Open Integrations → Webhooks, open the row menu (More actions) and choose Rotate secret. Confirm with Rotate. A new secret is shown once.
Your webhook is older than signing. Webhooks created before signing was introduced show Secret not yet viewed in the Signing column. Their deliveries are not signed yet: they are sent exactly as before, without the signature headers, and they stay that way until you switch signing on. You switch it on in one of three ways:
From then on every delivery to that webhook is signed, goes only to a public address and follows no redirect, like a delivery of a new webhook. It does not go back to unsigned delivery. If your current URL redirects to another address, replace it with the address it redirects to before you switch signing on.
t and every v1.whsec_ prefix) as the key, over the string <t>.<raw body>, as lowercase hex.v1 in constant time (for example crypto.timingSafeEqual in Node or hmac.compare_digest in Python). Accept the request if one matches.t is more than 5 minutes away from your clock. This stops replays.X-Signalist-Delivery-Id and ignore a delivery you already processed. A retry repeats it.Answer with a 2xx status to accept a delivery.
A Node example. It accepts a real delivery and rejects a changed body, a wrong secret and a timestamp older than 5 minutes:
import crypto from "node:crypto";
function verify(header, rawBody, secret, now = Date.now() / 1000) {
const parts = header.split(",").map((p) => p.split("="));
const t = parts.find(([k]) => k === "t")?.[1];
const signatures = parts.filter(([k]) => k === "v1").map(([, v]) => v);
if (!t || Math.abs(now - Number(t)) > 300) return false;
const expected = crypto.createHmac("sha256", secret).update(`${t}.${rawBody}`).digest("hex");
return signatures.some(
(s) => s.length === expected.length && crypto.timingSafeEqual(Buffer.from(s), Buffer.from(expected)),
);
}
Choose Rotate secret in the row menu. The old secret keeps working for 24 hours. During that time each request carries two v1 values, the new one first and the old one second, so you can update your receiver at your own pace: accept the request if either value matches. The Signing column shows "Rotating: old secret valid until" and the date.
If you rotate again within those 24 hours, the secret from the first rotation stops working at once.
Rotating the secret of an older webhook also switches it to signed delivery: after rotating, every delivery to it is signed, goes only to a public address and follows no redirect.
In the row menu or in the edit dialog, choose Send test event. Signalist sends a signed sample, marked "event": "test", to your URL. No real lead is sent and nothing is written to your lists. The dialog shows Delivered. or Not delivered., what was sent, and your receiver's answer (the first 500 characters). A test event does not count toward the webhook's delivery status in the table.
| Problem | What to do |
|---|---|
| The signature never matches | Compute it over the raw request body, byte for byte, not over re-serialised JSON. Use the whole secret including whsec_, and the string <t>.<raw body>. |
| The signature matched until today | The secret may have been rotated. During the 24 hours after a rotation a request carries two v1 values. Accept it if either matches, and switch to the new secret. |
| The deliveries of an older webhook carry no signature | The webhook shows Secret not yet viewed and still delivers as before. Choose Reveal secret once or Rotate secret in the row menu, or replace its URL. From then on its deliveries are signed. |
| I lost the secret | Choose Rotate secret in the row menu. |
| Reveal secret once is missing | The secret of a webhook created with signing was shown once, at creation. Choose Rotate secret to get a new one. |
| Send test event says Not delivered | Read your receiver's answer in the dialog. If your receiver checks the signature, make sure it uses the current secret and the raw request body. |
Signalist connects to your own systems in three ways: the API , webhooks that send leads to your endpoint, and the MCP server for AI assistants. All three are under Integrations in the sidebar, in the Developer section.
Compare the same period, list, sender, channel, and campaign before drawing conclusions from activity and replies.
Your contacts and companies live in two places in the sidebar: