Catálogo de eventos
Os 21 tipos de evento que um webhook pode assinar, com o corpo real de cada um, e as rotas que listam os tipos disponíveis.
Um evento é o aviso de que algo aconteceu na loja. Ao cadastrar um webhook você escolhe a lista de tipos que quer receber (campo events). Esta página mostra o que cada tipo significa, quando é disparado e qual é o payload exato que chega à sua URL. Todos os corpos abaixo vêm das estruturas que a plataforma serializa; os valores dos exemplos são fictícios.
Lembre que o payload vem dentro do envelope {event, payload, timestamp, webhook_id}. Os campos do payload valem para os webhooks do administrador. O seller recebe os mesmos corpos, só que apenas para os tipos order.* e product.* dos próprios pedidos e produtos.
Listar os tipos assináveis
As três rotas abaixo devolvem listas de nomes de evento. Use as duas primeiras para montar uma tela de cadastro ou validar o que você vai enviar em events. A terceira serve a scripts da loja e não é a lista de webhooks.
/api/v1/admin/webhooks/event-typesAdminTipos de evento que o administrador pode assinar, por categoria
Exige o módulo webhooks e o privilégio manage_webhooks ou manage_settings. Não tem parâmetros.
/api/v1/vendor/webhooks/event-typesSellerTipos de evento que o seller pode assinar, por categoria
Exige o módulo webhooks e um usuário seller com permissão de configurações. Não tem parâmetros. Devolve só as categorias orders e products.
/api/v1/admin/event-typesAdminTipos de evento que um script da loja pode escutar
Exige o privilégio manage_scripts ou manage_settings. É a lista usada pelo editor de scripts da loja, e não a de webhooks: inclui order.paid e order.cancelled, e order.completed, order.shipped e os incentive.* não aparecem nela. Para webhooks, use a rota webhooks/event-types.
Exemplo de requisição
curl "$BASE_URL/api/v1/admin/webhooks/event-types" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"incentives": [
"incentive.campaign_published", "incentive.member_enrolled", "incentive.progress_changed",
"incentive.award_granted", "incentive.redemption_updated", "incentive.campaign_closed",
"incentive.resource_changed"
],
"orders": ["order.created", "order.statusChanged", "order.completed", "order.cancelled", "order.shipped"],
"products": ["product.created", "product.updated", "product.deleted"],
"customers": ["customer.registered", "customer.updated"],
"cart": ["cart.abandoned"],
"reviews": ["review.created"],
"vendors": ["vendor.registered", "vendor.approved"]
}{
"orders": ["order.created", "order.statusChanged", "order.completed", "order.cancelled", "order.shipped"],
"products": ["product.created", "product.updated", "product.deleted"]
}{
"event_types": [
"order.created", "order.statusChanged", "order.paid", "order.cancelled",
"product.created", "product.updated", "product.deleted",
"customer.registered", "customer.updated", "cart.abandoned", "review.created",
"vendor.registered", "vendor.approved"
]
}Erros
| Status | Quando | Corpo |
|---|---|---|
| 401 | Token ausente ou inválido | {"error":"invalid or expired token"} |
| 403 | Módulo webhooks desligado | {"error":"module_disabled","module":"webhooks"} |
| 403 | Falta o privilégio manage_webhooks ou manage_settings (administrador) | {"error":"insufficient privileges","privilege_required_any":["manage_webhooks","manage_settings"]} |
| 403 | Falta manage_scripts ou manage_settings (rota /admin/event-types) | {"error":"insufficient privileges","privilege_required_any":["manage_scripts","manage_settings"]} |
| 403 | Usuário sem conta de seller (rota do seller) | {"error":"no vendor account associated with this user"} |
Pedidos
order.created
Disparado depois que um pedido é gravado, seja pelo checkout, pela API ou pelo atendimento. Quando o pedido é um sub-pedido de uma compra com vários sellers, parent_order_id aponta para o pedido pai.
{
"type": "order.created",
"order_id": "3f73310d-bfdd-4713-a664-305c08eda58b",
"customer_id": "f12f30a9-cbec-40ba-98f1-b7fa8f2e8e10",
"vendor_id": "9a4c1d52-7e0b-4c34-b6f1-2d5e3a8c7b10",
"total": 22500,
"item_count": 3,
"payment_method": "pix",
"timestamp": "2026-10-11T20:15:03.482913Z"
}Campos do payload
typestringorder.created.order_iduuidparent_order_iduuidcustomer_iduuidvendor_iduuidtotalintegeritem_countintegerpayment_methodstringpix, boleto).timestampstringorder.statusChanged
Disparado a cada mudança de status do pedido. É o evento mais útil para um ERP, porque cobre todo o ciclo. old_status e new_status são os nomes por extenso (pending, processing, shipped), e não as letras gravadas no pedido.
{
"type": "order.statusChanged",
"order_id": "3f73310d-bfdd-4713-a664-305c08eda58b",
"old_status": "pending",
"new_status": "processing",
"changed_by": "d4613dde-ac7a-4312-9232-50d8cd6ad5fc",
"timestamp": "2026-10-11T20:18:41.120554Z",
"old_status_code": "pending",
"new_status_code": "processing",
"actor": "admin"
}Campos do payload
typestringorder.statusChanged.order_iduuidold_statusstringnew_statusstringchanged_bystringtimestampstringold_status_codestringnew_status_codestringactorstringadminvendorsystemforcedbooleantrue quando a mudança pulou a matriz de transições permitidas.reasonstringforced é true.skip_customer_noticebooleantrue quando a mudança não deve avisar o cliente dentro da loja.order.completed
Disparado quando o pedido chega ao status concluído. Serve para programas de fidelidade e pós-venda.
{
"type": "order.completed",
"order_id": "3f73310d-bfdd-4713-a664-305c08eda58b",
"customer_id": "f12f30a9-cbec-40ba-98f1-b7fa8f2e8e10",
"total": 22500,
"timestamp": "2026-10-18T14:02:09.771203Z"
}Campos do payload
typestringorder.completed.order_iduuidcustomer_iduuidtotalintegertimestampstringorder.cancelled
Disparado quando o pedido é cancelado. refund_amount pode ser parcial.
{
"type": "order.cancelled",
"order_id": "3f73310d-bfdd-4713-a664-305c08eda58b",
"customer_id": "f12f30a9-cbec-40ba-98f1-b7fa8f2e8e10",
"total": 22500,
"refund_amount": 22500,
"reason": "Pedido em duplicidade",
"cancelled_by": "d4613dde-ac7a-4312-9232-50d8cd6ad5fc",
"timestamp": "2026-10-12T09:30:00.004417Z"
}Campos do payload
typestringorder.cancelled.order_iduuidcustomer_iduuidtotalintegerrefund_amountintegertotal.reasonstringcancelled_bystringtimestampstringorder.shipped
Disparado uma vez por pedido quando o status do pedido passa para enviado, mesmo que existam várias remessas. O código de rastreio não vem no evento: leia o pedido para obtê-lo (Obter pedido).
{
"type": "order.shipped",
"order_id": "3f73310d-bfdd-4713-a664-305c08eda58b",
"customer_id": "f12f30a9-cbec-40ba-98f1-b7fa8f2e8e10",
"old_status": "processing",
"changed_by": "d4613dde-ac7a-4312-9232-50d8cd6ad5fc",
"timestamp": "2026-10-13T11:45:30.250981Z"
}Campos do payload
typestringorder.shipped.order_iduuidcustomer_iduuidold_statusstringchanged_bystringtimestampstringProdutos
product.created
Disparado depois que um produto é gravado.
{
"type": "product.created",
"product_id": "c3f92551-9dda-4fc7-b518-353d1c4e4035",
"vendor_id": "9a4c1d52-7e0b-4c34-b6f1-2d5e3a8c7b10",
"name": "Camiseta Algodão Preta M",
"category_id": "5b0d6a3e-1c44-4f6e-9c02-7f2e8d4a1b90",
"price": 7990,
"timestamp": "2026-10-11T19:00:12.337718Z"
}Campos do payload
typestringproduct.created.product_iduuidvendor_iduuidnamestringcategory_iduuidpriceintegertimestampstringproduct.updated
Disparado depois que um produto é alterado. O evento traz só o id: leia o produto para ver o que mudou.
{
"type": "product.updated",
"product_id": "c3f92551-9dda-4fc7-b518-353d1c4e4035",
"timestamp": "2026-10-11T19:12:44.901226Z"
}Campos do payload
typestringproduct.updated.product_iduuidtimestampstringproduct.deleted
Disparado depois que um produto é excluído (remoção lógica ou definitiva). Remova o produto do seu índice.
{
"type": "product.deleted",
"product_id": "c3f92551-9dda-4fc7-b518-353d1c4e4035",
"timestamp": "2026-10-11T19:30:02.118840Z"
}Campos do payload
typestringproduct.deleted.product_iduuidtimestampstringClientes, carrinho e avaliações
customer.registered
Disparado quando um novo usuário é criado. Atenção: o campo type do corpo é user.registered (nome interno do evento), enquanto o cabeçalho X-Venddor-Event e o campo event do envelope dizem customer.registered. Use sempre o event do envelope para decidir o que fazer. Para empresa (PJ), first_name traz a razão social inteira.
{
"type": "user.registered",
"user_id": "8d1e5c40-2b7a-4a39-9d6e-0f4b7c2a5e11",
"email": "maria.souza@example.com",
"user_type": "customer",
"first_name": "Maria",
"tenant_id": "store1",
"timestamp": "2026-10-11T18:05:27.640012Z"
}Campos do payload
typestringuser.registered.user_iduuidemailstringuser_typestringcustomervendoradminfirst_namestringperson_typestringFJJ indica pessoa jurídica.legal_namestringtrade_namestringcnpjstringtenant_idstringtimestampstringcustomer.updated
Disparado quando um usuário altera o próprio perfil. O type do corpo é user.profileUpdated.
{
"type": "user.profileUpdated",
"user_id": "8d1e5c40-2b7a-4a39-9d6e-0f4b7c2a5e11",
"email": "maria.souza@example.com",
"fields": ["phone", "birth_date"],
"timestamp": "2026-10-11T18:40:55.309871Z"
}Campos do payload
typestringuser.profileUpdated.user_iduuidemailstringfieldsarraytimestampstringcart.abandoned
Disparado quando um carrinho com itens fica parado pelo período configurado na loja. Serve para recuperação de carrinho.
{
"type": "cart.abandoned",
"cart_id": "b7e2a4c8-5d19-4e03-8c6f-91a0d3f27b44",
"user_id": "8d1e5c40-2b7a-4a39-9d6e-0f4b7c2a5e11",
"email": "maria.souza@example.com",
"item_count": 2,
"total": 15980,
"timestamp": "2026-10-11T22:00:00.000000Z"
}Campos do payload
typestringcart.abandoned.cart_iduuiduser_iduuidemailstringitem_countintegertotalintegertimestampstringreview.created
Disparado quando um cliente envia uma avaliação de produto. O type do corpo é review.submitted.
{
"type": "review.submitted",
"review_id": "e1f4b6d2-8a35-47c9-b0d1-3c5a9e7f2d68",
"product_id": "c3f92551-9dda-4fc7-b518-353d1c4e4035",
"customer_id": "8d1e5c40-2b7a-4a39-9d6e-0f4b7c2a5e11",
"vendor_id": "9a4c1d52-7e0b-4c34-b6f1-2d5e3a8c7b10",
"rating": 5,
"comment": "Chegou antes do prazo, tecido ótimo.",
"timestamp": "2026-10-14T10:11:12.512340Z"
}Campos do payload
typestringreview.submitted.review_iduuidproduct_iduuidcustomer_iduuidvendor_iduuidratinginteger12345commentstringtimestampstringSellers
vendor.registered
Disparado quando um seller envia o pedido de cadastro, antes da aprovação.
{
"type": "vendor.registered",
"vendor_id": "9a4c1d52-7e0b-4c34-b6f1-2d5e3a8c7b10",
"company_name": "Moda Sul Ltda",
"cnpj": "12.345.678/0001-95",
"timestamp": "2026-10-09T13:20:00.718455Z"
}Campos do payload
typestringvendor.registered.vendor_iduuidcompany_namestringcnpjstringtimestampstringvendor.approved
Disparado quando um administrador aprova o cadastro do seller.
{
"type": "vendor.approved",
"vendor_id": "9a4c1d52-7e0b-4c34-b6f1-2d5e3a8c7b10",
"vendor_slug": "moda-sul",
"company_name": "Moda Sul Ltda",
"email": "contato@modasul.example.com",
"approved_by": "d4613dde-ac7a-4312-9232-50d8cd6ad5fc",
"timestamp": "2026-10-10T09:00:31.002763Z"
}Campos do payload
typestringvendor.approved.vendor_iduuidvendor_slugstringcompany_namestringemailstringapproved_bystringtimestampstringIncentivos
Os sete tipos incentive.* (campaign_published, member_enrolled, progress_changed, award_granted, redemption_updated, campaign_closed, resource_changed) pertencem ao módulo de campanhas de incentivo e só podem ser assinados por webhook do administrador. Eles seguem um formato diferente dos demais: são avisos "magros", que dizem o que mudou e onde ler o dado, sem copiar o conteúdo.
{
"event": {
"cursor": 1042,
"event_id": "6c2b8f0a-91d3-4e57-a8b4-0d7e5f3a1c92",
"event_type": "incentive.award_granted",
"schema_version": 1,
"campaign_id": "a1d5c7e9-3b02-4f68-9e14-8c6b0d2f4a73",
"resource_version": 7,
"occurred_at": "2026-10-11T20:00:00Z",
"tenant_id": "store1",
"resource": "/api/v1/admin/incentives/campaigns/a1d5c7e9-3b02-4f68-9e14-8c6b0d2f4a73"
},
"emitted_at": "2026-10-11T20:00:04.120Z",
"timestamp": "1791748804"
}Campos do corpo (incentivos)
event.cursorintegerevent.event_iduuidevent.event_typestringincentive.*.event.schema_versioninteger1.event.campaign_iduuidnull.event.resource_versionintegerevent.occurred_atstringevent.tenant_idstringevent.resourcestringemitted_atstringtimestampstringX-Venddor-Timestamp: segundos Unix, como texto.As regras de entrega dos incentivos são mais estritas que as dos demais eventos:
| Eventos de incentivo | Demais eventos | |
|---|---|---|
| Cabeçalhos | X-Venddor-Event-ID, X-Venddor-Timestamp, X-Venddor-Signature | X-Venddor-Event, X-Venddor-Signature |
| Assinatura | Mesma: sha256= + HMAC-SHA256 hex do corpo bruto | Idem |
| Sucesso | Apenas 2xx | Qualquer status abaixo de 400 |
| Tempo limite | 3 segundos | 30 segundos |
| Tentativas | Até 8, com espera de 30 s que dobra a cada falha (30 s, 1 min, 2 min, 4 min, 8 min, 16 min, 32 min) | Até 3 (agora, 30 s, 5 min), só para 5xx e erro de rede |
| Registro | Acompanhado na área de incentivos, não aparece em /deliveries | Aparece em /deliveries |
Como a entrega é "pelo menos uma vez" e um tempo limite pode esconder um envio que deu certo, deduplique por event.event_id.