Skip to main content
Lancer sends a signed POST to your URL whenever an event you subscribed to happens. Use it to feed n8n, Make, a data warehouse or your own backend without polling.

Set up a webhook

1

Add the endpoint

Settings → API and webhooks (“API ו-Webhooks”) → Outgoing webhooks (“Webhooks יוצאים”) → New webhook. Paste an HTTPS URL that is reachable from the public internet (internal and private addresses are rejected) and pick the events.
2

Copy the signing secret

Each webhook gets its own secret (whsec_…), visible on the webhook’s card. Store it with your endpoint’s config.
3

Send a test

Test sends a ping event and shows the response code. The card also lists the last 100 deliveries, with status, response code and error, and lets you retry one by hand.

Events

data carries the same record the Lancer app works with, so it can include more fields than the public API returns. Rely on id and the fields you need, and ignore unknown fields: new ones are added without notice.

The request

string
The delivery id, the same as X-Lancer-Delivery. Retries keep the same id: use it to de-duplicate.
string
The event name.
string
When the event happened (ISO 8601, UTC).
string
The organization the event belongs to.
object
The event’s payload, see the table above.

Verify the signature

The signature is an HMAC-SHA256 over the timestamp, a dot and the raw request body, keyed with the webhook’s secret, hex encoded and prefixed with sha256=:
To accept a delivery:
  1. Recompute the signature from the raw bytes of the body (not a re-serialised JSON object).
  2. Compare it to the header in constant time.
  3. Reject timestamps more than 5 minutes away from your clock, to stop replays.
Frameworks that parse JSON before your handler runs (Express’s express.json(), Next.js API routes, many serverless platforms) give you an object, not the original bytes. Re-serialising it usually produces the same string because Lancer sends JSON.stringify output with no extra whitespace, but don’t rely on that: read the raw body.

Delivery and retries

  • Answer with any 2xx within 10 seconds. Anything else (another status, a timeout, a redirect, a connection error) counts as a failure. Redirects are not followed.
  • A failed delivery is retried after 1, 5, 30, 120 and 720 minutes. After the last retry fails it is marked “נכשל סופית” (exhausted) and you can still retry it by hand from the webhook’s card.
  • Deliveries can arrive more than once and out of order. De-duplicate on id and, when order matters, re-read the current state from the API.
  • Do slow work in the background: acknowledge first, process after.
Building on n8n or Make? The n8n template already verifies the signature for you.