Skip to content

Customer Orders

GET /cdp/customers/{identifier}/orders — list a single customer’s orders, resolved from the same identifier as Get Customer. The response is the exact same contract as List Orders: a normalized order list plus offset pagination — just pre-filtered to one customer.

Requires the beta:cdp-commerce permission on your brand.

GET /cdp/customers/{identifier}/orders
Authorization: Bearer vyg_…
ParamTypeDescription
identifierstringA profile id, email, phone, Shopify customer id, or contact id — classified by shape (see Get Customer). Pass the customer.contact_id from an order here to list that customer’s full history.
ParamTypeDefaultDescription
limitinteger25Page size, clamped to a maximum of 100.
offsetinteger0Offset; offset + limit must stay within the 10,000-row window or the request is rejected 400.
{
"list": [
{
"id": "b2c1…",
"external_id": "4501234567890",
"number": "1001",
"state": "complete",
"billing_status": "complete",
"total": "120.00",
"currency_code": "USD",
"customer": { "contact_id": "c9f0…" },
"created_at": "2026-03-02T14:21:00.000Z",
"recovered_at": null
}
],
"totalSize": 1,
"offset": 0,
"pageSize": 25,
"scope": "your-shop.myshopify.com",
"nextCursor": null
}

The envelope and each order are identical to List Orders — see Get Order for the full per-order field reference and line-item detail. Orders here include all states (not just completed), unlike the commerce.total_spend summary on Get Customer, which counts completed orders only.

A customer that resolves a profile but no local order contact returns an empty page (list: [], totalSize: 0) — never another brand’s orders.

Terminal window
curl -s "https://cdp.vyg.app/cdp/customers/alice@example.com/orders?limit=25" \
-H "Authorization: Bearer vyg_your_key_here"
StatusWhen
400Missing identifier, or a deep offset past the result window.
401Missing or invalid credential.
403Brand not enrolled in the commerce beta (beta_not_enabled), or no connected Shopify integration (integration_not_connected).
404The customer is absent from both the profile and commerce stores — an unknown identifier or one belonging to another brand, indistinguishable by design.
405Non-GET method.

See Tenant Isolation & Scope for why cross-brand identifiers return 404 and never leak another brand’s orders.