---
title: "Read a transfer"
method: GET
path: "/v1/transfers/{id}"
tags: ["Partner API"]
---

# Read a transfer

`GET /v1/transfers/{id}`

## Request

- Base URL: `https://sandbox.onlink.africa`
- URL: `https://sandbox.onlink.africa/v1/transfers/{id}`
- Auth: API key in header `X-OnLink-Key`

## Path parameters

- `id` string, required

## Response `200`

The transfer.

- PartnerTransferResponseDto
  - `id` string, required: The transfer id.
  - `status` 'awaiting_confirmation' | 'confirmed' | 'executing' | 'processing' | 'settled' | 'failed' | 'expired' | 'cancelled', required: The transfer status.
  - `rail` 'mpesa' | 'pesalink' | 'rtgs' | 'eft' | 'swift' | 'internal', required: The rail this transfer moves on.
  - `amount` TransferAmountDto, required
    - `currency` 'KES' | 'USD', required: Send currency, and the account it is paid from: KES from your KES account, USD from your USD account. Nothing is converted. USD is accepted on rtgs, eft and swift only (to a USD beneficiary account); any other rail refuses it with TRANSFER_RAIL_CURRENCY_UNSUPPORTED. USD is for Collections accounts only: a USDT Rails account is refused TRANSFER_CURRENCY_NOT_ENABLED on any rail.
    - `value` string, required: Decimal string, major units of `currency`, up to 2 decimal places, GREATER than zero. Never a JSON number.
  - `fee` TransferAmountDto, required
    - `currency` 'KES' | 'USD', required: Send currency, and the account it is paid from: KES from your KES account, USD from your USD account. Nothing is converted. USD is accepted on rtgs, eft and swift only (to a USD beneficiary account); any other rail refuses it with TRANSFER_RAIL_CURRENCY_UNSUPPORTED. USD is for Collections accounts only: a USDT Rails account is refused TRANSFER_CURRENCY_NOT_ENABLED on any rail.
    - `value` string, required: Decimal string, major units of `currency`, up to 2 decimal places, GREATER than zero. Never a JSON number.
  - `destination` TransferDestinationEchoDto, required
    - `accountNumber` string, required: The account number you supplied.
    - `accountName` string, required: The account name you supplied.
    - `bankCode` string: The bank code you supplied, when the rail carries one.
  - `nameVerification` 'verified' | 'unavailable', required: Whether the beneficiary name could be verified against the rail. `unavailable` covers both "this rail has no verification" (rtgs, eft, swift) and a provider outage — see verifiedAccountName.
  - `verifiedAccountName` string: The resolved beneficiary name, present only when nameVerification is verified.
  - `partnerReference` string: Your own reference, echoed back.
  - `failureCode` string: A classified failure code, present only once failed.
  - `createdAt` string, date-time, required: ISO-8601 instant the transfer was created.
  - `confirmedAt` string, date-time: ISO-8601 instant the transfer was confirmed: when its confirmation code was verified, or, when confirmation is waived for your account, when the transfer was created already confirmed.
  - `settledAt` string, date-time: ISO-8601 instant the transfer settled.
  - `confirmation` ConfirmationDto
    - `id` string, required: The confirmation id. POST the code your confirmation contact receives (or your webhook, as `confirmation.code_issued`, when `channel` is `webhook`) back to `/v1/confirmations/:id` to authorise the transfer.
    - `channel` 'email' | 'sms' | 'webhook', required: How the confirmation code was delivered. `webhook` means it was pushed to your webhook endpoint as `confirmation.code_issued`.
    - `deliveredTo` string, required: Masked delivery address or number. Never the raw contact.
    - `expiresAt` string, date-time, required: ISO-8601 instant the confirmation code expires.
    - `resendAvailableAt` string, date-time, required: ISO-8601 instant a resend becomes available.
    - `webhookDelivery` ConfirmationWebhookDeliveryDto
      - `status` 'pending' | 'delivered' | 'failed', required: `pending` while we are still trying, `delivered` once your endpoint acknowledged the push, `failed` once every attempt has failed.
      - `attempts` integer, required: How many push attempts have been made so far.
      - `lastAttemptAt` string, date-time, nullable, required: ISO-8601 instant of the most recent push attempt, or null before the first.
    - `waiverNotApplied` 'key_without_ip_allowlist': Present only when OnLink has enabled confirmation waiving for your account but this request still needs a confirmation code, because the API key that made it has no IP allowlist. Ask OnLink to add an IP allowlist to that API key; payouts made with it are then created already confirmed. Present on the first response only: a repeat of the same request (an idempotent replay) returns the stored payout without it. Absent in every other case.

## Other responses

- `404`: TRANSFER_NOT_FOUND.

---

[API](https://skmtc.dev/onlink/apis/onlink-partner-api.md) - [All operations](https://skmtc.dev/onlink/apis/onlink-partner-api/llms.txt) - [OpenAPI document](https://skmtc.dev/onlink/apis/onlink-partner-api/revisions/1d1c6a3671f2?raw)
