A valid request URL is required to generate request examples{
"id": "quote-ok",
"customerId": "cust-1",
"storeId": "store-rivoli",
"currency": "EUR",
"lines": [
{
"description": "Custom sofa",
"skuId": null,
"quantity": 1,
"unitPriceCents": 120000,
"vatRate": 20
}
],
"validUntil": "2030-01-01T00:00:00.000Z",
"status": "draft",
"revision": 0,
"actorId": "user-camille",
"createdAt": "2026-07-28T09: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
}
}Create a quote (devis)
Draws up a priced quote (devis) in the draft state from at least one priced line. The CALLER supplies the quote id — it must be unique, so choose a stable, collision-free identifier (a duplicate is rejected with a 409, never silently merged). validUntil is an ISO 8601 instant (the server coerces it). 409s when a quote with the same id already exists; 422s when validUntil is already in the past.
A valid request URL is required to generate request examples{
"id": "quote-ok",
"customerId": "cust-1",
"storeId": "store-rivoli",
"currency": "EUR",
"lines": [
{
"description": "Custom sofa",
"skuId": null,
"quantity": 1,
"unitPriceCents": 120000,
"vatRate": 20
}
],
"validUntil": "2030-01-01T00:00:00.000Z",
"status": "draft",
"revision": 0,
"actorId": "user-camille",
"createdAt": "2026-07-28T09: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
Caller-supplied unique quote (devis) id; a duplicate 409s.
1Customer the quote is drawn up for.
1Store issuing the quote.
1ISO 4217 currency code (e.g. EUR).
3At least one priced quote line.
1Show child attributes
Show child attributes
ISO 8601 validity deadline; must be in the future.
^(?:(?:\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))$Response
The created quote in its draft state.
The created quote in its draft state.
Show child attributes
Show child attributes
draft, sent, accepted, expired, cancelled 0 <= x <= 9007199254740991
