Gestão de Webhooks

A API permite cadastrar e gerenciar webhooks por unidade. Cada unidade pode ter 1 webhook ativo que recebe eventos como equipment.recognized.

Endpoints

MétodoRotaScopeDescrição
GET/v1/webhookswebhooks:readListar webhooks da unidade
POST/v1/webhookswebhooks:writeCriar webhook (retorna secret uma vez)
GET/v1/webhooks/:idwebhooks:readDetalhar webhook
PUT/v1/webhooks/:idwebhooks:writeAtualizar URL, eventos ou status
DELETE/v1/webhooks/:idwebhooks:writeDesativar webhook (soft)
GET/v1/webhooks/:id/deliverieswebhooks:readListar entregas (histórico)
POST/v1/webhooks/:id/testwebhooks:writeDisparar evento de teste

GET /v1/webhooks

Lista o webhook da unidade atual (se existir).

Exemplo

curl "https://api.gdredu.com/v1/webhooks" \
  -H "Authorization: Bearer gdredu_live_..." \
  -H "x-branch-id: branch-id-aqui"

Resposta (200)

{
  "data": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "url": "https://minha-app.com/webhooks/gdredu",
      "events": ["equipment.recognized"],
      "isActive": true,
      "secretPrefix": "whsec_ab12cd34",
      "lastDeliveryAt": "2026-06-19T08:00:12.000Z",
      "lastStatus": 200,
      "createdAt": "2026-06-15T10:00:00.000Z",
      "updatedAt": "2026-06-19T08:00:12.000Z",
      "_count": { "deliveries": 42 }
    }
  ]
}

POST /v1/webhooks

Cria um novo webhook. O secret é gerado e retornado apenas nesta resposta.

Body

{
  "url": "https://minha-app.com/webhooks/gdredu",
  "events": ["equipment.recognized"],
  "isActive": true
}
CampoTipoObrigatórioDefaultDescrição
urlstring (URL)simURL HTTPS que receberá os eventos
eventsarraysimLista de eventos (atualmente apenas equipment.recognized)
isActivebooleannãotrueSe o webhook está ativo

Exemplo

curl -X POST "https://api.gdredu.com/v1/webhooks" \
  -H "Authorization: Bearer gdredu_live_..." \
  -H "x-branch-id: branch-id-aqui" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000" \
  -d '{
    "url": "https://minha-app.com/webhooks/gdredu",
    "events": ["equipment.recognized"]
  }'

Resposta (201)

{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "branchId": "a999af34-c399-45f6-9dc9-5e8c024b0a49",
  "url": "https://minha-app.com/webhooks/gdredu",
  "events": ["equipment.recognized"],
  "isActive": true,
  "secretPrefix": "whsec_ab12cd34",
  "lastDeliveryAt": null,
  "lastStatus": null,
  "createdAt": "2026-06-19T12:00:00.000Z",
  "updatedAt": "2026-06-19T12:00:00.000Z",
  "secret": "whsec_ab12cd34ef5678901234567890abcdef1234567890abcdef1234567890abcdef"
}

:::danger[Armazene o secret com segurança]
O campo secret só é exibido nesta resposta. Guarde-o em um cofre de senhas. Se você perdê-lo, será necessário criar um novo webhook.
:::

Erros

StatusCodeQuando
409CONFLICTJá existe um webhook para esta unidade (1 por branch)

GET /v1/webhooks/:id

Retorna os detalhes de um webhook (sem o secret).

Resposta (200)

{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "branchId": "a999af34-c399-45f6-9dc9-5e8c024b0a49",
  "url": "https://minha-app.com/webhooks/gdredu",
  "events": ["equipment.recognized"],
  "isActive": true,
  "secretPrefix": "whsec_ab12cd34",
  "lastDeliveryAt": "2026-06-19T08:00:12.000Z",
  "lastStatus": 200,
  "createdAt": "2026-06-15T10:00:00.000Z",
  "updatedAt": "2026-06-19T08:00:12.000Z",
  "_count": { "deliveries": 42 }
}

PUT /v1/webhooks/:id

Atualiza URL, eventos ou status de um webhook. O secret não pode ser alterado por aqui — se precisar rotacionar, delete o webhook e crie um novo.

Body

Todos os campos são opcionais:

{
  "url": "https://nova-url.com/webhooks/gdredu",
  "events": ["equipment.recognized"],
  "isActive": true
}

DELETE /v1/webhooks/:id

Desativa o webhook. Pode ser reativado via PUT /v1/webhooks/:id com isActive: true.

Resposta (204)

Sem corpo.


GET /v1/webhooks/:id/deliveries

Lista o histórico de entregas do webhook (mais recentes primeiro).

Parâmetros (query)

ParâmetroTipoDefaultDescrição
limitinteger20Máximo 100

Resposta (200)

{
  "data": [
    {
      "id": "660e8400-e29b-41d4-a716-446655440000",
      "event": "equipment.recognized",
      "status": "SUCCESS",
      "attempt": 1,
      "nextAttemptAt": null,
      "responseStatus": 200,
      "responseError": null,
      "durationMs": 234,
      "deliveredAt": "2026-06-19T08:00:12.500Z",
      "ignoredAt": null,
      "createdAt": "2026-06-19T08:00:12.000Z"
    },
    {
      "id": "770e8400-e29b-41d4-a716-446655440000",
      "event": "equipment.recognized",
      "status": "RETRYING",
      "attempt": 2,
      "nextAttemptAt": "2026-06-19T08:06:00.000Z",
      "responseStatus": 503,
      "responseError": "HTTP 503",
      "durationMs": 30000,
      "deliveredAt": null,
      "ignoredAt": null,
      "createdAt": "2026-06-19T08:00:12.000Z"
    }
  ]
}

POST /v1/webhooks/:id/test

Enfileira um evento de teste (com payload fixo) para validar a integração.

Resposta (202)

{
  "deliveryId": "880e8400-e29b-41d4-a716-446655440000",
  "message": "Evento de teste enfileirado para entrega."
}

O evento será entregue em segundos (se o receptor estiver saudável).


Conceitos importantes

1 webhook por unidade

Cada unidade pode ter no máximo 1 webhook ativo. Para "trocar" de webhook, desative o antigo e crie um novo (ou use PUT para atualizar).

Eventos disponíveis

Atualmente apenas equipment.recognized é emitido.


Did this page help you?