Receba eventos de pedido e de indoor em tempo real na sua URL, valide a assinatura e trate reenvios e suspensões.
Com o webhook, a DeliveryVip faz um POST com o evento em JSON na sua URL assim que ele acontece. Você recebe eventos de pedido e de indoor (chamar garçom, pedir a conta) sem fila para drenar, sem limite de 100 eventos e sem intervalo de consulta.
Webhook e polling são independentes: receber um evento por webhook não o remove do polling, e vice-versa. Eventos entregues por webhook não precisam de acknowledgment.Use o webhook como canal principal e o polling como reconciliação: se o seu endpoint ficar fora do ar, os eventos das últimas 24 horas continuam disponíveis no polling.
No painel do desenvolvedor, abra a aplicação que integra com as lojas.
2
Informe a URL de notificação
Na seção Webhook, preencha a URL de notificação com o endpoint do seu sistema que vai receber os eventos e salve.
Seção Webhook: informe a URL de notificação e salve
3
Responda 2xx
O seu endpoint precisa aceitar POST e responder com um status 2xx para confirmar o recebimento.
A aplicação tem uma única URL de webhook. Os eventos de todas as lojas que instalaram o seu app chegam nela; identifique a loja pelo header X-App-MerchantId ou pelo campo merchantId do corpo.
Apps com a extensão Open Delivery podem ter uma URL e um secret por loja. Veja Recebendo eventos no guia Open Delivery.
POST {sua URL de notificação}Content-Type: application/jsonUser-Agent: DeliveryVipX-App-Id: 019efa90-dcd1-7846-983d-6bab871b2f6bX-App-MerchantId: 8158198a-4bb7-430e-9746-87cd02dfeddaX-App-Signature: 5d41402abc4b2a76b9719d911017c592...
A loja do evento: o merchantId que você configurou para ela, quando houver, ou o id da loja na DeliveryVip. É o mesmo valor do campo merchantId do corpo.
Identificador fixo da DeliveryVip como plataforma emissora: 019efa90-dcd1-7846-983d-6bab871b2f6b. É o mesmo em todas as entregas, para todos os apps, e não é o id do seu app. Serve como checagem simples de origem; quem garante a autenticidade é a assinatura.
O header X-App-Signature é o HMAC-SHA256 do corpo bruto, em hexadecimal minúsculo, usando o Client Secret da sua aplicação como chave. Recalcule a assinatura sobre o corpo recebido e compare com o header usando comparação de tempo constante.
import crypto from 'node:crypto'import express from 'express'const app = express()// express.raw mantém o corpo exatamente como chegouapp.post('/webhooks/deliveryvip', express.raw({ type: 'application/json' }), (req, res) => { const expected = crypto.createHmac('sha256', process.env.CLIENT_SECRET).update(req.body).digest('hex') const received = req.get('X-App-Signature') ?? '' const valid = received.length === expected.length && crypto.timingSafeEqual(Buffer.from(received), Buffer.from(expected)) if (!valid) return res.sendStatus(401) const event = JSON.parse(req.body) queue.push(event) // processe depois, fora da requisição res.sendStatus(200)})
import hashlibimport hmacimport osfrom flask import Flask, abort, requestapp = Flask(__name__)@app.post("/webhooks/deliveryvip")def deliveryvip_webhook(): raw_body = request.get_data() # bytes exatamente como chegaram expected = hmac.new(os.environ["CLIENT_SECRET"].encode(), raw_body, hashlib.sha256).hexdigest() if not hmac.compare_digest(expected, request.headers.get("X-App-Signature", "")): abort(401) queue.put(request.get_json()) # processe depois, fora da requisição return "", 200
Calcule a assinatura sobre o corpo exato recebido, antes de qualquer parse. Fazer parse e serializar de novo muda os bytes, e a assinatura deixa de bater.
Rejeite toda requisição cuja assinatura não confere. A assinatura é a única prova de que o evento veio da DeliveryVip; sem ela, qualquer um consegue forjar eventos de pedido no seu endpoint.
Ao renovar o Client Secret, a troca vale na hora: toda entrega enviada depois, incluindo tentativas automáticas e reenvios manuais, já é assinada com o novo secret.
PICKUP_AREA_ASSIGNED, CANCELLATION_REQUESTED, CANCELLATION_REQUEST_DENIED e ORDER_CANCELLATION_REQUEST estão previstos na especificação, mas ainda não são emitidos. Se chegar um tipo que você não conhece, responda 2xx e ignore.
Validar a assinatura antes de qualquer processamento.
Responder 2xx rápido. Grave o evento e processe de forma assíncrona: a DeliveryVip desiste após 3 segundos para conectar e 5 segundos para receber a resposta, e conta isso como falha.
Descartar repetidos pelo eventId. A assinatura não tem timestamp e o mesmo evento pode chegar de novo numa nova tentativa ou num reenvio manual.
Tenta de novo automaticamente, até 3 tentativas no total. Se todas falharem, a entrega fica como falha.
Qualquer outro status, inclusive 5xx
Marca a entrega como falha na hora, sem nova tentativa automática.
Entregas com falha podem ser reenviadas manualmente no painel. Enquanto ainda há tentativas automáticas em curso, o reenvio manual fica indisponível para evitar entregas duplicadas.
Se o seu servidor estiver sobrecarregado e quiser que a DeliveryVip tente de novo, responda 429 ou 408, não 500 ou 503.
Após 10 falhas consecutivas, a DeliveryVip suspende o envio de webhooks da sua aplicação e avisa por e-mail, com o motivo da última falha. Cada tentativa que falha conta; uma entrega bem-sucedida zera o contador.
Enquanto o envio está suspenso, os eventos continuam disponíveis no polling. Para retomar:
1
Corrija o endpoint
Confirme que a URL responde 2xx para um POST com corpo JSON.
2
Reative o envio
No painel do desenvolvedor, abra a aplicação e entre em Ver webhooks enviados. No aviso Envio de webhooks suspenso, clique em Reativar envios.
3
Reenvie o que falhou
Na mesma tela, filtre por Com falha e reenvie as entregas que você precisa.
A tela Webhooks enviados (painel do desenvolvedor, sua aplicação, Ver webhooks enviados) mostra o histórico de entregas: tipo do evento, loja, status HTTP e número de tentativas. Filtre por Com falha ou Sucesso e reenvie as entregas que falharam.
Tela Webhooks enviados: histórico, status HTTP, tentativas e reenvio
Quase sempre o corpo foi transformado antes do cálculo: o framework fez parse do JSON e você serializou de novo. Leia o corpo bruto (express.raw, request.get_data(), request.raw_post) e calcule o HMAC sobre esses bytes. Confira também se está usando o Client Secret da aplicação, e não o Client ID.
Recebo o mesmo evento duas vezes
É esperado: novas tentativas e reenvios manuais repetem o mesmo eventId, e o mesmo evento também aparece no polling. Guarde os eventId processados e descarte os repetidos.
O envio foi suspenso
O seu endpoint acumulou 10 falhas seguidas. Corrija o endpoint, clique em Reativar envios na tela Webhooks enviados e reenvie as entregas com falha. Enquanto isso, recupere os eventos pelo polling.
Meu endpoint retornou 500 e o evento não voltou
Respostas 5xx não são tentadas de novo automaticamente. Reenvie pelo painel ou recupere o evento pelo polling. Para pedir uma nova tentativa automática, responda 429 ou 408.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"DeliveryVip Developers","description":"Documentação das APIs da DeliveryVip: Merchant API, Open Delivery, Fidelidade e Partner API, com guias, tutoriais e referência.","colors":{"primary":"#EC681B","light":"#F4A476","dark":"#EC681B"},"logo":{"light":"https://mintcdn.com/deliveryvip-a4256422/ELxpcniK2_BP8zxT/logo/light.svg?fit=max\u0026auto=format\u0026n=ELxpcniK2_BP8zxT\u0026q=85\u0026s=b5cd347a6fb8b88418ecffa2cecba5ca","dark":"https://mintcdn.com/deliveryvip-a4256422/ELxpcniK2_BP8zxT/logo/dark.svg?fit=max\u0026auto=format\u0026n=ELxpcniK2_BP8zxT\u0026q=85\u0026s=c4d4b4b52656b650a0faa7dcc736c1a4"},"favicon":"https://mintcdn.com/deliveryvip-a4256422/ELxpcniK2_BP8zxT/favicon.png?fit=max\u0026auto=format\u0026n=ELxpcniK2_BP8zxT\u0026q=85\u0026s=f7fca2ed2e2a42c04178d079778d86f7","appearance":{"default":"system","strict":true},"navbar":{"primary":{"type":"button","label":"Painel do developer","href":"https://developer.deliveryvip.com.br"}},"footer":{"socials":{"website":"https://deliveryvip.com.br","github":"https://github.com/DeliveryVip","discord":"https://discord.gg/AJF8Yha4"},"links":[{"header":"Plataforma","items":[{"label":"Painel do lojista","href":"https://app.deliveryvip.com.br"},{"label":"Painel do developer","href":"https://developer.deliveryvip.com.br"},{"label":"Status","href":"https://status.deliveryvip.com.br"},{"label":"Central de ajuda","href":"https://ajuda.deliveryvip.com.br"}]},{"header":"Desenvolvedores","items":[{"label":"Jornada do Developer","href":"/docs/inicio/primeiros-passos/jornada-do-developer"},{"label":"Postman","href":"/docs/inicio/conceitos/postman"},{"label":"Use com IA","href":"/docs/inicio/conceitos/usando-com-ia"},{"label":"Cofrinho (exemplo de fidelidade)","href":"https://github.com/DeliveryVip/cofrinho"},{"label":"Changelog","href":"/docs/changelog"}]},{"header":"Suporte","items":[{"label":"Discord","href":"https://discord.gg/AJF8Yha4"},{"label":"Agendar uma reunião","href":"https://calendar.app.google/EchaXk57y7xp8Hyx6"}]}]},"search":{"prompt":"Pesquisar na documentação..."},"seo":{"metatags":{"og:site_name":"DeliveryVip Developers","og:locale":"pt_BR","twitter:card":"summary_large_image"}},"fonts":{"family":"Geist"},"errors":{"404":{"redirect":false,"title":"Página não encontrada","description":"Volte para a [página inicial](/) ou use a busca."}},"contextual":{"options":["copy","view","chatgpt","claude","cursor","vscode","mcp"],"display":"header"},"markdown":{"instructions":"Documentação das APIs da DeliveryVip, em português. Regras que mais quebram integrações: (1) Merchant API: faça polling em GET /merchant/v3/events:polling no máximo a cada 30 s por token; confirme todo evento recebido com POST /merchant/v3/events/acknowledgment e corpo [{\"id\": \"\u003ceventId>\"}] (o campo lido é id, não eventId), inclusive eventos repetidos ou que o sistema não trata; deduplique por eventId; o evento é só um aviso, busque o pedido na orderURL. (2) Tokens client_credentials valem 24 h e não têm refresh_token: peça outro ao receber 401. (3) Webhooks: valide a assinatura HMAC sobre o corpo bruto e responda 2xx rápido; o polling é a reconciliação. (4) Open Delivery: host od.deliveryvip.com.br, um client_secret por loja, datas em UTC. (5) Fidelidade: o operador implementa 5 rotas assinadas com HMAC e chama o config push; o estorno precisa ser idempotente. (6) Partner API: scope dv.partner. Não invente endpoints: use a referência gerada das specs OpenAPI."},"styling":{"latex":false},"navigation":{"languages":[{"language":"pt-BR","href":""}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"deliveryvip-a4256422","hasAudioNarration":false,"actualSubdomain":"deliveryvip-a4256422","customDomains":[],"gitSource":{"type":"github","owner":"deliveryvip","repo":"developerdocs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":"","_id":"6ae4c831d9cc4cd9a0a2acf8"},"chroma":{"latestBuiltDeploymentHistoryId":"6ae4cc91981729a4c39866ff","collectionId":"b87548ca-f6e4-4b97-b2a3-975659825db2","liveDeploymentHistoryId":"6ae4cc91981729a4c39866ff","schemaVersion":"v3"},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae4cc91981729a4c39866ff","clientVersion":"0.0.4043","searchFilterCounts":[{"language":"pt-BR","tag":"Referência","count":120},{"language":"pt-BR","tag":"Merchant API","count":88},{"language":"pt-BR","tag":"Partner API","count":87},{"language":"pt-BR","tag":"Indoor","count":35},{"language":"pt-BR","tag":"Lojas","count":34},{"language":"pt-BR","tag":"Revendas","count":29},{"language":"pt-BR","tag":"Open Delivery","count":27},{"language":"pt-BR","tag":"Pedidos","count":25},{"language":"pt-BR","tag":"Endpoints","count":25},{"language":"pt-BR","tag":"Início","count":20}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"/docs","hasChatPermissions":true,"hasWebMcpPermissions":true,"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}],"googleFontsInlined":true},"customCss":[{"filePath":"style.css","content":"#localization-select-trigger,[data-component-part=localization-select-trigger]{display:none!important}"}],"page":{"pagePath":"guides/merchant/webhooks","slug":"/guides/merchant/webhooks","pageMetadata":{"title":"Webhooks","description":"Receba eventos de pedido e de indoor em tempo real na sua URL, valide a assinatura e trate reenvios e suspensões.","icon":"bolt","href":"/guides/merchant/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: \"Receba eventos de pedido e de indoor em tempo real na sua URL, valide a assinatura e trate reenvios e suspensões.\"\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},{Accordion,AccordionGroup,Check,CodeBlock,CodeGroup,Danger,Frame,Heading,Info,Note,OptimizedImage,ParamField,ResponseField,Step,Steps,Table,Tip,Warning}=_components;if(!Accordion)_missingMdxReference(`Accordion`,true);if(!AccordionGroup)_missingMdxReference(`AccordionGroup`,true);if(!Check)_missingMdxReference(`Check`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!CodeGroup)_missingMdxReference(`CodeGroup`,true);if(!Danger)_missingMdxReference(`Danger`,true);if(!Frame)_missingMdxReference(`Frame`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Info)_missingMdxReference(`Info`,true);if(!Note)_missingMdxReference(`Note`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!ParamField)_missingMdxReference(`ParamField`,true);if(!ResponseField)_missingMdxReference(`ResponseField`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Com o webhook, a DeliveryVip faz um `,_jsx(_components.code,{children:`POST`}),` com o evento em JSON na sua URL assim que ele acontece. Você recebe eventos de pedido e de indoor (chamar garçom, pedir a conta) sem fila para drenar, sem limite de 100 eventos e sem intervalo de consulta.`]}),`\n`,_jsxs(Info,{children:[_jsxs(_components.p,{children:[`Webhook e `,_jsx(_components.a,{href:`/guides/merchant/events`,children:`polling`}),` são independentes: receber um evento por webhook `,_jsx(_components.strong,{children:`não`}),` o remove do polling, e vice-versa. Eventos entregues por webhook não precisam de acknowledgment.`]}),_jsxs(_components.p,{children:[`Use o `,_jsx(_components.strong,{children:`webhook como canal principal`}),` e o `,_jsx(_components.strong,{children:`polling como reconciliação`}),`: se o seu endpoint ficar fora do ar, os eventos das últimas 24 horas continuam disponíveis no polling.`]})]}),`\n`,_jsx(Heading,{level:`2`,id:`como-configurar`,children:`Como configurar`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Abra a sua aplicação`,children:_jsx(_components.p,{children:`No painel do desenvolvedor, abra a aplicação que integra com as lojas.`})}),_jsxs(Step,{title:`Informe a URL de notificação`,children:[_jsxs(_components.p,{children:[`Na seção `,_jsx(_components.strong,{children:`Webhook`}),`, preencha a `,_jsx(_components.strong,{children:`URL de notificação`}),` com o endpoint do seu sistema que vai receber os eventos e salve.`]}),_jsx(Frame,{caption:`Seção Webhook: informe a URL de notificação e salve`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/deliveryvip-a4256422/ELxpcniK2_BP8zxT/images/webhook-configuracao.png?fit=max\u0026auto=format\u0026n=ELxpcniK2_BP8zxT\u0026q=85\u0026s=ddfcf91e47dd66a7ad8109765772a0c1`,alt:`Seção Webhook do painel, com o campo URL de notificação preenchido`,\"data-og-width\":`846`,width:`846`,\"data-og-height\":`190`,height:`190`,\"data-path\":`images/webhook-configuracao.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/deliveryvip-a4256422/ELxpcniK2_BP8zxT/images/webhook-configuracao.png?w=280\u0026fit=max\u0026auto=format\u0026n=ELxpcniK2_BP8zxT\u0026q=85\u0026s=aeff64436bda4eb4a3575e3ad7e9731a 280w, https://mintcdn.com/deliveryvip-a4256422/ELxpcniK2_BP8zxT/images/webhook-configuracao.png?w=560\u0026fit=max\u0026auto=format\u0026n=ELxpcniK2_BP8zxT\u0026q=85\u0026s=b013d9ec910b1a6bc5305549e406be9f 560w, https://mintcdn.com/deliveryvip-a4256422/ELxpcniK2_BP8zxT/images/webhook-configuracao.png?w=840\u0026fit=max\u0026auto=format\u0026n=ELxpcniK2_BP8zxT\u0026q=85\u0026s=0f2a6de8a7cebb3f725e92519ef32365 840w, https://mintcdn.com/deliveryvip-a4256422/ELxpcniK2_BP8zxT/images/webhook-configuracao.png?w=1100\u0026fit=max\u0026auto=format\u0026n=ELxpcniK2_BP8zxT\u0026q=85\u0026s=fc462bdf77af1d94db63a50abf211c7f 1100w, https://mintcdn.com/deliveryvip-a4256422/ELxpcniK2_BP8zxT/images/webhook-configuracao.png?w=1650\u0026fit=max\u0026auto=format\u0026n=ELxpcniK2_BP8zxT\u0026q=85\u0026s=19444711d60ee580d07128d49dbecd7e 1650w, https://mintcdn.com/deliveryvip-a4256422/ELxpcniK2_BP8zxT/images/webhook-configuracao.png?w=2500\u0026fit=max\u0026auto=format\u0026n=ELxpcniK2_BP8zxT\u0026q=85\u0026s=ddaa3a447574b109ba1ee3c4ae6c13ec 2500w`})})]}),_jsx(Step,{title:`Responda 2xx`,children:_jsxs(_components.p,{children:[`O seu endpoint precisa aceitar `,_jsx(_components.code,{children:`POST`}),` e responder com um status `,_jsx(_components.strong,{children:`2xx`}),` para confirmar o recebimento.`]})})]}),`\n`,_jsxs(_components.p,{children:[`A aplicação tem `,_jsx(_components.strong,{children:`uma única URL`}),` de webhook. Os eventos de todas as lojas que instalaram o seu app chegam nela; identifique a loja pelo header `,_jsx(_components.code,{children:`X-App-MerchantId`}),` ou pelo campo `,_jsx(_components.code,{children:`merchantId`}),` do corpo.`]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`Apps com a extensão Open Delivery podem ter uma URL e um secret `,_jsx(_components.strong,{children:`por loja`}),`. Veja `,_jsx(_components.a,{href:`/guides/open-delivery/recebendo-eventos`,children:`Recebendo eventos`}),` no guia Open Delivery.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`a-requisição`,children:`A requisição`}),`\n`,_jsx(_components.p,{children:`Cada evento chega numa requisição própria:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`6`,language:`http`,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:`http`,children:_jsxs(_components.code,{language:`http`,numberOfLines:`6`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`POST`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {sua URL de notificação}`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`Content-Type`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` application/json`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`User-Agent`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` DeliveryVip`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`X-App-Id`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 019efa90-dcd1-7846-983d-6bab871b2f6b`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`X-App-MerchantId`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 8158198a-4bb7-430e-9746-87cd02dfedda`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`X-App-Signature`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 5d41402abc4b2a76b9719d911017c592...`})]}),`\n`]})})}),`\n`,_jsx(ParamField,{header:`X-App-Signature`,type:`string`,required:true,id:`param-x-app-signature`,children:_jsxs(_components.p,{children:[`HMAC-SHA256 do corpo bruto da requisição, em hexadecimal minúsculo. Veja `,_jsx(_components.a,{href:`#validando-a-origem`,children:`Validando a origem`}),`.`]})}),`\n`,_jsx(ParamField,{header:`X-App-MerchantId`,type:`string`,required:true,id:`param-x-app-merchant-id`,children:_jsxs(_components.p,{children:[`A loja do evento: o `,_jsx(_components.code,{children:`merchantId`}),` que você configurou para ela, quando houver, ou o id da loja na DeliveryVip. É o mesmo valor do campo `,_jsx(_components.code,{children:`merchantId`}),` do corpo.`]})}),`\n`,_jsx(ParamField,{header:`X-App-Id`,type:`string`,required:true,id:`param-x-app-id`,children:_jsxs(_components.p,{children:[`Identificador `,_jsx(_components.strong,{children:`fixo`}),` da DeliveryVip como plataforma emissora: `,_jsx(_components.code,{children:`019efa90-dcd1-7846-983d-6bab871b2f6b`}),`. É o mesmo em todas as entregas, para todos os apps, e `,_jsx(_components.strong,{children:`não`}),` é o id do seu app. Serve como checagem simples de origem; quem garante a autenticidade é a assinatura.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`validando-a-origem`,children:`Validando a origem`}),`\n`,_jsxs(_components.p,{children:[`O header `,_jsx(_components.code,{children:`X-App-Signature`}),` é o `,_jsx(_components.strong,{children:`HMAC-SHA256 do corpo bruto`}),`, em hexadecimal minúsculo, usando o `,_jsx(_components.strong,{children:`Client Secret`}),` da sua aplicação como chave. Recalcule a assinatura sobre o corpo recebido e compare com o header usando comparação de tempo constante.`]}),`\n`,_jsxs(CodeGroup,{children:[_jsx(CodeBlock,{filename:`Node.js`,numberOfLines:`20`,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:`20`,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'`})]}),`\n`,_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:` express`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` from`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'express'`})]}),`\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:` app`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` express`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// express.raw mantém o corpo exatamente como chegou`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`app`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`post`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'/webhooks/deliveryvip'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`express`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`raw`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`({ `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`type:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'application/json'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }), (`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`req`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`res`}),_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\":`#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:` expected`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_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:`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:`process`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`env`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:`CLIENT_SECRET`}),_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:`req`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`body`}),_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`,_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:` received`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` req`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`get`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'X-App-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:`#0A3069`,\"--shiki-dark\":`#CE9178`},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:` valid`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` received`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#9CDCFE`},children:`length`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--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:`#0550AE`,\"--shiki-dark\":`#9CDCFE`},children:`length`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` \u0026\u0026`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_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:`received`}),_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:`))`})]}),`\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:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`!`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`valid`}),_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:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` res`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`sendStatus`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`401`}),_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:` event`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` JSON`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`parse`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`req`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`body`}),_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\":`#9CDCFE`},children:` queue`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`push`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`event`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// processe depois, fora da requisição`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` res`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`sendStatus`}),_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:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`})`})}),`\n`]})})}),_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`})]}),`\n`,_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:` hmac`})]}),`\n`,_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:` os`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` flask `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Flask, abort, request`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`app `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Flask(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#9CDCFE`},children:`__name__`}),_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:`#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/deliveryvip\"`}),_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:` deliveryvip_webhook`}),_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:` raw_body `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` request.get_data() `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# bytes exatamente como chegaram`})]}),`\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(os.environ[`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"CLIENT_SECRET\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`].encode(), raw_body, hashlib.sha256).hexdigest()`})]}),`\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:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` not`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` hmac.compare_digest(expected, request.headers.get(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"X-App-Signature\"`}),_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:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` abort(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`401`}),_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:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` queue.put(request.get_json()) `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# processe depois, fora da requisição`})]}),`\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`]})})}),_jsx(CodeBlock,{filename:`Ruby`,numberOfLines:`2`,language:`ruby`,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:`ruby`,children:_jsxs(_components.code,{language:`ruby`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`expected`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` OpenSSL`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#4EC9B0`},children:`::`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`HMAC`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`hexdigest`}),_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:`, client_secret, request.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`raw_post`}),_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:`valid`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` ActiveSupport`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#4EC9B0`},children:`::`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`SecurityUtils`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`secure_compare`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(expected, request.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`headers`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`[`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"X-App-Signature\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`].`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`to_s`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`]})})})]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Calcule a assinatura sobre o `,_jsx(_components.strong,{children:`corpo exato recebido`}),`, antes de qualquer parse. Fazer parse e serializar de novo muda os bytes, e a assinatura deixa de bater.`]})}),`\n`,_jsx(Danger,{children:_jsx(_components.p,{children:`Rejeite toda requisição cuja assinatura não confere. A assinatura é a única prova de que o evento veio da DeliveryVip; sem ela, qualquer um consegue forjar eventos de pedido no seu endpoint.`})}),`\n`,_jsx(Info,{children:_jsx(_components.p,{children:`Ao renovar o Client Secret, a troca vale na hora: toda entrega enviada depois, incluindo tentativas automáticas e reenvios manuais, já é assinada com o novo secret.`})}),`\n`,_jsx(Heading,{level:`2`,id:`o-corpo-do-evento`,children:`O corpo do evento`}),`\n`,_jsxs(_components.p,{children:[`O corpo é `,_jsx(_components.strong,{children:`um único evento`}),`, no mesmo formato que o polling devolve.`]}),`\n`,_jsx(ResponseField,{name:`eventId`,type:`uuid`,required:true,id:`param-event-id`,children:_jsx(_components.p,{children:`Identificador único do evento. Use-o para descartar entregas repetidas.`})}),`\n`,_jsx(ResponseField,{name:`eventType`,type:`string`,required:true,id:`param-event-type`,children:_jsxs(_components.p,{children:[`Tipo do evento, em maiúsculas. Veja `,_jsx(_components.a,{href:`#tipos-de-evento`,children:`os tipos`}),`.`]})}),`\n`,_jsx(ResponseField,{name:`merchantId`,type:`string`,required:true,id:`param-merchant-id`,children:_jsx(_components.p,{children:`A loja do evento.`})}),`\n`,_jsx(ResponseField,{name:`createdAt`,type:`datetime`,required:true,id:`param-created-at`,children:_jsxs(_components.p,{children:[`Quando o evento aconteceu, em RFC 3339 com o fuso de Brasília (`,_jsx(_components.code,{children:`-03:00`}),`). Para lojas integradas pelo `,_jsx(_components.a,{href:`/guides/open-delivery`,children:`Open Delivery`}),`, vem em UTC (sufixo `,_jsx(_components.code,{children:`Z`}),`).`]})}),`\n`,_jsx(ResponseField,{name:`metadata`,type:`object`,id:`param-metadata`,children:_jsx(_components.p,{children:`Dados extras de alguns eventos, como o motivo de um cancelamento. Chaves em camelCase. Só vem quando há conteúdo.`})}),`\n`,_jsx(ResponseField,{name:`orderId`,type:`uuid`,id:`param-order-id`,children:_jsx(_components.p,{children:`Eventos de pedido. O pedido ao qual o evento pertence.`})}),`\n`,_jsx(ResponseField,{name:`orderURL`,type:`string`,id:`param-order-url`,children:_jsxs(_components.p,{children:[`Eventos de pedido. URL para `,_jsx(_components.a,{href:`/guides/merchant/order/fluxo-de-integracao/obter-detalhes-do-pedido`,children:`buscar os detalhes do pedido`}),`.`]})}),`\n`,_jsx(ResponseField,{name:`orderType`,type:`string`,id:`param-order-type`,children:_jsxs(_components.p,{children:[`Eventos de pedido. `,_jsx(_components.code,{children:`DELIVERY`}),`, `,_jsx(_components.code,{children:`TAKEOUT`}),` ou `,_jsx(_components.code,{children:`INDOOR`}),`.`]})}),`\n`,_jsx(ResponseField,{name:`placeName, placeId, tab, tabId, tabCode, tabName`,type:`string`,id:`param-place-name-place-id-tab-tab-id-tab-code-tab-name`,children:_jsx(_components.p,{children:`Eventos de indoor. A mesa ou a comanda que gerou o evento. Cada campo só vem quando está preenchido.`})}),`\n`,_jsxs(CodeGroup,{children:[_jsx(CodeBlock,{filename:`Pedido`,numberOfLines:`9`,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:`9`,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:` \"eventId\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"209c060f-41f2-4420-81ab-15f2b5559c58\"`}),_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:` \"createdAt\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"2026-06-30T12:00:00-03:00\"`}),_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:` \"merchantId\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"8158198a-4bb7-430e-9746-87cd02dfedda\"`}),_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:` \"eventType\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"CREATED\"`}),_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:` \"orderId\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"52122852-6626-11ed-9022-0242ac120002\"`}),_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:` \"orderURL\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"https://api.deliveryvip.com.br/merchant/v3/orders/52122852-6626-11ed-9022-0242ac120002\"`}),_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:` \"orderType\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"DELIVERY\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),_jsx(CodeBlock,{filename:`Indoor`,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:` \"eventId\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"6f1d2c3b-8a4e-4b5f-9c6d-7e8f9a0b1c2d\"`}),_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:` \"createdAt\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"2026-06-30T20:15:00-03:00\"`}),_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:` \"merchantId\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"8158198a-4bb7-430e-9746-87cd02dfedda\"`}),_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:` \"eventType\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"CALL_WAITER\"`}),_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:` \"placeName\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Mesa 10\"`}),_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:` \"placeId\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"a3c1e5f7-2b4d-4f6a-8c0e-1d3f5a7b9c2e\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})})]}),`\n`,_jsx(Heading,{level:`3`,id:`tipos-de-evento`,children:`Tipos de evento`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Grupo`}),_jsx(_components.th,{children:_jsx(_components.code,{children:`eventType`})}),_jsx(_components.th,{children:`Detalhes`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Pedido`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`CREATED`}),`, `,_jsx(_components.code,{children:`CONFIRMED`}),`, `,_jsx(_components.code,{children:`PREPARING`}),`, `,_jsx(_components.code,{children:`READY_FOR_PICKUP`}),`, `,_jsx(_components.code,{children:`PICKED_UP`}),`, `,_jsx(_components.code,{children:`DISPATCHED`}),`, `,_jsx(_components.code,{children:`DELIVERED`}),`, `,_jsx(_components.code,{children:`CONCLUDED`}),`, `,_jsx(_components.code,{children:`CANCELLED`})]}),_jsx(_components.td,{children:_jsx(_components.a,{href:`/guides/merchant/order/fluxo-de-integracao/eventos-de-pedidos`,children:`Eventos de pedidos`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Indoor`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`CALL_WAITER`}),`, `,_jsx(_components.code,{children:`CLOSE_ACCOUNT`})]}),_jsx(_components.td,{children:_jsx(_components.a,{href:`/guides/merchant/indoor/fluxo-de-integracao/eventos-de-indoor`,children:`Eventos de indoor`})})]})]})]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`PICKUP_AREA_ASSIGNED`}),`, `,_jsx(_components.code,{children:`CANCELLATION_REQUESTED`}),`, `,_jsx(_components.code,{children:`CANCELLATION_REQUEST_DENIED`}),` e `,_jsx(_components.code,{children:`ORDER_CANCELLATION_REQUEST`}),` estão previstos na especificação, mas `,_jsx(_components.a,{href:`/guides/merchant/order/fluxo-de-integracao/eventos-de-pedidos#previstos-na-especifica%C3%A7%C3%A3o`,children:`ainda não são emitidos`}),`. Se chegar um tipo que você não conhece, responda `,_jsx(_components.code,{children:`2xx`}),` e ignore.`]}),`\n`,_jsx(Heading,{level:`2`,id:`o-que-o-seu-endpoint-deve-fazer`,children:`O que o seu endpoint deve fazer`}),`\n`,_jsx(Check,{children:_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Validar a assinatura`}),` antes de qualquer processamento.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Responder 2xx rápido.`}),` Grave o evento e processe de forma assíncrona: a DeliveryVip desiste após `,_jsx(_components.strong,{children:`3 segundos`}),` para conectar e `,_jsx(_components.strong,{children:`5 segundos`}),` para receber a resposta, e conta isso como falha.`]}),`\n`,_jsxs(_components.li,{children:[_jsxs(_components.strong,{children:[`Descartar repetidos pelo `,_jsx(_components.code,{children:`eventId`}),`.`]}),` A assinatura não tem timestamp e o mesmo evento pode chegar de novo numa nova tentativa ou num reenvio manual.`]}),`\n`]})}),`\n`,_jsx(Heading,{level:`2`,id:`tentativas-e-reenvio`,children:`Tentativas e reenvio`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Resposta do seu endpoint`}),_jsx(_components.th,{children:`O que a DeliveryVip faz`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`2xx`})}),_jsx(_components.td,{children:`Entrega concluída.`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`408`}),`, `,_jsx(_components.code,{children:`429`}),`, timeout ou erro de conexão`]}),_jsxs(_components.td,{children:[`Tenta de novo automaticamente, até `,_jsx(_components.strong,{children:`3 tentativas`}),` no total. Se todas falharem, a entrega fica como falha.`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[`Qualquer outro status, `,_jsxs(_components.strong,{children:[`inclusive `,_jsx(_components.code,{children:`5xx`})]})]}),_jsx(_components.td,{children:`Marca a entrega como falha na hora, sem nova tentativa automática.`})]})]})]}),`\n`,_jsxs(_components.p,{children:[`Entregas com falha podem ser `,_jsx(_components.strong,{children:`reenviadas manualmente`}),` no painel. Enquanto ainda há tentativas automáticas em curso, o reenvio manual fica indisponível para evitar entregas duplicadas.`]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`Se o seu servidor estiver sobrecarregado e quiser que a DeliveryVip tente de novo, responda `,_jsx(_components.code,{children:`429`}),` ou `,_jsx(_components.code,{children:`408`}),`, não `,_jsx(_components.code,{children:`500`}),` ou `,_jsx(_components.code,{children:`503`}),`.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`suspensão-automática`,children:`Suspensão automática`}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Após `,_jsx(_components.strong,{children:`10 falhas consecutivas`}),`, a DeliveryVip `,_jsx(_components.strong,{children:`suspende`}),` o envio de webhooks da sua aplicação e avisa por e-mail, com o motivo da última falha. Cada tentativa que falha conta; uma entrega bem-sucedida zera o contador.`]})}),`\n`,_jsxs(_components.p,{children:[`Enquanto o envio está suspenso, os eventos continuam disponíveis no `,_jsx(_components.a,{href:`/guides/merchant/events`,children:`polling`}),`. Para retomar:`]}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Corrija o endpoint`,children:_jsxs(_components.p,{children:[`Confirme que a URL responde `,_jsx(_components.code,{children:`2xx`}),` para um `,_jsx(_components.code,{children:`POST`}),` com corpo JSON.`]})}),_jsx(Step,{title:`Reative o envio`,children:_jsxs(_components.p,{children:[`No painel do desenvolvedor, abra a aplicação e entre em `,_jsx(_components.strong,{children:`Ver webhooks enviados`}),`. No aviso `,_jsx(_components.strong,{children:`Envio de webhooks suspenso`}),`, clique em `,_jsx(_components.strong,{children:`Reativar envios`}),`.`]})}),_jsx(Step,{title:`Reenvie o que falhou`,children:_jsxs(_components.p,{children:[`Na mesma tela, filtre por `,_jsx(_components.strong,{children:`Com falha`}),` e reenvie as entregas que você precisa.`]})})]}),`\n`,_jsx(Heading,{level:`2`,id:`acompanhamento`,children:`Acompanhamento`}),`\n`,_jsxs(_components.p,{children:[`A tela `,_jsx(_components.strong,{children:`Webhooks enviados`}),` (painel do desenvolvedor, sua aplicação, `,_jsx(_components.strong,{children:`Ver webhooks enviados`}),`) mostra o histórico de entregas: tipo do evento, loja, status HTTP e número de tentativas. Filtre por `,_jsx(_components.strong,{children:`Com falha`}),` ou `,_jsx(_components.strong,{children:`Sucesso`}),` e reenvie as entregas que falharam.`]}),`\n`,_jsx(Frame,{caption:`Tela Webhooks enviados: histórico, status HTTP, tentativas e reenvio`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/deliveryvip-a4256422/ELxpcniK2_BP8zxT/images/webhooks-enviados.png?fit=max\u0026auto=format\u0026n=ELxpcniK2_BP8zxT\u0026q=85\u0026s=1ea47ce8608d4736c48107e490f60f2e`,alt:`Tela Webhooks enviados com histórico de entregas e botões de reenvio`,\"data-og-width\":`1200`,width:`1200`,\"data-og-height\":`868`,height:`868`,\"data-path\":`images/webhooks-enviados.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/deliveryvip-a4256422/ELxpcniK2_BP8zxT/images/webhooks-enviados.png?w=280\u0026fit=max\u0026auto=format\u0026n=ELxpcniK2_BP8zxT\u0026q=85\u0026s=a79699e3ff494e24919b0816690aaa1b 280w, https://mintcdn.com/deliveryvip-a4256422/ELxpcniK2_BP8zxT/images/webhooks-enviados.png?w=560\u0026fit=max\u0026auto=format\u0026n=ELxpcniK2_BP8zxT\u0026q=85\u0026s=4e02664a465538677be70e18eb371d4b 560w, https://mintcdn.com/deliveryvip-a4256422/ELxpcniK2_BP8zxT/images/webhooks-enviados.png?w=840\u0026fit=max\u0026auto=format\u0026n=ELxpcniK2_BP8zxT\u0026q=85\u0026s=2d8f338e5729d375735915cf3efdaa98 840w, https://mintcdn.com/deliveryvip-a4256422/ELxpcniK2_BP8zxT/images/webhooks-enviados.png?w=1100\u0026fit=max\u0026auto=format\u0026n=ELxpcniK2_BP8zxT\u0026q=85\u0026s=7caa8babc3699c5944cc9a32f28e42d0 1100w, https://mintcdn.com/deliveryvip-a4256422/ELxpcniK2_BP8zxT/images/webhooks-enviados.png?w=1650\u0026fit=max\u0026auto=format\u0026n=ELxpcniK2_BP8zxT\u0026q=85\u0026s=ffca0c433cc3f6b7a524e3df728e0397 1650w, https://mintcdn.com/deliveryvip-a4256422/ELxpcniK2_BP8zxT/images/webhooks-enviados.png?w=2500\u0026fit=max\u0026auto=format\u0026n=ELxpcniK2_BP8zxT\u0026q=85\u0026s=5a10a5fb4f8053c6bc73d586dd52fce9 2500w`})}),`\n`,_jsx(Heading,{level:`2`,id:`erros-comuns`,children:`Erros comuns`}),`\n`,_jsxs(AccordionGroup,{children:[_jsx(Accordion,{title:`A assinatura nunca confere`,icon:`signature`,id:`a-assinatura-nunca-confere`,children:_jsxs(_components.p,{children:[`Quase sempre o corpo foi transformado antes do cálculo: o framework fez parse do JSON e você serializou de novo. Leia o corpo bruto (`,_jsx(_components.code,{children:`express.raw`}),`, `,_jsx(_components.code,{children:`request.get_data()`}),`, `,_jsx(_components.code,{children:`request.raw_post`}),`) e calcule o HMAC sobre esses bytes. Confira também se está usando o `,_jsx(_components.strong,{children:`Client Secret`}),` da aplicação, e não o Client ID.`]})}),_jsx(Accordion,{title:`Recebo o mesmo evento duas vezes`,icon:`clone`,id:`recebo-o-mesmo-evento-duas-vezes`,children:_jsxs(_components.p,{children:[`É esperado: novas tentativas e reenvios manuais repetem o mesmo `,_jsx(_components.code,{children:`eventId`}),`, e o mesmo evento também aparece no polling. Guarde os `,_jsx(_components.code,{children:`eventId`}),` processados e descarte os repetidos.`]})}),_jsx(Accordion,{title:`O envio foi suspenso`,icon:`circle-pause`,id:`o-envio-foi-suspenso`,children:_jsxs(_components.p,{children:[`O seu endpoint acumulou 10 falhas seguidas. Corrija o endpoint, clique em `,_jsx(_components.strong,{children:`Reativar envios`}),` na tela `,_jsx(_components.strong,{children:`Webhooks enviados`}),` e reenvie as entregas com falha. Enquanto isso, recupere os eventos pelo polling.`]})}),_jsx(Accordion,{title:`Meu endpoint retornou 500 e o evento não voltou`,icon:`rotate`,id:`meu-endpoint-retornou-500-e-o-evento-nao-voltou`,children:_jsxs(_components.p,{children:[`Respostas `,_jsx(_components.code,{children:`5xx`}),` não são tentadas de novo automaticamente. Reenvie pelo painel ou recupere o evento pelo polling. Para pedir uma nova tentativa automática, responda `,_jsx(_components.code,{children:`429`}),` ou `,_jsx(_components.code,{children:`408`}),`.`]})})]})]})}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":"Receba eventos de pedido e de indoor em tempo real na sua URL, valide a assinatura e trate reenvios e suspensões.","icon":"bolt","href":"/guides/merchant/webhooks"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Como configurar","slug":"como-configurar","depth":2,"children":[]},{"title":"A requisição","slug":"a-requisição","depth":2,"children":[]},{"title":"Validando a origem","slug":"validando-a-origem","depth":2,"children":[]},{"title":"O corpo do evento","slug":"o-corpo-do-evento","depth":2,"children":[{"title":"Tipos de evento","slug":"tipos-de-evento","depth":3,"children":[]}]},{"title":"O que o seu endpoint deve fazer","slug":"o-que-o-seu-endpoint-deve-fazer","depth":2,"children":[]},{"title":"Tentativas e reenvio","slug":"tentativas-e-reenvio","depth":2,"children":[]},{"title":"Suspensão automática","slug":"suspensão-automática","depth":2,"children":[]},{"title":"Acompanhamento","slug":"acompanhamento","depth":2,"children":[]},{"title":"Erros comuns","slug":"erros-comuns","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"deliveryvip-a4256422","siteName":"DeliveryVip Developers","title":"Webhooks - DeliveryVip Developers","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"pt-BR":{"href":"/guides/merchant/webhooks","matchLevel":0}}},"lastModified":"2026-10-30T16:41:39.076Z","originalFileLocation":"guides/merchant/webhooks.mdx","locale":"pt-BR"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=\"system\";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=\"system\"}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=\"Receba eventos de pedido e de indoor em tempo real na sua URL, valide a assinatura e trate reenvios e suspensões.\">\u003cmeta data-mint-head name=\"application-name\" content=\"DeliveryVip Developers\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/deliveryvip-a4256422/lIzAoDMYv08osHDW/_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=\"/docs/mintlify-assets/_mintlify/favicons/deliveryvip-a4256422/lIzAoDMYv08osHDW/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/deliveryvip-a4256422/lIzAoDMYv08osHDW/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/deliveryvip-a4256422/lIzAoDMYv08osHDW/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/deliveryvip-a4256422/lIzAoDMYv08osHDW/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/deliveryvip-a4256422/lIzAoDMYv08osHDW/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/deliveryvip-a4256422/lIzAoDMYv08osHDW/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/deliveryvip-a4256422/lIzAoDMYv08osHDW/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/deliveryvip-a4256422/lIzAoDMYv08osHDW/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Webhooks - DeliveryVip Developers\">\u003cmeta data-mint-head property=\"og:description\" content=\"Receba eventos de pedido e de indoor em tempo real na sua URL, valide a assinatura e trate reenvios e suspensões.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"DeliveryVip Developers\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://deliveryvip-a4256422.mintlify.dev/docs/guides/merchant/webhooks\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://deliveryvip-a4256422.mintlify.app/_mintlify/api/og/v2?division=Vis%C3%A3o+geral\u0026amp;title=Webhooks\u0026amp;description=Receba+eventos+de+pedido+e+de+indoor+em+tempo+real+na+sua+URL%2C+valide+a+assinatura+e+trate+reenvios+e+suspens%C3%B5es.\u0026amp;theme=3b22322ae3bbae2651505377\u0026amp;signature=5f087b994969dda64f64579b4c6b57f5f3d6c490f9991931fbdb2574fac30808\">\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 - DeliveryVip Developers\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Receba eventos de pedido e de indoor em tempo real na sua URL, valide a assinatura e trate reenvios e suspensões.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://deliveryvip-a4256422.mintlify.app/_mintlify/api/og/v2?division=Vis%C3%A3o+geral\u0026amp;title=Webhooks\u0026amp;description=Receba+eventos+de+pedido+e+de+indoor+em+tempo+real+na+sua+URL%2C+valide+a+assinatura+e+trate+reenvios+e+suspens%C3%B5es.\u0026amp;theme=3b22322ae3bbae2651505377\u0026amp;signature=5f087b994969dda64f64579b4c6b57f5f3d6c490f9991931fbdb2574fac30808\">\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=\"/docs/mintlify-assets/_mintlify/favicons/deliveryvip-a4256422/lIzAoDMYv08osHDW/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"DeliveryVip Developers\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#EC681B\">\u003cmeta data-mint-head name=\"og:locale\" content=\"pt_BR\">\u003clink data-mint-head rel=\"canonical\" href=\"https://deliveryvip-a4256422.mintlify.dev/docs/guides/merchant/webhooks\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/docs/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/docs/guides/merchant/webhooks.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://deliveryvip-a4256422.mintlify.dev/#organization\",\"name\":\"DeliveryVip Developers\",\"url\":\"https://deliveryvip-a4256422.mintlify.dev\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/deliveryvip-a4256422/ELxpcniK2_BP8zxT/logo/light.svg?fit=max\u0026auto=format\u0026n=ELxpcniK2_BP8zxT\u0026q=85\u0026s=b5cd347a6fb8b88418ecffa2cecba5ca\"}},{\"@type\":\"WebSite\",\"@id\":\"https://deliveryvip-a4256422.mintlify.dev/docs#website\",\"name\":\"DeliveryVip Developers\",\"url\":\"https://deliveryvip-a4256422.mintlify.dev/docs\",\"publisher\":{\"@id\":\"https://deliveryvip-a4256422.mintlify.dev/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://deliveryvip-a4256422.mintlify.dev/docs/guides/merchant/webhooks#webpage\",\"url\":\"https://deliveryvip-a4256422.mintlify.dev/docs/guides/merchant/webhooks\",\"name\":\"Webhooks\",\"description\":\"Receba eventos de pedido e de indoor em tempo real na sua URL, valide a assinatura e trate reenvios e suspensões.\",\"dateModified\":\"2026-10-30T16:41:39.076Z\",\"isPartOf\":{\"@id\":\"https://deliveryvip-a4256422.mintlify.dev/docs#website\"},\"breadcrumb\":{\"@id\":\"https://deliveryvip-a4256422.mintlify.dev/docs/guides/merchant/webhooks#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://deliveryvip-a4256422.mintlify.dev/docs/guides/merchant/webhooks#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Visão geral\",\"item\":\"https://deliveryvip-a4256422.mintlify.dev/docs/guides/merchant/index\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Webhooks\",\"item\":\"https://deliveryvip-a4256422.mintlify.dev/docs/guides/merchant/webhooks\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://deliveryvip-a4256422.mintlify.dev/docs/guides/merchant/webhooks#article\",\"headline\":\"Webhooks\",\"name\":\"Webhooks\",\"description\":\"Receba eventos de pedido e de indoor em tempo real na sua URL, valide a assinatura e trate reenvios e suspensões.\",\"url\":\"https://deliveryvip-a4256422.mintlify.dev/docs/guides/merchant/webhooks\",\"mainEntityOfPage\":{\"@id\":\"https://deliveryvip-a4256422.mintlify.dev/docs/guides/merchant/webhooks#webpage\"},\"dateModified\":\"2026-10-30T16:41:39.076Z\",\"publisher\":{\"@id\":\"https://deliveryvip-a4256422.mintlify.dev/#organization\"},\"isPartOf\":{\"@id\":\"https://deliveryvip-a4256422.mintlify.dev/docs#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"DeliveryVip Developers\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"DeliveryVip Developers","nav":{"global":null,"languages":[{"language":"pt-BR","tabs":[{"tab":"Início","icon":"house","pages":[{"title":"Início","href":""}]},{"tab":"Merchant API","icon":"store","groups":[{"group":"Visão geral","icon":"compass","pages":[{"title":"Merchant API","sidebarTitle":"Introdução","icon":"store","href":"/guides/merchant"},{"title":"Eventos","sidebarTitle":"Eventos","description":"Entenda o polling de eventos, a fila de 100 eventos por chamada e quando combinar polling com webhook.","icon":"bell","href":"/guides/merchant/events"},{"title":"Webhooks","icon":"bolt","href":"/guides/merchant/webhooks"}]},{"group":"Pedidos","icon":"receipt","pages":[{"title":"Pedidos","sidebarTitle":"Visão geral","description":"Receba, confirme e acompanhe os pedidos das lojas que instalaram o seu app.","icon":"compass","href":"/guides/merchant/order/index"},{"title":"Definições","icon":"book-open","href":"/guides/merchant/order/definicoes"},{"title":"Listar pedidos","icon":"list","href":"/guides/merchant/order/listar-pedidos"},{"group":"Fluxo de integração","pages":[{"title":"Fluxo de integração","sidebarTitle":"Visão geral","icon":"compass","href":"/guides/merchant/order/fluxo-de-integracao/index"},{"title":"Receba seu primeiro pedido","sidebarTitle":"Seu primeiro pedido","icon":"rocket","href":"/guides/merchant/order/fluxo-de-integracao/recepcao-de-pedidos"},{"title":"Consultar novos pedidos","sidebarTitle":"Consultar eventos","icon":"bell","href":"/guides/merchant/order/fluxo-de-integracao/consultar-novos-pedidos"},{"title":"Eventos de pedidos","icon":"bell","href":"/guides/merchant/order/fluxo-de-integracao/eventos-de-pedidos"},{"title":"Acknowledgment de eventos","sidebarTitle":"Acknowledgment","icon":"check-double","href":"/guides/merchant/order/fluxo-de-integracao/acknowledgment-de-eventos"},{"title":"Ações de pedidos","sidebarTitle":"Ações","icon":"arrows-rotate","href":"/guides/merchant/order/fluxo-de-integracao/acoes-de-pedidos"},{"title":"Obter detalhes do pedido","sidebarTitle":"Detalhes do pedido","icon":"magnifying-glass","href":"/guides/merchant/order/fluxo-de-integracao/obter-detalhes-do-pedido"}]}]},{"group":"Catálogo","icon":"utensils","pages":[{"title":"Catálogo","sidebarTitle":"Visão geral","icon":"compass","href":"/guides/merchant/catalog-and-services/index"},{"title":"Detalhes da loja","sidebarTitle":"Detalhes","icon":"magnifying-glass","href":"/guides/merchant/catalog-and-services/details"},{"group":"Ações","pages":[{"title":"Ações do catálogo","sidebarTitle":"Ações","icon":"arrows-rotate","href":"/guides/merchant/catalog-and-services/actions/index"},{"title":"Atualizar objetos (update)","sidebarTitle":"Update","icon":"pen","href":"/guides/merchant/catalog-and-services/actions/update"},{"title":"Criar ou atualizar objetos (upsert)","sidebarTitle":"Upsert","icon":"file-import","href":"/guides/merchant/catalog-and-services/actions/upsert"},{"title":"Reescrever o catálogo (force)","sidebarTitle":"Force","icon":"triangle-exclamation","href":"/guides/merchant/catalog-and-services/actions/force"}]}]},{"group":"Indoor","icon":"chair","pages":[{"title":"Indoor","sidebarTitle":"Visão geral","icon":"compass","href":"/guides/merchant/indoor/index"},{"group":"Fluxo de integração","pages":[{"title":"Fluxo de integração","icon":"diagram-project","href":"/guides/merchant/indoor/fluxo-de-integracao/index"},{"title":"Consultar novos eventos","sidebarTitle":"Consultar eventos","icon":"bell","href":"/guides/merchant/indoor/fluxo-de-integracao/consultar-novos-eventos"},{"title":"Eventos de indoor","icon":"bell-concierge","href":"/guides/merchant/indoor/fluxo-de-integracao/eventos-de-indoor"},{"title":"Acknowledgment de eventos","sidebarTitle":"Acknowledgment","icon":"check-double","href":"/guides/merchant/indoor/fluxo-de-integracao/acknowledgment-de-eventos"}]},{"group":"Comandas","pages":[{"title":"Comandas","sidebarTitle":"Visão geral","icon":"compass","href":"/guides/merchant/indoor/comanda-api/index"},{"title":"Listar comandas","icon":"list","href":"/guides/merchant/indoor/comanda-api/listar-comandas"},{"title":"Obter detalhes da comanda","sidebarTitle":"Obter uma comanda","icon":"magnifying-glass","href":"/guides/merchant/indoor/comanda-api/obter-detalhes-da-comanda"},{"title":"Adicionar uma comanda","icon":"plus","href":"/guides/merchant/indoor/comanda-api/adicionar-uma-comanda"},{"title":"Atualizar uma comanda","icon":"pen","href":"/guides/merchant/indoor/comanda-api/atualizar-uma-comanda"},{"title":"Remover uma comanda","icon":"trash","href":"/guides/merchant/indoor/comanda-api/remover-uma-comanda"},{"group":"Ações das comandas","pages":[{"title":"Ações das comandas","sidebarTitle":"Ações","icon":"arrows-rotate","href":"/guides/merchant/indoor/comanda-api/acoes-das-comandas/index"},{"title":"Ativar uma comanda","sidebarTitle":"Ativar (descontinuado)","icon":"ban","href":"/guides/merchant/indoor/comanda-api/acoes-das-comandas/ativar-uma-comanda"},{"title":"Desativar uma comanda","sidebarTitle":"Desativar (descontinuado)","icon":"ban","href":"/guides/merchant/indoor/comanda-api/acoes-das-comandas/desativar-uma-comanda"},{"title":"Abrir uma comanda para consumo","sidebarTitle":"Abrir para consumo","icon":"lock-open","href":"/guides/merchant/indoor/comanda-api/acoes-das-comandas/abrir-para-consumo-uma-comanda"},{"title":"Fechar uma comanda para consumo","sidebarTitle":"Fechar para consumo","icon":"lock","href":"/guides/merchant/indoor/comanda-api/acoes-das-comandas/fechar-para-consumo-uma-comanda"}]}]},{"group":"Mesas (places)","pages":[{"title":"Places","sidebarTitle":"Visão geral","icon":"compass","href":"/guides/merchant/indoor/places-api/index"},{"title":"Listar places","icon":"list","href":"/guides/merchant/indoor/places-api/listar-places"},{"group":"Ações das mesas","pages":[{"title":"Ações de places","sidebarTitle":"Ações","icon":"arrows-rotate","href":"/guides/merchant/indoor/places-api/acoes-de-places/index"},{"title":"Abrir um place para consumo","sidebarTitle":"Abrir para consumo","icon":"lock-open","href":"/guides/merchant/indoor/places-api/acoes-de-places/abrir-para-consumo-um-place"},{"title":"Fechar um place para consumo","sidebarTitle":"Fechar para consumo","icon":"lock","href":"/guides/merchant/indoor/places-api/acoes-de-places/fechar-para-consumo-um-place"}]}]}]},{"group":"Descontos","icon":"tag","pages":[{"title":"Descontos","sidebarTitle":"Visão geral","icon":"compass","href":"/guides/merchant/discount/index"},{"title":"Listar descontos","icon":"list","href":"/guides/merchant/discount/listar-descontos"},{"title":"Obter detalhes do desconto","sidebarTitle":"Obter um desconto","icon":"magnifying-glass","href":"/guides/merchant/discount/obter-detalhes-do-desconto"},{"title":"Obter estatística do desconto","sidebarTitle":"Estatísticas","icon":"chart-line","href":"/guides/merchant/discount/obter-estatistica-do-desconto"},{"title":"Adicionar um desconto","icon":"plus","href":"/guides/merchant/discount/adicionar-um-desconto"},{"title":"Atualizar um desconto","icon":"pen","href":"/guides/merchant/discount/atualizar-um-desconto"},{"title":"Remover um desconto","icon":"trash","href":"/guides/merchant/discount/remover-um-desconto"},{"group":"Ações dos descontos","pages":[{"title":"Ações dos descontos","sidebarTitle":"Ações","icon":"arrows-rotate","href":"/guides/merchant/discount/acoes-dos-descontos/index"},{"title":"Ativar um desconto","sidebarTitle":"Ativar","icon":"toggle-on","href":"/guides/merchant/discount/acoes-dos-descontos/ativar-um-desconto"},{"title":"Desativar um desconto","sidebarTitle":"Desativar","icon":"toggle-off","href":"/guides/merchant/discount/acoes-dos-descontos/desativar-um-desconto"}]}]},{"group":"Ferramentas","icon":"wrench","pages":[{"title":"Ferramentas","sidebarTitle":"Visão geral","icon":"compass","href":"/guides/merchant/tools/index"},{"title":"Obter taxa de entrega","sidebarTitle":"Taxa de entrega","icon":"route","href":"/guides/merchant/tools/obter-taxa-de-entrega"},{"title":"Obter status do merchant","sidebarTitle":"Status do merchant","icon":"store","href":"/guides/merchant/tools/obter-status-do-merchant"}]},{"group":"Referência","icon":"code","pages":[{"title":"Merchant API V3","sidebarTitle":"Visão geral","icon":"compass","href":"/reference/merchant/v3/index"},{"group":"Pedidos","icon":"receipt","pages":[{"title":"Pedidos","icon":"receipt","href":"/reference/merchant/v3/orders"},{"group":"Eventos","pages":[{"title":"Listar eventos","deprecated":null,"version":null,"openapi":"https://app.deliveryvip.com.br/swaggers/opendelivery.yaml get /v1/events:polling","href":"/api-reference/events/listar-eventos"},{"title":"Confirmar eventos","deprecated":null,"version":null,"openapi":"https://app.deliveryvip.com.br/swaggers/merchant.yaml post /merchant/v3/events/acknowledgment","href":"/api-reference/events/confirmar-eventos"}]},{"group":"Listagem","pages":[{"title":"Listar pedidos","deprecated":null,"version":null,"openapi":"https://app.deliveryvip.com.br/swaggers/merchant.yaml get /merchant/v3/{merchantId}/orders","href":"/api-reference/orders/listar-pedidos"}]},{"group":"Detalhes","pages":[{"title":"Consultar pedido","deprecated":null,"version":null,"openapi":"https://app.deliveryvip.com.br/swaggers/opendelivery.yaml get /v1/orders/{orderId}","href":"/api-reference/orders/consultar-pedido"}]},{"group":"Ações","pages":[{"title":"Confirmar pedido","deprecated":null,"version":null,"openapi":"https://app.deliveryvip.com.br/swaggers/opendelivery.yaml post /v1/orders/{orderId}/confirm","href":"/api-reference/orders/confirmar-pedido"},{"title":"Iniciar preparo do pedido","deprecated":null,"version":null,"openapi":"https://app.deliveryvip.com.br/swaggers/merchant.yaml post /merchant/v3/orders/{orderId}/preparing","href":"/api-reference/orders/iniciar-preparo-do-pedido"},{"title":"Marcar pedido como pronto","deprecated":null,"version":null,"openapi":"https://app.deliveryvip.com.br/swaggers/opendelivery.yaml post /v1/orders/{orderId}/readyForPickup","href":"/api-reference/orders/marcar-pedido-como-pronto"},{"title":"Despachar pedido","deprecated":null,"version":null,"openapi":"https://app.deliveryvip.com.br/swaggers/opendelivery.yaml post /v1/orders/{orderId}/dispatch","href":"/api-reference/orders/despachar-pedido"},{"title":"Marcar pedido como retirado","deprecated":null,"version":null,"openapi":"https://app.deliveryvip.com.br/swaggers/opendelivery.yaml post /v1/orders/{orderId}/pickedUp","href":"/api-reference/orders/marcar-pedido-como-retirado"},{"title":"Marcar pedido como entregue","deprecated":null,"version":null,"openapi":"https://app.deliveryvip.com.br/swaggers/opendelivery.yaml post /v1/orders/{orderId}/delivered","href":"/api-reference/orders/marcar-pedido-como-entregue"},{"title":"Cancelar pedido","deprecated":null,"version":null,"openapi":"https://app.deliveryvip.com.br/swaggers/opendelivery.yaml post /v1/orders/{orderId}/requestCancellation","href":"/api-reference/orders/cancelar-pedido"},{"title":"Aceitar cancelamento","deprecated":null,"version":null,"openapi":"https://app.deliveryvip.com.br/swaggers/opendelivery.yaml post /v1/orders/{orderId}/acceptCancellation","href":"/api-reference/orders/aceitar-cancelamento"},{"title":"Recusar cancelamento","deprecated":null,"version":null,"openapi":"https://app.deliveryvip.com.br/swaggers/opendelivery.yaml post /v1/orders/{orderId}/denyCancellation","href":"/api-reference/orders/recusar-cancelamento"},{"title":"Atualizar rastreamento da entrega","deprecated":null,"version":null,"openapi":"https://app.deliveryvip.com.br/swaggers/merchant.yaml post /merchant/v3/orders/{orderId}/tracking","href":"/api-reference/orders/atualizar-rastreamento-da-entrega"}]}]},{"group":"Catálogo","icon":"utensils","pages":[{"title":"Catálogo","icon":"book-open","href":"/reference/merchant/v3/catalog-and-services"},{"group":"Detalhes","pages":[{"title":"Consultar loja","deprecated":null,"version":null,"openapi":"https://app.deliveryvip.com.br/swaggers/partner.yaml get /partner/v2/merchants/{merchantId}","href":"/api-reference/merchants/consultar-loja"}]},{"group":"Ações","pages":[{"title":"Atualizar loja","deprecated":null,"version":null,"openapi":"https://app.deliveryvip.com.br/swaggers/merchant.yaml post /merchant/v3/{merchantId}/merchantUpdate","href":"/api-reference/merchants/atualizar-loja"},{"title":"Criar ou atualizar entidades da loja","deprecated":null,"version":null,"openapi":"https://app.deliveryvip.com.br/swaggers/merchant.yaml post /merchant/v3/{merchantId}/merchantUpsert","href":"/api-reference/merchants/criar-ou-atualizar-entidades-da-loja"},{"title":"Sincronizar loja completa","deprecated":null,"version":null,"openapi":"https://app.deliveryvip.com.br/swaggers/merchant.yaml post /merchant/v3/{merchantId}/merchantForce","href":"/api-reference/merchants/sincronizar-loja-completa"}]},{"group":"Status","pages":[{"title":"Consultar status e horários da loja","deprecated":null,"version":null,"openapi":"https://app.deliveryvip.com.br/swaggers/merchant.yaml get /merchant/v3/{merchantId}/status","href":"/api-reference/merchants/consultar-status-e-horários-da-loja"}]}]},{"group":"Indoor","icon":"chair","pages":[{"title":"Indoor","icon":"utensils","href":"/reference/merchant/v3/indoor"},{"group":"Eventos","pages":[{"title":"Listar eventos","deprecated":null,"version":null,"openapi":"https://app.deliveryvip.com.br/swaggers/opendelivery.yaml get /v1/events:polling","href":"/api-reference/events/listar-eventos"},{"title":"Confirmar eventos","deprecated":null,"version":null,"openapi":"https://app.deliveryvip.com.br/swaggers/merchant.yaml post /merchant/v3/events/acknowledgment","href":"/api-reference/events/confirmar-eventos"}]},{"group":"Listagem","pages":[{"title":"Listar comandas","deprecated":null,"version":null,"openapi":"https://app.deliveryvip.com.br/swaggers/merchant.yaml get /merchant/v3/{merchantId}/tabs","href":"/api-reference/tabs/listar-comandas"},{"title":"Listar mesas","deprecated":null,"version":null,"openapi":"https://app.deliveryvip.com.br/swaggers/merchant.yaml get /merchant/v3/{merchantId}/places","href":"/api-reference/places/listar-mesas"}]},{"group":"Detalhes","pages":[{"title":"Consultar comanda","deprecated":null,"version":null,"openapi":"https://app.deliveryvip.com.br/swaggers/merchant.yaml get /merchant/v3/{merchantId}/tabs/{tabId}","href":"/api-reference/tabs/consultar-comanda"}]},{"group":"Ações de comandas","pages":[{"title":"Criar comanda","deprecated":null,"version":null,"openapi":"https://app.deliveryvip.com.br/swaggers/merchant.yaml post /merchant/v3/{merchantId}/tabs","href":"/api-reference/tabs/criar-comanda"},{"title":"Atualizar comanda","deprecated":null,"version":null,"openapi":"https://app.deliveryvip.com.br/swaggers/merchant.yaml patch /merchant/v3/{merchantId}/tabs/{tabId}","href":"/api-reference/tabs/atualizar-comanda"},{"title":"Excluir comanda","deprecated":null,"version":null,"openapi":"https://app.deliveryvip.com.br/swaggers/merchant.yaml delete /merchant/v3/{merchantId}/tabs/{tabId}","href":"/api-reference/tabs/excluir-comanda"},{"title":"Disponibilizar comanda","deprecated":true,"version":null,"openapi":"https://app.deliveryvip.com.br/swaggers/merchant.yaml post /merchant/v3/{merchantId}/tabs/{tabId}/available","href":"/api-reference/tabs/disponibilizar-comanda"},{"title":"Indisponibilizar comanda","deprecated":true,"version":null,"openapi":"https://app.deliveryvip.com.br/swaggers/merchant.yaml post /merchant/v3/{merchantId}/tabs/{tabId}/unavailable","href":"/api-reference/tabs/indisponibilizar-comanda"},{"title":"Abrir comanda","deprecated":null,"version":null,"openapi":"https://app.deliveryvip.com.br/swaggers/merchant.yaml post /merchant/v3/{merchantId}/tabs/{tabId}/opened","href":"/api-reference/tabs/abrir-comanda"},{"title":"Fechar comanda","deprecated":null,"version":null,"openapi":"https://app.deliveryvip.com.br/swaggers/merchant.yaml post /merchant/v3/{merchantId}/tabs/{tabId}/closed","href":"/api-reference/tabs/fechar-comanda"}]},{"group":"Ações das mesas","pages":[{"title":"Abrir mesa","deprecated":null,"version":null,"openapi":"https://app.deliveryvip.com.br/swaggers/merchant.yaml post /merchant/v3/{merchantId}/places/{placeId}/opened","href":"/api-reference/places/abrir-mesa"},{"title":"Fechar mesa","deprecated":null,"version":null,"openapi":"https://app.deliveryvip.com.br/swaggers/merchant.yaml post /merchant/v3/{merchantId}/places/{placeId}/closed","href":"/api-reference/places/fechar-mesa"}]}]},{"group":"Descontos","icon":"tag","pages":[{"title":"Descontos","icon":"tags","href":"/reference/merchant/v3/discounts"},{"group":"Listagem","pages":[{"title":"Listar descontos","deprecated":null,"version":null,"openapi":"https://app.deliveryvip.com.br/swaggers/merchant.yaml get /merchant/v3/{merchantId}/discounts","href":"/api-reference/discounts/listar-descontos"}]},{"group":"Detalhes","pages":[{"title":"Consultar desconto","deprecated":null,"version":null,"openapi":"https://app.deliveryvip.com.br/swaggers/merchant.yaml get /merchant/v3/{merchantId}/discounts/{discountId}","href":"/api-reference/discounts/consultar-desconto"},{"title":"Consultar estatísticas do desconto","deprecated":null,"version":null,"openapi":"https://app.deliveryvip.com.br/swaggers/merchant.yaml get /merchant/v3/{merchantId}/discounts/{discountId}/stats","href":"/api-reference/discounts/consultar-estatísticas-do-desconto"}]},{"group":"Ações","pages":[{"title":"Criar desconto","deprecated":null,"version":null,"openapi":"https://app.deliveryvip.com.br/swaggers/merchant.yaml post /merchant/v3/{merchantId}/discounts","href":"/api-reference/discounts/criar-desconto"},{"title":"Atualizar desconto","deprecated":null,"version":null,"openapi":"https://app.deliveryvip.com.br/swaggers/merchant.yaml patch /merchant/v3/{merchantId}/discounts/{discountId}","href":"/api-reference/discounts/atualizar-desconto"},{"title":"Excluir desconto","deprecated":null,"version":null,"openapi":"https://app.deliveryvip.com.br/swaggers/merchant.yaml delete /merchant/v3/{merchantId}/discounts/{discountId}","href":"/api-reference/discounts/excluir-desconto"},{"title":"Ativar desconto","deprecated":null,"version":null,"openapi":"https://app.deliveryvip.com.br/swaggers/merchant.yaml post /merchant/v3/{merchantId}/discounts/{discountId}/available","href":"/api-reference/discounts/ativar-desconto"},{"title":"Desativar desconto","deprecated":null,"version":null,"openapi":"https://app.deliveryvip.com.br/swaggers/merchant.yaml post /merchant/v3/{merchantId}/discounts/{discountId}/unavailable","href":"/api-reference/discounts/desativar-desconto"}]}]},{"group":"Ferramentas","icon":"wrench","pages":[{"title":"Ferramentas","icon":"toolbox","href":"/reference/merchant/v3/tools"},{"title":"Calcular taxa de entrega","deprecated":null,"version":null,"openapi":"https://app.deliveryvip.com.br/swaggers/merchant.yaml get /merchant/v3/{merchantId}/delivery-fee/{latitude}/{longitude}","href":"/api-reference/utils/calcular-taxa-de-entrega"}]}]}]},{"tab":"Open Delivery","icon":"right-left","pages":[{"title":"Open Delivery","href":"/guides/open-delivery"}]},{"tab":"Fidelidade","icon":"gift","pages":[{"title":"Fidelidade","href":"/guides/merchant/loyalty"}]},{"tab":"Partner API","icon":"handshake","pages":[{"title":"Partner API","href":"/guides/partner"}]},{"tab":"Changelog","icon":"clock-rotate-left","pages":[{"title":"Changelog","href":"/changelog"}]}]}]},"basePath":"","title":"Webhooks - DeliveryVip Developers","buildId":"dpl_4RHMRqtvdHvKgaEfTTjFqjzja3B6","deploymentId":"dpl_4RHMRqtvdHvKgaEfTTjFqjzja3B6","dynamics":["07c022d89b","a74be98ba7"],"chunks":["Frame-CSp1VigC.js","DynamicMarkdown-Dnt6YhtR.js","zoom-image-lightbox-CZTaVDTN.js","lightbox-handle-r17bVUz3.js"]}