Skip to main content

List Transactions

List gift card transactions across your merchant, newest first, with cursor pagination. This is the reconciliation view of every value movement.

Endpoint

GET /v1/giftCards/transactions

Headers

HeaderTypeDescriptionRequired
X-Client-IdStringYour client ID✅ Yes
X-Client-SecretStringYour client secret✅ Yes

Query Parameters

ParameterTypeDescriptionRequired
limitIntegerItems per page. Default 15, maximum 100, -1 for unlimited❌ No
nextCursorStringCursor from the previous page's pagination object❌ No

Example Request

curl --location 'https://stage-platform-exlr8-incentives.exlr8now.com/v1/giftCards/transactions?limit=100' \
--header 'X-Client-Id: YOUR_CLIENT_ID' \
--header 'X-Client-Secret: YOUR_CLIENT_SECRET'

Response

Successful Response — 200 OK

{
"success": true,
"data": [
{
"transactionId": "1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
"giftCardId": "9b2c4d6e-8f0a-4b1c-9d3e-5f7a1b2c3d4e",
"type": "DEBIT",
"amount": 150,
"balanceBefore": 500,
"balanceAfter": 350,
"referenceId": "order-20260825-0042",
"idempotencyKey": "order-20260825-0042-debit-01",
"createdAt": "2026-08-25T11:42:07Z"
},
{
"transactionId": "2b3c4d5e-6f7a-4b8c-9d0e-1f2a3b4c5d6e",
"giftCardId": "9b2c4d6e-8f0a-4b1c-9d3e-5f7a1b2c3d4e",
"type": "REFUND",
"amount": 50,
"balanceBefore": 350,
"balanceAfter": 400,
"referenceId": "order-20260825-0042",
"idempotencyKey": "order-20260825-0042-refund-01",
"createdAt": "2026-08-25T14:05:11Z"
}
],
"pagination": {
"nextCursor": "eyJpZCI6IjJiM2M0ZDVlIn0",
"hasMore": true
}
}

Each element carries the same fields as Get Transaction By ID.

Reconciliation

referenceId is the join key back to your own records. Set it to your order ID at redemption and this listing reconciles directly against your order book.

// Reconcile a day's redemptions against your orders
async function reconcile(orderIndex) {
const unmatched = [];
let cursor = null;

do {
const url = new URL(`${baseUrl}/v1/giftCards/transactions`);
url.searchParams.set("limit", "100");
if (cursor) url.searchParams.set("nextCursor", cursor);

const res = await fetch(url, {
headers: {
"X-Client-Id": clientId,
"X-Client-Secret": clientSecret,
},
});

const body = await res.json();

for (const txn of body.data) {
if (!orderIndex.has(txn.referenceId)) {
unmatched.push(txn);
}
}

cursor = body.pagination.hasMore ? body.pagination.nextCursor : null;
} while (cursor);

return unmatched;
}

Both the debit and its refund carry the same referenceId — that is required by the refund rules, and it means a reference can map to several ledger entries. Sum by type when netting.

A transaction with no matching order usually means a redemption committed but your acknowledgement was lost — the value moved, and your side does not know it. These are the entries worth alerting on.

:::note Netting a card's position A card's balance is initialBalance minus debits plus refunds. You do not need to compute it: balanceAfter on the most recent transaction is authoritative, as is remainingBalance from Get Gift Card By ID. :::

Error Responses

Error codeHTTPCause
BAD_REQUEST400limit is not an integer, or the cursor is malformed