POST
/
api
/
v1
/
pay
/
single-transfer
curl --request POST \
  --url https://adapter.cepta.co/api/v1/pay/single-transfer \
  --header 'Content-Type: application/json' \
  --header 'X-Access-Key: <api-key>' \
  --header 'X-Access-Signature: <api-key>' \
  --header 'X-Access-Ts: <api-key>' \
  --data '{
  "bankAccount": "<string>",
  "accountNumber": "<string>",
  "accountName": "<string>",
  "amount": 123,
  "description": "<string>",
  "currency": "<string>",
  "reference": "<string>",
  "narration": "<string>"
}'
{
  "status": true,
  "message": "<string>",
  "data": {
    "status": true,
    "message": "<string>",
    "reference": "<string>",
    "transactionId": "<string>",
    "amount": 123,
    "currency": "<string>",
    "accountNumber": "<string>",
    "accountName": "<string>",
    "bankAccount": "<string>",
    "transferStatus": "<string>"
  }
}

Authorizations

X-Access-Key
string
header
required

Access key from Dashboard

X-Access-Signature
string
header
required

HMAC-SHA256 signature (hex lowercase)

X-Access-Ts
string
header
required

Unix timestamp in seconds (UTC) as a string

Body

bankAccount
string
required

Mobile money channel code: 63902 (M-PESA), 63903 (Airtel Money), 0 (SasaPay)

accountNumber
string
required

Recipient phone number in 254XXXXXXXXX format

accountName
string
required

Full name of the recipient

amount
number
required

Amount to transfer (must be greater than 0)

description
string
required

Purpose or reason for the transfer (e.g., "Salary disbursement")

currency
string
required

Currency code. Must be "KES"

reference
string
required

Unique reference for this transfer (alphanumeric, hyphens, underscores, spaces)

narration
string | null

Additional notes for the transfer (optional)

Response

200
text/plain
Success
status
boolean

Indicates if the transfer was successfully initiated

message
string | null

Descriptive message (e.g., "Transfer initiated successfully")

data
object