List a customer's points transactions
GET /customers/{customer_id}/transactions| Scope | points:read |
| Customer session token | Accepted with the read scope, for the token’s own customer |
| Rate limit class | read (limits) |
| Idempotency key | Not used |
| MCP tool | charm_list_customer_transactions |
Newest first, cursor-paginated. points is signed and its sign does not follow from type — zero-point marker rows exist, and corrections can be negative earns.
Parameters
Section titled “Parameters”| Name | In | Type | Description |
|---|---|---|---|
customer_id | path | string | Shopify customer GID (percent-encoded, e.g. gid%3A%2F%2Fshopify%2FCustomer%2F123) or the numeric customer id. |
limit (optional) | query | integer | Page size, 1–250. Defaults to 50. |
cursor (optional) | query | string | Opaque cursor from a previous response’s next_cursor. |
include_internal (optional) | query | string: true | Include internal bookkeeping rows (pending reversals) that are hidden by default. The paired earn row already carries the reduced amount, so a reconciliation client wants these and a customer-facing one does not. |
type (optional) | query | string | Comma-separated ledger types to include: earn, adjust, redeem, reversal, expire, credit, status, history. |
Response 200
Section titled “Response 200”Returns TransactionList.
| Field | Type | Description |
|---|---|---|
data | array of Transaction | |
next_cursor | string or null | Pass as cursor to fetch the next page; null on the last page. (nullable) |
has_more | boolean | True when another page exists. |
{ "data": [ { "id": "id", "type": "earn", "points": 120, "balance_after": 120, "source": "order", "source_ref": "pos-receipt-4471", "description": "Points for order #1042", "title_key": "history.title.order_points", "title_params": {}, "discount_code": "CHARM-7Q2X9", "order_total": null, "credit_amount": null, "is_pending": false, "pending_until": "2026-10-01T09:30:00.000Z", "cancelled": false, "created_at": "2026-10-01T09:30:00.000Z" } ], "next_cursor": null, "has_more": true}Example
Section titled “Example”curl -X GET "https://charm.appfleece.app/api/v1/customers/7712345/transactions" \ -H "Authorization: Bearer chrm_live_..."Errors
Section titled “Errors”unauthorized · invalid_token · token_expired · insufficient_scope · access_required · not_found · validation_error · rate_limited
Every error body carries code, message, request_id and a doc_url pointing at the matching entry in the error catalog.