# Direct Link Pay-Out

## When to use

Send funds to a customer with no OMNO UI, using a `directRouteId`. Direct Link Pay-Out supports **APM** and **crypto** [TBD: confirm crypto pay-out support], consistent with the [Choose Your Integration](/guides/choose-your-integration) matrix.

> ℹ️ **Note:** When a payout requires manual approval, the exact sequence relative to `process/direct-link` is not yet confirmed. [TBD: with manual approval, is the order create → confirm → process/direct-link, or create → process/direct-link → WAITING_FOR_CONFIRMATION → confirm?] The steps below show create → process → confirm; treat the ordering as provisional until confirmed.


## Steps

### 1. Create the payout

`POST /public/payout` with a `directRouteId` and the required `CreatePayoutRequest` fields.

```bash
curl -X POST "https://api.omno.com/public/payout" \
  -H "Authorization: Bearer <access_token>" \
  -H "Content-Type: application/json" \
  -d '{
    "orderId": "order-2026-000124",
    "value": 100.00,
    "currency": "EUR",
    "kycVerified": true,
    "customer": {
      "externalUserId": "3183818381183",
      "firstName": "John",
      "lastName": "Doe",
      "email": "john.doe@example.com",
      "phoneNumber": "1 1234567890",
      "dateOfBirth": "1990-12-01",
      "billing": {
        "address": "123 Main St",
        "city": "Atlanta",
        "state": "GA",
        "countryCode": "US",
        "postalCode": "30308"
      }
    },
    "directRouteId": "944732c4608c441aa91379478b91f76e"
  }'
```

Response:

```json
{
  "payoutId": "944732c4608c441aa91379478b91f76e",
  "status": "CREATED",
  "iframeUrls": {
    "card": "https://checkout.omno.com/payments/payout/944732c4608c441aa91379478b91f76e/card",
    "apm": "https://checkout.omno.com/payments/payout/944732c4608c441aa91379478b91f76e/apm"
  }
}
```

`CreatePayoutRequest` fields:

| Field | Type | Required | Description | Example |
|  --- | --- | --- | --- | --- |
| `orderId` | string | Yes | Your unique identifier for the payout. | `order-2026-000124` |
| `value` | number | Yes | Payout amount. | `100.00` |
| `currency` | string | Yes | ISO 4217 currency. | `EUR` |
| `kycVerified` | boolean | Yes | Whether the customer is KYC verified in your system. | `true` |
| `customer` | object | Yes | [`CustomerRequest`](https://docs.omno.com/apis). |  |
| `directRouteId` | string | Yes (Direct Link) | Direct Link route ID. | `944732c4608c441aa91379478b91f76e` |
| `routerId` | string | No | Specific router ID. |  |
| `merchantAdditionalData` | object | No | Additional data for the transaction. |  |


### 2. Start processing

`POST /public/payout/{payoutId}/process/direct-link` with `browser` and `additionalData`.

```bash
curl -X POST \
  "https://api.omno.com/public/payout/944732c4608c441aa91379478b91f76e/process/direct-link" \
  -H "Authorization: Bearer <access_token>" \
  -H "Content-Type: application/json" \
  -d '{
    "browser": {
      "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
      "language": "en-US",
      "customerIp": "203.0.113.10",
      "javascriptEnabled": true
    },
    "additionalData": {}
  }'
```

Response:

```json
{
  "payoutId": "944732c4608c441aa91379478b91f76e",
  "status": "PENDING",
  "redirectUrl": null,
  "message": null
}
```

See the [`Browser` field table](/guides/direct-link/payin-apm#the-browser-object) for how to collect each value.

`additionalData` carries the destination details for the payout method.

> **[TBD: required `additionalData` keys per payout method / APM]**


### 3. Confirm or reject (if manual approval applies)

If the payout enters `WAITING_FOR_CONFIRMATION`, confirm or reject it. See [APIs → Confirm / Reject Payout](https://docs.omno.com/apis).

### 4. Final status

Determine the outcome from [webhooks](/guides/getting-started/webhooks) or [GET transaction](https://docs.omno.com/apis).

## Failure states

- **Rejected** — `REJECTED` after a reject call; never sent to a PSP.
- **PSP failure** — `FAILED`.
- **Timeout** — `TIMEOUT`; may resolve later.
- **Pending resolving asynchronously** — `PENDING`; final status via webhook.