A valid request URL is required to generate request examples{
"id": "promo-threshold-tshirt",
"type": "threshold",
"validFrom": "2026-01-01T00:00:00.000Z",
"validUntil": "2026-12-31T00: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
}
}Get a promotion's full rule definition
Resolves ONE automatic promotion’s COMPLETE rule: the reward mechanics the six-field directory projection omits (skuId / minQuantity / reward for a threshold, buySkuId / buyQuantity / getSkuId / getQuantity / getDiscountBps for a bogo, components / bundlePriceCents for a bundle) plus its inclusive validity window. This is the READ half of a read-modify-write on a live rule: fetch it here, change only the field you were asked to change, and send the WHOLE object back through PUT /v1/promotions/{id} — never reconstruct mechanics from memory, because the PUT is a full replace. 404s when the promotion carries no configured rule: a directory row seeded without one is browsable but not editable, and PUT /v1/promotions/{id} plus POST /v1/promotions/{id}/deactivate 404 on it for the same reason.
A valid request URL is required to generate request examples{
"id": "promo-threshold-tshirt",
"type": "threshold",
"validFrom": "2026-01-01T00:00:00.000Z",
"validUntil": "2026-12-31T00: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.
Path Parameters
1Response
The full promotion rule, its validity window as ISO instants.
- Option 1
- Option 2
- Option 3
The full promotion rule, its validity window as ISO instants.
1^(?:(?:\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)))$^(?:(?:\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)))$bogo ^[0-9a-f]{64}$0 < x <= 9007199254740991^[0-9a-f]{64}$0 < x <= 90071992547409911 <= x <= 10000
