A valid request URL is required to generate request examples{
"items": [
{
"id": "cust-1",
"name": "Camille Renard",
"email": "camille.renard@example.com",
"phone": "06 12 34 56 78",
"tier": "Or",
"postalCode": "75011",
"points": 1240,
"spend": 842.5,
"orders": 17,
"optIn": true
}
],
"total": 15,
"page": 1,
"pageSize": 20,
"pageCount": 1
}{
"error": {
"code": "VALIDATION_FAILED",
"message": "<string>",
"statusCode": 123,
"fieldErrors": [
{
"field": "<string>",
"message": "<string>"
}
]
}
}{
"error": {
"code": "VALIDATION_FAILED",
"message": "<string>",
"statusCode": 123
}
}{
"error": {
"code": "VALIDATION_FAILED",
"message": "<string>",
"statusCode": 123
}
}{
"error": {
"code": "VALIDATION_FAILED",
"message": "<string>",
"statusCode": 123
}
}List customers
Returns one page of the customer directory (annuaire client). To FIND a customer by name, email, phone or postal code, pass ?search= — it filters SERVER-SIDE (recherche client), case-insensitive, and a phone needle ignores spacing (0612 finds 06 12 34 56 78); never page the whole base and match client-side. When you already hold an id, call getCustomer instead. Filter with tier (the loyalty tier label / palier de fidélité, e.g. Or), order with sortField (name/spend/points) + sortDirection, and walk the base with page/pageSize (max 100) until page reaches pageCount. search and tier combine as AND. spend is a currency amount, points the loyalty balance.
A valid request URL is required to generate request examples{
"items": [
{
"id": "cust-1",
"name": "Camille Renard",
"email": "camille.renard@example.com",
"phone": "06 12 34 56 78",
"tier": "Or",
"postalCode": "75011",
"points": 1240,
"spend": 842.5,
"orders": 17,
"optIn": true
}
],
"total": 15,
"page": 1,
"pageSize": 20,
"pageCount": 1
}{
"error": {
"code": "VALIDATION_FAILED",
"message": "<string>",
"statusCode": 123,
"fieldErrors": [
{
"field": "<string>",
"message": "<string>"
}
]
}
}{
"error": {
"code": "VALIDATION_FAILED",
"message": "<string>",
"statusCode": 123
}
}{
"error": {
"code": "VALIDATION_FAILED",
"message": "<string>",
"statusCode": 123
}
}{
"error": {
"code": "VALIDATION_FAILED",
"message": "<string>",
"statusCode": 123
}
}Authorizations
Authorization: Bearer <token>. Accepts EITHER a Keycloak access token (scopes-in-token) OR an opaque POS session token; both resolve to the same pos.* scope vocabulary the route guards enforce.
Query Parameters
1-based page index to return. Defaults to 1.
1 <= x <= 9007199254740991Rows per page, 1..100. Defaults to 20.
1 <= x <= 100Exact loyalty-tier label to filter on (fidélité/palier), e.g. Or.
1Free-text search (recherche client) matched server-side, case-insensitive, against the name, email, phone and postal code. A phone match ignores spacing (0612 finds 06 12 34 56 78). This is THE way to find a customer by name — do not page the whole directory client-side. Combine with tier (AND).
1true also lists customers out of circulation — deactivated (reversibly withdrawn, data intact) or anonymized (GDPR-erased). Hidden by default, so pickers and search only see selectable customers. Read each record's status to tell them apart.
true, false Field to order by: name, spend (lifetime) or points (loyalty balance).
name, spend, points Order direction for sortField (default asc).
asc, desc Response
A page of customer records with the pagination totals.
A page of customer records with the pagination totals.
The rows on this page, in the query's sort order.
Show child attributes
Show child attributes
Total rows matching the filter across ALL pages, not just this one.
0 <= x <= 9007199254740991The 1-based page number served.
0 < x <= 9007199254740991Rows requested per page.
0 < x <= 9007199254740991Total number of pages; stop walking when page reaches it.
0 <= x <= 9007199254740991
