Criar um endpoint
Este endpoint cria uma nova configuração de webhook para receber notificações em tempo real sobre eventos específicos da API. O secret de assinatura (whsec...) é retornado apenas nesta resposta — guar
Visão Geral
Este endpoint cria uma nova configuração de webhook para receber notificações em tempo real sobre eventos específicos da API. O secret de assinatura (whsec_...) é retornado apenas nesta resposta — guarde-o imediatamente.
Precauções
- Seu endpoint deve responder a requisições HTTP
POST. - A URL do
endpointdeve ser pública e HTTPS (URLshttp://são rejeitadas com 400). - Sua aplicação deve responder rapidamente (timeout de entrega de 30s); processe de forma assíncrona.
- Salve o
id(wbe_*) e osecret(whsec_...) retornados — osecretnão é exibido novamente.
Descrição
A criação envolve um name descritivo, uma URL endpoint válida (HTTPS) e a lista events[] de tipos de evento a receber. Forneça events[] ou defina forceActive: true (um dos dois é obrigatório). Opcionalmente, você pode configurar cabeçalhos de autenticação enviados a cada disparo.
Requisição
POST /v1/webhooksCabeçalho: SelectKey: sk_live_... (ou sk_test_...). Escopo necessário: webhooks:create.
Corpo da Requisição
| Parâmetro | Tipo | Obrigatório | Descrição | Exemplo |
|---|---|---|---|---|
name | string (1–100) | Sim | Nome descritivo para o webhook | "Webhook MyDomain" |
endpoint | string (URI HTTPS) | Sim | URL que receberá as notificações | "https://webhooks.mydomain.com/selectwin" |
events | array de strings (máx. 200) | Condicional | Tipos de evento a assinar (ver Catálogo). Obrigatório, a menos que forceActive seja true | ["transaction.approved", "transaction.failed"] |
forceActive | boolean | Não | Recebe todos os tipos de evento (dispensa events[]) | false |
enabled | boolean | Não | Se o endpoint está ativo (padrão true) | true |
headerAuthorization | string (máx. 1000) | Não | Valor de autenticação enviado no cabeçalho Authorization de cada disparo (write-only — nunca retorna) | "sk_live_xyz" |
headerAuthorizationType | string (máx. 50) | Não | Tipo de autenticação associado (write-only) | "Bearer" |
metadata | objeto | Não | Metadados livres | {"team": "ops"} |
Valores em
events[]são validados contra o Catálogo de Eventos. Um tipo inexistente retorna400.
Exemplo de Requisição
{
"name": "Webhook MyDomain",
"endpoint": "https://webhooks.mydomain.com/selectwin",
"events": [
"transaction.approved",
"transaction.pending",
"transaction.failed"
],
"metadata": {
"team": "ops"
}
}Resposta
Sucesso (201 Created)
{
"id": "wbe_01hqzvabc",
"name": "Webhook MyDomain",
"endpoint": "https://webhooks.mydomain.com/selectwin",
"enabled": true,
"events": [
"transaction.approved",
"transaction.pending",
"transaction.failed"
],
"forceActive": false,
"shotsQty": 0,
"failedShotsQty": 0,
"lastDeliveryAt": null,
"metadata": {
"team": "ops"
},
"createdAt": "2026-06-20T20:18:05.000Z",
"updatedAt": "2026-06-20T20:18:05.000Z",
"secret": "whsec_abc123def456ghi789jkl012mno345pqr678stu901vwx234yz567",
"merchant": {
"name": "Seller Name",
"merchantId": "bus_1234567890",
"isSubAccount": false
},
"_links": {
"self": { "href": "https://api.selectwin.io/v1/webhooks/wbe_01hqzvabc", "method": "GET", "description": "Read a webhook." },
"create": { "href": "https://api.selectwin.io/v1/webhooks", "method": "POST", "description": "Create a new webhook." },
"update": { "href": "https://api.selectwin.io/v1/webhooks/wbe_01hqzvabc", "method": "PUT", "description": "Update the webhook." },
"delete": { "href": "https://api.selectwin.io/v1/webhooks/wbe_01hqzvabc", "method": "DELETE", "description": "Delete the webhook." },
"list": { "href": "https://api.selectwin.io/v1/webhooks", "method": "GET", "description": "List all webhooks." }
}
}Atributos da Resposta
secret (whsec_*) só aparece no create (e no rotate-secret). As credenciais headerAuthorization/headerAuthorizationType são write-only e nunca retornam.
| Atributo | Tipo | Descrição |
|---|---|---|
id | string | wbe_* |
name | string | Nome descritivo |
endpoint | string | URL HTTPS |
enabled | boolean | Ativo |
events | array | null | Tipos de evento assinados (null quando forceActive) |
forceActive | boolean | Recebe todos os tipos de evento |
shotsQty | integer | Total de disparos |
failedShotsQty | integer | Disparos com falha |
lastDeliveryAt | string (ISO) | null | Última entrega |
metadata | objeto | null | Metadados |
createdAt / updatedAt | string (ISO) | Timestamps |
secret | string | Segredo whsec_* — apenas no create/rotate-secret |
merchant | object | Bloco do lojista |
_links | object | HATEOAS |
Erros
| Código HTTP | Quando |
|---|---|
| 400 | Validação (URL não-HTTPS, events[] ausente sem forceActive, tipo de evento inválido) |
| 401 | Chave de API ausente/inválida (SelectKey) |
| 403 | Sem o escopo webhooks:create |
| 409 | Conflito de idempotência |
| 500 | Erro interno |
Melhores Práticas
-
Dê nomes descritivos aos seus webhooks para facilitar a identificação.
-
Implemente idempotência no seu endpoint; deduplique pelo
iddo evento. -
Assine a menor lista de eventos que você precisa, em vez de
forceActive, para evitar tráfego desnecessário. -
Use cabeçalhos de autenticação (
headerAuthorization) ou valide a assinatura HMAC para garantir a origem das requisições. -
Salve o
ide osecretimediatamente após a criação. -
Teste seu endpoint com
POST /v1/webhooks/{webhookId}/testantes de colocá-lo em produção.
How is this guide?