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