Get started
Webhooks
Get notified when async publishing jobs settle — no polling required.
Pass webhookUrl when creating a publishing job and LynCut POSTs a signed event to your endpoint when the job reaches a terminal state (COMPLETED, FAILED, or CANCELLED).
Payload
POST your webhookUrljson
{
"type": "publishing.job.completed",
"data": {
"id": "job_8f2",
"status": "COMPLETED",
"connectionId": "con_9f3a",
"providerUrl": "https://youtu.be/dQw4w9WgXcQ",
"completedAt": "2026-09-23T15:34:10.000Z"
}
}Verifying signatures
Every delivery is signed with your webhook secret. Verify before trusting the payload:
| Header | Meaning |
|---|---|
| X-LynCut-Event | Event type, e.g. publishing.job.completed |
| X-LynCut-Delivery | Unique delivery id — dedupe on this |
| X-LynCut-Signature | HMAC-SHA256 of the raw body, hex-encoded |
Verify in Node.jsts
import { createHmac, timingSafeEqual } from "node:crypto";
const sig = req.headers["x-lyncut-signature"];
const expected = createHmac("sha256", WEBHOOK_SECRET)
.update(rawBody)
.digest("hex");
if (!timingSafeEqual(Buffer.from(sig), Buffer.from(expected))) {
return res.status(401).end();
}Retries
- Respond 2xx within 10 seconds — anything else counts as a failed delivery.
- Failed deliveries retry up to 5 times with exponential backoff over ~1 hour.
- Dedupe on X-LynCut-Delivery — retries of the same event share the delivery id.
- Events are at-least-once; make your handler idempotent.
Was this page helpful?
