secret is returned exactly once, at creation. Store it before you close the response — there
is no endpoint to read it back. If you lose it, delete the endpoint and create a new one.
A tracked entity’s record was refreshed, regardless of whether it moved
entity.refreshed is high volume by design — it fires on every refresh of every entity in a
tracked list. Subscribe to it only if you are mirroring records into your own store; for
“tell me when something changed”, use tracker.triggered.
Payloads carry identifiers and summaries, not full result sets. Fetch the data with the ID —
that keeps deliveries small and means a replayed event cannot hand you stale records.
Sign the raw body. Verify before any JSON parsing or re-serialization. A framework that
re-encodes the body changes the bytes and breaks the signature.
Compare in constant time.hmac.compare_digest and timingSafeEqual, never ==.
Enforce the timestamp window. Without it, a captured delivery stays valid forever.
Return a 2xx within 10 seconds. Anything else — including a timeout — counts as a failure.
@app.post("/webhooks/unif")def handle(request): if not verify(request.get_data(), request.headers["Unif-Signature"], SECRET): return "", 401 queue.enqueue(process_event, request.get_json()) # do the work elsewhere return "", 200
Acknowledge first, process asynchronously. Doing real work inside the handler is how endpoints end
up timing out, which turns a delivered event into a retried one.
Failed deliveries retry with exponential backoff over 24 hours: after 10s, 1m, 5m, 30m, 2h, 6h and
12h. After that the event is dropped, and the endpoint is disabled automatically if every delivery
fails for 72 hours straight.
Retries mean at-least-once delivery, and events can arrive out of order. Deduplicate on
event.id, and use created_at to discard an event older than one you have already applied.
if redis.set(f"unif:evt:{event['id']}", 1, nx=True, ex=86400) is None: return "", 200 # already handled
If you cannot expose one — a local environment, or a network that will not allow inbound traffic —
poll instead. GET /jobs?status=completed is the supported fallback, and
trackers can be read with GET /trackers/{id} for last_run_at.
Polling costs more and tells you later, but nothing else changes.
Was this page helpful?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Unif","description":"One schema for commerce data across every channel.","colors":{"primary":"#15803D","light":"#3ECD75","dark":"#15803D"},"logo":{"light":"https://mintcdn.com/unifdev/t6BPluVf4xKZ3_nf/logo/light.svg?fit=max\u0026auto=format\u0026n=t6BPluVf4xKZ3_nf\u0026q=85\u0026s=b9b4ff2d35ee8ff9cb9ccef766d4b839","dark":"https://mintcdn.com/unifdev/t6BPluVf4xKZ3_nf/logo/dark.svg?fit=max\u0026auto=format\u0026n=t6BPluVf4xKZ3_nf\u0026q=85\u0026s=60f1adbd68708a9930e9234f8db92815","href":"/"},"favicon":"https://mintcdn.com/unifdev/t6BPluVf4xKZ3_nf/favicon.svg?fit=max\u0026auto=format\u0026n=t6BPluVf4xKZ3_nf\u0026q=85\u0026s=eaf2ff555b5275e691ac9f1f2c25514b","api":{"params":{"expanded":"all"},"examples":{"defaults":"all","prefill":true,"autogenerate":true},"url":"full","mdx":{"auth":{"method":"bearer"}}},"appearance":{"default":"dark"},"navbar":{"links":[{"href":"mailto:[email protected]","label":"Support"}],"primary":{"type":"button","label":"Dashboard","href":"https://app.unif.dev"}},"footer":{"links":[{"header":"Product","items":[{"label":"Quickstart","href":"/docs/quickstart"},{"label":"API reference","href":"/api-reference/introduction"},{"label":"Changelog","href":"/changelog"}]},{"header":"Concepts","items":[{"label":"Unified model","href":"/docs/concepts/unified-model"},{"label":"Entities","href":"/docs/concepts/entities"},{"label":"Coverage","href":"/docs/concepts/coverage"}]},{"header":"Support","items":[{"label":"Contact","href":"mailto:[email protected]"},{"label":"Dashboard","href":"https://app.unif.dev"}]}]},"seo":{"metatags":{"og:site_name":"Unif"}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"markdown":{"schema":true},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"unifdev","hasAudioNarration":false,"actualSubdomain":"unifdev","customDomains":["unif.dev"],"gitSource":{"type":"github","owner":"winsloop","repo":"unif","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"latestBuiltDeploymentHistoryId":"6aa9f54cdd8d74ee1feb94f8","collectionId":"20eff3fc-1a7b-44dc-9539-384bd7c9b040","liveDeploymentHistoryId":"6aa9f54cdd8d74ee1feb94f8","schemaVersion":"v3"},"feedback":{"thumbs":true,"edits":false,"issues":false},"entitlements":{"AI_CHAT":{"status":"DISABLED"},"WEB_MCP":{"status":"DISABLED"},"NARRATION":{"status":"DISABLED"}},"buildId":"6aa9f966df0e3365e72e777d","clientVersion":"0.0.4044","searchFilterCounts":[{"language":"default","tag":"API reference","count":48},{"language":"default","tag":"Documentation","count":30},{"language":"default","tag":"Core concepts","count":8},{"language":"default","tag":"Platform","count":7},{"language":"default","tag":"Lists","count":7},{"language":"default","tag":"Workflows","count":6},{"language":"default","tag":"Guides","count":5},{"language":"default","tag":"Jobs","count":5},{"language":"default","tag":"Webhooks","count":5},{"language":"default","tag":"Creators","count":4}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":":root{--u-mono:var(--font-mono, ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, monospace);--u-bg:#ffffff;--u-bg-subtle:#f7f8f7;--u-bg-raised:#ffffff;--u-border:#e4e7e4;--u-border-strong:#d2d7d2;--u-text:#10201a;--u-text-muted:#5b6b63;--u-text-faint:#66736d;--u-accent:#15803d;--u-accent-strong:#0f5c2c;--u-accent-wash:#eefcf3;--u-on-accent:#ffffff;--u-neg:#a63d28;--u-line-up:#15803d;--u-line-down:#b4452f;--u-line-flat:#858f8a;--u-warn-bg:#fef6e7;--u-warn-text:#8a5a08;--u-off-bg:#f2f4f3;--u-off-text:#606d67;--u-shadow:0 1px 2px rgba(16, 32, 26, 0.04), 0 14px 34px -18px rgba(16, 32, 26, 0.2);--u-d-bg:#0c1512;--u-d-raised:#101b17;--u-d-border:#263631;--u-d-border-soft:#1f2e28;--u-d-text:#e8efeb;--u-d-muted:#8fa49b;--u-d-label:#7a8f86;--u-d-faint:#75857e;--u-d-code:#9fb3aa;--u-d-code-key:#d4e0da;--u-d-accent:#3ecd75;--u-d-on-accent:#07140d}.dark{--u-bg:#0a0f0d;--u-bg-subtle:#0f1613;--u-bg-raised:#121a17;--u-border:#1e2825;--u-border-strong:#2b3733;--u-text:#eef2f0;--u-text-muted:#9aaaa3;--u-text-faint:#8a9a93;--u-accent:#3ecd75;--u-accent-strong:#5fdc8d;--u-accent-wash:#0f2418;--u-on-accent:#071310;--u-neg:#f08c72;--u-line-up:#3ecd75;--u-line-down:#f08c72;--u-line-flat:#7c8c86;--u-warn-bg:#2a2110;--u-warn-text:#e8bd6a;--u-off-bg:#151d1a;--u-off-text:#9aaaa3;--u-shadow:0 1px 2px rgba(0, 0, 0, 0.3), 0 14px 34px -18px rgba(0, 0, 0, 0.6);--u-d-bg:#101a16;--u-d-raised:#16211c}.u-page p,.u-panel-body pre{margin:0}.u-page{color:var(--u-text);font-size:16px;line-height:1.6}.u-section{max-width:1160px;margin:0 auto;padding:92px 24px}.u-band{border-top:1px solid var(--u-border);border-bottom:1px solid var(--u-border);background:var(--u-bg-subtle)}.u-band--dark{background:var(--u-d-bg);border-color:transparent;color:var(--u-d-text)}.u-strip{border-top:1px solid var(--u-border);border-bottom:1px solid var(--u-border);background:var(--u-bg)}.u-strip-inner{max-width:1160px;margin:0 auto;padding:30px 24px;display:flex;align-items:center;gap:26px;flex-wrap:wrap}.u-strip-label{flex:none;font-family:var(--u-mono);font-size:11.5px;letter-spacing:.09em;color:var(--u-text-faint)}.u-strip-note{flex-grow:1;min-width:230px;font-size:14px;line-height:1.55;color:var(--u-text-faint);text-align:right}.u-eyebrow{display:flex;align-items:center;flex-wrap:wrap;gap:12px;font-family:var(--u-mono);font-size:12px;letter-spacing:.1em;color:var(--u-text-muted);margin-bottom:28px}.u-eyebrow-live{display:inline-flex;align-items:center;gap:7px;color:var(--u-accent-strong)}.u-eyebrow-sep{color:var(--u-border-strong)}.u-dot{width:6px;height:6px;border-radius:50%;background:var(--u-accent);flex:none}.u-h1,.u-h2{font-size:clamp(2.3rem,4.6vw,3.4rem);line-height:1.05;letter-spacing:-.034em;font-weight:620;margin:0 0 24px;max-width:17ch;text-wrap:balance}.u-h2{font-size:clamp(1.7rem,3vw,2.5rem);line-height:1.12;letter-spacing:-.028em;margin:0 0 14px;max-width:26ch}.u-h2--wide{max-width:32ch}.u-lede,.u-triptych p{line-height:1.6;margin:0}.u-lede{font-size:1.0625rem;color:var(--u-text-muted);max-width:64ch;text-wrap:pretty}.u-hero .u-lede{font-size:1.1875rem;max-width:60ch}.u-kicker{font-family:var(--u-mono);font-size:12px;letter-spacing:.1em;text-transform:uppercase;color:var(--u-accent-strong);margin:0 0 16px}.u-note{margin-top:24px;font-size:13px;color:var(--u-text-faint)}.u-mono,.u-note{font-family:var(--u-mono)}.u-hero,.u-link{align-items:center}.u-link{display:inline-flex;gap:8px;font-size:16px;font-weight:560;color:var(--u-accent-strong);text-decoration:none}.u-link:hover{color:var(--u-accent)}.u-hero{display:grid;grid-template-columns:minmax(0,1.04fr) minmax(0,.96fr);gap:60px;padding-top:84px;padding-bottom:84px}.u-cta-row{display:flex;flex-wrap:wrap;align-items:center;gap:14px;margin-top:36px}.u-btn{display:inline-flex;align-items:center;justify-content:center;gap:9px;font-size:16px;font-weight:560;height:50px;padding:0 24px;border-radius:10px;text-decoration:none;border:1px solid transparent;transition:background-color .15s ease,border-color .15s ease,transform .15s ease}.u-btn:hover{transform:translateY(-1px)}.u-btn--primary{background:var(--u-accent);color:var(--u-on-accent)}.u-btn--primary:hover{background:var(--u-accent-strong);color:var(--u-on-accent)}.u-btn--ghost{background:var(--u-bg-raised);color:var(--u-text);border-color:var(--u-border-strong)}.u-btn--ghost:hover{border-color:var(--u-accent);color:var(--u-text)}.u-btn--bright{font-weight:620}.u-btn--bright,.u-btn--bright:hover{background:var(--u-d-accent);color:var(--u-d-on-accent)}.u-btn--outline{border-color:var(--u-d-border);color:var(--u-d-text);background:0 0}.u-btn--outline:hover{border-color:var(--u-d-accent);color:var(--u-d-text)}.u-panel{border:1px solid var(--u-border);border-radius:13px;background:var(--u-bg-raised);box-shadow:var(--u-shadow);overflow:hidden}.u-panel-bar,.u-table td{border-bottom:1px solid var(--u-border);color:var(--u-text-muted)}.u-panel-bar{display:flex;align-items:center;gap:9px;padding:13px 18px;background:var(--u-bg-subtle);font-family:var(--u-mono);font-size:12.5px}.u-panel-bar .u-dot{width:7px;height:7px}.u-panel-body{padding:4px 14px 10px}.u-cascade-head{display:flex;align-items:center;justify-content:space-between;gap:20px;margin:44px 0 14px;font-family:var(--u-mono);font-size:11.5px;letter-spacing:.09em;color:var(--u-d-label)}.u-cascade{display:flex;flex-direction:column;gap:9px}.u-cas{display:flex;align-items:center;gap:20px;padding:15px 20px;border:1px solid var(--u-d-border-soft);border-radius:9px;font-family:var(--u-mono);font-size:13px}.u-cas--hit{border-color:var(--u-d-accent);background:var(--u-d-raised)}.u-cas--skip{border-style:dashed}.u-cas-n{flex:none;width:26px;font-size:12px;color:var(--u-d-faint)}.u-cas-payload{flex-grow:1;min-width:0;color:var(--u-d-code);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.u-cas--hit .u-cas-payload{color:var(--u-d-text)}.u-cas-payload em{font-style:normal}.u-cas-payload b,.u-returned-body b{font-weight:400;color:var(--u-d-code-key)}.u-cas-credits,.u-cas-status{flex:none;width:118px;font-size:12px;color:var(--u-d-label)}.u-cas--hit .u-cas-status{color:var(--u-d-accent)}.u-cas--skip .u-cas-status,.u-cas-payload em{color:var(--u-d-faint)}.u-cas-credits{width:66px;text-align:right}.u-cas--hit .u-cas-credits{color:var(--u-d-accent)}.u-cas--skip .u-cas-credits{color:var(--u-d-faint)}.u-returned{display:flex;align-items:center;gap:16px;margin-top:22px}.u-returned-arrow{flex:none;margin-left:24px}.u-returned-body{flex-grow:1;min-width:0;border:1px solid var(--u-d-border);border-radius:9px;background:var(--u-d-raised);padding:15px 20px;font-family:var(--u-mono);font-size:13px;color:var(--u-d-code);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.u-returned-body em{font-style:normal;color:var(--u-d-label)}.u-returned-body i{font-style:normal}.u-triptych{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:26px;margin-top:52px;padding-top:40px;border-top:1px solid var(--u-d-border-soft)}.u-triptych h3{font-size:17px;font-weight:620;margin:0 0 7px;letter-spacing:-.01em}.u-triptych p{font-size:14.5px;color:var(--u-d-muted)}.u-band--dark .u-kicker,.u-returned-body i{color:var(--u-d-accent)}.u-band--dark .u-h2,.u-triptych h3{color:var(--u-d-text)}.u-band--dark .u-lede{color:var(--u-d-muted)}.u-chips{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.u-chip{font-size:16px;font-weight:620;letter-spacing:-.01em;padding:7px 15px;border:1px solid var(--u-border-strong);border-radius:8px}.u-chip--ghost,.u-table th{font-family:var(--u-mono);color:var(--u-text-faint)}.u-chip--ghost{font-size:12.5px;font-weight:400;letter-spacing:0;border-style:dashed;padding:8px 15px}.u-channel{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.u-channel-name{font-size:17px;font-weight:620;letter-spacing:-.02em}.u-channel-meta{font-size:14px;color:var(--u-text-muted)}.u-table-wrap{overflow-x:auto}.u-table{width:100%;border-collapse:collapse;font-size:15px;min-width:620px}.u-table th{font-size:11.5px;font-weight:500;letter-spacing:.09em;text-align:left;padding:0 16px 12px 0;border-bottom:1px solid var(--u-text);white-space:nowrap}.u-table td{padding:16px 16px 16px 0;vertical-align:middle}.u-table tr:last-child td{border-bottom:0}.u-table td:last-child,.u-table th:last-child{padding-right:0}.u-t-name{font-weight:620;font-size:16px;color:var(--u-text);letter-spacing:-.01em}.u-t-id{font-family:var(--u-mono);font-size:13px;color:var(--u-accent-strong)}.u-t-fields{font-size:12.5px;color:var(--u-text-faint)}.u-callout code,.u-num,.u-t-fields{font-family:var(--u-mono)}.u-num{font-size:13.5px;text-align:right;white-space:nowrap}.u-num--lead{font-size:14.5px;font-weight:560;color:var(--u-text)}.u-pos{color:var(--u-accent-strong)}.u-neg{color:var(--u-neg)}.u-prod{font-size:15px;font-weight:560;color:var(--u-text);line-height:1.35}.u-prod-shop{font-family:var(--u-mono);font-size:12px;color:var(--u-text-faint);margin-top:4px}.u-spark{display:block}.u-spark--up{color:var(--u-line-up)}.u-spark--down{color:var(--u-line-down)}.u-spark--flat{color:var(--u-line-flat)}.u-table-foot{display:flex;align-items:center;justify-content:space-between;gap:24px;margin-top:18px;font-family:var(--u-mono);font-size:12.5px;color:var(--u-text-faint)}.u-callout{display:flex;gap:12px;margin-top:22px;padding:16px 18px;border-radius:10px;background:var(--u-accent-wash)}.u-callout svg{flex:none;margin-top:2px}.u-callout-text{font-size:14.5px;line-height:1.6;color:var(--u-accent-strong)}.u-callout code{font-size:13px;background:0 0;padding:0}.u-do{display:flex;flex-direction:column;margin-top:48px}.u-do-row{display:flex;align-items:flex-start;gap:36px;padding:30px 0;border-top:1px solid var(--u-border-strong)}.u-do-row:last-child{border-bottom:1px solid var(--u-border-strong)}.u-do-n{flex:none;width:40px;font-family:var(--u-mono);font-size:13px;color:var(--u-accent);padding-top:5px}.u-do-name{flex:none;width:200px;font-size:22px;font-weight:620;letter-spacing:-.02em;color:var(--u-text)}.u-do-desc{flex-grow:1;margin:0;font-size:16px;line-height:1.62;color:var(--u-text-muted);max-width:46ch}.u-endpoint{flex:none;margin-left:auto;align-self:center;font-family:var(--u-mono);font-size:13px;color:var(--u-text);background:var(--u-bg-raised);border:1px solid var(--u-border);border-radius:7px;padding:7px 12px;text-decoration:none;white-space:nowrap}.u-endpoint:hover{border-color:var(--u-accent);color:var(--u-text)}.u-split{display:flex;gap:72px;align-items:flex-start}.u-split-copy{flex:none;width:430px}.u-copy-p{font-size:16.5px;line-height:1.62;color:var(--u-text-muted);margin:0 0 16px}.u-split-copy .u-h2{margin-bottom:18px}.u-split-copy .u-link{margin-top:10px}.u-cov{flex-grow:1;min-width:0;border:1px solid var(--u-border);border-radius:12px;overflow:hidden}.u-cov-bar,.u-cov-row{border-bottom:1px solid var(--u-border)}.u-cov-bar{padding:13px 20px;background:var(--u-bg-subtle);font-family:var(--u-mono);font-size:12px;color:var(--u-text-muted)}.u-cov-row{display:flex;align-items:center;justify-content:space-between;gap:20px;padding:18px 20px}.u-cov-row:last-child{border-bottom:0}.u-cov-field{font-family:var(--u-mono);font-size:13.5px;color:var(--u-text)}.u-cov-meta{font-size:13px;color:var(--u-text-faint);margin-top:3px}.u-pill{flex:none;font-family:var(--u-mono);font-size:11.5px;letter-spacing:.06em;padding:5px 11px;border-radius:999px;white-space:nowrap}.u-pill--full{background:var(--u-accent-wash);color:var(--u-accent-strong)}.u-pill--partial{background:var(--u-warn-bg);color:var(--u-warn-text)}.u-pill--none{background:var(--u-off-bg);color:var(--u-off-text)}.u-pill--live{background:var(--u-accent);color:var(--u-on-accent);font-size:11px;letter-spacing:.07em;padding:4px 10px}.u-closer{display:flex;align-items:center;justify-content:space-between;gap:56px}.u-closer-actions{flex:none;display:flex;flex-direction:column;gap:12px}@media (max-width:1080px){.u-split{gap:44px}.u-split-copy{width:360px}.u-do-name{width:150px}}@media (max-width:960px){.u-section{padding:72px 24px}.u-hero{grid-template-columns:minmax(0,1fr);gap:44px}.u-h1{max-width:none}.u-triptych{grid-template-columns:minmax(0,1fr);gap:22px}.u-split{flex-direction:column;gap:40px}.u-split-copy{width:auto}.u-cov{width:100%}.u-closer{flex-direction:column;align-items:flex-start;gap:32px}.u-strip-note{text-align:left}.u-do-row{flex-wrap:wrap;gap:0 24px}.u-do-name{width:auto;flex-grow:1}.u-do-desc{flex-basis:100%;margin-top:10px;max-width:none}.u-endpoint{margin-left:0;order:3;margin-top:14px}}@media (max-width:640px){.u-section{padding:56px 20px}.u-strip-inner{padding:24px 20px;gap:16px}.u-btn{width:100%}.u-cascade-head{font-size:10.5px}.u-cas{gap:12px;padding:13px 14px;font-size:12px}.u-cas-status{width:86px;font-size:11px}.u-cas-credits{width:40px;font-size:11px}.u-returned-arrow{display:none}.u-returned{margin-left:0}.u-cov-row,.u-table-foot{flex-direction:column;align-items:flex-start;gap:10px}.u-table-foot{gap:8px}}.u-table-wrap--spaced{margin-top:42px}.u-table th.u-th-r{text-align:right}.u-table th.u-th-trend{width:76px}"}],"page":{"pagePath":"docs/workflows/webhooks","slug":"/docs/workflows/webhooks","pageMetadata":{"title":"Webhooks","description":"Event delivery, signature verification and retries.","icon":"webhook","href":"/docs/workflows/webhooks"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Event delivery, signature verification and retries.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,CodeGroup,Heading,Note,Table,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!CodeGroup)_missingMdxReference(`CodeGroup`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`Webhooks are how Unif tells you something happened without you asking. Jobs finish and trackers\nfire on their own schedule; both deliver here.`}),`\n`,_jsx(Heading,{level:`2`,id:`registering-an-endpoint`,children:`Registering an endpoint`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`8`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`8`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -X`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` POST`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` https://api.unif.dev/v1/webhooks`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Authorization: Bearer `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$UNIF_API_KEY`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Content-Type: application/json\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -d`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` '{`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"url\": \"https://hooks.example.com/unif\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"events\": [\"job.completed\", \"job.failed\", \"tracker.triggered\"],`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"description\": \"Production ingestion\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` }'`})}),`\n`]})})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`8`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`8`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"id\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"whk_01k3m9x7v2q8r4t6y0b1n5d7fa\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"object\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"webhook\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"url\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"https://hooks.example.com/unif\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"events\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"job.completed\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"job.failed\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"tracker.triggered\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`],`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"enabled\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"secret\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"whsec_7f3c1a9e4b2d8065f1a3c7e9b5d2408f\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`secret`}),` is returned exactly once, at creation. Store it before you close the response — there\nis no endpoint to read it back. If you lose it, delete the endpoint and create a new one.`]})}),`\n`,_jsx(_components.p,{children:`The URL must be HTTPS.`}),`\n`,_jsx(Heading,{level:`2`,id:`event-types`,children:`Event types`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Event`}),_jsx(_components.th,{children:`Fires when`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`job.completed`})}),_jsxs(_components.td,{children:[`A job reaches `,_jsx(_components.code,{children:`completed`}),` or `,_jsx(_components.code,{children:`partially_completed`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`job.failed`})}),_jsxs(_components.td,{children:[`A job reaches `,_jsx(_components.code,{children:`failed`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`tracker.triggered`})}),_jsx(_components.td,{children:`A tracker cycle matched at least one condition`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`entity.refreshed`})}),_jsx(_components.td,{children:`A tracked entity’s record was refreshed, regardless of whether it moved`})]})]})]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`entity.refreshed`}),` is high volume by design — it fires on every refresh of every entity in a\ntracked list. Subscribe to it only if you are mirroring records into your own store; for\n“tell me when something changed”, use `,_jsx(_components.code,{children:`tracker.triggered`}),`.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`envelope`,children:`Envelope`}),`\n`,_jsxs(_components.p,{children:[`Every delivery has the same shape. `,_jsx(_components.code,{children:`data`}),` varies by `,_jsx(_components.code,{children:`type`}),`.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`12`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`12`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"id\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"evt_01k3m9x7v2q8r4t6y0b1n5d7fa\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"object\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"event\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"type\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"job.completed\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"created_at\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"2026-09-15T02:41:09Z\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"data\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"job_id\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"job_01k3m9x7v2q8r4t6y0b1n5d7fa\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"job_type\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"enrich\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"status\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"completed\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"result_count\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`19847`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Payloads carry identifiers and summaries, not full result sets. Fetch the data with the ID —\nthat keeps deliveries small and means a replayed event cannot hand you stale records.`}),`\n`,_jsx(Heading,{level:`2`,id:`verifying-a-delivery`,children:`Verifying a delivery`}),`\n`,_jsxs(_components.p,{children:[`Every request carries a `,_jsx(_components.code,{children:`Unif-Signature`}),` header:`]}),`\n`,_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Unif-Signature: t=1789459269,v1=6f2a1c8e5b3d9047a2c6e8b4d1f70395ac82e6b04d19f7c3a5e82b6d0f419c7a`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`v1`}),` is the hex HMAC-SHA256 of `,_jsx(_components.code,{children:`{timestamp}.{raw_body}`}),`, keyed with your endpoint secret.`]}),`\n`,_jsxs(CodeGroup,{children:[_jsx(CodeBlock,{filename:`Python`,numberOfLines:`18`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`18`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` hashlib, hmac, time`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`TOLERANCE`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 300`}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # seconds`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`def`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` verify`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`raw_body`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`bytes`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`header`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`str`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`secret`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`str`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) -> `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`bool`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` parts `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` dict`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(p.split(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"=\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`1`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`for`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` p `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`in`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` header.split(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\",\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`))`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` timestamp, signature `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` parts.get(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"t\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`), parts.get(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"v1\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` if`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:` abs`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(time.time() `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`-`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` int`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(timestamp)) `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`>`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` TOLERANCE`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` False`}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # too old — replay`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` expected `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` hmac.new(`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` secret.encode(),`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` f`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`{`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`timestamp`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`}`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`.\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.encode() `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`+`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` raw_body,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` hashlib.sha256,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ).hexdigest()`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` hmac.compare_digest(expected, signature)`})]}),`\n`]})})}),_jsx(CodeBlock,{filename:`Node`,numberOfLines:`18`,language:`javascript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`javascript`,children:_jsxs(_components.code,{language:`javascript`,numberOfLines:`18`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` crypto`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` from`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"node:crypto\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` TOLERANCE`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 300`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`export`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` function`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` verify`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`rawBody`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`header`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`secret`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` parts`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` Object`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`fromEntries`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`header`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`split`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\",\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`).`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`map`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`((`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`p`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`=>`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` p`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`split`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"=\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)));`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` const`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`t`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:`timestamp`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`v1`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:`signature`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` } `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` parts`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` if`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`Math`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`abs`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`Date`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`now`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`() `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`/`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 1000`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` -`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` Number`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`timestamp`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)) `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`>`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` TOLERANCE`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`return`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` false`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` expected`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` crypto`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` .`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`createHmac`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"sha256\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`secret`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` .`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`update`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\"`\"}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#569CD6`},children:\"${\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`timestamp`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#569CD6`},children:`}`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\".`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` .`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`update`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`rawBody`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` .`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`digest`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"hex\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` crypto`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`timingSafeEqual`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`Buffer`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`expected`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`), `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`Buffer`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`signature`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`));`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})})]}),`\n`,_jsx(_components.p,{children:`Three things that are easy to get wrong:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Sign the raw body.`}),` Verify before any JSON parsing or re-serialization. A framework that\nre-encodes the body changes the bytes and breaks the signature.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Compare in constant time.`}),` `,_jsx(_components.code,{children:`hmac.compare_digest`}),` and `,_jsx(_components.code,{children:`timingSafeEqual`}),`, never `,_jsx(_components.code,{children:`==`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Enforce the timestamp window.`}),` Without it, a captured delivery stays valid forever.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`responding`,children:`Responding`}),`\n`,_jsxs(_components.p,{children:[`Return a `,_jsx(_components.code,{children:`2xx`}),` within `,_jsx(_components.strong,{children:`10 seconds`}),`. Anything else — including a timeout — counts as a failure.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`7`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`7`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`@app.post`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"/webhooks/unif\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`def`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` handle`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`request`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`):`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` if`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` not`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` verify(request.get_data(), request.headers[`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Unif-Signature\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`], `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`SECRET`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`):`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`401`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` queue.enqueue(process_event, request.get_json()) `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# do the work elsewhere`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`200`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Acknowledge first, process asynchronously. Doing real work inside the handler is how endpoints end\nup timing out, which turns a delivered event into a retried one.`}),`\n`,_jsx(Heading,{level:`2`,id:`retries-and-ordering`,children:`Retries and ordering`}),`\n`,_jsx(_components.p,{children:`Failed deliveries retry with exponential backoff over 24 hours: after 10s, 1m, 5m, 30m, 2h, 6h and\n12h. After that the event is dropped, and the endpoint is disabled automatically if every delivery\nfails for 72 hours straight.`}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Retries mean `,_jsx(_components.strong,{children:`at-least-once`}),` delivery, and events can arrive out of order. Deduplicate on\n`,_jsx(_components.code,{children:`event.id`}),`, and use `,_jsx(_components.code,{children:`created_at`}),` to discard an event older than one you have already applied.`]})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`if`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` redis.set(`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`f`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"unif:evt:`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`{`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`event[`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'id'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`}`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`1`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`nx`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`True`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`ex`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`86400`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`is`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` None`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`200`}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # already handled`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`2`,id:`without-a-public-endpoint`,children:`Without a public endpoint`}),`\n`,_jsxs(_components.p,{children:[`If you cannot expose one — a local environment, or a network that will not allow inbound traffic —\npoll instead. `,_jsx(_components.code,{children:`GET /jobs?status=completed`}),` is the supported fallback, and\n`,_jsx(_components.a,{href:`/docs/workflows/trackers`,children:`trackers`}),` can be read with `,_jsx(_components.code,{children:`GET /trackers/{id}`}),` for `,_jsx(_components.code,{children:`last_run_at`}),`.\nPolling costs more and tells you later, but nothing else changes.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Webhooks","description":"Event delivery, signature verification and retries.","icon":"webhook","href":"/docs/workflows/webhooks"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Registering an endpoint","slug":"registering-an-endpoint","depth":2,"children":[]},{"title":"Event types","slug":"event-types","depth":2,"children":[]},{"title":"Envelope","slug":"envelope","depth":2,"children":[]},{"title":"Verifying a delivery","slug":"verifying-a-delivery","depth":2,"children":[]},{"title":"Responding","slug":"responding","depth":2,"children":[]},{"title":"Retries and ordering","slug":"retries-and-ordering","depth":2,"children":[]},{"title":"Without a public endpoint","slug":"without-a-public-endpoint","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"unifdev","siteName":"Unif","title":"Webhooks - Unif","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-16T01:48:42.731Z","originalFileLocation":"docs/workflows/webhooks.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"dark\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Event delivery, signature verification and retries.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Unif\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/unifdev/GKhCeLBOivsxdW2C/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/unifdev/GKhCeLBOivsxdW2C/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/unifdev/GKhCeLBOivsxdW2C/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/unifdev/GKhCeLBOivsxdW2C/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/unifdev/GKhCeLBOivsxdW2C/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/unifdev/GKhCeLBOivsxdW2C/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/unifdev/GKhCeLBOivsxdW2C/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/unifdev/GKhCeLBOivsxdW2C/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/unifdev/GKhCeLBOivsxdW2C/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Webhooks - Unif\">\u003cmeta data-mint-head property=\"og:description\" content=\"Event delivery, signature verification and retries.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Unif\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://unif.dev/docs/workflows/webhooks\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://unifdev.mintlify.app/_mintlify/api/og/v2?division=Workflows\u0026amp;title=Webhooks\u0026amp;description=Event+delivery%2C+signature+verification+and+retries.\u0026amp;theme=04dba3584e03642731bf176a\u0026amp;signature=45d08baa6dac92a40a1aa5c2aa304d71e7076e111e72c8cc78ae7e8af4360529\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Webhooks - Unif\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Event delivery, signature verification and retries.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://unifdev.mintlify.app/_mintlify/api/og/v2?division=Workflows\u0026amp;title=Webhooks\u0026amp;description=Event+delivery%2C+signature+verification+and+retries.\u0026amp;theme=04dba3584e03642731bf176a\u0026amp;signature=45d08baa6dac92a40a1aa5c2aa304d71e7076e111e72c8cc78ae7e8af4360529\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/unifdev/GKhCeLBOivsxdW2C/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Unif\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#15803D\">\u003clink data-mint-head rel=\"canonical\" href=\"https://unif.dev/docs/workflows/webhooks\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/docs/workflows/webhooks.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://unif.dev/#organization\",\"name\":\"Unif\",\"url\":\"https://unif.dev\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/unifdev/t6BPluVf4xKZ3_nf/logo/light.svg?fit=max\u0026auto=format\u0026n=t6BPluVf4xKZ3_nf\u0026q=85\u0026s=b9b4ff2d35ee8ff9cb9ccef766d4b839\"}},{\"@type\":\"WebSite\",\"@id\":\"https://unif.dev#website\",\"name\":\"Unif\",\"url\":\"https://unif.dev\",\"publisher\":{\"@id\":\"https://unif.dev/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://unif.dev/docs/workflows/webhooks#webpage\",\"url\":\"https://unif.dev/docs/workflows/webhooks\",\"name\":\"Webhooks\",\"description\":\"Event delivery, signature verification and retries.\",\"dateModified\":\"2026-09-16T01:48:42.731Z\",\"isPartOf\":{\"@id\":\"https://unif.dev#website\"},\"breadcrumb\":{\"@id\":\"https://unif.dev/docs/workflows/webhooks#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://unif.dev/docs/workflows/webhooks#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Workflows\",\"item\":\"https://unif.dev/docs/workflows/search\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Webhooks\",\"item\":\"https://unif.dev/docs/workflows/webhooks\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://unif.dev/docs/workflows/webhooks#article\",\"headline\":\"Webhooks\",\"name\":\"Webhooks\",\"description\":\"Event delivery, signature verification and retries.\",\"url\":\"https://unif.dev/docs/workflows/webhooks\",\"mainEntityOfPage\":{\"@id\":\"https://unif.dev/docs/workflows/webhooks#webpage\"},\"dateModified\":\"2026-09-16T01:48:42.731Z\",\"publisher\":{\"@id\":\"https://unif.dev/#organization\"},\"isPartOf\":{\"@id\":\"https://unif.dev#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Unif\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Unif","nav":{"global":null,"tabs":[{"tab":"Home","icon":"house","pages":[{"title":"Home","href":""}]},{"tab":"Documentation","icon":"book-open","groups":[{"group":"Getting started","pages":[{"title":"Introduction","icon":"book-open","href":"/docs/introduction"},{"title":"Quickstart","icon":"rocket","href":"/docs/quickstart"},{"title":"Authentication","icon":"key","href":"/docs/authentication"}]},{"group":"Core concepts","pages":[{"title":"The waterfall","icon":"layer-group","href":"/docs/concepts/waterfall"},{"title":"The unified model","icon":"diagram-project","href":"/docs/concepts/unified-model"},{"title":"Entities","icon":"cubes","href":"/docs/concepts/entities"},{"title":"Identifiers","icon":"fingerprint","href":"/docs/concepts/identifiers"},{"title":"Channels and markets","icon":"globe","href":"/docs/concepts/channels"},{"title":"Periods and currency","icon":"calendar","href":"/docs/concepts/periods"},{"title":"Metrics reference","icon":"chart-line","href":"/docs/concepts/metrics"},{"title":"Coverage and freshness","icon":"eye","href":"/docs/concepts/coverage"}]},{"group":"Workflows","pages":[{"title":"Search","icon":"magnifying-glass","href":"/docs/workflows/search"},{"title":"Enrichment","icon":"wand-magic-sparkles","href":"/docs/workflows/enrich"},{"title":"Lists","icon":"bookmark","href":"/docs/workflows/lists"},{"title":"Trackers","icon":"bell","href":"/docs/workflows/trackers"},{"title":"Jobs and exports","description":"Bulk work, handed off and collected later.","icon":"layer-group","href":"/docs/workflows/jobs"},{"title":"Webhooks","icon":"webhook","href":"/docs/workflows/webhooks"}]},{"group":"Guides","pages":[{"title":"Find products before they peak","description":"Building a product discovery query that surfaces breakouts, not bestsellers.","icon":"arrow-trend-up","href":"/docs/guides/winning-products"},{"title":"Track a competitor set","icon":"binoculars","href":"/docs/guides/competitor-shops"},{"title":"Build a creator shortlist","icon":"users","href":"/docs/guides/creator-shortlist"},{"title":"Size and monitor a category","icon":"chart-pie","href":"/docs/guides/category-monitor"},{"title":"Sync Unif into your warehouse","icon":"database","href":"/docs/guides/warehouse-sync"}]},{"group":"Platform","pages":[{"title":"Errors","icon":"triangle-exclamation","href":"/docs/platform/errors"},{"title":"Rate limits","icon":"gauge-high","href":"/docs/platform/rate-limits"},{"title":"Pagination","icon":"list-ol","href":"/docs/platform/pagination"},{"title":"Idempotency","icon":"rotate","href":"/docs/platform/idempotency"},{"title":"Credits and usage","icon":"coins","href":"/docs/platform/credits"},{"title":"Sandbox","icon":"flask","href":"/docs/platform/sandbox"},{"title":"Versioning","icon":"code-branch","href":"/docs/platform/versioning"}]},{"group":"Release notes","pages":[{"title":"Changelog","icon":"clock-rotate-left","href":"/changelog"}]}]},{"tab":"API reference","icon":"code","pages":[{"title":"API reference","href":"/api-reference/introduction"}]}]},"basePath":"","title":"Webhooks - Unif","buildId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","deploymentId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","dynamics":[],"chunks":[]}