OnLink
API reference

Send N transfers under one confirmation

A loop over POST /v1/transfers behind a single confirmation code (spec §2.3). Each item is validated exactly as a single transfer would be; a failed item is reported with its refusal reason and the rest proceed. Nothing reaches the bank until the one code is verified via POST /v1/confirmations/:id, unless OnLink has enabled confirmation waiving for your account and, in production, the API key has an IP allowlist, in which case the batch is returned already confirmed and is executed immediately.

POST
/v1/transfers/batch

Authorization

partner-key
X-OnLink-Key<token>

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

curl -X POST "https://example.com/v1/transfers/batch" \  -H "Content-Type: application/json" \  -d '{    "idempotencyKey": "batch-2026-09-16-000001",    "items": [      {        "rail": "mpesa",        "destination": {          "accountNumber": "254700000000",          "accountName": "Jane Wanjiku"        },        "amount": {          "currency": "KES",          "value": "1500.00"        },        "idempotencyKey": "trf-2026-09-11-000123"      }    ]  }'
{  "id": "be9f1e6a-0000-4000-8000-000000000040",  "status": "awaiting_confirmation",  "itemCount": 0,  "acceptedCount": 0,  "failedCount": 0,  "items": [    {      "transferId": "bd9f1e6a-0000-4000-8000-000000000010",      "idempotencyKey": "trf-2026-09-16-000123",      "accepted": true,      "failureCode": "TRANSFER_NAME_MISMATCH"    }  ],  "createdAt": "2026-09-16T00:00:00.000Z",  "confirmedAt": "2026-09-16T00:02:00.000Z",  "confirmation": {    "id": "df9f1e6a-0000-4000-8000-000000000030",    "channel": "email",    "deliveredTo": "o***@partner.co.ke",    "expiresAt": "2026-09-11T00:15:00.000Z",    "resendAvailableAt": "2026-09-11T00:00:15.000Z",    "webhookDelivery": {      "status": "delivered",      "attempts": 1,      "lastAttemptAt": "2026-09-11T00:00:02.000Z"    },    "waiverNotApplied": "key_without_ip_allowlist"  }}