KashierDevelopersKashier Developers
Payouts

Instant Settlement

Request an early payout of eligible, not-yet-settled transactions in exchange for a fee

Instant Settlement lets you request an early payout of eligible, not-yet-settled transactions in exchange for a fee, ahead of their normal settlement window.

Feature must be enabled

Instant settlement is gated by the per-merchant instant_settlement_request feature flag, which is off by default. Only Kashier can enable it on your account — you can't toggle it yourself. Separately, each route requires an instant-settlement permission on the calling user's role — instant_settlements.all.view_instant_settlement for the reads on this page, instant_settlements.all.create_instant_settlement for the fee inquiry and for creating a request — so a valid key on a role without them is rejected even when the flag is on.

Both refusals come from the same gate and look alike: a 401 Unauthorized, not a 404. Every path on this page is live on test-api.kashier.io — if you get a 401 on a valid key, the flag or the permission is missing, not the endpoint. (A request with no Authorization header at all is answered with 403 {"message": "No auth token provided"}.)

A typical flow: list your eligible transactions, optionally get amount suggestions or a fee quote, then create a request. Once created, a request moves through a small set of statuses:

StatusMeaning
PENDINGThe request has been created and is waiting to be processed.
PROCESSINGThe early payout amount has been deducted from your balance.
TRANSFERREDThe payout has reached your payout method.
DECLINEDThe request will not be processed. See declineReason on the request for details.

Get eligible transactions

Returns a paginated list of your not-yet-settled transactions that are eligible for instant settlement, plus summary totals and your current caps.

Query parameters

KeyDescription
pagePage number for pagination. Example: 1
limitRecords per page. Example: 20
channelOptional filter: online or pos.
methodOptional filter: card or wallet.
dateFromInclusive lower bound on transaction date (ISO). Example: 2026-06-01
dateToInclusive upper bound on transaction date (ISO). Example: 2026-06-30
curl --location 'https://test-api.kashier.io/v3/payment/instant-settlements/instant/eligible-transactions?page=1&limit=20' \
  --header 'Authorization: YOUR_TEST_SECRET_KEY'

Headers

KeyDescription
AuthorizationThe Authorization is a secret key that is used to identify the merchant. You can obtain it from Kashier's dashboard. Learn more about Authorization.

Response

{
  "message": "success",
  "data": [
    {
      "transactionId": "TX-1001",
      "amount": 10000,
      "settlementAmount": 10000,
      "accountId": "ACC-39550-436-01",
      "method": "card",
      "channel": "online",
      "transactionDate": "2026-06-10T11:20:00.000Z",
      "rfsDate": "2026-06-15T00:00:00.000Z"
    }
  ],
  "pagination": {
    "total": 2,
    "limit": 20,
    "page": 1,
    "pages": 1
  },
  "summary": {
    "count": 2,
    "totalAmount": 15000,
    "totalSettlementAmount": 15000
  },
  "limits": {
    "perRequestCap": 100000,
    "dailyCap": 250000,
    "usedToday": 0,
    "remainingToday": 250000
  }
}
FieldDescription
data[].transactionIdThe transaction's identifier.
data[].settlementAmountThe amount that would be settled for this transaction.
data[].accountIdThe account this transaction would settle into.
data[].rfsDateThe transaction's regular ("ready for settlement") settlement date, absent instant settlement.
summaryTotals across the whole eligible set, not just the current page.
limits.perRequestCapThe maximum amount you can include in a single request.
limits.dailyCapThe maximum amount you can request in a day. 0 means no daily cap is configured.
limits.usedTodayAmount already requested today.
limits.remainingTodayRemaining amount you can request today. null when dailyCap is unconfigured.

Get amount suggestions

Given a target amount, returns the combination of your eligible transactions whose combined settlementAmount comes closest to that target — one combination just below it and one just above it — so you don't have to hand-pick transactions to hit a number.

Body parameters

KeyDescription
targetAmountThe amount you'd like to get as close to as possible. Required.
channelOptional filter: online or pos.
methodOptional filter: card or wallet.
dateFromOptional inclusive lower bound on transaction date (ISO).
dateToOptional inclusive upper bound on transaction date (ISO).
curl --location 'https://test-api.kashier.io/v3/payment/instant-settlements/instant/suggestions' \
  --header 'Authorization: YOUR_TEST_SECRET_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
    "targetAmount": 50000
  }'

Headers

KeyDescription
AuthorizationThe Authorization is a secret key that is used to identify the merchant. You can obtain it from Kashier's dashboard. Learn more about Authorization.

Response

