List customers
Returns a cursor-paginated list of customers in the calling organization, sorted by created_at descending (newest first).
Filtering
Filters combine with AND. Two categories:
- Lookup filters (rate-limited more strictly - used to find a specific record):
email,phone,external_id - Scan filters (standard rate limit - used to iterate a subset):
card_id,location_id,status,device,created[gte|lte],updated[gte|lte] - Serial number lookup (standard rate limit - returns at most one customer):
serial_number, the value in the customer’s wallet pass QR code or barcode, or the number on a physical card. Send it exactly as you have it; it is not the customerid.
Lookup filters are stricter because they can be used to enumerate the organization’s customers.
See Pagination for the cursor pattern and Rate Limits for the per-key ceilings.
Date filters
created[gte|lte] and updated[gte|lte] accept ISO-8601 timestamps (with timezone) or Unix seconds - either format works interchangeably.
Authorizations
Your secret API key as a Bearer token: Authorization: Bearer vxn_sk_.... Keys are created and scoped in the dashboard - see Authentication.
Query Parameters
Look up a customer by serial number: the value encoded in their wallet pass QR code or barcode and printed on physical cards (see Customer.serial_number). Send it exactly as you have it, for example as scanned, typed or stored from a webhook. Accepts the platform-assigned serial (a 24-character hex value), a referral-link QR (https://www.vexioncards.one/ref/<serial>), a gift-card QR (https://www.vexioncards.one/gfc/<serial>, returns the gift-card customer) and a merchant-assigned custom serial (serial_number_locked: true). Returns at most one customer; an unknown value returns an empty list, not an error. Standard rate limit (not the 5/sec lookup tier).
1 - 256Response
The customer object.
Cursor-paginated list of Customer objects.
Cursor for the next page in the direction you are already paging, or null when this page ends the collection. has_more: true always comes with a non-null next_cursor.
Feed it back to the SAME parameter you used: starting_after when paging forward (the default), or ending_before when paging backward. Treat it as opaque and do not parse it.
You no longer need to take the last object's id yourself. That still works and is unchanged, but deriving the cursor from the page put the burden of knowing the sort direction on you, and it broke silently on any endpoint whose cursor is not the object id.
"cus_iofv5j4hn6bphinmmyat27tc5y"