A valid request URL is required to generate request examples{
"items": [
{
"id": "writeoff-8f2b1c4a-0e5d-4a2b-9c3f-1a2b3c4d5e6f",
"storeId": "store-rivoli",
"reasonCode": "damaged",
"note": null,
"lines": [
{
"skuId": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"quantity": 3,
"unitCostCents": 1500
}
],
"status": "pending",
"actorId": "user-42",
"createdAt": "2026-07-28T10:15:30.000Z",
"decidedAt": null,
"decidedBy": null
}
],
"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 stock write-offs (démarque)
Returns one PAGE of the write-off history (démarque) newest-first, optionally narrowed by storeId and/or approval status. An unrecognised status filter is ignored rather than rejected. The response is the canonical paged envelope (items, total, page, pageSize, pageCount): walk page up to pageCount to read the whole history, and narrow with storeId/status to keep the walk short.
A valid request URL is required to generate request examples{
"items": [
{
"id": "writeoff-8f2b1c4a-0e5d-4a2b-9c3f-1a2b3c4d5e6f",
"storeId": "store-rivoli",
"reasonCode": "damaged",
"note": null,
"lines": [
{
"skuId": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"quantity": 3,
"unitCostCents": 1500
}
],
"status": "pending",
"actorId": "user-42",
"createdAt": "2026-07-28T10:15:30.000Z",
"decidedAt": null,
"decidedBy": null
}
],
"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 <= 100Filter to write-offs raised at one store (magasin).
1Filter by approval status: pending (en attente), approved (validée), rejected (refusée). An unrecognised value is ignored, not rejected.
pending, approved, rejected Response
One page of the write-off history (newest first).
One page of the write-off history (newest first).
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
