A valid request URL is required to generate request examples{
"id": "sess-ok",
"storeId": "store-1",
"registerId": "reg-1",
"currency": "EUR",
"salespersonId": "cashier-1",
"openingFloatCents": 10000,
"movements": [],
"status": "open",
"closing": null,
"actorId": "cashier-1",
"openedAt": "2026-01-02T09:00:00.000Z"
}{
"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
}
}Open a register session (session de caisse)
Opens a register session (session de caisse) with its opening cash float (fond de caisse) and the salesperson taking the shift. The session is always created open with no movements; the actor and the opened-at instant are stamped server-side from the context. Amounts are integer cents. A register may hold at most ONE open session, so this 409s when the drawer already carries one — the refusal names that session, which the caller reads (GET /v1/sessions/{sessionId}) and either keeps trading on or closes against a physical count. A session that was never closed is never force-closed: its Z closure is a sealed, chain-linked document and inventing a count for it would seal a fiction. Re-posting the SAME id with the SAME attribution is idempotent — it resolves to the stored session (201), so an offline till replaying an open it already performed is never refused. Re-using an id under a different attribution 409s. 400s on a storeId the PROVISIONED store network does not carry (field error on storeId); a network with no store provisioned yet has no authority and the open proceeds, so a freshly deployed environment is unaffected.
A valid request URL is required to generate request examples{
"id": "sess-ok",
"storeId": "store-1",
"registerId": "reg-1",
"currency": "EUR",
"salespersonId": "cashier-1",
"openingFloatCents": 10000,
"movements": [],
"status": "open",
"closing": null,
"actorId": "cashier-1",
"openedAt": "2026-01-02T09:00:00.000Z"
}{
"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
}
}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
111310 <= x <= 9007199254740991Response
The opened session at status open.
The opened session at status open.
-9007199254740991 <= x <= 9007199254740991Show child attributes
Show child attributes
open, closed Show child attributes
Show child attributes
^(?:(?:\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])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
