A valid request URL is required to generate request examples{
"periodKey": "2026-07:store-paris",
"store": "store-paris",
"from": "2026-07-01",
"to": "2026-07-31",
"closedAt": "2026-08-01T02:00:00.000Z",
"closedBy": "manager-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
}
}{
"error": {
"code": "VALIDATION_FAILED",
"message": "<string>",
"statusCode": 123
}
}{
"error": {
"code": "VALIDATION_FAILED",
"message": "<string>",
"statusCode": 123
}
}Close (lock) a fiscal period
LOCKS a fiscal period (clôture de période), sealing its cash truth so it can no longer be re-opened or re-stated (201). Address the period by an opaque periodKey (e.g. 2026-07, or 2026-07:store-paris for a per-store close); pass store and the inclusive from / to day window (YYYY-MM-DD, from <= to) to record the locked span, or omit store for a network-wide close. The sealing actor and instant are stamped server-side — a body actor is ignored. IRREVERSIBLE BY DESIGN: this is the back-office period-end lock, distinct from the live period-close READ aggregate (GET /v1/finance/period-close) and from the NF525 closure chain (/v1/fiscal/closures). There is NO re-open endpoint — a locked period is never unlocked; the correction path is to book the adjustment into a later, still-open period (an adjusting entry), exactly as an accounting close mandates. Idempotent-by-conflict: re-closing an already-locked key 409s (never a silent overwrite). Failure conditions: 400 on a malformed body or an inverted window; 409 when the periodKey is already locked.
A valid request URL is required to generate request examples{
"periodKey": "2026-07:store-paris",
"store": "store-paris",
"from": "2026-07-01",
"to": "2026-07-31",
"closedAt": "2026-08-01T02:00:00.000Z",
"closedBy": "manager-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
}
}{
"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.
Body
REQUIRED — opaque idempotency anchor for the close (e.g. 2026-07 or 2026-07:store-paris).
1Store id for a per-store close; omit for a network-wide close.
1Inclusive start (YYYY-MM-DD, from <= to) of the locked span, for the record.
^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$Inclusive end (YYYY-MM-DD, from <= to) of the locked span, for the record.
^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$Response
The locked period record: the key, the store/window, and the sealing stamp.
The locked period record: the key, the store/window, and the sealing stamp.

