A valid request URL is required to generate request examples{
"items": [
{
"id": "list-1",
"number": "T-list-1",
"storeId": "store-list",
"sellerId": "user-camille",
"sessionId": "sess-1",
"customerId": null,
"customerName": null,
"recordedAt": "2026-07-16T09:30:00.000Z",
"lineCount": 1,
"unitsSold": 2,
"subtotalCents": 3600,
"totalCents": 3600,
"vatTotalCents": 600,
"vatByRate": [
{
"rate": 20,
"baseCents": 3000,
"vatCents": 600,
"grossCents": 3600
}
],
"paymentMethod": "cash",
"lines": [
{
"skuId": "sku-espresso-1kg",
"quantity": 2,
"unitPriceCents": 1800
}
]
}
],
"total": 1,
"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 finalized sale tickets
Returns the finalized sale tickets (ventes / tickets de caisse — the back-office read model projected by the checkout finalize hook), optionally narrowed by ?store= and/or a ?day= UTC calendar day (YYYY-MM-DD). A malformed day facet 400s. This router never writes. Page with page/pageSize (max 100) until page reaches pageCount. For the rolled-up KPIs use the summary operation; for one ticket use GET /sales/:id.
A valid request URL is required to generate request examples{
"items": [
{
"id": "list-1",
"number": "T-list-1",
"storeId": "store-list",
"sellerId": "user-camille",
"sessionId": "sess-1",
"customerId": null,
"customerName": null,
"recordedAt": "2026-07-16T09:30:00.000Z",
"lineCount": 1,
"unitsSold": 2,
"subtotalCents": 3600,
"totalCents": 3600,
"vatTotalCents": 600,
"vatByRate": [
{
"rate": 20,
"baseCents": 3000,
"vatCents": 600,
"grossCents": 3600
}
],
"paymentMethod": "cash",
"lines": [
{
"skuId": "sku-espresso-1kg",
"quantity": 2,
"unitPriceCents": 1800
}
]
}
],
"total": 1,
"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 <= 100Narrow the ventes / tickets de caisse to one store by its canonical store id.
Narrow to a single UTC calendar day (YYYY-MM-DD). A malformed day 400s.
Response
A page of matching sale tickets (one row per finalized sale) with the totals.
A page of matching sale tickets (one row per finalized sale) with the 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
