A valid request URL is required to generate request examples{
"id": "rep-2030-000471",
"article": {
"label": "Smartphone screen",
"skuId": "d4c81e5b0f7a396248ce15b7d0a83f62915ce4d7b0863af251d94c7e08b3f6a1",
"purchasedAt": "2029-01-16T09:00:00.000Z"
},
"issueDescription": "Cracked screen after a drop",
"quoteAmountCents": 12000,
"depositAmountCents": 3600,
"expectedPickupDate": "2030-07-20T18:00:00.000Z",
"customerId": "cust-1",
"storeId": "store-rivoli",
"status": "intake",
"actorId": "user-camille",
"createdAt": "2030-07-10T14:05:00.000Z",
"updatedAt": "2030-07-10T14:05: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
}
}Take an article in for repair
Opens a repair order in the intake state — the article is now in the store’s custody. article.label is the only required article field; add skuId and serial when the unit is identifiable and purchasedAt when the original sale date is known. purchasedAt is RECORDED ONLY — the server derives nothing from it and never adjusts a price; the warranty helper that reads it lives in the till UI, and quoteAmountCents is entirely caller-supplied either way. MONEY: quoteAmountCents is the price quoted to the customer and depositAmountCents the acompte ALREADY captured at the counter (typically 30%; send 0 if none was taken). This endpoint captures nothing itself — take the acompte first, then record it here. There is NO update route: once open, neither the quote nor the acompte can ever be revised, so do not open an order on a provisional estimate. id is CALLER-SUPPLIED and is the dedup key: on a timeout retry with the SAME id — a 409 CONFLICT then means your first attempt committed, so read it back with getRepairOrder rather than minting a new id. 422 when depositAmountCents exceeds quoteAmountCents, or when expectedPickupDate is not in the future. Note article.serial is stored EXACTLY as sent — unlike the sale and warranty paths it is neither upper-cased/trimmed nor IMEI-checksummed here, so send an already-canonical value if you want it to match a serial captured elsewhere.
A valid request URL is required to generate request examples{
"id": "rep-2030-000471",
"article": {
"label": "Smartphone screen",
"skuId": "d4c81e5b0f7a396248ce15b7d0a83f62915ce4d7b0863af251d94c7e08b3f6a1",
"purchasedAt": "2029-01-16T09:00:00.000Z"
},
"issueDescription": "Cracked screen after a drop",
"quoteAmountCents": 12000,
"depositAmountCents": 3600,
"expectedPickupDate": "2030-07-20T18:00:00.000Z",
"customerId": "cust-1",
"storeId": "store-rivoli",
"status": "intake",
"actorId": "user-camille",
"createdAt": "2030-07-10T14:05:00.000Z",
"updatedAt": "2030-07-10T14:05: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
1Show child attributes
Show child attributes
10 < x <= 90071992547409910 <= x <= 9007199254740991^(?:(?:\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)))$11Response
The opened order: intake, updatedAt equal to createdAt, attributed to the calling actor.
The opened order: intake, updatedAt equal to createdAt, attributed to the calling actor.
Show child attributes
Show child attributes
-9007199254740991 <= x <= 9007199254740991-9007199254740991 <= x <= 9007199254740991intake, in_workshop, ready, collected, unrepairable 
