> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.credify.com.br/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.credify.com.br/_mcp/server.

# Webhook de Decisão

> Callback de saída do Decisionfy — eventos enviados ao seu sistema quando um pedido é criado, muda de status ou tem a decisão concluída.

## Webhook de Decisão

O webhook é um **callback de saída**: o Decisionfy envia eventos para a URL configurada no endpoint do parceiro (tipo `WEBHOOK`). **Não é um endpoint que você chama** no Decisionfy — é uma URL sua, que recebe as notificações.

|                      |                          |
| :------------------- | :----------------------- |
| **Direção**          | Decisionfy → seu sistema |
| **Método**           | `POST`                   |
| **Content-Type**     | `application/json`       |
| **Header do evento** | `X-DecisionFy-Event`     |
| **Timeout de envio** | 10 segundos              |

## Eventos enviados

| Evento               | Quando é enviado              |
| :------------------- | :---------------------------- |
| `NEW_ORDER`          | Pedido criado                 |
| `STATUS_CHANGED`     | Alteração em `status`         |
| `DECISION_CHANGED`   | Alteração em `decisionStatus` |
| `DECISION_COMPLETED` | Fluxo finalizado              |

## Payload

#### Padrão

```json
{
  "event": "DECISION_COMPLETED",
  "accessKey": "SUA_ACCESS_KEY",
  "id": 7281,
  "orderId": "PED-2026-0001",
  "sessionId": "00000000-0000-0000-0000-000000000000",
  "status": "COMPLETED",
  "decisionStatus": "APPROVED",
  "startedAt": "2026-05-04T15:17:21.000Z",
  "completedAt": "2026-05-04T15:17:32.000Z",
  "notifiedAt": "2026-05-04T15:17:32.300Z"
}
```

#### Legado (compatibilidade)

Em alguns fluxos antigos, o callback final pode incluir o objeto `context` completo.

```json
{
  "event": "DECISION_COMPLETED",
  "accessKey": "SUA_ACCESS_KEY",
  "orderId": "PED-2026-0001",
  "sessionId": "00000000-0000-0000-0000-000000000000",
  "status": "COMPLETED",
  "decisionStatus": "APPROVED",
  "completedAt": "2026-05-04T15:17:32.000Z",
  "context": {
    "id": 7281,
    "orderId": "PED-2026-0001",
    "accessKey": "SUA_ACCESS_KEY",
    "status": "COMPLETED",
    "decisionStatus": "APPROVED",
    "ruleScore": 18
  }
}
```

## Exemplo de endpoint receptor

```javascript
import express from "express";

const app = express();
app.use(express.json());

app.post("/webhooks/decisionfy", (req, res) => {
  const event = req.header("X-DecisionFy-Event") || req.body?.event;

  // Sempre responder 2xx rapido para evitar retries e timeout
  res.status(200).json({ received: true });

  // Processamento assincrono recomendado
  console.log("Evento recebido:", event);
  console.log("Payload:", req.body);
});

app.listen(4000, () => {
  console.log("Webhook receiver na porta 4000");
});
```

## Boas práticas

> **Tip**
>
> * Responda `200` rapidamente e processe de forma assíncrona.
> * Use idempotência por `orderId` + `event` para evitar duplicidade.
> * Aplique timeout e retry no seu lado consumidor.
> * Registre logs com `orderId` e `event` para rastreabilidade.