Webhooks are how services notify each other of events. At their core they are just a POST request to a pre-determined endpoint. The endpoint can be whatever you want, and you can just add them from the UI. You normally use one endpoint per service, and that endpoint listens to all of the event types. For example, if you receive webhooks from Acme Inc., you can structure your URL like: https://www.example.com/acme/webhooks/.The way to indicate that a webhook has been processed is by returning a 2xx (status code 200-299) response to the webhook message within a reasonable time-frame (15s). It’s also important to disable CSRF protection for this endpoint if the framework you use enables them by default.Another important aspect of handling webhooks is to verify the signature and timestamp when processing them. You can learn more about it in the webhook signature verification.
Document Verification (for those using the deprecated /verifications endpoint):
export interface DeprecatedDvWhPayload { event_type: "verification.completed" | "verification.failed" | "verification.expired_document_url"; mode: 'live' | 'test'; timestamp: string; verification_id: string; // same as id in the new endpoint verification_type: string; // same as document_type in the new endpoint}
In order to start listening to messages sent through Svix, you will need to configure your endpoints.Adding an endpoint is as simple as providing a URL that you control and a list of event types that you want to listen to.
Helpful Tip!If you don’t have a URL or your service isn’t quite ready to start receiving events just yet, just press the with Svix Play button to have a unique URL generated for you.You’ll be able to view and inspect all operational webhooks sent to your Svix Play URL, making it effortless to get started.
If you don’t specify any event types, by default, your endpoint will receive all events, regardless of type. This can be helpful for getting started and for testing, but we recommend changing this to a subset later on to avoid receiving unexpected messages.
The easiest way to be more confident in your endpoint configuration is to start receiving events as quickly as possible.That’s why we have a “Testing” tab for you to send example events to your endpoint.After sending an example event, you can click into the message to view the message payload, all of the message attempts, and whether it succeeded or failed.
Webhook signatures is your way to verify that webhook messages are sent by us. For a more detailed explanation, check out this article on why you should verify webhooks.
Our webhook partner Svix offers a set of useful libraries that make verifying webhooks very simple. Here is a an example using Javascript:
import { Webhook } from "svix";const secret = "whsec_MfKQ9r8GKYqrTwjUPD8ILPZIo2LaLaSw";// These were all sent from the serverconst headers = {"svix-id": "msg_p5jXN8AQM9LWM0D4loKWxJek","svix-timestamp": "1614265330","svix-signature": "v1,g0hM9SsE+OTPJTGt/tmIKtSyZlE3uFJELVlNIOLJ1OE=",};const payload = '{"test": 2432232314}';const wh = new Webhook(secret);// Throws on error, returns the verified content on successconst payload = wh.verify(payload, headers);
Each message is attempted based on the following schedule, where each period is started following the failure of the preceding attempt:
Immediately
5 seconds
5 minutes
30 minutes
2 hours
5 hours
10 hours
10 hours (in addition to the previous)
If an endpoint is removed or disabled delivery attempts to the endpoint will be disabled as well.For example, an attempt that fails three times before eventually succeeding will be delivered roughly 35 minutes and 5 seconds following the first attempt.
You can also use the application portal to manually retry each message at any time, or automatically retry (“Recover”) all failed messages starting from a given date.
This is the most common issue. When generating the signed content, we use the raw string body of the message payload.If you convert JSON payloads into strings using methods like stringify, different implementations may produce different string representations of the JSON object, which can lead to discrepancies when verifying the signature. It’s crucial to verify the payload exactly as it was sent, byte-for-byte or string-for-string, to ensure accurate verification.
When we receive a response with a 2xx status code, we interpret that as a successful delivery even if you indicate a failure in the response payload. Make sure to use the right response status codes so we know when message are supposed to succeed vs fail.
We will consider any message that fails to send a response within 15 seconds a failed message. If your endpoint is also processing complicated workflows, it may timeout and result in failed messages.We suggest having your endpoint simply receive the message and add it to a queue to be processed asynchronously so you can respond promptly and avoiding getting timed out.
If all attempts to a specific endpoint fail for a period of 5 days, the endpoint will be disabled. To re-enable a disabled endpoint, go to the webhook dashboard, find the endpoint from the list and select “Enable Endpoint”.
If you want to replay a single event, you can find the message from the UI and click the options menu next to any of the attempts.From there, click “resend” to have the same message send to your endpoint again.If you need to recover from a service outage and want to replay all the events since a given time, you can do so from the Endpoint page. On an endpoint’s details page, click Options > Recover Failed Messages.From there, you can choose a time window to recover from.For a more granular recovery - for example, if you know the exact timestamp that you want to recover from - you can click the options menu on any message from the endpoint page. From there, you can click “Replay…” and choose to “Replay all failed messages since this time.”
In case your webhook receiving endpoint is behind a firewall or NAT, you may need to allow traffic from Svix’s IP addresses.Reach out to us in your Slack channel and we can help you with the IP addresses.
{"docsConfig":{"$schema":"https://mintlify.com/docs.json","theme":"mint","name":"Camber","colors":{"primary":"#042f2e","light":"#F9FAFB","dark":"#0d1716"},"favicon":"/static/favicon-web-primary.svg","logo":{"light":"https://mintcdn.com/camber/NZwfo9aFIQGmelD7/static/logo-web-primary.png?fit=max\u0026auto=format\u0026n=NZwfo9aFIQGmelD7\u0026q=85\u0026s=2d6d0fb81c4838694914f08f7c38df2c","dark":"https://mintcdn.com/camber/NZwfo9aFIQGmelD7/static/logo-web-primary.png?fit=max\u0026auto=format\u0026n=NZwfo9aFIQGmelD7\u0026q=85\u0026s=2d6d0fb81c4838694914f08f7c38df2c"},"api":{"mdx":{"server":"https://api.camber.so","auth":{"method":"bearer","name":null}}},"appearance":{"default":"light","strict":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"camber","hasAudioNarration":false,"actualSubdomain":"camber","customDomains":["docs.camber.so"],"gitSource":{"type":"github","owner":"camber-ai","repo":"camber-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6a21c9491d603ef037f0888a","collectionId":"4b0450cf-79ec-4b15-93a3-3990127a16df","schemaVersion":"v2"},"entitlements":{},"buildId":"6a21c9491d603ef037f0888a:success","clientVersion":"0.0.3990","searchFilterCounts":[{"language":"default","tag":"Documentation","count":17},{"language":"default","tag":"Document Verification","count":12},{"language":"default","tag":"API Reference","count":7},{"language":"default","tag":"License Verification","count":4}]},"assistantConfig":{},"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":"editor-v7-file-tree","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":"pause-universal-search-reconcile","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":"per-site-search-delta","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":"editor-private-page-search","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":"editor-nav-generations","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":"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":"editor-agent-model-picker","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":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"docs/webhooks","slug":"/docs/webhooks","pageMetadata":{"title":"Webhooks","description":"Notify your application about verification events.","icon":"webhook","href":"/docs/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: \"Notify your application about verification events.\"\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`,blockquote:`blockquote`,code:`code`,img:`img`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,OptimizedImage,Tip}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Tip)_missingMdxReference(`Tip`,true);return _jsxs(_Fragment,{children:[_jsx(Tip,{children:`Webhooks just launched! We’re excited to get your feedback.`}),`\n`,_jsx(Heading,{level:`2`,id:`introduction-to-camber-webhooks`,children:`Introduction to Camber Webhooks`}),`\n`,_jsxs(_components.p,{children:[`Webhooks are how services notify each other of events. At their core they are just a `,_jsx(_components.code,{children:`POST`}),` request to a pre-determined endpoint. The endpoint can be whatever you want, and you can just `,_jsx(_components.a,{href:`#adding-an-endpoint`,children:`add them from the UI`}),`. You normally use one endpoint per service, and that endpoint listens to all of the event types. For example, if you receive webhooks from Acme Inc., you can structure your URL like: `,_jsx(_components.code,{children:`https://www.example.com/acme/webhooks/`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`The way to indicate that a webhook has been processed is by returning a `,_jsx(_components.code,{children:`2xx`}),` (status code `,_jsx(_components.code,{children:`200-299`}),`) response to the webhook message within a reasonable time-frame (15s). It’s also important to disable `,_jsx(_components.code,{children:`CSRF`}),` protection for this endpoint if the framework you use enables them by default.`]}),`\n`,_jsxs(_components.p,{children:[`Another important aspect of handling webhooks is to verify the signature and timestamp when processing them. You can learn more about it in the `,_jsx(_components.a,{href:`#webhook-signature-verification`,children:`webhook signature verification`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`webhook-events`,children:`Webhook Events`}),`\n`,_jsxs(Heading,{level:`3`,id:`document-verification-for-those-using-the-/document-verifications-endpoint-`,children:[`Document Verification (for those using the `,_jsx(_components.code,{children:`/document-verifications`}),` endpoint):`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`document_verification.completed`}),` - Triggered when a document verification is completed.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`document_verification.failed`}),` - Triggered when a document verification fails.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`document_verification.expired_document_url`}),` - Triggered when the URL for a document expires before Camber is able to download it.`]}),`\n`]}),`\n`,_jsxs(Heading,{level:`3`,id:`document-verification-for-those-using-the-deprecated-/verifications-endpoint-`,children:[`Document Verification (for those using the deprecated `,_jsx(_components.code,{children:`/verifications`}),` endpoint):`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`verification.completed`}),` - Triggered when a document verification is completed.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`verification.failed`}),` - Triggered when a document verification fails.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`verification.expired_document_url`}),` - Triggered when the URL for a document expires before Camber is able to download it.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`license-verification`,children:`License Verification:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`license_verification.completed`}),` - Triggered when a license verification is completed.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`license_verification.failed`}),` - Triggered when a license verification fails.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`webhook-payload`,children:`Webhook Payload`}),`\n`,_jsxs(Heading,{level:`3`,id:`document-verification-for-those-using-the-/document-verifications-endpoint--2`,children:[`Document Verification (for those using the `,_jsx(_components.code,{children:`/document-verifications`}),` endpoint):`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`7`,language:`typescript`,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:`typescript`,children:_jsxs(_components.code,{language:`typescript`,numberOfLines:`7`,children:[_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:` interface`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` DvWhPayload`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` event_type`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"document_verification.completed\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` |`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"document_verification.failed\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` |`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"document_verification.expired_document_url\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` mode`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'live'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` |`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'test'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` timestamp`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` string`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` id`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` string`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` document_type`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` string`}),_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`,_jsxs(Heading,{level:`3`,id:`document-verification-for-those-using-the-deprecated-/verifications-endpoint--2`,children:[`Document Verification (for those using the deprecated `,_jsx(_components.code,{children:`/verifications`}),` endpoint):`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`7`,language:`typescript`,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:`typescript`,children:_jsxs(_components.code,{language:`typescript`,numberOfLines:`7`,children:[_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:` interface`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` DeprecatedDvWhPayload`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` event_type`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"verification.completed\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` |`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"verification.failed\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` |`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"verification.expired_document_url\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` mode`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'live'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` |`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'test'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` timestamp`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` string`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` verification_id`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` string`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`; `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// same as id in the new endpoint`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` verification_type`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` string`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`; `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// same as document_type in the new endpoint`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`license-verification-2`,children:`License Verification:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`6`,language:`typescript`,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:`typescript`,children:_jsxs(_components.code,{language:`typescript`,numberOfLines:`6`,children:[_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:` interface`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` LvWhPayload`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` event_type`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"license_verification.completed\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` |`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"license_verification.failed\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` mode`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'live'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` |`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'test'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` timestamp`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` string`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` id`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` string`}),_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(Heading,{level:`2`,id:`adding-an-endpoint`,children:`Adding an Endpoint`}),`\n`,_jsxs(_components.p,{children:[`In order to start listening to messages sent through Svix, you will need to configure your `,_jsx(_components.strong,{children:`endpoints`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`Adding an endpoint is as simple as providing a URL that you control and a list of `,_jsx(_components.strong,{children:`event types`}),` that you want to listen to.`]}),`\n`,_jsx(OptimizedImage,{src:`https://mintcdn.com/camber/NZwfo9aFIQGmelD7/static/images/add-endpoint.png?fit=max\u0026auto=format\u0026n=NZwfo9aFIQGmelD7\u0026q=85\u0026s=6e0e007e7c1a411fde6f5ca0135dc46e`,alt:`add endpoint`,\"data-og-width\":`1764`,width:`1764`,\"data-og-height\":`1340`,height:`1340`,\"data-path\":`static/images/add-endpoint.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/camber/NZwfo9aFIQGmelD7/static/images/add-endpoint.png?w=280\u0026fit=max\u0026auto=format\u0026n=NZwfo9aFIQGmelD7\u0026q=85\u0026s=e01ccfe3f9541e1f90191a6bd1621234 280w, https://mintcdn.com/camber/NZwfo9aFIQGmelD7/static/images/add-endpoint.png?w=560\u0026fit=max\u0026auto=format\u0026n=NZwfo9aFIQGmelD7\u0026q=85\u0026s=fb7c40dbd8107006ee626e30e2cf2696 560w, https://mintcdn.com/camber/NZwfo9aFIQGmelD7/static/images/add-endpoint.png?w=840\u0026fit=max\u0026auto=format\u0026n=NZwfo9aFIQGmelD7\u0026q=85\u0026s=89766b6ebef7ed55143a9a60dae9c4f2 840w, https://mintcdn.com/camber/NZwfo9aFIQGmelD7/static/images/add-endpoint.png?w=1100\u0026fit=max\u0026auto=format\u0026n=NZwfo9aFIQGmelD7\u0026q=85\u0026s=8314ee85b8aef885eaf1077de569f5ed 1100w, https://mintcdn.com/camber/NZwfo9aFIQGmelD7/static/images/add-endpoint.png?w=1650\u0026fit=max\u0026auto=format\u0026n=NZwfo9aFIQGmelD7\u0026q=85\u0026s=28b45f531096c9073850fbc893a107ba 1650w, https://mintcdn.com/camber/NZwfo9aFIQGmelD7/static/images/add-endpoint.png?w=2500\u0026fit=max\u0026auto=format\u0026n=NZwfo9aFIQGmelD7\u0026q=85\u0026s=692d36362a9eff5458ffe63aa8ecec27 2500w`}),`\n`,_jsxs(_components.blockquote,{children:[`\n`,_jsx(_components.p,{children:`Helpful Tip!`}),`\n`,_jsxs(_components.p,{children:[`If you don’t have a URL or your service isn’t quite ready to start receiving events just yet, just press the `,_jsx(_components.strong,{children:`with Svix Play`}),` button to have a unique URL generated for you.`]}),`\n`,_jsx(_components.p,{children:`You’ll be able to view and inspect all operational webhooks sent to your Svix Play URL, making it effortless to get started.`}),`\n`]}),`\n`,_jsx(_components.p,{children:`If you don’t specify any event types, by default, your endpoint will receive all events, regardless of type. This can be helpful for getting started and for testing, but we recommend changing this to a subset later on to avoid receiving unexpected messages.`}),`\n`,_jsx(Heading,{level:`3`,id:`testing-your-endpoint`,children:`Testing your Endpoint`}),`\n`,_jsx(_components.p,{children:`The easiest way to be more confident in your endpoint configuration is to start receiving events as quickly as possible.`}),`\n`,_jsx(_components.p,{children:`That’s why we have a “Testing” tab for you to send example events to your endpoint.`}),`\n`,_jsx(OptimizedImage,{src:`https://mintcdn.com/camber/NZwfo9aFIQGmelD7/static/images/testing-endpoint.png?fit=max\u0026auto=format\u0026n=NZwfo9aFIQGmelD7\u0026q=85\u0026s=9a6a95b92a83bbf0644906043d112b3f`,alt:`testing endpoint`,\"data-og-width\":`1644`,width:`1644`,\"data-og-height\":`1554`,height:`1554`,\"data-path\":`static/images/testing-endpoint.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/camber/NZwfo9aFIQGmelD7/static/images/testing-endpoint.png?w=280\u0026fit=max\u0026auto=format\u0026n=NZwfo9aFIQGmelD7\u0026q=85\u0026s=8ec63f5c1fa215ee9fd6e52d4646ca92 280w, https://mintcdn.com/camber/NZwfo9aFIQGmelD7/static/images/testing-endpoint.png?w=560\u0026fit=max\u0026auto=format\u0026n=NZwfo9aFIQGmelD7\u0026q=85\u0026s=aa37ee59608c635c1aa04c0591abbc29 560w, https://mintcdn.com/camber/NZwfo9aFIQGmelD7/static/images/testing-endpoint.png?w=840\u0026fit=max\u0026auto=format\u0026n=NZwfo9aFIQGmelD7\u0026q=85\u0026s=8ed3c107170c970dee5576a1bb468e3c 840w, https://mintcdn.com/camber/NZwfo9aFIQGmelD7/static/images/testing-endpoint.png?w=1100\u0026fit=max\u0026auto=format\u0026n=NZwfo9aFIQGmelD7\u0026q=85\u0026s=98f8f97aa905294b1296b81400328e2a 1100w, https://mintcdn.com/camber/NZwfo9aFIQGmelD7/static/images/testing-endpoint.png?w=1650\u0026fit=max\u0026auto=format\u0026n=NZwfo9aFIQGmelD7\u0026q=85\u0026s=11aded9484b9637d66fcb74d14762a77 1650w, https://mintcdn.com/camber/NZwfo9aFIQGmelD7/static/images/testing-endpoint.png?w=2500\u0026fit=max\u0026auto=format\u0026n=NZwfo9aFIQGmelD7\u0026q=85\u0026s=8c4207a1bb27776517d46cb552f233da 2500w`}),`\n`,_jsx(_components.p,{children:`After sending an example event, you can click into the message to view the message payload, all of the message attempts, and whether it succeeded or failed.`}),`\n`,_jsx(Heading,{level:`2`,id:`webhook-signature-verification`,children:`Webhook Signature Verification`}),`\n`,_jsxs(_components.p,{children:[`Webhook signatures is your way to verify that webhook messages are sent by us. For a more detailed explanation, check out this article on `,_jsx(_components.a,{href:`https://docs.svix.com/receiving/verifying-payloads/why`,children:`why you should verify webhooks`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`how-to-verify-webhooks-with-svix-libraries`,children:`How to verify webhooks with Svix Libraries`}),`\n`,_jsx(_components.p,{children:`Our webhook partner Svix offers a set of useful libraries that make verifying webhooks very simple. Here is a an example using Javascript:`}),`\n`,_jsx(CodeBlock,{numberOfLines:`16`,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:`16`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`import { Webhook } from \"svix\";`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`const secret = \"whsec_MfKQ9r8GKYqrTwjUPD8ILPZIo2LaLaSw\";`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`// These were all sent from the server`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`const headers = {`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`\"svix-id\": \"msg_p5jXN8AQM9LWM0D4loKWxJek\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`\"svix-timestamp\": \"1614265330\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`\"svix-signature\": \"v1,g0hM9SsE+OTPJTGt/tmIKtSyZlE3uFJELVlNIOLJ1OE=\",`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`};`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`const payload = '{\"test\": 2432232314}';`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`const wh = new Webhook(secret);`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`// Throws on error, returns the verified content on success`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`const payload = wh.verify(payload, headers);`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`For more instructions and examples of how to verify signatures, check out their `,_jsx(_components.a,{href:`https://docs.svix.com/receiving/verifying-payloads/how`,children:`webhook verification documentation`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`retries`,children:`Retries`}),`\n`,_jsx(_components.p,{children:`We attempt to deliver each webhook message based on a retry schedule with exponential backoff.`}),`\n`,_jsx(Heading,{level:`3`,id:`the-schedule`,children:`The schedule`}),`\n`,_jsx(_components.p,{children:`Each message is attempted based on the following schedule, where each period is started following the failure of the preceding attempt:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Immediately`}),`\n`,_jsx(_components.li,{children:`5 seconds`}),`\n`,_jsx(_components.li,{children:`5 minutes`}),`\n`,_jsx(_components.li,{children:`30 minutes`}),`\n`,_jsx(_components.li,{children:`2 hours`}),`\n`,_jsx(_components.li,{children:`5 hours`}),`\n`,_jsx(_components.li,{children:`10 hours`}),`\n`,_jsx(_components.li,{children:`10 hours (in addition to the previous)`}),`\n`]}),`\n`,_jsx(_components.p,{children:`If an endpoint is removed or disabled delivery attempts to the endpoint will be disabled as well.`}),`\n`,_jsx(_components.p,{children:`For example, an attempt that fails three times before eventually succeeding will be delivered roughly 35 minutes and 5 seconds following the first attempt.`}),`\n`,_jsx(Heading,{level:`3`,id:`manual-retries`,children:`Manual retries`}),`\n`,_jsx(_components.p,{children:`You can also use the application portal to manually retry each message at any time, or automatically retry (“Recover”) all failed messages starting from a given date.`}),`\n`,_jsx(Heading,{level:`2`,id:`troubleshooting-tips`,children:`Troubleshooting Tips`}),`\n`,_jsx(_components.p,{children:`There are some common reasons why your webhook endpoint is failing:`}),`\n`,_jsx(Heading,{level:`3`,id:`not-using-the-raw-payload-body`,children:`Not using the raw payload body`}),`\n`,_jsx(_components.p,{children:`This is the most common issue. When generating the signed content, we use the raw string body of the message payload.`}),`\n`,_jsx(_components.p,{children:`If you convert JSON payloads into strings using methods like stringify, different implementations may produce different string representations of the JSON object, which can lead to discrepancies when verifying the signature. It’s crucial to verify the payload exactly as it was sent, byte-for-byte or string-for-string, to ensure accurate verification.`}),`\n`,_jsx(Heading,{level:`3`,id:`missing-the-secret-key`,children:`Missing the secret key`}),`\n`,_jsx(_components.p,{children:`From time to time we see people simple using the wrong secret key. Remember that keys are unique to endpoints.`}),`\n`,_jsx(Heading,{level:`3`,id:`sending-the-wrong-response-codes`,children:`Sending the wrong response codes`}),`\n`,_jsx(_components.p,{children:`When we receive a response with a 2xx status code, we interpret that as a successful delivery even if you indicate a failure in the response payload. Make sure to use the right response status codes so we know when message are supposed to succeed vs fail.`}),`\n`,_jsx(Heading,{level:`3`,id:`responses-timing-out`,children:`Responses timing out`}),`\n`,_jsx(_components.p,{children:`We will consider any message that fails to send a response within 15 seconds a failed message. If your endpoint is also processing complicated workflows, it may timeout and result in failed messages.`}),`\n`,_jsx(_components.p,{children:`We suggest having your endpoint simply receive the message and add it to a queue to be processed asynchronously so you can respond promptly and avoiding getting timed out.`}),`\n`,_jsx(Heading,{level:`2`,id:`failure-recovery`,children:`Failure Recovery`}),`\n`,_jsx(Heading,{level:`3`,id:`re-enable-a-disabled-endpoint`,children:`Re-enable a disabled endpoint`}),`\n`,_jsx(_components.p,{children:`If all attempts to a specific endpoint fail for a period of 5 days, the endpoint will be disabled. To re-enable a disabled endpoint, go to the webhook dashboard, find the endpoint from the list and select “Enable Endpoint”.`}),`\n`,_jsx(Heading,{level:`3`,id:`recovering/resending-failed-messages`,children:`Recovering/Resending failed messages`}),`\n`,_jsx(Heading,{level:`4`,id:`why-replay`,children:`Why Replay`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`If your service has downtime`}),`\n`,_jsx(_components.li,{children:`If your endpoint was misconfigured`}),`\n`]}),`\n`,_jsx(_components.p,{children:`If you want to replay a single event, you can find the message from the UI and click the options menu next to any of the attempts.`}),`\n`,_jsx(_components.p,{children:_jsx(_components.img,{src:`https://docs.svix.com/assets/images/resend-single-a4fb6e65f27f27e5700becb523135c2f.png`,alt:`resend message`})}),`\n`,_jsx(_components.p,{children:`From there, click “resend” to have the same message send to your endpoint again.`}),`\n`,_jsxs(_components.p,{children:[`If you need to recover from a service outage and want to replay all the events since a given time, you can do so from the Endpoint page. On an endpoint’s details page, click `,_jsx(_components.code,{children:`Options > Recover Failed Messages`}),`.`]}),`\n`,_jsx(_components.p,{children:_jsx(_components.img,{src:`https://docs.svix.com/assets/images/replay-modal-fa510bd82e4eccbbb01df28581ad8901.png`,alt:`recover modal`})}),`\n`,_jsx(_components.p,{children:`From there, you can choose a time window to recover from.`}),`\n`,_jsx(_components.p,{children:`For a more granular recovery - for example, if you know the exact timestamp that you want to recover from - you can click the options menu on any message from the endpoint page. From there, you can click “Replay…” and choose to “Replay all failed messages since this time.”`}),`\n`,_jsx(Heading,{level:`2`,id:`ip-whitelist`,children:`IP Whitelist`}),`\n`,_jsx(_components.p,{children:`In case your webhook receiving endpoint is behind a firewall or NAT, you may need to allow traffic from Svix’s IP addresses.`}),`\n`,_jsx(_components.p,{children:`Reach out to us in your Slack channel and we can help you with the IP addresses.`})]})}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":"Notify your application about verification events.","icon":"webhook","href":"/docs/webhooks"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Introduction to Camber Webhooks","slug":"introduction-to-camber-webhooks","depth":2,"children":[]},{"title":"Webhook Events","slug":"webhook-events","depth":2,"children":[{"title":"Document Verification (for those using the /document-verifications endpoint):","slug":"document-verification-for-those-using-the-/document-verifications-endpoint-","depth":3,"children":[]},{"title":"Document Verification (for those using the deprecated /verifications endpoint):","slug":"document-verification-for-those-using-the-deprecated-/verifications-endpoint-","depth":3,"children":[]},{"title":"License Verification:","slug":"license-verification","depth":3,"children":[]}]},{"title":"Webhook Payload","slug":"webhook-payload","depth":2,"children":[{"title":"Document Verification (for those using the /document-verifications endpoint):","slug":"document-verification-for-those-using-the-/document-verifications-endpoint--2","depth":3,"children":[]},{"title":"Document Verification (for those using the deprecated /verifications endpoint):","slug":"document-verification-for-those-using-the-deprecated-/verifications-endpoint--2","depth":3,"children":[]},{"title":"License Verification:","slug":"license-verification-2","depth":3,"children":[]}]},{"title":"Adding an Endpoint","slug":"adding-an-endpoint","depth":2,"children":[{"title":"Testing your Endpoint","slug":"testing-your-endpoint","depth":3,"children":[]}]},{"title":"Webhook Signature Verification","slug":"webhook-signature-verification","depth":2,"children":[{"title":"How to verify webhooks with Svix Libraries","slug":"how-to-verify-webhooks-with-svix-libraries","depth":3,"children":[]}]},{"title":"Retries","slug":"retries","depth":2,"children":[{"title":"The schedule","slug":"the-schedule","depth":3,"children":[]},{"title":"Manual retries","slug":"manual-retries","depth":3,"children":[]}]},{"title":"Troubleshooting Tips","slug":"troubleshooting-tips","depth":2,"children":[{"title":"Not using the raw payload body","slug":"not-using-the-raw-payload-body","depth":3,"children":[]},{"title":"Missing the secret key","slug":"missing-the-secret-key","depth":3,"children":[]},{"title":"Sending the wrong response codes","slug":"sending-the-wrong-response-codes","depth":3,"children":[]},{"title":"Responses timing out","slug":"responses-timing-out","depth":3,"children":[]}]},{"title":"Failure Recovery","slug":"failure-recovery","depth":2,"children":[{"title":"Re-enable a disabled endpoint","slug":"re-enable-a-disabled-endpoint","depth":3,"children":[]},{"title":"Recovering/Resending failed messages","slug":"recovering/resending-failed-messages","depth":3,"children":[]},{"title":"Why Replay","slug":"why-replay","depth":4,"children":[]}]},{"title":"IP Whitelist","slug":"ip-whitelist","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"camber","siteName":"Camber","title":"Webhooks - Camber","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-01-07T01:41:28.022Z","originalFileLocation":"docs/webhooks.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=\"light\";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=\"light\"}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=\"Notify your application about verification events.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Camber\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/camber/an9-kgfs8CA8Im-w/_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/camber/an9-kgfs8CA8Im-w/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/camber/an9-kgfs8CA8Im-w/_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/camber/an9-kgfs8CA8Im-w/_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/camber/an9-kgfs8CA8Im-w/_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/camber/an9-kgfs8CA8Im-w/_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/camber/an9-kgfs8CA8Im-w/_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/camber/an9-kgfs8CA8Im-w/_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/camber/an9-kgfs8CA8Im-w/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Webhooks - Camber\">\u003cmeta data-mint-head property=\"og:description\" content=\"Notify your application about verification events.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Camber\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.camber.so/docs/webhooks\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://camber.mintlify.app/_mintlify/api/og/v2?division=Documentation\u0026amp;title=Webhooks\u0026amp;description=Notify+your+application+about+verification+events.\u0026amp;theme=14688bd82a6e177cf0694f6e\u0026amp;signature=ead62d0d7c7bf5623e94b1da636d01b9f73023dd51bd06f40a22a9349c497688\">\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 - Camber\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Notify your application about verification events.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://camber.mintlify.app/_mintlify/api/og/v2?division=Documentation\u0026amp;title=Webhooks\u0026amp;description=Notify+your+application+about+verification+events.\u0026amp;theme=14688bd82a6e177cf0694f6e\u0026amp;signature=ead62d0d7c7bf5623e94b1da636d01b9f73023dd51bd06f40a22a9349c497688\">\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/camber/an9-kgfs8CA8Im-w/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Camber\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#042f2e\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.camber.so/docs/webhooks\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/docs/webhooks.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.camber.so/#organization\",\"name\":\"Camber\",\"url\":\"https://docs.camber.so\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/camber/NZwfo9aFIQGmelD7/static/logo-web-primary.png?fit=max\u0026auto=format\u0026n=NZwfo9aFIQGmelD7\u0026q=85\u0026s=2d6d0fb81c4838694914f08f7c38df2c\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.camber.so#website\",\"name\":\"Camber\",\"url\":\"https://docs.camber.so\",\"publisher\":{\"@id\":\"https://docs.camber.so/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.camber.so/docs/webhooks#webpage\",\"url\":\"https://docs.camber.so/docs/webhooks\",\"name\":\"Webhooks\",\"description\":\"Notify your application about verification events.\",\"dateModified\":\"2026-01-07T01:41:28.022Z\",\"isPartOf\":{\"@id\":\"https://docs.camber.so#website\"},\"breadcrumb\":{\"@id\":\"https://docs.camber.so/docs/webhooks#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.camber.so/docs/webhooks#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Documentation\",\"item\":\"https://docs.camber.so/docs/introduction\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Webhooks\",\"item\":\"https://docs.camber.so/docs/webhooks\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.camber.so/docs/webhooks#article\",\"headline\":\"Webhooks\",\"name\":\"Webhooks\",\"description\":\"Notify your application about verification events.\",\"url\":\"https://docs.camber.so/docs/webhooks\",\"mainEntityOfPage\":{\"@id\":\"https://docs.camber.so/docs/webhooks#webpage\"},\"dateModified\":\"2026-01-07T01:41:28.022Z\",\"publisher\":{\"@id\":\"https://docs.camber.so/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.camber.so#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Camber\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Camber","nav":{"global":null,"tabs":[{"tab":"Documentation","groups":[{"group":"Documentation","pages":[{"title":"Introduction","icon":"rocket-launch","href":"/docs/introduction"},{"title":"Glossary","icon":"book","href":"/docs/glossary"},{"title":"Sandbox","description":"Learn how to test your Camber integration.","icon":"vial","href":"/docs/sandbox"},{"title":"Webhooks","icon":"webhook","href":"/docs/webhooks"}]},{"group":"Document Verification","pages":[{"title":"Introduction","description":"Learn how to use our document verification API.","icon":"expand","href":"/docs/document-verification/introduction"},{"title":"Quickstart","icon":"bolt","href":"/docs/document-verification/quickstart"},{"title":"Tuberculosis Test","icon":"lungs","href":"/docs/document-verification/tuberculosis-test"},{"title":"COVID Vaccination","icon":"virus-covid","href":"/docs/document-verification/covid-vaccination"},{"title":"Flu Vaccination","icon":"virus","href":"/docs/document-verification/flu-vaccination"},{"title":"Life Support Certification","icon":"heart","href":"/docs/document-verification/life-support-certification"},{"title":"Resume","icon":"file","href":"/docs/document-verification/resume"}]},{"group":"License Verification","pages":[{"title":"Introduction","icon":"expand","href":"/docs/license-verification/introduction"},{"title":"Quickstart","icon":"bolt","href":"/docs/license-verification/quickstart"}]}]},{"tab":"API Reference","pages":[{"title":"API Reference","href":"/api-reference/document-verification/list-document-verifications"}]}]},"title":"Webhooks - Camber","buildId":"dpl_2oYXwqkEXirXBPk8wV1FtM5USFWi","deploymentId":"dpl_2oYXwqkEXirXBPk8wV1FtM5USFWi","dynamics":["a74be98ba7"],"chunks":["zoom-image-lightbox-D7yRe3On.js","lightbox-handle-r17bVUz3.js"]}