A valid request URL is required to generate request examples{
"id": "rnt-2030-000184",
"skuId": "6b1f0c93a4d7e28150c3af6b9d24e70f8a5c1b3e6d90f27a4c8b5e1d3f7a9c02",
"customerId": "cust-1",
"storeId": "store-rivoli",
"period": {
"startAt": "2030-01-01T09:00:00.000Z",
"dueAt": "2030-01-04T09:00:00.000Z"
},
"days": 3,
"ratePerDayCents": 640,
"depositAmountCents": 4000,
"depositReference": "PREAUTH-4821",
"status": "active",
"actorId": "user-camille",
"rentedAt": "2030-01-01T09: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
}
}{
"error": {
"code": "VALIDATION_FAILED",
"message": "<string>",
"statusCode": 123
}
}Open a rental
Opens a rental in the active state: the unit leaves the store with the customer until dueAt, which the server DERIVES as startAt + days (do not send it). days is one of the four offered tiers — 1, 3, 7 or 14 — and no other value is accepted. MONEY, read carefully: this endpoint moves NONE. depositAmountCents / depositReference merely RECORD a caution the payment terminal has already pre-authorised (the money is HELD on the customer’s card, not captured), and the rental fee itself (ratePerDayCents x days) is NOT charged here or by any other endpoint in this API — take it at the till. Never call this before the pre-auth actually exists; you would open an unsecured rental. id is CALLER-SUPPLIED and is the dedup key: if your call times out, retry with the SAME id — a 409 CONFLICT then means your first attempt committed, so read it back with getRental instead of minting a new id. The duplicate-id check runs FIRST, so an existing id returns 409 even when the window is also invalid — you will not see the 422 until the id is unique. 422 when the derived dueAt is not in the future (a stale startAt, or a window that has already elapsed); 400 on a bad tier, a non-hex skuId or a non-positive amount.
A valid request URL is required to generate request examples{
"id": "rnt-2030-000184",
"skuId": "6b1f0c93a4d7e28150c3af6b9d24e70f8a5c1b3e6d90f27a4c8b5e1d3f7a9c02",
"customerId": "cust-1",
"storeId": "store-rivoli",
"period": {
"startAt": "2030-01-01T09:00:00.000Z",
"dueAt": "2030-01-04T09:00:00.000Z"
},
"days": 3,
"ratePerDayCents": 640,
"depositAmountCents": 4000,
"depositReference": "PREAUTH-4821",
"status": "active",
"actorId": "user-camille",
"rentedAt": "2030-01-01T09: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
}
}{
"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
1^[0-9a-f]{64}$11^(?:(?:\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|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$1 0 < x <= 90071992547409910 < x <= 90071992547409911Response
The opened rental: active, dueAt derived from startAt + days, no settlement yet, attributed to the calling actor.
The opened rental: active, dueAt derived from startAt + days, no settlement yet, attributed to the calling actor.
Show child attributes
Show child attributes
1 -9007199254740991 <= x <= 9007199254740991-9007199254740991 <= x <= 9007199254740991active, returned, overdue Show child attributes
Show child attributes

