KashierDevelopersKashier Developers

Look up an order and its transactions

curl -X GET "https://test-api.kashier.io/v3/payment/orders?search=ORDER-12345&startDate=2026-06-01&endDate=2026-06-18"
{  "status": "SUCCESS",  "message": "Orders retrieved successfully",  "data": [    {      "merchantOrderId": "ORDER-12345",      "orderId": "00916dc7-7a3a-4875-af44-118bc678378b",      "status": "CAPTURED",      "interChangeRate": "ON_US",      "transactions": [        {          "operation": "3dsecure_verify",          "status": "SUCCESS",          "transactionResponseCode": "AUTHENTICATION_IN_PROGRESS",          "transactionResponseMessage": {            "en": "Authentication in progress",            "ar": "المصادقة قيد التقدم"          },          "reconcilation": "NA",          "merchantWebhookReconciliation": "NA"        },        {          "operation": "pay",          "status": "SUCCESS",          "transactionResponseCode": "APPROVED",          "transactionResponseMessage": {            "en": "Approved",            "ar": "تمت الموافقة"          },          "reconcilation": "OK",          "merchantWebhookReconciliation": "OK",          "isSettled": true        }      ]    }  ],  "pagination": {    "total": 1,    "page": 1,    "limit": 20,    "pages": 1  }}

The endpoint to call after a payment when you need to know what actually happened. It returns the whole order — every transaction attempted against it, each one's response code, and Kashier's own reconciliation verdict — so you can settle the question "was this paid?" from Kashier's records rather than from a webhook you may have missed.

Read the order status, not the HTTP status. A declined payment is still an HTTP 200 here, and inside transactions[] a declined attempt is still a stored transaction. Branch on the order-level status (CAPTURED is the paid state) and, per transaction, on status together with transactionResponseCode.

search is required, and it is a partial, case-insensitive match on your own merchantOrderId — not on Kashier's order id. Calling without it returns a 400. (Kashier's older published docs name this parameter merchantOrderId; the parameter the API actually accepts is search.)

A merchant's calls are always scoped to their own MID, which is taken from the credential — you cannot read another merchant's orders by passing a different merchantId.

Authorization

secretKey
Authorization<token>

Merchant secret key used to identify the merchant, obtained from Kashier's dashboard. Pass the raw secret key value in the Authorization header (NOT a "Bearer" token).

In: header

Query Parameters

search*string

Partial, case-insensitive match on your merchantOrderId. Must be a non-empty string of 1–100 characters; the call is rejected with a 400 without it.

Length1 <= length <= 100
status?string

Filter by the order-level status. The value is upper-cased before matching, so captured and CAPTURED are equivalent. This is the OrderStatus vocabulary — not the Approved/Rejected labels used by the transactions list.

Value in

  • "INITIATED"
  • "CAPTURED"
  • "AUTHORIZED"
  • "FAILED"
  • "CANCELLED"
  • "REVERSED"
  • "EXPIRED"
  • "REJECTED"
startDate?string

Only return orders dated on or after this date. Must not be later than endDate, or the call is rejected with a 400.

endDate?string

Only return orders dated on or before this date.

page?integer

Page number. Defaults to 1.

Default1
limit?integer

Page size. Defaults to 20. Orders come back newest first.

Default20

Response Body

application/json

application/json

application/json

application/json

application/json

GET
/v3/payment/orders