> ## Documentation Index
> Fetch the complete documentation index at: https://docs.clausum.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Payout assessment

> Evaluate outbound transfers (SPEI, wire, withdrawals) before money leaves your platform.

Clausum scores **payouts and disbursements** synchronously — call assess **before** your core authorizes the transfer, then honor `decision` the same way as payin.

<Note>
  Requires blocklists with `flow_scope` (`079` migration). Payout-specific list types: `clabe`, `iban`, `account_hash`, `swift_bic`, `beneficiary_id`. See [Blocklists](/concepts/blocklists).
</Note>

## When to use

| Flow                               | Endpoint                         |
| ---------------------------------- | -------------------------------- |
| Partner API (production / sandbox) | `POST /api/v1/assess/payout`     |
| Dashboard simulation               | `POST /api/v1/simulation/payout` |

* Authenticate with **`clm_sk_*`** (server key, permission `assess`).
* Response shape matches payin assess: `decision`, `risk_score`, `signals`, `session_id`, `flow: "payout"`.

## Minimal payload

```json theme={null}
{
  "amount": 250000,
  "currency": "MXN",
  "transaction_type": "payout",
  "beneficiary": {
    "id": "ben_123",
    "name": "Proveedor Norte SA",
    "country": "MX",
    "clabe": "012180001234567890"
  },
  "origin": {
    "account_id": "acct_orig_01",
    "country": "MX"
  },
  "payout": {
    "rail": "spei",
    "first_to_beneficiary": false,
    "channel": "api",
    "initiated_by": "treasury@empresa.com"
  }
}
```

<Warning>
  `amount` uses the same unit model as payin — see [Real-time assessment](/guides/realtime-assessment#amount-units). Prefer explicit minor units or `amount_unit: "major"` with decimals.
</Warning>

## Enforce the decision

```ts theme={null}
const res = await fetch(`${process.env.CLAUSUM_API_BASE}/api/v1/assess/payout`, {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.CLAUSUM_SECRET_KEY}`,
    "Content-Type": "application/json",
    "Idempotency-Key": payoutRequestId,
  },
  body: JSON.stringify(payload),
})

const result = await res.json()
if (result.decision === "decline") {
  throw new Error("Payout blocked by Clausum")
}
// approve / review / challenge → your treasury workflow
```

## Signals you may see

| Signal                            | Meaning                                 |
| --------------------------------- | --------------------------------------- |
| `payout_first_beneficiary`        | First payout to this beneficiary        |
| `payout_high_risk_country`        | Beneficiary country on risk list        |
| `payout_cross_border_high_amount` | Cross-border above threshold            |
| `payout_unattributed_initiator`   | Missing or generic initiator            |
| Blocklist hits                    | `clabe`, `iban`, `beneficiary_id`, etc. |

## Outbound webhooks

Non-decline payout assess emits **`transaction.created`**; decline emits **`transaction.blocked`**. Payload includes `flow: "payout"` and mirrors `assess_response`. See [Webhook events](/concepts/webhook-events).

## Next steps

<CardGroup cols={2}>
  <Card title="Real-time assessment (payin)" icon="gauge-high" href="/guides/realtime-assessment">
    Checkout and card-not-present flows.
  </Card>

  <Card title="Blocklists" icon="ban" href="/concepts/blocklists">
    Payin vs payout scope and entry types.
  </Card>
</CardGroup>
