KashierDevelopersKashier Developers
Payouts

Payouts

Send funds to bank accounts, cards, and mobile wallets

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.

Hosts

Payouts span two hosts, and both are valid:

HostUsed 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.

EndpointValue
LIVE URLhttps://api.kashier.io/v2/transfers?limit=5&page=1&sortType=-1
MethodGET
TEST URLhttps://test-api.kashier.io/v2/transfers?limit=5&page=1&sortType=-1
MethodGET

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

KeyDescription
AuthorizationThe 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.

EndpointValue
LIVE URLhttps://api.kashier.io/v2/transfers/:transferId
MethodGET
TEST URLhttps://test-api.kashier.io/v2/transfers/:transferId
MethodGET

Headers

KeyDescription
AuthorizationThe 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.

EndpointValue
LIVE URLhttps://api.kashier.io/v2/transfers/fee-inquiry
MethodPOST
TEST URLhttps://test-api.kashier.io/v2/transfers/fee-inquiry
MethodPOST

Headers

KeyDescription
AuthorizationThe 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.

MethodRequired fieldsDedicated batch route
bankrecipientBank
walletEgyptian mobile number in recipientNumber
instant walletEgyptian mobile number in recipientNumber/batch/instant-wallet
cardcardToken and recipientBank
octo cardOcto Payout recipient/batch/octo-payout
internal accountInternal 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.

RuleLimit
Amount, minimum0.01 for every method
Amount, wallet maximum60000
recipientNumber for wallet and instant walletEgyptian mobile number matching ^(010|011|012|015)\d{8}$
recipientNumber for bank and cardLength 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.
recipientNameTrimmed, 3–70 characters
Transfers per batch1–1000
recipientBankUppercased 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.
merchantTransferIdOptional, but must be unique per merchant. Reusing one is rejected as a duplicate.

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.

EndpointValue
LIVE URLhttps://fep.kashier.io/v3/transfers/single
MethodPOST
TEST URLhttps://test-fep.kashier.io/v3/transfers/single
MethodPOST

Two hosts are in circulation for this call

Kashier's own sources disagree on the canonical public entry point for creating a transfer: this page (and the sandbox examples) use (test-)fep.kashier.io/v3/transfers/single, while the transfers service documents the merchant entry point as (test-)api.kashier.io/v2/transfers/single. Both appear in Kashier's Postman collection. If the host above does not work for your account, try the api.kashier.io/v2/transfers/single form and confirm with your account manager which one you should build against.

Headers

KeyDescription
AuthorizationThe Authorization is a secret key used to identify the merchant. You can obtain it from Kashier's dashboard. Learn more about Authorization.
kashier-hashRequest 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 are getting a 403 on create with valid keys and no explanation, this is the first thing to check with your account manager.

The value is the HMAC-SHA256 of the string below, hex-encoded, keyed by your transfer API key — 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.

Unconfirmed on this route

The kashier-hash requirement is documented against the api-gateway create route (/v2/transfers/single). Whether it is also enforced on the fep.kashier.io/v3/transfers/single form shown above is not confirmed — check with your account manager if the capability is enabled on your account.

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", // optional; must be unique per merchant
        "recipientNumber": "01555539512"
    }'

merchantTransferId is left out of the panel

It is optional, and reusing one is rejected as a duplicate — a fixed value in the docs would work for whoever sends first and fail for everyone after. Add your own when you send the request for real; it is the field you use to reconcile the transfer against your own records.

The create call returns status: "PENDING" — the transfer is accepted, not sent. It then moves through INITIATEDIN_TRANSITTRANSFERRED or FAILED asynchronously, and the final provider result is never in this response. Track the outcome with Get transfer details or the payouts webhook.

StatusMeaning
PENDINGTransfer created, balance not yet debited. Returned by the create call.
INITIATEDBalance debited; ready to send to the provider.
IN_TRANSITSent to the provider, awaiting confirmation.
TRANSFERREDCompleted. Final unless openForReturn is true — see openForReturn.
FAILEDFailed at any stage. Balance is reversed.

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.

EndpointValue
LIVE URLhttps://fep.kashier.io/v3/transfers/batch?merchantBatchId=:merchantBatchId&batchName=:batchName
MethodPOST
TEST URLhttps://test-fep.kashier.io/v3/transfers/batch?merchantBatchId=:merchantBatchId&batchName=:batchName
MethodPOST

Headers

KeyDescription
AuthorizationThe 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.

On this page