Single Transfer

Single Transfer sends money from your Cepta merchant account directly to a recipient’s mobile money wallet. Supports M-PESA, Airtel Money, and SasaPay channels.

Before You Start

Your Cepta merchant account must have sufficient balance before initiating a payout:

  1. Collect funds via mobile money.
  2. Use Internal Fund Movement to move funds from your Working Account to your Utility Account.
  3. Initiate the Single Transfer.

Initiating a transfer with insufficient balance will return a 400 error: "Insufficient balance to send KES X.XX".

Channel Codes

Retrieve the list of supported mobile money channels dynamically:

GET https://adapter.cepta.co/api/v1/pay/mobile-money-banks

Use the code field from the response as the bankAccount value in your request.

Request

Request
curl --request POST \
  --url https://adapter.cepta.co/api/v1/pay/single-transfer \
  --header 'X-Access-Ts: <EPOCH Timestamp(seconds)>' \
  --header 'X-Access-Key: <PUBLIC_KEY>' \
  --header 'X-Access-Signature: <HMAC SHA256 signature>' \
  --header 'Content-Type: application/json' \
  --data '{
    "bankAccount": "63902",
    "accountNumber": "254712345678",
    "accountName": "Jane Wanjiku",
    "amount": 1000.00,
    "description": "Salary disbursement",
    "currency": "KES",
    "reference": "PAY-KES-001",
    "narration": "March salary"
  }'

reference must be unique per transfer. Use only alphanumeric characters, hyphens (-), underscores (_), or spaces.

Request Parameters

bankAccount
string
required

Mobile money channel code. Retrieve available codes from GET /api/v1/pay/mobile-money-banks.

accountNumber
string
required

Recipient phone number in 254XXXXXXXXX format.

accountName
string
required

Full name of the recipient.

amount
number
required

Amount to transfer in KES. Must be greater than 0.

description
string
required

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

currency
string
required

Currency code. Must be "KES".

reference
string
required

Unique reference for this transfer. Pattern: ^[a-zA-Z0-9-_\s]*$

narration
string

Additional notes for the transfer (optional).

Sample Requests by Provider

{
  "bankAccount": "63902",
  "accountNumber": "254712345678",
  "accountName": "Jane Wanjiku",
  "amount": 1000.00,
  "description": "Salary disbursement",
  "currency": "KES",
  "reference": "PAY-KES-001",
  "narration": "March salary"
}

Response

Success Response
{
  "status": true,
  "message": "Transfer initiated successfully",
  "data": {
    "reference": "PAY-KES-001",
    "transactionId": "TXN-xxxx-xxxx",
    "amount": 1000.00,
    "currency": "KES",
    "accountNumber": "254712345678",
    "accountName": "Jane Wanjiku",
    "bankAccount": "63902",
    "transferStatus": "pending"
  }
}

Response Fields

status
boolean

true if the transfer was successfully initiated.

message
string

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

data
object

Contains transfer details.

reference
string

The transfer reference echoed back from your request.

transactionId
string

Unique transaction identifier generated by Cepta.

amount
number

Amount transferred in KES.

currency
string

Currency code ("KES").

accountNumber
string

Recipient phone number.

accountName
string

Recipient name.

bankAccount
string

Channel code used for the transfer.

transferStatus
string

Current status of the transfer. Typically "pending" on initiation.

Error Responses

HTTPScenarioMessage
400Missing required field"One or more validation errors occurred"
400Invalid amount (0 or negative)"Amount must be greater than 0"
400Invalid reference characters"Reference contains invalid characters"
400Insufficient SasaPay balance"Insufficient balance to send KES X.XX"
408Provider timeout"Request timed out"
500Integration service unreachable"An error occurred processing request"