Skip to main content
Webhooks permitem que o CGD notifique o seu sistema automaticamente quando eventos importantes ocorrem, como mudancas de status de pedidos ou atribuicao de motorista. Voce registra uma URL e o CGD envia requisicoes HTTP POST para ela com os dados do evento.

Endpoints

MetodoEndpointDescricao
POST/webhooksRegistrar novo webhook
GET/webhooksListar webhooks cadastrados
GET/webhooks/{id}Buscar webhook por ID
PUT/webhooks/{id}Atualizar webhook
DELETE/webhooks/{id}Remover webhook

Eventos disponiveis

EventoDescricao
order.status_changedStatus do pedido foi alterado
order_item.status_changedStatus de um servico foi alterado
order_item.driver_assignedMotorista foi atribuido a um servico
order_item.vehicle_assignedVeiculo foi atribuido a um servico

Registrar webhook

curl -X POST https://gds.fretatech.com.br/api/partner/v1/webhooks \
  -H "Authorization: Bearer SEU_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://seu-sistema.com.br/webhooks/gds",
    "events": [
      "order.status_changed",
      "order_item.driver_assigned",
      "order_item.vehicle_assigned",
      "order_item.status_changed"
    ],
    "secret": "seu_segredo_hmac_aleatorio"
  }'

Campos da requisicao

CampoTipoObrigatorioDescricao
urlstringSimURL HTTPS que recebera os eventos
eventsarraySimLista de eventos para assinar
secretstringSimSegredo usado para assinar os payloads (HMAC-SHA256)

Resposta

{
  "data": {
    "id": "wh_01jk2m3n4p5q6r7s",
    "url": "https://seu-sistema.com.br/webhooks/gds",
    "events": ["order.status_changed", "order_item.driver_assigned"],
    "active": true,
    "created_at": "2026-03-06T14:00:00.000000Z"
  }
}

Estrutura do payload

Quando um evento ocorre, o CGD envia uma requisicao POST para a URL cadastrada com o seguinte payload:
{
  "event": "order_item.driver_assigned",
  "timestamp": "2026-04-14T18:30:00.000000Z",
  "data": {
    "order_id": "ord_01jk2m3n4p5q6r7s",
    "order_item_id": "item_01jk2m3n4p5q6r7s",
    "driver": {
      "name": "Carlos Eduardo Santos",
      "phone": "11988887777",
      "document": "12345678901"
    }
  }
}

Campos do payload

CampoTipoDescricao
eventstringNome do evento que ocorreu
timestampstringData e hora do evento (ISO 8601 UTC)
dataobjectDados do evento (varia por tipo de evento)

Verificacao de assinatura

Cada requisicao de webhook inclui o header X-Signature com a assinatura HMAC-SHA256 do payload. Voce deve verificar essa assinatura para garantir que a requisicao veio do CGD e nao foi adulterada.

Como calcular a assinatura esperada

assinatura = HMAC-SHA256(payload_raw_bytes, seu_secret)
Compare o resultado (em hexadecimal) com o valor do header X-Signature.

Verificacao em Node.js

const crypto = require('crypto');

function verifyWebhookSignature(payload, signature, secret) {
  const expectedSignature = crypto
    .createHmac('sha256', secret)
    .update(payload, 'utf8')
    .digest('hex');

  // Comparacao segura contra timing attacks
  return crypto.timingSafeEqual(
    Buffer.from(expectedSignature, 'hex'),
    Buffer.from(signature, 'hex')
  );
}

// Exemplo de uso em Express.js
app.post('/webhooks/gds', express.raw({ type: 'application/json' }), (req, res) => {
  const signature = req.headers['x-signature'];
  const secret = process.env.CGD_WEBHOOK_SECRET;

  if (!verifyWebhookSignature(req.body, signature, secret)) {
    return res.status(401).json({ error: 'Assinatura invalida' });
  }

  const event = JSON.parse(req.body);
  console.log('Evento recebido:', event.event);

  // Processe o evento aqui
  res.json({ received: true });
});

Verificacao em PHP

<?php

function verifyWebhookSignature(string $payload, string $signature, string $secret): bool
{
    $expectedSignature = hash_hmac('sha256', $payload, $secret);
    return hash_equals($expectedSignature, $signature);
}

// Exemplo de uso em Laravel
Route::post('/webhooks/gds', function (Request $request) {
    $payload = $request->getContent();
    $signature = $request->header('X-Signature');
    $secret = config('services.gds.webhook_secret');

    if (!verifyWebhookSignature($payload, $signature, $secret)) {
        return response()->json(['error' => 'Assinatura invalida'], 401);
    }

    $event = json_decode($payload, true);
    Log::info('CGD webhook recebido', ['event' => $event['event']]);

    // Processe o evento aqui

    return response()->json(['received' => true]);
});
Sempre use hash_equals (PHP) ou crypto.timingSafeEqual (Node.js) para comparar assinaturas. Comparacoes diretas com === sao vulneraveis a timing attacks.

Retentativas

O CGD reenvia o evento automaticamente em caso de falha (timeout ou status HTTP diferente de 2xx):
TentativaIntervalo
1aImediata
2a1 minuto
3a5 minutos
4a30 minutos
5a2 horas
Apos 5 tentativas sem sucesso, o evento e marcado como falho e nao e mais reenviado.

Gerenciamento de webhooks

Listar webhooks

curl -X GET https://gds.fretatech.com.br/api/partner/v1/webhooks \
  -H "Authorization: Bearer SEU_TOKEN"

Atualizar webhook

curl -X PUT https://gds.fretatech.com.br/api/partner/v1/webhooks/wh_01jk2m3n4p5q6r7s \
  -H "Authorization: Bearer SEU_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://novo-url.com.br/webhooks/gds",
    "events": ["order.status_changed"],
    "active": false
  }'

Remover webhook

curl -X DELETE https://gds.fretatech.com.br/api/partner/v1/webhooks/wh_01jk2m3n4p5q6r7s \
  -H "Authorization: Bearer SEU_TOKEN"