Skip to main content
POST
/
api
/
partner
/
sandbox
/
v1
/
payout
Execute Payout
curl --request POST \
  --url https://quickei.io/api/partner/sandbox/v1/payout \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "quote_id": "<string>",
  "lookup_token": "<string>",
  "amount": 123,
  "sender_currency": "<string>",
  "receiver_currency": "<string>",
  "reference": "<string>",
  "idempotency_key": "<string>",
  "description": "<string>"
}
'
{
  "payout.payout_id": "<string>",
  "payout.reference": "<string>",
  "payout.amount": 123,
  "payout.currency": "<string>",
  "payout.fee": 123,
  "payout.total_deducted": 123,
  "payout.exchange_rate": 123,
  "payout.receiver_amount": 123,
  "payout.receiver_currency": "<string>",
  "payout.status": "<string>",
  "payout.trx_id": "<string>",
  "payout.created_at": "<string>",
  "payout.processed_at": "<string>"
}

Documentation Index

Fetch the complete documentation index at: https://developer.quickei.io/llms.txt

Use this file to discover all available pages before exploring further.

Execute a payout to credit a Quickei user’s wallet. Your merchant wallet is debited and the recipient’s wallet is credited instantly.

Parameters

You can execute a payout in two ways: using a quote_id from a previous quote, or by providing the lookup and amount parameters directly.
quote_id
string
The quote ID from the Quote endpoint. If provided, the payout uses the locked exchange rate and fees from the quote. When using quote_id, you do not need to provide lookup_token, amount, sender_currency, or receiver_currency.
lookup_token
string
The token from the Lookup endpoint identifying the recipient. Required if quote_id is not provided.
amount
number
Amount to send from your merchant wallet. Must be greater than 0. Required if quote_id is not provided.
sender_currency
string
ISO 4217 currency code of your merchant wallet (e.g. EUR). Max 10 characters. Required if quote_id is not provided.
receiver_currency
string
ISO 4217 currency code of the recipient’s wallet (e.g. XAF). Max 10 characters. Required if quote_id is not provided.
reference
string
required
Your internal reference for this payout (max 255 characters). Must be unique per merchant account.
idempotency_key
string
required
A unique key (max 64 characters) to prevent duplicate payouts. If a payout with the same key already exists, the original payout is returned.
description
string
Optional description visible in the transaction history (max 500 characters).
Using a quote_id locks in the exchange rate and fees from the quote.
curl -X POST https://quickei.io/api/partner/sandbox/v1/payout \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "quote_id": "f7e6d5c4-b3a2-1098-7654-321fedcba098",
    "reference": "PAYROLL-2026-03-001",
    "idempotency_key": "payout_inv_2026_0042",
    "description": "March 2026 salary"
  }'

Without Quote ID (Direct)

If you skip the quote step, Quickei calculates the rate and fees at execution time.
curl -X POST https://quickei.io/api/partner/sandbox/v1/payout \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "lookup_token": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "amount": 100.00,
    "sender_currency": "EUR",
    "receiver_currency": "XAF",
    "reference": "REM-78901",
    "idempotency_key": "payout_inv_2026_0043",
    "description": "Transfer from ExampleRemit"
  }'

Success Response 200

{
  "message": {
    "success": ["Payout completed successfully."]
  },
  "data": {
    "payout": {
      "payout_id": "POAB1C2D3E",
      "reference": "PAYROLL-2026-03-001",
      "amount": 100.00,
      "currency": "EUR",
      "fee": 2.50,
      "total_deducted": 102.50,
      "exchange_rate": 655.957,
      "receiver_amount": 65595.70,
      "receiver_currency": "XAF",
      "status": "completed",
      "description": "March 2026 salary",
      "trx_id": "PP8274619350",
      "created_at": "2026-03-29T14:01:15+00:00",
      "processed_at": "2026-03-29T14:01:15+00:00"
    }
  }
}
payout.payout_id
string
Unique payout identifier (format: PO + 8 random alphanumeric characters). Use this to check status via GET /payout/{id}.
payout.reference
string
Your internal reference as provided in the request.
payout.amount
number
The amount sent (before fees).
payout.currency
string
The sender currency code.
payout.fee
number
Total fee charged (fixed + percentage).
payout.total_deducted
number
Total debited from your merchant wallet (amount + fee).
payout.exchange_rate
number
Applied exchange rate from sender to receiver currency.
payout.receiver_amount
number
Amount credited to the recipient’s wallet.
payout.receiver_currency
string
The recipient’s currency code.
payout.status
string
Payout status: completed, pending, or failed.
payout.trx_id
string
Quickei internal transaction ID.
payout.created_at
string
ISO 8601 timestamp when the payout was created.
payout.processed_at
string
ISO 8601 timestamp when the payout was processed. null if still pending.

Idempotency

The idempotency_key prevents duplicate payouts. If you send the same key twice:
  • The original payout is returned with "duplicate": true
  • No additional funds are moved
  • The response status is 200
{
  "message": {
    "success": ["Payout already processed."]
  },
  "data": {
    "duplicate": true,
    "payout": {
      "payout_id": "POAB1C2D3E",
      "reference": "PAYROLL-2026-03-001",
      "amount": 100.00,
      "currency": "EUR",
      "fee": 2.50,
      "total_deducted": 102.50,
      "exchange_rate": 655.957,
      "receiver_amount": 65595.70,
      "receiver_currency": "XAF",
      "status": "completed",
      "description": "March 2026 salary",
      "trx_id": "PP8274619350",
      "created_at": "2026-03-29T14:01:15+00:00",
      "processed_at": "2026-03-29T14:01:15+00:00"
    }
  }
}
Always include an idempotency_key. Without it, the request will be rejected (it is required). The reference must also be unique per merchant account — a duplicate reference will be rejected even with a new idempotency key.

Error Responses

StatusMessageCause
400Invalid or expired quote.The quote_id has expired (older than 5 minutes) or does not belong to your account
400Invalid or expired lookup token.The lookup_token has expired (older than 10 minutes)
400Insufficient balance.Merchant wallet balance is less than total_deducted
400Currency EUR is not authorized for payouts.Currency not enabled for payouts on your account
400Amount exceeds per-transaction limitAmount exceeds the per-transaction limit for this currency
400Daily payout limit exceededDaily payout volume limit reached for this currency
400Monthly payout limit exceededMonthly payout volume limit reached for this currency
400Duplicate reference.A different payout already uses this reference
400Recipient not found or inactive.The user account is deactivated
400Recipient wallet not found for currency: XAFRecipient has no wallet in the specified receiver currency
422Validation errorMissing required fields
401Invalid API credentials.Bad or missing Bearer token
Payouts are atomic. If any step fails (debit, credit, or ledger entry), the entire transaction is rolled back. Your merchant wallet is not debited and the recipient receives nothing. You can safely retry with the same idempotency_key.