Payouts
Send funds from Kashier to bank accounts, cards, and mobile wallets in Egypt
Send funds from your Kashier balance to bank accounts, cards, and mobile wallets through the Payouts API. Use it to pay vendors, suppliers, employees, or customers programmatically.
Paying the same people repeatedly? Save them once as beneficiaries and pay by id instead of resending their details on every transfer.
Hosts
Payouts span two hosts, and both are valid:
| Host | Used for |
|---|---|
api.kashier.io (test-api in test) | Reads, lookups, and fee inquiry — account info, listing transfers, transfer details, batch tracking, schedulers, fee inquiry |
fep.kashier.io (test-fep in test) | Transfer writes — create transfer, bulk transfer |
Each endpoint below states its own host. Use the host shown for that endpoint rather than assuming one base URL for the whole domain.
Looking for account management or the balance ledger instead? See Accounts and balance — that's also where Get account info (GET /v2/account) now lives, alongside the rest of the account read/write endpoints.
List all transfers
To list all the transfers, you need to make a GET request to the list all transfers API.
| Endpoint | Value |
|---|---|
| LIVE URL | https://api.kashier.io/v2/transfers?limit=5&page=1&sortType=-1 |
| Method | GET |
| TEST URL | https://test-api.kashier.io/v2/transfers?limit=5&page=1&sortType=-1 |
| Method | GET |
limit, page, and sortType are optional pagination controls — page is 1-based and sortType is -1 for newest first or 1 for oldest first.
Headers
| Key | Description |
|---|---|
| Authorization | The authorization is a secret key used to identify the merchant. You can obtain this key from Kashier's dashboard. Learn more about Authorization. |
curl -X 'GET' 'https://test-api.kashier.io/v2/transfers?limit=5&page=1&sortType=-1'
-H 'Authorization: your_secretKey'
-H "accept: application/json"Full parameter and response reference → List all transfers.
Get transfer details
To get transfer details, you need to make a GET request to the transfer details API, including the transfer ID as a parameter.
| Endpoint | Value |
|---|---|
| LIVE URL | https://api.kashier.io/v2/transfers/:transferId |
| Method | GET |
| TEST URL | https://test-api.kashier.io/v2/transfers/:transferId |
| Method | GET |
Headers
| Key | Description |
|---|---|
| Authorization | The authorization is a secret key used to identify the merchant. You can obtain this key from Kashier's dashboard. Learn more about Authorization. |
curl --location 'https://test-api.kashier.io/v2/transfers/{{transferId}}' \
--header 'Authorization: your_secretKey' \
--header 'Content-Type: application/json' \Full parameter and response reference → Get transfer details.
Fees inquiry
To inquire about the fees, you can make a POST request to the fees inquiry API.
| Endpoint | Value |
|---|---|
| LIVE URL | https://api.kashier.io/v2/transfers/fee-inquiry |
| Method | POST |
| TEST URL | https://test-api.kashier.io/v2/transfers/fee-inquiry |
| Method | POST |
Headers
| Key | Description |
|---|---|
| Authorization | The Authorization is a secret key used to identify the merchant. You can obtain it from Kashier's dashboard. Learn more about Authorization. |
curl -X 'POST' 'https://test-api.kashier.io/v2/transfers/fee-inquiry' \
-H 'Authorization: your_secretKey'
-H "accept: application/json"
--data '{
"transfers": [
{
"amount": "100", // transfer amount that you want to inquire about its fees
"method": "wallet" // use card, wallet, bank or instant wallet for different methods
}
]
}'Full parameter and response reference → Fees inquiry.
Transfer methods
method is lowercased before validation, so send it in lower case.
| Method | Required fields | Dedicated batch route |
|---|---|---|
bank | recipientBank | — |
wallet | Egyptian mobile number in recipientNumber | — |
instant wallet | Egyptian mobile number in recipientNumber | /batch/instant-wallet |
card | cardToken and recipientBank | — |
octo card | Octo Payout recipient | /batch/octo-payout |
internal account | Internal account-to-account recipient | /batch/internal-account |
The dedicated batch routes hang off the same transfers path as Bulk transfers and take an XLSX upload. /batch/instant-wallet and /batch/octo-payout accept the columns Recipient Name, Recipient Number, Amount, Merchant Transfer Id, and force the method for every row. A generic /batch file whose rows mix methods is stored with the batch method mixed.
Validation rules
Requests that break these rules are rejected with a 400 before any money moves.
| Rule | Limit |
|---|---|
| Amount, minimum | 0.01 for every method |
| Amount, wallet maximum | 60000 |
recipientNumber for wallet and instant wallet | Egyptian mobile number matching ^(010|011|012|015)\d{8}$ |
recipientNumber for bank and card | Length only — 1–34 characters, the same bound that applies to every method. No format, checksum, or IBAN validation is applied, so a malformed account number is rejected by the receiving provider rather than by this API. |
recipientName | Trimmed, 3–70 characters |
| Transfers per batch | 1–1000 |
recipientBank | Uppercased and matched against Kashier's supported-bank list — see Bank codes for the downloadable list. Required for bank and card; ignored for every other method. |
merchantTransferId | Optional, but must be unique per merchant. Reusing one is rejected as a duplicate. Required if you want to receive the transfer webhook. |
Bank codes
recipientBank takes a bank abbreviation, not a name or a SWIFT code. It is
uppercased before validation, and an abbreviation Kashier does not recognise is
rejected with a 400 before any money moves.
Download the full list here:
Bank abbreviations
Bank abbreviations (XLSX) —
every accepted recipientBank value with its bank name.
Create transfer
To create a transfer, you need to make a POST request to the create transfer API.
| Endpoint | Value |
|---|---|
| LIVE URL | https://fep.kashier.io/v3/transfers/single |
| Method | POST |
| TEST URL | https://test-fep.kashier.io/v3/transfers/single |
| Method | POST |
Headers
| Key | Description |
|---|---|
| Authorization | The Authorization is a secret key used to identify the merchant. You can obtain it from Kashier's dashboard. Learn more about Authorization. |
| kashier-hash | Request signature. Only required when the transfers hashing capability is enabled on your account — see below. |
The kashier-hash request header
Transfer creation can be signature-protected. When Kashier enables the transfers hashing capability on your merchant account, every create-transfer request must carry a kashier-hash header; a missing or mismatched hash is rejected with a 403. When the capability is off, the header is ignored. If you get a 403 on create with valid keys, check whether transfer hashing is enabled on your account.
The value is the HMAC-SHA256 of the string below, hex-encoded, keyed by your transfer API key — the API key you create in the dashboard named transfer (see Payouts webhook). It is a different key from the payment API key used for order hashing:
/?transfer={merchantId}.{method}.{recipientName}.{recipientNumber}.{amount}If you send a merchantTransferId, append it as a sixth segment, and sign that variant instead:
/?transfer={merchantId}.{method}.{recipientName}.{recipientNumber}.{amount}.{merchantTransferId}The key must match the mode you are calling in — a test transfer API key for the test hosts, a live one for live.
curl -X 'POST' 'https://test-fep.kashier.io/v3/transfers/single'
-H 'Authorization: your_secretKey'
-H "accept: application/json"
--data '{
"amount": 10,
"method": "wallet", // use card, wallet, bank or instant wallet for different methods
"recipientName": "Jhon Doe",
"merchantTransferId":"TRF-YOUR-OWN-UNIQUE-ID", // unique per merchant; required to receive the webhook
"recipientNumber": "01555539512"
}'Send merchantTransferId to receive webhooks
merchantTransferId is optional for the create call, but a transfer created without it never triggers a transfer webhook. To receive webhooks you also need an API key named transfer in the same mode (test or live) and a registered webhook URL — see Before you start. The value must be unique per merchant; reusing one is rejected as a duplicate, which is why the panel below leaves it out.
The create call returns status: "PENDING" — the transfer is accepted, not sent. It then moves through INITIATED → IN_TRANSIT → TRANSFERRED or FAILED asynchronously, and the final provider result is never in this response. Track the outcome with Get transfer details or the payouts webhook.
| Status | Meaning |
|---|---|
| PENDING | Transfer created, balance not yet debited. Returned by the create call. |
| INITIATED | Balance debited; ready to send to the provider. |
| IN_TRANSIT | Sent to the provider, awaiting confirmation. |
| TRANSFERRED | Completed. Final unless openForReturn is true — see openForReturn. |
| FAILED | Failed at any stage. Balance is reversed. |
Optional fields
Three optional fields on this route are worth knowing about:
| Key | Description |
|---|---|
accountId | The Kashier account to debit, in ACC- format. Omit it and the transfer is funded from your primary account. Use it when you hold more than one account. |
partyId | Pay a saved beneficiary by id. Kashier fills in recipientName, recipientNumber, recipientBank, and cardToken from the saved record, so you send only the id, the amount, and the method. |
saveBeneficiary | Save this recipient as a beneficiary while the transfer is created. Ignored on the bulk routes. |
Full parameter and response reference → Create transfer.
Bulk transfers
To create a bulk transfer, you need to make a POST request to the create bulk transfer API.
| Endpoint | Value |
|---|---|
| LIVE URL | https://fep.kashier.io/v3/transfers/batch?merchantBatchId=:merchantBatchId&batchName=:batchName |
| Method | POST |
| TEST URL | https://test-fep.kashier.io/v3/transfers/batch?merchantBatchId=:merchantBatchId&batchName=:batchName |
| Method | POST |
Headers
| Key | Description |
|---|---|
| Authorization | The Authorization is a secret key used to identify the merchant. You can obtain it from Kashier's dashboard. Learn more about Authorization. |
curl -X POST 'https://test-fep.kashier.io/v3/transfers/batch?merchantBatchId=:merchantBatchId&batchName=:batchName' \
-H 'Authorization: your_secretKey' \
-H "accept: application/json" \
-F 'file=@/path/to/file.xlsx'The upload is an XLSX file sent as multipart form data under the field name file. Its columns are method, recipientName, recipientNumber, recipientBank, amount, cardToken, and merchantTransferId; the per-row method decides the rail, and a file whose rows mix methods is stored with the batch method mixed.
Full parameter and response reference → Bulk transfers.