{
  "targetAmount": 50000,
  "below": {
    "totalAmount": 38500,
    "transactionsCount": 4,
    "transactionIds": ["TX-A30000", "TX-B7000", "TX-C1000", "TX-D500"]
  },
  "above": {
    "totalAmount": 55000,
    "transactionsCount": 2,
    "transactionIds": ["TX-A30000", "TX-E25000"]
  },
  "candidatesConsidered": 5,
  "truncated": false,
  "approximate": false,
  "limits": {
    "perRequestCap": 100000,
    "dailyCap": 250000,
    "remainingToday": 250000
  }
}
FieldDescription
belowThe largest combination of transactions whose total is at or under targetAmount. null if no combination fits.
aboveThe smallest combination of transactions whose total is at or over targetAmount. null if no combination fits.
below.transactionIds / above.transactionIdsPass these directly as transactionIds to the fee inquiry or create request endpoints.

Both below and above are clamped to your effective cap (the lower of perRequestCap and your remaining daily cap).

Get a fee inquiry

Returns a fee breakdown for a set of transactions, without creating a request. Use this to show the merchant the net amount they'd receive before they commit.

Body parameters

KeyDescription
transactionIdsArray of transaction IDs to quote a fee for. Required.
curl --location 'https://test-api.kashier.io/v3/payment/instant-settlements/instant/inquiry' \
  --header 'Authorization: YOUR_TEST_SECRET_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
    "transactionIds": ["TX-1001", "TX-1002"]
  }'

Headers

KeyDescription
AuthorizationThe Authorization is a secret key that is used to identify the merchant. You can obtain it from Kashier's dashboard. Learn more about Authorization.

Response

{
  "totalAmount": 15000,
  "totalSettlementAmount": 15000,
  "totalRateFees": 225,
  "vat": 31.5,
  "flatFees": 0,
  "totalFees": 256.5,
  "netTransferAmount": 14743.5,
  "transactionsCount": 2
}
FieldDescription
totalSettlementAmountSum of the settlement amounts of the selected transactions.
totalRateFeesPercentage-based instant settlement fee.
vatVAT on the fee.
flatFeesFlat portion of the fee, if any.
totalFeestotalRateFees + vat + flatFees.
netTransferAmountWhat you'd actually receive: totalSettlementAmount - totalFees.

Caps are enforced here too

If the selection would exceed your per-request or daily cap, this call fails before you ever create a request, with a 422 carrying a dedicated code — INSTANT_SETTLEMENT_PER_REQUEST_LIMIT_EXCEEDED or INSTANT_SETTLEMENT_DAILY_LIMIT_EXCEEDED — and the relevant figures:

{
  "status": "FAILURE",
  "error": {
    "code": "INSTANT_SETTLEMENT_DAILY_LIMIT_EXCEEDED",
    "message": "Instant settlement daily limit exceeded",
    "limit": 250000,
    "usedToday": 240000,
    "remaining": 10000
  }
}

Cap breaches are the one exception: every other validation failure on this module is a 400, and a 409 means the request exists but is no longer PENDING.

Create an instant settlement request

Creates a request over the selected transactions. The request starts in PENDING status.

Body parameters

KeyDescription
transactionIdsArray of transaction IDs to include in the request. Required.
curl --location 'https://test-api.kashier.io/v3/payment/instant-settlements/instant-requests' \
  --header 'Authorization: YOUR_TEST_SECRET_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
    "transactionIds": ["TX-1001", "TX-1002"]
  }'

Headers

KeyDescription
AuthorizationThe Authorization is a secret key that is used to identify the merchant. You can obtain it from Kashier's dashboard. Learn more about Authorization.

Response

{
  "message": "success",
  "data": {
    "id": "d2719f9a-3a36-4f10-9c7b-1f2e3d4c5b6a",
    "requestId": "ISR-1042",
    "merchantId": "MID-957-917",
    "status": "PENDING",
    "declineReason": null,
    "totalAmount": 15000,
    "totalSettlementAmount": 15000,
    "totalRateFees": 225,
    "flatFees": 0,
    "vat": 31.5,
    "totalFees": 256.5,
    "netTransferAmount": 14743.5,
    "transactionsCount": 2,
    "statusHistory": [
      { "status": "PENDING", "at": "2026-06-13T08:00:00.000Z", "by": "[email protected]" }
    ],
    "createdAt": "2026-06-13T08:00:00.000Z",
    "updatedAt": "2026-06-13T08:00:00.000Z"
  }
}
FieldDescription
data.idThe request's UUID. Use this or requestId to look up the request later.
data.requestIdThe request's human-readable ID (e.g. ISR-1042).
data.statusSee the status table at the top of this page.
data.declineReasonSet when status is DECLINED; otherwise null.
data.netTransferAmountThe amount you'll receive after fees.
data.statusHistoryA log of status changes for this request.

