Skip to main content

Get Customer

Retrieve a specific customer from your store.

By default the response contains only the customer's base fields. Use the include query parameter to expand related sections — orders, subscriptions, one-time product access, and a lifetime-value breakdown — in the same call, so you don't have to stitch together several requests.

Request

GET /customers/{id}

Path Parameters

ParameterTypeRequiredDescription
idstringYesCustomer UUID

Query Parameters

ParameterTypeRequiredDescription
currencystringYesLowercase ISO currency code (e.g. pln). Scopes the money sections. See Get Store for valid values.
includestringNoComma-separated list of sections to expand. Allowed values: orders, subscriptions, products, ltv. Unknown values are ignored.
note

A section that is not requested is returned as null — the key is always present, so the response shape stays stable. Requesting include=orders therefore leaves subscriptions, products, and ltv as null.

note

currency scopes the money sections only: orders, ltv, and the base lifetime_value / orders_count / first_seen / last_order fields. The subscriptions and products sections are tracked per store and are returned regardless of currency.

Example Request

curl -X GET "https://cart.easy.tools/api/v1/customers/550e8400-e29b-41d4-a716-446655440010?currency=pln&include=orders,subscriptions,products,ltv" \
-H "Authorization: Bearer YOUR_API_TOKEN"

Response

Success Response (200)

Returns a single customer. The example below requests all sections.

{
"id": "550e8400-e29b-41d4-a716-446655440010",
"name": "Jane Doe",
"email": "buyer@example.com",
"avatar": "https://example.com/avatars/jane.png",
"first_seen": "2026-01-15T10:15:30+00:00",
"last_order": "2026-05-20T14:02:00+00:00",
"orders_count": 4,
"subscriptions_count": 1,
"lifetime_value": 19600,
"currency": "pln",
"orders": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"status": "completed",
"amount": 4900,
"currency": "pln",
"product_name": "Premium Course",
"created_at": "2026-05-20T14:02:00+00:00"
}
],
"subscriptions": [
{
"id": "550e8400-e29b-41d4-a716-446655440020",
"remote_id": "sub_1QabcDEFghiJKLmn",
"provider": "stripe",
"status": "active",
"variant_name": "Monthly Plan",
"recurring_amount": 4900,
"currency": "pln",
"interval": "month",
"current_period_end": "2026-06-20T14:02:00+00:00",
"active_until": null,
"is_delegated": false,
"created_at": "2026-01-20T14:02:00+00:00"
}
],
"products": [
{
"id": "550e8400-e29b-41d4-a716-446655440030",
"product_name": "Premium Course",
"variant_name": "Lifetime",
"active_until": null,
"is_delegated": false,
"created_at": "2026-01-20T14:02:00+00:00"
}
],
"ltv": {
"gross": 24500,
"refunded": 4900,
"net": 19600,
"currency": "pln"
}
}

A lean read (no include) returns the base fields with every section set to null:

{
"id": "550e8400-e29b-41d4-a716-446655440010",
"name": "Jane Doe",
"email": "buyer@example.com",
"avatar": "https://example.com/avatars/jane.png",
"first_seen": "2026-01-15T10:15:30+00:00",
"last_order": "2026-05-20T14:02:00+00:00",
"orders_count": 4,
"subscriptions_count": 1,
"lifetime_value": 19600,
"currency": "pln",
"orders": null,
"subscriptions": null,
"products": null,
"ltv": null
}

Response Fields

FieldTypeNullableDescription
idstringNoUnique identifier for the customer (UUID)
namestringYesCustomer full name
emailstringNoCustomer email
avatarstringYesAvatar URL
first_seenstringYesWhen the customer first ordered, in the requested currency (ISO 8601 format)
last_orderstringYesWhen the customer last ordered, in the requested currency (ISO 8601 format)
orders_countintegerNoNumber of completed orders in the requested currency
subscriptions_countintegerNoNumber of active (non-cancelled) subscriptions. Tracked per store, not per currency.
lifetime_valueintegerYesNet lifetime value in minor units (payments minus refunds), in the requested currency
currencystringNoLowercase ISO currency code the money fields are scoped to
ordersarrayYesThe customer's orders in the requested currency. null unless orders is included.
subscriptionsarrayYesThe customer's subscriptions. null unless subscriptions is included.
productsarrayYesThe customer's one-time product access. null unless products is included.
ltvobjectYesLifetime-value breakdown. null unless ltv is included.

orders[]

Scoped to the requested currency.

FieldTypeNullableDescription
idstringNoOrder identifier (UUID)
statusstringYesOrder status: created, awaiting_payment, processing, completed, canceled, or refunded.
amountintegerNoOrder total in minor units
currencystringNoLowercase ISO currency code
product_namestringYesPrimary product name, cached at purchase time
created_atstringNoWhen the order was created (ISO 8601 format)

subscriptions[]

Tracked per store (currency-independent). variant_name and currency come from the related price.

FieldTypeNullableDescription
idstringNoSubscription identifier (UUID)
remote_idstringYesThe provider's own subscription id (e.g. the Stripe subscription id)
providerstringNoPayment provider the subscription lives in. Currently always stripe.
statusstringYesSubscription status: active, trialing, past_due, canceled, incomplete, incomplete_expired, or unpaid. Null for statuses outside this set.
variant_namestringYesRelated price (variant) name
recurring_amountintegerYesRecurring charge in minor units
currencystringYesCurrency of the related price
intervalstringYesBilling interval (e.g. "month", "year")
current_period_endstringYesEnd of the current billing period (ISO 8601 format)
active_untilstringYesWhen access ends (ISO 8601 format)
is_delegatedbooleanNoWhether access was granted by delegation rather than purchase
created_atstringNoWhen the subscription was created (ISO 8601 format)

products[]

One-time product access, tracked per store (currency-independent).

FieldTypeNullableDescription
idstringNoProduct access identifier (UUID)
product_namestringYesRelated product name
variant_namestringYesRelated price (variant) name
active_untilstringYesWhen access expires (ISO 8601 format). Null means lifetime access.
is_delegatedbooleanNoWhether access was granted by delegation rather than purchase
created_atstringNoWhen access was granted (ISO 8601 format)

ltv

The breakdown behind the lifetime_value scalar, scoped to the requested currency. refunded is the slice of gross that was returned, and net (= gross − refunded) equals the top-level lifetime_value.

FieldTypeNullableDescription
grossintegerNoTotal paid in minor units (sum of payments)
refundedintegerNoTotal refunded in minor units
netintegerNogross − refunded; equals the top-level lifetime_value
currencystringNoLowercase ISO currency code

Error Responses

Bad Request (400)

{
"message": "Invalid customer ID"
}
{
"message": "A valid currency query parameter is required"
}

Customer Not Found (404)

{
"message": "Customer with ID <UUID> not found"
}

Unauthorized (401)

{
"message": "Unauthenticated."
}