Skip to main content

Create Transfer

POST /v1/transfers

Moves money from one account to another. The debit account is charged, the credit account receives.

Request

{
"debit_account_id": "ba9755d7e835cdeea6bca803721c7eba",
"credit_account_id": "19d64e32e2da3c3dbd1ebaba9860ab9",
"amount": 50000,
"ledger": 1001,
"code": 100
}
FieldRequiredTypeDescription
debit_account_idYesstringAccount to debit (money leaves)
credit_account_idYesstringAccount to credit (money arrives)
amountYesintegerAmount in the ledger's smallest unit
ledgerYesintegerLedger ID. Both accounts must be on this ledger.
codeYesintegerTransfer reason code. See transfer codes.

Transfer codes

The code field represents why the money moved. This is your own numbering system. Quda does not enforce any meaning.

Example transfer codes:

CodeMeaning
100Payment
200Refund
300Fee
400Settlement
500Interest
600Adjustment

Transfer codes are separate from account codes. Transfer codes describe why money moved. Account codes describe what the account is.

Transfers are final

Transfers cannot be edited or deleted

A posted transfer is permanent. The money has moved. There is no undo, no edit, no delete.

If you need to reverse a transfer, create a new transfer in the opposite direction. Debit the account that was credited, credit the account that was debited, for the same amount.

This is by design. An immutable ledger means the history is always complete and auditable. Every movement of funds is recorded permanently.

Amount

Amounts are integers in the ledger's smallest unit. See asset scale.

LedgerScaleAmount 50000Display
USD250000$500.00
TZS050000TZS 50,000

Never calculate amounts using floating-point arithmetic. Perform all calculations on integers and only convert for display.

Response 201

{
"data": {
"tenant_id": "f714f6af-...",
"transfer": {
"id": "a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4",
"debit_account_id": "ba9755d7e835cdeea6bca803721c7eba",
"credit_account_id": "19d64e32e2da3c3dbd1ebaba9860ab9",
"amount": 50000,
"ledger": 1001,
"code": 100,
"status": "posted",
"created_at": "2026-04-06T22:50:00Z"
}
}
}

Headers

Authorization: Bearer qk_live_...
Idempotency-Key: <unique-string>
Content-Type: application/json

Errors

CodeTypeMeaning
422insufficient_fundsDebit account does not have enough balance
422same_accountDebit and credit accounts must be different
422zero_amountAmount must be greater than zero
422account_closedOne of the accounts is closed