Only transactions that are currently eligible are accepted — if any transaction in transactionIds is no longer eligible, the request is rejected with a 400 naming the offending transaction, and no partial request is created.

List your instant settlement requests

Returns a paginated list of your own instant settlement requests.

Query parameters

KeyDescription
pagePage number for pagination. Example: 1
limitRecords per page. Example: 20
statusFilter by status: PENDING, PROCESSING, TRANSFERRED, or DECLINED.
requestIdFilter/search by the human requestId (prefix match).
dateFromInclusive lower bound on transaction date (ISO).
dateToInclusive upper bound on transaction date (ISO).
curl --location 'https://test-api.kashier.io/v3/payment/instant-settlements/instant-requests?page=1&limit=20' \
  --header 'Authorization: YOUR_TEST_SECRET_KEY'

Headers

KeyDescription
AuthorizationThe Authorization is a secret key that is used to identify the merchant. You can obtain it from Kashier's dashboard. Learn more about Authorization.

Response

{
  "message": "success",
  "data": [
    {
      "id": "d2719f9a-3a36-4f10-9c7b-1f2e3d4c5b6a",
      "requestId": "ISR-1042",
      "merchantId": "MID-957-917",
      "status": "PENDING",
      "totalSettlementAmount": 15000,
      "netTransferAmount": 14743.5,
      "transactionsCount": 2,
      "createdAt": "2026-06-13T08:00:00.000Z"
    }
  ],
  "pagination": {
    "total": 1,
    "limit": 20,
    "page": 1,
    "pages": 1
  }
}

Get request details

Fetch the full detail of a single request by its id or requestId.

:id accepts either the UUID id or the human-readable requestId (e.g. ISR-1042).

curl --location 'https://test-api.kashier.io/v3/payment/instant-settlements/instant-requests/ISR-1042' \
  --header 'Authorization: YOUR_TEST_SECRET_KEY'

Headers

KeyDescription
AuthorizationThe Authorization is a secret key that is used to identify the merchant. You can obtain it from Kashier's dashboard. Learn more about Authorization.

Response

{
  "message": "success",
  "data": {
    "id": "d2719f9a-3a36-4f10-9c7b-1f2e3d4c5b6a",
    "requestId": "ISR-1042",
    "merchantId": "MID-957-917",
    "status": "PROCESSING",
    "totalSettlementAmount": 15000,
    "netTransferAmount": 14743.5,
    "transactionsCount": 2,
    "statusHistory": [
      { "status": "PENDING", "at": "2026-06-13T08:00:00.000Z" },
      { "status": "PROCESSING", "at": "2026-06-13T08:05:00.000Z" }
    ],
    "linkedBalanceRecords": [
      {
        "recordId": "ISR-1042-20260615",
        "accountId": "ACC-39550-436-01",
        "amount": -10000,
        "valueDate": "2026-06-15T00:00:00.000Z",
        "isReflected": false
      }
    ]
  }
}
FieldDescription
data.linkedBalanceRecordsThe balance ledger records created for this request, once its early-payout deduction has posted. Empty ([]) while status is PENDING. See Get balance records for the general ledger this is drawn from.
data.linkedBalanceRecords[].isReflectedWhether this deduction has been fully reflected in your balance yet.

Degraded response

If the balance ledger is temporarily unavailable when you call this endpoint, the request details still return, but with linkedBalanceRecords: null and linkedBalanceRecordsUnavailable: true. Retry later to get the linked records.

Calling this with an id/requestId that doesn't belong to you returns a 404.

Get request transactions

Returns the transactions that belong to a specific request.

Query parameters

KeyDescription
pagePage number for pagination. Example: 1
limitRecords per page. Example: 20
curl --location 'https://test-api.kashier.io/v3/payment/instant-settlements/instant-requests/ISR-1042/transactions?page=1&limit=20' \
  --header 'Authorization: YOUR_TEST_SECRET_KEY'

Headers

KeyDescription
AuthorizationThe Authorization is a secret key that is used to identify the merchant. You can obtain it from Kashier's dashboard. Learn more about Authorization.

Response

{
  "message": "success",
  "data": [
    {
      "transactionId": "TX-1001",
      "settlementAmount": 10000,
      "accountId": "ACC-39550-436-01",
      "rfsDate": "2026-06-15T00:00:00.000Z",
      "method": "card"
    },
    {
      "transactionId": "TX-1002",
      "settlementAmount": 5000,
      "accountId": "ACC-39550-436-02",
      "rfsDate": "2026-06-16T00:00:00.000Z",
      "method": "wallet"
    }
  ],
  "pagination": {
    "total": 2,
    "limit": 20,
    "page": 1,
    "pages": 1
  }
}

On this page