Orchestration configuration
The versioned, audited configuration of the order engine. It holds channels, purchase moments, markets, connected systems, execution-ownership rules, status models, the event catalogue and payment rules.
| Operation | Endpoint |
|---|---|
| Read the effective configuration | GET /order-orchestration/config |
| Publish a new configuration version | PUT /order-orchestration/config |
| Read the configuration history and audit trail | GET /order-orchestration/config/history |
| Roll back to an earlier configuration version | POST /order-orchestration/config/rollback |
| Validate a configuration without publishing it | POST /order-orchestration/config/validate |
| Read the event catalogue | GET /order-orchestration/event-types |
| Read one event type | GET /order-orchestration/event-types/{type} |
| Resolve which system executes a process | GET /order-orchestration/ownership/resolve |
| Read the payment rules | GET /order-orchestration/payment-rules |
| Test a payment allocation | POST /order-orchestration/payment-rules/test |
| List execution-ownership rules | GET /order-orchestration/rules |
| Read an execution-ownership rule | GET /order-orchestration/rules/{id} |
| Read the status models | GET /order-orchestration/status-models |
| Read the status model of one object | GET /order-orchestration/status-models/{object} |
| Test how an inbound status would be applied | POST /order-orchestration/status-models/test |
| List connected systems | GET /order-orchestration/systems |
| Read a connected system and its rules | GET /order-orchestration/systems/{id} |
Read the effective configuration
/order-orchestration/configResponse 200
/order-orchestration/configRead the effective orchestration configurationcurl -X GET "$BASE/order-orchestration/config" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Request-Id: req-0030"
HTTP/1.1 200
X-Request-Id: req-0030
{
"config": {
"version": 1,
"trip": {
"anchor_product_types": [
"cruise"
],
"id_prefix": "TRP"
},
"channels": [
"web",
"app",
"contact_centre",
"agency",
"onboard"
],
"moments": [
"booking",
"pre_trip",
"onboard"
],
"markets": [
"IT",
"FR",
"DE",
"ES"
],
"systems": [
{
"id": "reservation",
"label": "Reservation system",
"domains": [
"reservation"
]
},
{
"id": "onboard",
"label": "Onboard POS and guest account",
"domains": [
"onboard"
]
},
{
"id": "excursions",
"label": "Excursion system",
"domains": [
"excursions"
]
},
{
"id": "crm",
"label": "Customer and agency master",
"domains": [
"crm",
"loyalty"
]
},
{
"id": "finance",
"label": "Finance and billing",
"domains": [
"finance"
]
}
],
"processes": [
"create",
"modify",
"cancel",
"payment",
"fulfilment",
"billing"
],
"ownership_rules": [
{
"id": "anchor-reservation",
"process": "*",
"when": {
"product_type": [
"cruise"
]
},
"owner": "reservation",
"priority": 0
},
{
"id": "onboard-moment",
"process": "*",
"when": {
"moment": [
"onboard"
]
},
"owner": "onboard",
"priority": 0
},
{
"id": "excursions",
"process": "*",
"when": {
"product_type": [
"excursion"
]
},
"owner": "excursions",
"priority": 0
},
{
"id": "excursions-onboard",
"process": "*",
"when": {
"product_type": [
"excursion"
],
"moment": [
"onboard"
]
},
"owner": "onboard",
"priority": 0
},
{
"id": "billing-finance",
"process": "billing",
"when": {},
"owner": "finance",
"priority": 0
},
{
"id": "beverage-phase1",
"process": "create",
"when": {
"product_type": [
"beverage"
]
},
"owner": "onboard",
"priority": 0,
"effective_until": "2027-03-01T00:00:00Z"
},
{
"id": "beverage-phase2",
"process": "create",
"when": {
"product_type": [
"beverage"
]
},
"owner": "oms",
"priority": 0,
"effective_from": "2027-03-01T00:00:00Z"
}
],
"feedback": {
"expectations": [
{
"id": "reservation-create",
"system": "reservation",
"process": "create",
"expect": [
"booking.confirmed",
"booking.rejected"
]
},
{
"id": "reservation-modify",
"system": "reservation",
"process": "modify",
"expect": [
"booking.modified"
]
},
{
"id": "reservation-cancel",
"system": "reservation",
"process": "cancel",
"expect": [
"booking.cancelled"
]
},
{
"id": "excursions-create",
"system": "excursions",
"process": "create",
"expect": [
"service.confirmed"
]
},
{
"id": "onboard-create",
"system": "onboard",
"process": "create",
"expect": [
"onboard.posted"
]
}
],
"alert_rules": [
{
"id": "reservation-feedback-late",
"signal": "status_feedback.pending",
"match": {
"system": [
"reservation"
]
},
"after_seconds": 300,
"severity": "critical",
"priority": 0,
"enabled": true
},
{
"id": "feedback-late",
"signal": "status_feedback.pending",
"match": {},
"after_seconds": 3600,
"severity": "warning",
"priority": 0,
"enabled": true
}
]
},
"event_catalogue": [],
"quotations": {
"required_fields": {
"default": [
"anchor.productId"
],
"by_channel": {
"agency": [
"anchor.productId",
"agencyRef"
]
}
},
"inactivity_days": 30
},
"line_availability": []
},
"version": 0,
"source": "tenant_file",
"latestVersion": 0,
"governedReads": false
}
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | not_enabled | Order orchestration is not enabled for the tenant. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |
Publish a new configuration version
/order-orchestration/configValidates and stores a new version with an audit entry (who, when, why and the field-level changes). Send expectedVersion to make the write conditional. Registering a channel, a purchase moment, a connected system or a rule is a configuration change.
Headers: Idempotency-Key, plus X-Request-Id.
Request body
| Field | Type | Required | Notes |
|---|---|---|---|
config | object | yes | |
config.channels | array of string | yes | at least 1 |
config.event_catalogue | array of object | ||
config.event_catalogue[].carries_external_ref | boolean | default false | |
config.event_catalogue[].consumers | array of string | ||
config.event_catalogue[].description | string | ||
config.event_catalogue[].name | string | 1–120 chars | |
config.event_catalogue[].native_status | string | 1–100 chars | |
config.event_catalogue[].schema_version | string | 1–20 chars | |
config.event_catalogue[].scope | enum: line, purchase_order | default "line" | |
config.event_catalogue[].sets | object | ||
config.event_catalogue[].status | enum: active, deprecated | ||
config.event_catalogue[].systems | array of string | at least 1 | |
config.event_catalogue[].type | string | yes | pattern ^[a-z][a-z0-9_]*(\.[a-z][a-z0-9_]*)+$ |
config.feedback | object | ||
config.feedback.alert_rules | array of object | ||
config.feedback.expectations | array of object | ||
config.line_availability | array of object | ||
config.line_availability[].channels | array of string | yes | at least 1 |
config.line_availability[].note | string | max 500 chars | |
config.line_availability[].product_type | string | yes | min 1 chars |
config.markets | array of string | ||
config.moments | array of string | yes | at least 1 |
config.outbound_events | array of object | ||
config.outbound_events[].consumers | array of string | ||
config.outbound_events[].description | string | max 500 chars | |
config.outbound_events[].name | string | 1–120 chars | |
config.outbound_events[].schema_version | string | 1–20 chars | |
config.outbound_events[].status | enum: active, deprecated | ||
config.outbound_events[].type | string | yes | pattern ^[a-z][a-z0-9_]*(\.[a-z][a-z0-9_]*)+$ |
config.ownership_rules | array of object | ||
config.ownership_rules[].effective_from | string (date-time) | ||
config.ownership_rules[].effective_until | string (date-time) | ||
config.ownership_rules[].id | string | yes | pattern ^[a-z0-9][a-z0-9_.-]*$ |
config.ownership_rules[].name | string | 1–160 chars | |
config.ownership_rules[].note | string | max 500 chars | |
config.ownership_rules[].notify | array of object | ||
config.ownership_rules[].on_failure | object | ||
config.ownership_rules[].owner | string | yes | min 1 chars |
config.ownership_rules[].priority | integer | default 0 | |
config.ownership_rules[].process | string | yes | min 1 chars |
config.ownership_rules[].when | object | ||
config.payments | object | ||
config.payments.fullPaymentThresholds | array of object | ||
config.payments.overpayment | enum: hold_unallocated, reject | default "hold_unallocated" | |
config.payments.passengerSplit | enum: equal, by_unit | ||
config.payments.reallocateOnChange | boolean | default false | |
config.payments.rules | array of object | ||
config.payments.scenarios | array of object | yes | at least 1 |
config.processes | array of string | default ["create","modify","cancel","payment","fulfilment","billing"] | |
config.quotations | object | ||
config.quotations.inactivity_days | integer | > 0; default 30 | |
config.quotations.required_fields | object | ||
config.systems | array of object | ||
config.systems[].base_reference | string | 1–200 chars | |
config.systems[].capabilities | array of object | ||
config.systems[].channels | array of string | ||
config.systems[].contract | object | ||
config.systems[].description | string | max 500 chars | |
config.systems[].domains | array of string | ||
config.systems[].effective_from | string (date-time) | ||
config.systems[].field_mappings | array of object | ||
config.systems[].id | string | yes | pattern ^[a-z][a-z0-9_-]*$ |
config.systems[].label | string | yes | min 1 chars |
config.systems[].master_of | array of string | ||
config.systems[].owner_team | string | 1–120 chars | |
config.systems[].references_kept | array of string | ||
config.systems[].roles | array of source, channel, target | at least 1 | |
config.systems[].route | object | ||
config.systems[].status | enum: active, planned, retired | ||
config.trip | object | yes | |
config.trip.anchor_product_types | array of string | yes | at least 1 |
config.trip.id_prefix | string | pattern ^[A-Z][A-Z0-9]{0,5}$; default "TRP" | |
config.version | integer | ≥ 0; default 0 | |
expectedVersion | integer | ≥ 0 | |
actor | object | yes | |
actor.id | string | yes | min 1 chars |
actor.name | string | ||
actor.role | string | ||
actor.channel | enum: form, change_desk, api, system, seed | yes | |
reason | string | max 2000 chars |
Response 200
/order-orchestration/configPublish the configuration with the new channelcurl -X PUT "$BASE/order-orchestration/config" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Request-Id: req-0033" \
-H "Idempotency-Key: 5f64d379-4088-4636-a708-494fcc1f8b04" \
-H "Content-Type: application/json" \
-d '{
"config": {
"version": 1,
"trip": {
"anchor_product_types": [
"cruise"
],
"id_prefix": "TRP"
},
"channels": [
"web",
"app",
"contact_centre",
"agency",
"onboard",
"kiosk"
],
"moments": [
"booking",
"pre_trip",
"onboard"
],
"markets": [
"IT",
"FR",
"DE",
"ES"
],
"systems": [
{
"id": "reservation",
"label": "Reservation system",
"domains": [
"reservation"
]
},
{
"id": "onboard",
"label": "Onboard POS and guest account",
"domains": [
"onboard"
]
},
{
"id": "excursions",
"label": "Excursion system",
"domains": [
"excursions"
]
},
{
"id": "crm",
"label": "Customer and agency master",
"domains": [
"crm",
"loyalty"
]
},
{
"id": "finance",
"label": "Finance and billing",
"domains": [
"finance"
]
}
],
"processes": [
"create",
"modify",
"cancel",
"payment",
"fulfilment",
"billing"
],
"ownership_rules": [
{
"id": "anchor-reservation",
"process": "*",
"when": {
"product_type": [
"cruise"
]
},
"owner": "reservation",
"priority": 0
},
{
"id": "onboard-moment",
"process": "*",
"when": {
"moment": [
"onboard"
]
},
"owner": "onboard",
"priority": 0
},
{
"id": "excursions",
"process": "*",
"when": {
"product_type": [
"excursion"
]
},
"owner": "excursions",
"priority": 0
},
{
"id": "excursions-onboard",
"process": "*",
"when": {
"product_type": [
"excursion"
],
"moment": [
"onboard"
]
},
"owner": "onboard",
"priority": 0
},
{
"id": "billing-finance",
"process": "billing",
"when": {},
"owner": "finance",
"priority": 0
},
{
"id": "beverage-phase1",
"process": "create",
"when": {
"product_type": [
"beverage"
]
},
"owner": "onboard",
"priority": 0,
"effective_until": "2027-03-01T00:00:00Z"
},
{
"id": "beverage-phase2",
"process": "create",
"when": {
"product_type": [
"beverage"
]
},
"owner": "oms",
"priority": 0,
"effective_from": "2027-03-01T00:00:00Z"
}
],
"feedback": {
"expectations": [
{
"id": "reservation-create",
"system": "reservation",
"process": "create",
"expect": [
"booking.confirmed",
"booking.rejected"
]
},
{
"id": "reservation-modify",
"system": "reservation",
"process": "modify",
"expect": [
"booking.modified"
]
},
{
"id": "reservation-cancel",
"system": "reservation",
"process": "cancel",
"expect": [
"booking.cancelled"
]
},
{
"id": "excursions-create",
"system": "excursions",
"process": "create",
"expect": [
"service.confirmed"
]
},
{
"id": "onboard-create",
"system": "onboard",
"process": "create",
"expect": [
"onboard.posted"
]
}
],
"alert_rules": [
{
"id": "reservation-feedback-late",
"signal": "status_feedback.pending",
"match": {
"system": [
"reservation"
]
},
"after_seconds": 300,
"severity": "critical",
"priority": 0,
"enabled": true
},
{
"id": "feedback-late",
"signal": "status_feedback.pending",
"match": {},
"after_seconds": 3600,
"severity": "warning",
"priority": 0,
"enabled": true
}
]
},
"event_catalogue": [],
"quotations": {
"required_fields": {
"default": [
"anchor.productId"
],
"by_channel": {
"agency": [
"anchor.productId",
"agencyRef"
]
}
},
"inactivity_days": 30
},
"line_availability": []
},
"expectedVersion": 0,
"actor": {
"id": "ops-config-admin",
"name": "Elena Galli",
"role": "oms_admin",
"channel": "api"
},
"reason": "Register the port kiosk channel"
}'
HTTP/1.1 200
X-Request-Id: req-0033
{
"version": {
"tenantId": "meridian",
"documentType": "order_orchestration",
"documentId": "default",
"version": 1,
"document": {
"version": 1,
"trip": {
"anchor_product_types": [
"cruise"
],
"id_prefix": "TRP"
},
"channels": [
"web",
"app",
"contact_centre",
"agency",
"onboard",
"kiosk"
],
"moments": [
"booking",
"pre_trip",
"onboard"
],
"markets": [
"IT",
"FR",
"DE",
"ES"
],
"systems": [
{
"id": "reservation",
"label": "Reservation system",
"domains": [
"reservation"
]
},
{
"id": "onboard",
"label": "Onboard POS and guest account",
"domains": [
"onboard"
]
},
{
"id": "excursions",
"label": "Excursion system",
"domains": [
"excursions"
]
},
{
"id": "crm",
"label": "Customer and agency master",
"domains": [
"crm",
"loyalty"
]
},
{
"id": "finance",
"label": "Finance and billing",
"domains": [
"finance"
]
}
],
"processes": [
"create",
"modify",
"cancel",
"payment",
"fulfilment",
"billing"
],
"ownership_rules": [
{
"id": "anchor-reservation",
"process": "*",
"when": {
"product_type": [
"cruise"
]
},
"owner": "reservation",
"priority": 0
},
{
"id": "onboard-moment",
"process": "*",
"when": {
"moment": [
"onboard"
]
},
"owner": "onboard",
"priority": 0
},
{
"id": "excursions",
"process": "*",
"when": {
"product_type": [
"excursion"
]
},
"owner": "excursions",
"priority": 0
},
{
"id": "excursions-onboard",
"process": "*",
"when": {
"product_type": [
"excursion"
],
"moment": [
"onboard"
]
},
"owner": "onboard",
"priority": 0
},
{
"id": "billing-finance",
"process": "billing",
"when": {},
"owner": "finance",
"priority": 0
},
{
"id": "beverage-phase1",
"process": "create",
"when": {
"product_type": [
"beverage"
]
},
"owner": "onboard",
"priority": 0,
"effective_until": "2027-03-01T00:00:00Z"
},
{
"id": "beverage-phase2",
"process": "create",
"when": {
"product_type": [
"beverage"
]
},
"owner": "oms",
"priority": 0,
"effective_from": "2027-03-01T00:00:00Z"
}
],
"feedback": {
"expectations": [
{
"id": "reservation-create",
"system": "reservation",
"process": "create",
"expect": [
"booking.confirmed",
"booking.rejected"
]
},
{
"id": "reservation-modify",
"system": "reservation",
"process": "modify",
"expect": [
"booking.modified"
]
},
{
"id": "reservation-cancel",
"system": "reservation",
"process": "cancel",
"expect": [
"booking.cancelled"
]
},
{
"id": "excursions-create",
"system": "excursions",
"process": "create",
"expect": [
"service.confirmed"
]
},
{
"id": "onboard-create",
"system": "onboard",
"process": "create",
"expect": [
"onboard.posted"
]
}
],
"alert_rules": [
{
"id": "reservation-feedback-late",
"signal": "status_feedback.pending",
"match": {
"system": [
"reservation"
]
},
"after_seconds": 300,
"severity": "critical",
"priority": 0,
"enabled": true
},
{
"id": "feedback-late",
"signal": "status_feedback.pending",
"match": {},
"after_seconds": 3600,
"severity": "warning",
"priority": 0,
"enabled": true
}
]
},
"event_catalogue": [],
"quotations": {
"required_fields": {
"default": [
"anchor.productId"
],
"by_channel": {
"agency": [
"anchor.productId",
"agencyRef"
]
}
},
"inactivity_days": 30
},
"line_availability": []
},
"createdAt": "2026-11-02T09:06:42.000Z",
"createdBy": {
"id": "ops-config-admin",
"name": "Elena Galli",
"role": "oms_admin",
"channel": "api"
}
},
"audit": {
"id": "e7b2f846-31b1-4d66-a7d8-5473e65b804e",
"tenantId": "meridian",
"documentType": "order_orchestration",
"documentId": "default",
"action": "create",
"version": 1,
"previousVersion": null,
"restoredFrom": null,
"actor": {
"id": "ops-config-admin",
"name": "Elena Galli",
"role": "oms_admin",
"channel": "api"
},
"at": "2026-11-02T09:06:42.000Z",
"reason": "Register the port kiosk channel",
"changeSetId": null,
"before": null,
"after": {
"version": 1,
"trip": {
"anchor_product_types": [
"cruise"
],
"id_prefix": "TRP"
},
"channels": [
"web",
"app",
"contact_centre",
"agency",
"onboard",
"kiosk"
],
"moments": [
"booking",
"pre_trip",
"onboard"
],
"markets": [
"IT",
"FR",
"DE",
"ES"
],
"systems": [
{
"id": "reservation",
"label": "Reservation system",
"domains": [
"reservation"
]
},
{
"id": "onboard",
"label": "Onboard POS and guest account",
"domains": [
"onboard"
]
},
{
"id": "excursions",
"label": "Excursion system",
"domains": [
"excursions"
]
},
{
"id": "crm",
"label": "Customer and agency master",
"domains": [
"crm",
"loyalty"
]
},
{
"id": "finance",
"label": "Finance and billing",
"domains": [
"finance"
]
}
],
"processes": [
"create",
"modify",
"cancel",
"payment",
"fulfilment",
"billing"
],
"ownership_rules": [
{
"id": "anchor-reservation",
"process": "*",
"when": {
"product_type": [
"cruise"
]
},
"owner": "reservation",
"priority": 0
},
{
"id": "onboard-moment",
"process": "*",
"when": {
"moment": [
"onboard"
]
},
"owner": "onboard",
"priority": 0
},
{
"id": "excursions",
"process": "*",
"when": {
"product_type": [
"excursion"
]
},
"owner": "excursions",
"priority": 0
},
{
"id": "excursions-onboard",
"process": "*",
"when": {
"product_type": [
"excursion"
],
"moment": [
"onboard"
]
},
"owner": "onboard",
"priority": 0
},
{
"id": "billing-finance",
"process": "billing",
"when": {},
"owner": "finance",
"priority": 0
},
{
"id": "beverage-phase1",
"process": "create",
"when": {
"product_type": [
"beverage"
]
},
"owner": "onboard",
"priority": 0,
"effective_until": "2027-03-01T00:00:00Z"
},
{
"id": "beverage-phase2",
"process": "create",
"when": {
"product_type": [
"beverage"
]
},
"owner": "oms",
"priority": 0,
"effective_from": "2027-03-01T00:00:00Z"
}
],
"feedback": {
"expectations": [
{
"id": "reservation-create",
"system": "reservation",
"process": "create",
"expect": [
"booking.confirmed",
"booking.rejected"
]
},
{
"id": "reservation-modify",
"system": "reservation",
"process": "modify",
"expect": [
"booking.modified"
]
},
{
"id": "reservation-cancel",
"system": "reservation",
"process": "cancel",
"expect": [
"booking.cancelled"
]
},
{
"id": "excursions-create",
"system": "excursions",
"process": "create",
"expect": [
"service.confirmed"
]
},
{
"id": "onboard-create",
"system": "onboard",
"process": "create",
"expect": [
"onboard.posted"
]
}
],
"alert_rules": [
{
"id": "reservation-feedback-late",
"signal": "status_feedback.pending",
"match": {
"system": [
"reservation"
]
},
"after_seconds": 300,
"severity": "critical",
"priority": 0,
"enabled": true
},
{
"id": "feedback-late",
"signal": "status_feedback.pending",
"match": {},
"after_seconds": 3600,
"severity": "warning",
"priority": 0,
"enabled": true
}
]
},
"event_catalogue": [],
"quotations": {
"required_fields": {
"default": [
"anchor.productId"
],
"by_channel": {
"agency": [
"anchor.productId",
"agencyRef"
]
}
},
"inactivity_days": 30
},
"line_availability": []
},
"changes": [
{
"path": "$",
"before": null,
"after": {
"version": 1,
"trip": {
"anchor_product_types": [
"cruise"
],
"id_prefix": "TRP"
},
"channels": [
"web",
"app",
"contact_centre",
"agency",
"onboard",
"kiosk"
],
"moments": [
"booking",
"pre_trip",
"onboard"
],
"markets": [
"IT",
"FR",
"DE",
"ES"
],
"systems": [
{
"id": "reservation",
"label": "Reservation system",
"domains": [
"reservation"
]
},
{
"id": "onboard",
"label": "Onboard POS and guest account",
"domains": [
"onboard"
]
},
{
"id": "excursions",
"label": "Excursion system",
"domains": [
"excursions"
]
},
{
"id": "crm",
"label": "Customer and agency master",
"domains": [
"crm",
"loyalty"
]
},
{
"id": "finance",
"label": "Finance and billing",
"domains": [
"finance"
]
}
],
"processes": [
"create",
"modify",
"cancel",
"payment",
"fulfilment",
"billing"
],
"ownership_rules": [
{
"id": "anchor-reservation",
"process": "*",
"when": {
"product_type": [
"cruise"
]
},
"owner": "reservation",
"priority": 0
},
{
"id": "onboard-moment",
"process": "*",
"when": {
"moment": [
"onboard"
]
},
"owner": "onboard",
"priority": 0
},
{
"id": "excursions",
"process": "*",
"when": {
"product_type": [
"excursion"
]
},
"owner": "excursions",
"priority": 0
},
{
"id": "excursions-onboard",
"process": "*",
"when": {
"product_type": [
"excursion"
],
"moment": [
"onboard"
]
},
"owner": "onboard",
"priority": 0
},
{
"id": "billing-finance",
"process": "billing",
"when": {},
"owner": "finance",
"priority": 0
},
{
"id": "beverage-phase1",
"process": "create",
"when": {
"product_type": [
"beverage"
]
},
"owner": "onboard",
"priority": 0,
"effective_until": "2027-03-01T00:00:00Z"
},
{
"id": "beverage-phase2",
"process": "create",
"when": {
"product_type": [
"beverage"
]
},
"owner": "oms",
"priority": 0,
"effective_from": "2027-03-01T00:00:00Z"
}
],
"feedback": {
"expectations": [
{
"id": "reservation-create",
"system": "reservation",
"process": "create",
"expect": [
"booking.confirmed",
"booking.rejected"
]
},
{
"id": "reservation-modify",
"system": "reservation",
"process": "modify",
"expect": [
"booking.modified"
]
},
{
"id": "reservation-cancel",
"system": "reservation",
"process": "cancel",
"expect": [
"booking.cancelled"
]
},
{
"id": "excursions-create",
"system": "excursions",
"process": "create",
"expect": [
"service.confirmed"
]
},
{
"id": "onboard-create",
"system": "onboard",
"process": "create",
"expect": [
"onboard.posted"
]
}
],
"alert_rules": [
{
"id": "reservation-feedback-late",
"signal": "status_feedback.pending",
"match": {
"system": [
"reservation"
]
},
"after_seconds": 300,
"severity": "critical",
"priority": 0,
"enabled": true
},
{
"id": "feedback-late",
"signal": "status_feedback.pending",
"match": {},
"after_seconds": 3600,
"severity": "warning",
"priority": 0,
"enabled": true
}
]
},
"event_catalogue": [],
"quotations": {
"required_fields": {
"default": [
"anchor.productId"
],
"by_channel": {
"agency": [
"anchor.productId",
"agencyRef"
]
}
},
"inactivity_days": 30
},
"line_availability": []
}
}
]
},
"warnings": []
}
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | not_enabled | Order orchestration is not enabled for the tenant. |
| 409 | version_conflict | The expectedVersion does not match the current version. |
| 409 | idempotency_in_progress | A request with this Idempotency-Key is still running. Retry after the Retry-After interval. |
| 422 | invalid_config | The configuration failed validation; see issues. |
| 422 | idempotency_key_reused | The Idempotency-Key was used for a different request. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |
Read the configuration history and audit trail
/order-orchestration/config/historyResponse 200
/order-orchestration/config/historyRead the configuration history and audit trailcurl -X GET "$BASE/order-orchestration/config/history" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Request-Id: req-0034"
HTTP/1.1 200
X-Request-Id: req-0034
{
"versions": [
{
"tenantId": "meridian",
"documentType": "order_orchestration",
"documentId": "default",
"version": 1,
"document": {
"trip": {
"id_prefix": "TRP",
"anchor_product_types": [
"cruise"
]
},
"markets": [
"IT",
"FR",
"DE",
"ES"
],
"moments": [
"booking",
"pre_trip",
"onboard"
],
"systems": [
{
"id": "reservation",
"label": "Reservation system",
"domains": [
"reservation"
]
},
{
"id": "onboard",
"label": "Onboard POS and guest account",
"domains": [
"onboard"
]
},
{
"id": "excursions",
"label": "Excursion system",
"domains": [
"excursions"
]
},
{
"id": "crm",
"label": "Customer and agency master",
"domains": [
"crm",
"loyalty"
]
},
{
"id": "finance",
"label": "Finance and billing",
"domains": [
"finance"
]
}
],
"version": 1,
"channels": [
"web",
"app",
"contact_centre",
"agency",
"onboard",
"kiosk"
],
"feedback": {
"alert_rules": [
{
"id": "reservation-feedback-late",
"match": {
"system": [
"reservation"
]
},
"signal": "status_feedback.pending",
"enabled": true,
"priority": 0,
"severity": "critical",
"after_seconds": 300
},
{
"id": "feedback-late",
"match": {},
"signal": "status_feedback.pending",
"enabled": true,
"priority": 0,
"severity": "warning",
"after_seconds": 3600
}
],
"expectations": [
{
"id": "reservation-create",
"expect": [
"booking.confirmed",
"booking.rejected"
],
"system": "reservation",
"process": "create"
},
{
"id": "reservation-modify",
"expect": [
"booking.modified"
],
"system": "reservation",
"process": "modify"
},
{
"id": "reservation-cancel",
"expect": [
"booking.cancelled"
],
"system": "reservation",
"process": "cancel"
},
{
"id": "excursions-create",
"expect": [
"service.confirmed"
],
"system": "excursions",
"process": "create"
},
{
"id": "onboard-create",
"expect": [
"onboard.posted"
],
"system": "onboard",
"process": "create"
}
]
},
"processes": [
"create",
"modify",
"cancel",
"payment",
"fulfilment",
"billing"
],
"quotations": {
"inactivity_days": 30,
"required_fields": {
"default": [
"anchor.productId"
],
"by_channel": {
"agency": [
"anchor.productId",
"agencyRef"
]
}
}
},
"event_catalogue": [],
"ownership_rules": [
{
"id": "anchor-reservation",
"when": {
"product_type": [
"cruise"
]
},
"owner": "reservation",
"process": "*",
"priority": 0
},
{
"id": "onboard-moment",
"when": {
"moment": [
"onboard"
]
},
"owner": "onboard",
"process": "*",
"priority": 0
},
{
"id": "excursions",
"when": {
"product_type": [
"excursion"
]
},
"owner": "excursions",
"process": "*",
"priority": 0
},
{
"id": "excursions-onboard",
"when": {
"moment": [
"onboard"
],
"product_type": [
"excursion"
]
},
"owner": "onboard",
"process": "*",
"priority": 0
},
{
"id": "billing-finance",
"when": {},
"owner": "finance",
"process": "billing",
"priority": 0
},
{
"id": "beverage-phase1",
"when": {
"product_type": [
"beverage"
]
},
"owner": "onboard",
"process": "create",
"priority": 0,
"effective_until": "2027-03-01T00:00:00Z"
},
{
"id": "beverage-phase2",
"when": {
"product_type": [
"beverage"
]
},
"owner": "oms",
"process": "create",
"priority": 0,
"effective_from": "2027-03-01T00:00:00Z"
}
],
"line_availability": []
},
"createdAt": "2026-11-02T09:06:42.000Z",
"createdBy": {
"id": "ops-config-admin",
"name": "Elena Galli",
"role": "oms_admin",
"channel": "api"
}
}
],
"audit": [
{
"id": "e7b2f846-31b1-4d66-a7d8-5473e65b804e",
"tenantId": "meridian",
"documentType": "order_orchestration",
"documentId": "default",
"action": "create",
"version": 1,
"previousVersion": null,
"restoredFrom": null,
"actor": {
"id": "ops-config-admin",
"name": "Elena Galli",
"role": "oms_admin",
"channel": "api"
},
"at": "2026-11-02T09:06:42.000Z",
"reason": "Register the port kiosk channel",
"changeSetId": null,
"before": null,
"after": {
"trip": {
"id_prefix": "TRP",
"anchor_product_types": [
"cruise"
]
},
"markets": [
"IT",
"FR",
"DE",
"ES"
],
"moments": [
"booking",
"pre_trip",
"onboard"
],
"systems": [
{
"id": "reservation",
"label": "Reservation system",
"domains": [
"reservation"
]
},
{
"id": "onboard",
"label": "Onboard POS and guest account",
"domains": [
"onboard"
]
},
{
"id": "excursions",
"label": "Excursion system",
"domains": [
"excursions"
]
},
{
"id": "crm",
"label": "Customer and agency master",
"domains": [
"crm",
"loyalty"
]
},
{
"id": "finance",
"label": "Finance and billing",
"domains": [
"finance"
]
}
],
"version": 1,
"channels": [
"web",
"app",
"contact_centre",
"agency",
"onboard",
"kiosk"
],
"feedback": {
"alert_rules": [
{
"id": "reservation-feedback-late",
"match": {
"system": [
"reservation"
]
},
"signal": "status_feedback.pending",
"enabled": true,
"priority": 0,
"severity": "critical",
"after_seconds": 300
},
{
"id": "feedback-late",
"match": {},
"signal": "status_feedback.pending",
"enabled": true,
"priority": 0,
"severity": "warning",
"after_seconds": 3600
}
],
"expectations": [
{
"id": "reservation-create",
"expect": [
"booking.confirmed",
"booking.rejected"
],
"system": "reservation",
"process": "create"
},
{
"id": "reservation-modify",
"expect": [
"booking.modified"
],
"system": "reservation",
"process": "modify"
},
{
"id": "reservation-cancel",
"expect": [
"booking.cancelled"
],
"system": "reservation",
"process": "cancel"
},
{
"id": "excursions-create",
"expect": [
"service.confirmed"
],
"system": "excursions",
"process": "create"
},
{
"id": "onboard-create",
"expect": [
"onboard.posted"
],
"system": "onboard",
"process": "create"
}
]
},
"processes": [
"create",
"modify",
"cancel",
"payment",
"fulfilment",
"billing"
],
"quotations": {
"inactivity_days": 30,
"required_fields": {
"default": [
"anchor.productId"
],
"by_channel": {
"agency": [
"anchor.productId",
"agencyRef"
]
}
}
},
"event_catalogue": [],
"ownership_rules": [
{
"id": "anchor-reservation",
"when": {
"product_type": [
"cruise"
]
},
"owner": "reservation",
"process": "*",
"priority": 0
},
{
"id": "onboard-moment",
"when": {
"moment": [
"onboard"
]
},
"owner": "onboard",
"process": "*",
"priority": 0
},
{
"id": "excursions",
"when": {
"product_type": [
"excursion"
]
},
"owner": "excursions",
"process": "*",
"priority": 0
},
{
"id": "excursions-onboard",
"when": {
"moment": [
"onboard"
],
"product_type": [
"excursion"
]
},
"owner": "onboard",
"process": "*",
"priority": 0
},
{
"id": "billing-finance",
"when": {},
"owner": "finance",
"process": "billing",
"priority": 0
},
{
"id": "beverage-phase1",
"when": {
"product_type": [
"beverage"
]
},
"owner": "onboard",
"process": "create",
"priority": 0,
"effective_until": "2027-03-01T00:00:00Z"
},
{
"id": "beverage-phase2",
"when": {
"product_type": [
"beverage"
]
},
"owner": "oms",
"process": "create",
"priority": 0,
"effective_from": "2027-03-01T00:00:00Z"
}
],
"line_availability": []
},
"changes": [
{
"path": "$",
"after": {
"trip": {
"id_prefix": "TRP",
"anchor_product_types": [
"cruise"
]
},
"markets": [
"IT",
"FR",
"DE",
"ES"
],
"moments": [
"booking",
"pre_trip",
"onboard"
],
"systems": [
{
"id": "reservation",
"label": "Reservation system",
"domains": [
"reservation"
]
},
{
"id": "onboard",
"label": "Onboard POS and guest account",
"domains": [
"onboard"
]
},
{
"id": "excursions",
"label": "Excursion system",
"domains": [
"excursions"
]
},
{
"id": "crm",
"label": "Customer and agency master",
"domains": [
"crm",
"loyalty"
]
},
{
"id": "finance",
"label": "Finance and billing",
"domains": [
"finance"
]
}
],
"version": 1,
"channels": [
"web",
"app",
"contact_centre",
"agency",
"onboard",
"kiosk"
],
"feedback": {
"alert_rules": [
{
"id": "reservation-feedback-late",
"match": {
"system": [
"reservation"
]
},
"signal": "status_feedback.pending",
"enabled": true,
"priority": 0,
"severity": "critical",
"after_seconds": 300
},
{
"id": "feedback-late",
"match": {},
"signal": "status_feedback.pending",
"enabled": true,
"priority": 0,
"severity": "warning",
"after_seconds": 3600
}
],
"expectations": [
{
"id": "reservation-create",
"expect": [
"booking.confirmed",
"booking.rejected"
],
"system": "reservation",
"process": "create"
},
{
"id": "reservation-modify",
"expect": [
"booking.modified"
],
"system": "reservation",
"process": "modify"
},
{
"id": "reservation-cancel",
"expect": [
"booking.cancelled"
],
"system": "reservation",
"process": "cancel"
},
{
"id": "excursions-create",
"expect": [
"service.confirmed"
],
"system": "excursions",
"process": "create"
},
{
"id": "onboard-create",
"expect": [
"onboard.posted"
],
"system": "onboard",
"process": "create"
}
]
},
"processes": [
"create",
"modify",
"cancel",
"payment",
"fulfilment",
"billing"
],
"quotations": {
"inactivity_days": 30,
"required_fields": {
"default": [
"anchor.productId"
],
"by_channel": {
"agency": [
"anchor.productId",
"agencyRef"
]
}
}
},
"event_catalogue": [],
"ownership_rules": [
{
"id": "anchor-reservation",
"when": {
"product_type": [
"cruise"
]
},
"owner": "reservation",
"process": "*",
"priority": 0
},
{
"id": "onboard-moment",
"when": {
"moment": [
"onboard"
]
},
"owner": "onboard",
"process": "*",
"priority": 0
},
{
"id": "excursions",
"when": {
"product_type": [
"excursion"
]
},
"owner": "excursions",
"process": "*",
"priority": 0
},
{
"id": "excursions-onboard",
"when": {
"moment": [
"onboard"
],
"product_type": [
"excursion"
]
},
"owner": "onboard",
"process": "*",
"priority": 0
},
{
"id": "billing-finance",
"when": {},
"owner": "finance",
"process": "billing",
"priority": 0
},
{
"id": "beverage-phase1",
"when": {
"product_type": [
"beverage"
]
},
"owner": "onboard",
"process": "create",
"priority": 0,
"effective_until": "2027-03-01T00:00:00Z"
},
{
"id": "beverage-phase2",
"when": {
"product_type": [
"beverage"
]
},
"owner": "oms",
"process": "create",
"priority": 0,
"effective_from": "2027-03-01T00:00:00Z"
}
],
"line_availability": []
},
"before": null
}
]
}
]
}
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | not_enabled | Order orchestration is not enabled for the tenant. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |
Roll back to an earlier configuration version
/order-orchestration/config/rollbackA rollback is a new version whose document equals the older one.
Headers: Idempotency-Key, plus X-Request-Id.
Request body
| Field | Type | Required | Notes |
|---|---|---|---|
toVersion | integer | yes | ≥ 1 |
expectedVersion | integer | ≥ 0 | |
actor | object | yes | |
actor.id | string | yes | min 1 chars |
actor.name | string | ||
actor.role | string | ||
actor.channel | enum: form, change_desk, api, system, seed | yes | |
reason | string | max 2000 chars |
Response 200
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | not_found | The trip, purchase order, quotation or configuration item does not exist. |
| 404 | not_enabled | Order orchestration is not enabled for the tenant. |
| 409 | version_conflict | The expectedVersion does not match the current version. |
| 409 | idempotency_in_progress | A request with this Idempotency-Key is still running. Retry after the Retry-After interval. |
| 422 | idempotency_key_reused | The Idempotency-Key was used for a different request. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |
Validate a configuration without publishing it
/order-orchestration/config/validateHeaders: Idempotency-Key, plus X-Request-Id.
Request body
| Field | Type | Required | Notes |
|---|---|---|---|
config | object | yes | |
config.channels | array of string | yes | at least 1 |
config.event_catalogue | array of object | ||
config.event_catalogue[].carries_external_ref | boolean | default false | |
config.event_catalogue[].consumers | array of string | ||
config.event_catalogue[].description | string | ||
config.event_catalogue[].name | string | 1–120 chars | |
config.event_catalogue[].native_status | string | 1–100 chars | |
config.event_catalogue[].schema_version | string | 1–20 chars | |
config.event_catalogue[].scope | enum: line, purchase_order | default "line" | |
config.event_catalogue[].sets | object | ||
config.event_catalogue[].status | enum: active, deprecated | ||
config.event_catalogue[].systems | array of string | at least 1 | |
config.event_catalogue[].type | string | yes | pattern ^[a-z][a-z0-9_]*(\.[a-z][a-z0-9_]*)+$ |
config.feedback | object | ||
config.feedback.alert_rules | array of object | ||
config.feedback.expectations | array of object | ||
config.line_availability | array of object | ||
config.line_availability[].channels | array of string | yes | at least 1 |
config.line_availability[].note | string | max 500 chars | |
config.line_availability[].product_type | string | yes | min 1 chars |
config.markets | array of string | ||
config.moments | array of string | yes | at least 1 |
config.outbound_events | array of object | ||
config.outbound_events[].consumers | array of string | ||
config.outbound_events[].description | string | max 500 chars | |
config.outbound_events[].name | string | 1–120 chars | |
config.outbound_events[].schema_version | string | 1–20 chars | |
config.outbound_events[].status | enum: active, deprecated | ||
config.outbound_events[].type | string | yes | pattern ^[a-z][a-z0-9_]*(\.[a-z][a-z0-9_]*)+$ |
config.ownership_rules | array of object | ||
config.ownership_rules[].effective_from | string (date-time) | ||
config.ownership_rules[].effective_until | string (date-time) | ||
config.ownership_rules[].id | string | yes | pattern ^[a-z0-9][a-z0-9_.-]*$ |
config.ownership_rules[].name | string | 1–160 chars | |
config.ownership_rules[].note | string | max 500 chars | |
config.ownership_rules[].notify | array of object | ||
config.ownership_rules[].on_failure | object | ||
config.ownership_rules[].owner | string | yes | min 1 chars |
config.ownership_rules[].priority | integer | default 0 | |
config.ownership_rules[].process | string | yes | min 1 chars |
config.ownership_rules[].when | object | ||
config.payments | object | ||
config.payments.fullPaymentThresholds | array of object | ||
config.payments.overpayment | enum: hold_unallocated, reject | default "hold_unallocated" | |
config.payments.passengerSplit | enum: equal, by_unit | ||
config.payments.reallocateOnChange | boolean | default false | |
config.payments.rules | array of object | ||
config.payments.scenarios | array of object | yes | at least 1 |
config.processes | array of string | default ["create","modify","cancel","payment","fulfilment","billing"] | |
config.quotations | object | ||
config.quotations.inactivity_days | integer | > 0; default 30 | |
config.quotations.required_fields | object | ||
config.systems | array of object | ||
config.systems[].base_reference | string | 1–200 chars | |
config.systems[].capabilities | array of object | ||
config.systems[].channels | array of string | ||
config.systems[].contract | object | ||
config.systems[].description | string | max 500 chars | |
config.systems[].domains | array of string | ||
config.systems[].effective_from | string (date-time) | ||
config.systems[].field_mappings | array of object | ||
config.systems[].id | string | yes | pattern ^[a-z][a-z0-9_-]*$ |
config.systems[].label | string | yes | min 1 chars |
config.systems[].master_of | array of string | ||
config.systems[].owner_team | string | 1–120 chars | |
config.systems[].references_kept | array of string | ||
config.systems[].roles | array of source, channel, target | at least 1 | |
config.systems[].route | object | ||
config.systems[].status | enum: active, planned, retired | ||
config.trip | object | yes | |
config.trip.anchor_product_types | array of string | yes | at least 1 |
config.trip.id_prefix | string | pattern ^[A-Z][A-Z0-9]{0,5}$; default "TRP" | |
config.version | integer | ≥ 0; default 0 |
Response 200
/order-orchestration/config/validateDry-run a configuration that registers a new channelcurl -X POST "$BASE/order-orchestration/config/validate" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Request-Id: req-0031" \
-H "Content-Type: application/json" \
-d '{
"config": {
"version": 1,
"trip": {
"anchor_product_types": [
"cruise"
],
"id_prefix": "TRP"
},
"channels": [
"web",
"app",
"contact_centre",
"agency",
"onboard",
"kiosk"
],
"moments": [
"booking",
"pre_trip",
"onboard"
],
"markets": [
"IT",
"FR",
"DE",
"ES"
],
"systems": [
{
"id": "reservation",
"label": "Reservation system",
"domains": [
"reservation"
]
},
{
"id": "onboard",
"label": "Onboard POS and guest account",
"domains": [
"onboard"
]
},
{
"id": "excursions",
"label": "Excursion system",
"domains": [
"excursions"
]
},
{
"id": "crm",
"label": "Customer and agency master",
"domains": [
"crm",
"loyalty"
]
},
{
"id": "finance",
"label": "Finance and billing",
"domains": [
"finance"
]
}
],
"processes": [
"create",
"modify",
"cancel",
"payment",
"fulfilment",
"billing"
],
"ownership_rules": [
{
"id": "anchor-reservation",
"process": "*",
"when": {
"product_type": [
"cruise"
]
},
"owner": "reservation",
"priority": 0
},
{
"id": "onboard-moment",
"process": "*",
"when": {
"moment": [
"onboard"
]
},
"owner": "onboard",
"priority": 0
},
{
"id": "excursions",
"process": "*",
"when": {
"product_type": [
"excursion"
]
},
"owner": "excursions",
"priority": 0
},
{
"id": "excursions-onboard",
"process": "*",
"when": {
"product_type": [
"excursion"
],
"moment": [
"onboard"
]
},
"owner": "onboard",
"priority": 0
},
{
"id": "billing-finance",
"process": "billing",
"when": {},
"owner": "finance",
"priority": 0
},
{
"id": "beverage-phase1",
"process": "create",
"when": {
"product_type": [
"beverage"
]
},
"owner": "onboard",
"priority": 0,
"effective_until": "2027-03-01T00:00:00Z"
},
{
"id": "beverage-phase2",
"process": "create",
"when": {
"product_type": [
"beverage"
]
},
"owner": "oms",
"priority": 0,
"effective_from": "2027-03-01T00:00:00Z"
}
],
"feedback": {
"expectations": [
{
"id": "reservation-create",
"system": "reservation",
"process": "create",
"expect": [
"booking.confirmed",
"booking.rejected"
]
},
{
"id": "reservation-modify",
"system": "reservation",
"process": "modify",
"expect": [
"booking.modified"
]
},
{
"id": "reservation-cancel",
"system": "reservation",
"process": "cancel",
"expect": [
"booking.cancelled"
]
},
{
"id": "excursions-create",
"system": "excursions",
"process": "create",
"expect": [
"service.confirmed"
]
},
{
"id": "onboard-create",
"system": "onboard",
"process": "create",
"expect": [
"onboard.posted"
]
}
],
"alert_rules": [
{
"id": "reservation-feedback-late",
"signal": "status_feedback.pending",
"match": {
"system": [
"reservation"
]
},
"after_seconds": 300,
"severity": "critical",
"priority": 0,
"enabled": true
},
{
"id": "feedback-late",
"signal": "status_feedback.pending",
"match": {},
"after_seconds": 3600,
"severity": "warning",
"priority": 0,
"enabled": true
}
]
},
"event_catalogue": [],
"quotations": {
"required_fields": {
"default": [
"anchor.productId"
],
"by_channel": {
"agency": [
"anchor.productId",
"agencyRef"
]
}
},
"inactivity_days": 30
},
"line_availability": []
}
}'
HTTP/1.1 200
X-Request-Id: req-0031
{
"ok": true,
"issues": []
}
/order-orchestration/config/validateDry-run a configuration with a rule that names an unknown systemcurl -X POST "$BASE/order-orchestration/config/validate" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Request-Id: req-0032" \
-H "Content-Type: application/json" \
-d '{
"config": {
"version": 1,
"trip": {
"anchor_product_types": [
"cruise"
],
"id_prefix": "TRP"
},
"channels": [
"web",
"app",
"contact_centre",
"agency",
"onboard",
"kiosk"
],
"moments": [
"booking",
"pre_trip",
"onboard"
],
"markets": [
"IT",
"FR",
"DE",
"ES"
],
"systems": [
{
"id": "reservation",
"label": "Reservation system",
"domains": [
"reservation"
]
},
{
"id": "onboard",
"label": "Onboard POS and guest account",
"domains": [
"onboard"
]
},
{
"id": "excursions",
"label": "Excursion system",
"domains": [
"excursions"
]
},
{
"id": "crm",
"label": "Customer and agency master",
"domains": [
"crm",
"loyalty"
]
},
{
"id": "finance",
"label": "Finance and billing",
"domains": [
"finance"
]
}
],
"processes": [
"create",
"modify",
"cancel",
"payment",
"fulfilment",
"billing"
],
"ownership_rules": [
{
"id": "anchor-reservation",
"process": "*",
"when": {
"product_type": [
"cruise"
]
},
"owner": "reservation",
"priority": 0
},
{
"id": "onboard-moment",
"process": "*",
"when": {
"moment": [
"onboard"
]
},
"owner": "onboard",
"priority": 0
},
{
"id": "excursions",
"process": "*",
"when": {
"product_type": [
"excursion"
]
},
"owner": "excursions",
"priority": 0
},
{
"id": "excursions-onboard",
"process": "*",
"when": {
"product_type": [
"excursion"
],
"moment": [
"onboard"
]
},
"owner": "onboard",
"priority": 0
},
{
"id": "billing-finance",
"process": "billing",
"when": {},
"owner": "finance",
"priority": 0
},
{
"id": "beverage-phase1",
"process": "create",
"when": {
"product_type": [
"beverage"
]
},
"owner": "onboard",
"priority": 0,
"effective_until": "2027-03-01T00:00:00Z"
},
{
"id": "beverage-phase2",
"process": "create",
"when": {
"product_type": [
"beverage"
]
},
"owner": "oms",
"priority": 0,
"effective_from": "2027-03-01T00:00:00Z"
},
{
"id": "kiosk-excursions",
"process": "*",
"when": {
"channel": [
"kiosk"
]
},
"owner": "kiosk-pos"
}
],
"feedback": {
"expectations": [
{
"id": "reservation-create",
"system": "reservation",
"process": "create",
"expect": [
"booking.confirmed",
"booking.rejected"
]
},
{
"id": "reservation-modify",
"system": "reservation",
"process": "modify",
"expect": [
"booking.modified"
]
},
{
"id": "reservation-cancel",
"system": "reservation",
"process": "cancel",
"expect": [
"booking.cancelled"
]
},
{
"id": "excursions-create",
"system": "excursions",
"process": "create",
"expect": [
"service.confirmed"
]
},
{
"id": "onboard-create",
"system": "onboard",
"process": "create",
"expect": [
"onboard.posted"
]
}
],
"alert_rules": [
{
"id": "reservation-feedback-late",
"signal": "status_feedback.pending",
"match": {
"system": [
"reservation"
]
},
"after_seconds": 300,
"severity": "critical",
"priority": 0,
"enabled": true
},
{
"id": "feedback-late",
"signal": "status_feedback.pending",
"match": {},
"after_seconds": 3600,
"severity": "warning",
"priority": 0,
"enabled": true
}
]
},
"event_catalogue": [],
"quotations": {
"required_fields": {
"default": [
"anchor.productId"
],
"by_channel": {
"agency": [
"anchor.productId",
"agencyRef"
]
}
},
"inactivity_days": 30
},
"line_availability": []
}
}'
HTTP/1.1 422
X-Request-Id: req-0032
{
"ok": false,
"issues": [
{
"path": "ownership_rules[7].owner",
"code": "unknown_system",
"message": "unknown owner 'kiosk-pos'"
}
],
"code": "unprocessable",
"message": "Unprocessable Entity",
"requestId": "req-0032"
}
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | not_enabled | Order orchestration is not enabled for the tenant. |
| 409 | idempotency_in_progress | A request with this Idempotency-Key is still running. Retry after the Retry-After interval. |
| 422 | idempotency_key_reused | The Idempotency-Key was used for a different request. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |
Read the event catalogue
/order-orchestration/event-typesParameters
| Name | In | Required | Notes |
|---|---|---|---|
direction | query | inbound or outbound. | |
system | query | Only types mapped for this system. |
Response 200
/order-orchestration/event-typesRead the inbound event cataloguecurl -X GET "$BASE/order-orchestration/event-types" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Request-Id: req-0028"
HTTP/1.1 200
X-Request-Id: req-0028
{
"version": 0,
"state": "published",
"source": "tenant_file",
"items": [
{
"type": "booking.accepted",
"name": "booking.accepted",
"direction": "inbound",
"description": null,
"scope": "line",
"from": [],
"moves": [
{
"dimension": "fulfilment",
"to": "requested"
}
],
"nativeStatus": null,
"expectedAfter": [],
"threshold": null,
"consumers": [],
"schemaVersion": null,
"status": "active"
},
{
"type": "booking.confirmed",
"name": "booking.confirmed",
"direction": "inbound",
"description": null,
"scope": "line",
"from": [
"reservation"
],
"moves": [
{
"dimension": "commercial",
"to": "booked"
},
{
"dimension": "fulfilment",
"to": "confirmed"
}
],
"nativeStatus": null,
"expectedAfter": [
{
"system": "reservation",
"process": "create"
}
],
"threshold": {
"ruleId": "reservation-feedback-late",
"afterSeconds": 300,
"severity": "critical"
},
"consumers": [],
"schemaVersion": null,
"status": "active"
},
{
"type": "booking.optioned",
"name": "booking.optioned",
"direction": "inbound",
"description": null,
"scope": "line",
"from": [],
"moves": [
{
"dimension": "commercial",
"to": "option"
}
],
"nativeStatus": null,
"expectedAfter": [],
"threshold": null,
"consumers": [],
"schemaVersion": null,
"status": "active"
},
{
"type": "booking.rejected",
"name": "booking.rejected",
"direction": "inbound",
"description": null,
"scope": "line",
"from": [
"reservation"
],
"moves": [
{
"dimension": "fulfilment",
"to": "not_fulfilled"
}
],
"nativeStatus": null,
"expectedAfter": [
{
"system": "reservation",
"process": "create"
}
],
"threshold": {
"ruleId": "reservation-feedback-late",
"afterSeconds": 300,
"severity": "critical"
},
"consumers": [],
"schemaVersion": null,
"status": "active"
},
{
"type": "booking.modified",
"name": "booking.modified",
"direction": "inbound",
"description": null,
"scope": "line",
"from": [
"reservation"
],
"moves": [
{
"dimension": "fulfilment",
"to": "confirmed"
}
],
"nativeStatus": null,
"expectedAfter": [
{
"system": "reservation",
"process": "modify"
}
],
"threshold": {
"ruleId": "reservation-feedback-late",
"afterSeconds": 300,
"severity": "critical"
},
"consumers": [],
"schemaVersion": null,
"status": "active"
},
{
"type": "booking.cancelled",
"name": "booking.cancelled",
"direction": "inbound",
"description": null,
"scope": "line",
"from": [
"reservation"
],
"moves": [
{
"dimension": "commercial",
"to": "cancelled"
},
{
"dimension": "fulfilment",
"to": "cancelled"
}
],
"nativeStatus": null,
"expectedAfter": [
{
"system": "reservation",
"process": "cancel"
}
],
"threshold": {
"ruleId": "reservation-feedback-late",
"afterSeconds": 300,
"severity": "critical"
},
"consumers": [],
"schemaVersion": null,
"status": "active"
},
{
"type": "onboard.posted",
"name": "onboard.posted",
"direction": "inbound",
"description": null,
"scope": "line",
"from": [
"onboard"
],
"moves": [
{
"dimension": "commercial",
"to": "booked"
},
{
"dimension": "fulfilment",
"to": "fulfilled"
}
],
"nativeStatus": null,
"expectedAfter": [
{
"system": "onboard",
"process": "create"
}
],
"threshold": {
"ruleId": "feedback-late",
"afterSeconds": 3600,
"severity": "warning"
},
"consumers": [],
"schemaVersion": null,
"status": "active"
},
{
"type": "onboard.voided",
"name": "onboard.voided",
"direction": "inbound",
"description": null,
"scope": "line",
"from": [],
"moves": [
{
"dimension": "commercial",
"to": "cancelled"
},
{
"dimension": "fulfilment",
"to": "cancelled"
}
],
"nativeStatus": null,
"expectedAfter": [],
"threshold": null,
"consumers": [],
"schemaVersion": null,
"status": "active"
},
{
"type": "service.confirmed",
"name": "service.confirmed",
"direction": "inbound",
"description": null,
"scope": "line",
"from": [
"excursions"
],
"moves": [
{
"dimension": "fulfilment",
"to": "confirmed"
}
],
"nativeStatus": null,
"expectedAfter": [
{
"system": "excursions",
"process": "create"
}
],
"threshold": {
"ruleId": "feedback-late",
"afterSeconds": 3600,
"severity": "warning"
},
"consumers": [],
"schemaVersion": null,
"status": "active"
},
{
"type": "service.fulfilled",
"name": "service.fulfilled",
"direction": "inbound",
"description": null,
"scope": "line",
"from": [],
"moves": [
{
"dimension": "fulfilment",
"to": "fulfilled"
}
],
"nativeStatus": null,
"expectedAfter": [],
"threshold": null,
"consumers": [],
"schemaVersion": null,
"status": "active"
},
{
"type": "service.not_fulfilled",
"name": "service.not_fulfilled",
"direction": "inbound",
"description": null,
"scope": "line",
"from": [],
"moves": [
{
"dimension": "fulfilment",
"to": "not_fulfilled"
}
],
"nativeStatus": null,
"expectedAfter": [],
"threshold": null,
"consumers": [],
"schemaVersion": null,
"status": "active"
},
{
"type": "payment.authorised",
"name": "payment.authorised",
"direction": "inbound",
"description": null,
"scope": "purchase_order",
"from": [],
"moves": [
{
"dimension": "payment",
"to": "authorised"
}
],
"nativeStatus": null,
"expectedAfter": [],
"threshold": null,
"consumers": [],
"schemaVersion": null,
"status": "active"
},
{
"type": "payment.partially_paid",
"name": "payment.partially_paid",
"direction": "inbound",
"description": null,
"scope": "purchase_order",
"from": [],
"moves": [
{
"dimension": "payment",
"to": "partially_paid"
}
],
"nativeStatus": null,
"expectedAfter": [],
"threshold": null,
"consumers": [],
"schemaVersion": null,
"status": "active"
},
{
"type": "payment.captured",
"name": "payment.captured",
"direction": "inbound",
"description": null,
"scope": "purchase_order",
"from": [],
"moves": [
{
"dimension": "payment",
"to": "paid"
}
],
"nativeStatus": null,
"expectedAfter": [],
"threshold": null,
"consumers": [],
"schemaVersion": null,
"status": "active"
},
{
"type": "payment.failed",
"name": "payment.failed",
"direction": "inbound",
"description": null,
"scope": "purchase_order",
"from": [],
"moves": [
{
"dimension": "payment",
"to": "failed"
}
],
"nativeStatus": null,
"expectedAfter": [],
"threshold": null,
"consumers": [],
"schemaVersion": null,
"status": "active"
},
{
"type": "payment.refunded",
"name": "payment.refunded",
"direction": "inbound",
"description": null,
"scope": "purchase_order",
"from": [],
"moves": [
{
"dimension": "payment",
"to": "refunded"
}
],
"nativeStatus": null,
"expectedAfter": [],
"threshold": null,
"consumers": [],
"schemaVersion": null,
"status": "active"
},
{
"type": "billing.invoiced",
"name": "billing.invoiced",
"direction": "inbound",
"description": null,
"scope": "line",
"from": [],
"moves": [
{
"dimension": "billing",
"to": "invoiced"
}
],
"nativeStatus": null,
"expectedAfter": [],
"threshold": null,
"consumers": [],
"schemaVersion": null,
"status": "active"
},
{
"type": "billing.credited",
"name": "billing.credited",
"direction": "inbound",
"description": null,
"scope": "line",
"from": [],
"moves": [
{
"dimension": "billing",
"to": "credited"
}
],
"nativeStatus": null,
"expectedAfter": [],
"threshold": null,
"consumers": [],
"schemaVersion": null,
"status": "active"
},
{
"type": "billing.closed",
"name": "billing.closed",
"direction": "inbound",
"description": null,
"scope": "line",
"from": [],
"moves": [
{
"dimension": "billing",
"to": "closed"
}
],
"nativeStatus": null,
"expectedAfter": [],
"threshold": null,
"consumers": [],
"schemaVersion": null,
"status": "active"
},
{
"type": "customer.linked",
"name": "customer.linked",
"direction": "inbound",
"description": null,
"scope": "purchase_order",
"from": [],
"moves": [],
"nativeStatus": null,
"expectedAfter": [],
"threshold": null,
"consumers": [],
"schemaVersion": null,
"status": "active"
},
{
"type": "communication.delivered",
"name": "communication.delivered",
"direction": "inbound",
"description": null,
"scope": "purchase_order",
"from": [],
"moves": [],
"nativeStatus": null,
"expectedAfter": [],
"threshold": null,
"consumers": [],
"schemaVersion": null,
"status": "active"
}
]
}
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | not_enabled | Order orchestration is not enabled for the tenant. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |
Read one event type
/order-orchestration/event-types/{type}Parameters
| Name | In | Required | Notes |
|---|---|---|---|
type | path | yes |
Response 200
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | not_found | The trip, purchase order, quotation or configuration item does not exist. |
| 404 | not_enabled | Order orchestration is not enabled for the tenant. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |
Resolve which system executes a process
/order-orchestration/ownership/resolveEvaluates the ownership rules for a process, product type, channel and moment and returns the owner with the trace of every rule considered.
Parameters
| Name | In | Required | Notes |
|---|---|---|---|
process | query | yes | create |
productType | query | yes | |
channel | query | yes | |
moment | query | yes | |
market | query | ||
at | query |
Response 200
/order-orchestration/ownership/resolveResolve which system owns a processcurl -X GET "$BASE/order-orchestration/ownership/resolve?process=create&productType=excursion&channel=onboard&moment=onboard" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Request-Id: req-0026"
HTTP/1.1 200
X-Request-Id: req-0026
{
"owner": "onboard",
"ruleId": "excursions-onboard",
"trace": [
{
"ruleId": "anchor-reservation",
"outcome": "no_match",
"detail": "product_type excursion"
},
{
"ruleId": "billing-finance",
"outcome": "no_match",
"detail": "process create"
},
{
"ruleId": "beverage-phase1",
"outcome": "no_match",
"detail": "product_type excursion"
},
{
"ruleId": "beverage-phase2",
"outcome": "no_match",
"detail": "product_type excursion"
},
{
"ruleId": "onboard-moment",
"outcome": "outranked"
},
{
"ruleId": "excursions",
"outcome": "outranked"
},
{
"ruleId": "excursions-onboard",
"outcome": "selected"
}
],
"notify": [],
"onFailure": null
}
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | not_enabled | Order orchestration is not enabled for the tenant. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |
Read the payment rules
/order-orchestration/payment-rulesResponse 200
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | not_enabled | Order orchestration is not enabled for the tenant. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |
Test a payment allocation
/order-orchestration/payment-rules/testShows how a payment of a given scenario would be split across the lines you pass. Writes nothing.
Headers: Idempotency-Key, plus X-Request-Id.
Response 200
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | not_enabled | Order orchestration is not enabled for the tenant. |
| 409 | idempotency_in_progress | A request with this Idempotency-Key is still running. Retry after the Retry-After interval. |
| 422 | idempotency_key_reused | The Idempotency-Key was used for a different request. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |
List execution-ownership rules
/order-orchestration/rulesParameters
| Name | In | Required | Notes |
|---|---|---|---|
process | query | Only rules for this process. | |
system | query | Only rules executed by this system. |
Response 200
/order-orchestration/rulesList execution-ownership rulescurl -X GET "$BASE/order-orchestration/rules" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Request-Id: req-0025"
HTTP/1.1 200
X-Request-Id: req-0025
{
"version": 0,
"state": "published",
"source": "tenant_file",
"items": [
{
"id": "anchor-reservation",
"name": "anchor-reservation",
"process": "*",
"scope": {
"product_type": [
"cruise"
]
},
"executes": {
"system": "reservation",
"name": "Reservation system"
},
"notify": [],
"onFailure": null,
"priority": 0,
"effectiveFrom": null,
"effectiveUntil": null,
"window": "in_force",
"note": null
},
{
"id": "onboard-moment",
"name": "onboard-moment",
"process": "*",
"scope": {
"moment": [
"onboard"
]
},
"executes": {
"system": "onboard",
"name": "Onboard POS and guest account"
},
"notify": [],
"onFailure": null,
"priority": 0,
"effectiveFrom": null,
"effectiveUntil": null,
"window": "in_force",
"note": null
},
{
"id": "excursions",
"name": "excursions",
"process": "*",
"scope": {
"product_type": [
"excursion"
]
},
"executes": {
"system": "excursions",
"name": "Excursion system"
},
"notify": [],
"onFailure": null,
"priority": 0,
"effectiveFrom": null,
"effectiveUntil": null,
"window": "in_force",
"note": null
},
{
"id": "excursions-onboard",
"name": "excursions-onboard",
"process": "*",
"scope": {
"product_type": [
"excursion"
],
"moment": [
"onboard"
]
},
"executes": {
"system": "onboard",
"name": "Onboard POS and guest account"
},
"notify": [],
"onFailure": null,
"priority": 0,
"effectiveFrom": null,
"effectiveUntil": null,
"window": "in_force",
"note": null
},
{
"id": "billing-finance",
"name": "billing-finance",
"process": "billing",
"scope": {},
"executes": {
"system": "finance",
"name": "Finance and billing"
},
"notify": [],
"onFailure": null,
"priority": 0,
"effectiveFrom": null,
"effectiveUntil": null,
"window": "in_force",
"note": null
},
{
"id": "beverage-phase1",
"name": "beverage-phase1",
"process": "create",
"scope": {
"product_type": [
"beverage"
]
},
"executes": {
"system": "onboard",
"name": "Onboard POS and guest account"
},
"notify": [],
"onFailure": null,
"priority": 0,
"effectiveFrom": null,
"effectiveUntil": "2027-03-01T00:00:00Z",
"window": "in_force",
"note": null
},
{
"id": "beverage-phase2",
"name": "beverage-phase2",
"process": "create",
"scope": {
"product_type": [
"beverage"
]
},
"executes": {
"system": "oms",
"name": "Order engine"
},
"notify": [],
"onFailure": null,
"priority": 0,
"effectiveFrom": "2027-03-01T00:00:00Z",
"effectiveUntil": null,
"window": "scheduled",
"note": null
}
]
}
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | not_enabled | Order orchestration is not enabled for the tenant. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |
Read an execution-ownership rule
/order-orchestration/rules/{id}Parameters
| Name | In | Required | Notes |
|---|---|---|---|
id | path | yes |
Response 200
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | not_found | The trip, purchase order, quotation or configuration item does not exist. |
| 404 | not_enabled | Order orchestration is not enabled for the tenant. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |
Read the status models
/order-orchestration/status-modelsResponse 200
/order-orchestration/status-modelsRead the status modelscurl -X GET "$BASE/order-orchestration/status-models" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Request-Id: req-0027"
HTTP/1.1 200
X-Request-Id: req-0027
{
"version": 0,
"state": "published",
"source": "tenant_file",
"items": [
{
"object": "trip",
"dimensions": [
{
"dimension": "lifecycle",
"values": [
{
"value": "lead",
"terminal": false
},
{
"value": "quotation",
"terminal": false
},
{
"value": "option",
"terminal": false
},
{
"value": "booked",
"terminal": false
},
{
"value": "closed",
"terminal": true
}
],
"transitions": [
{
"from": "lead",
"to": "quotation",
"trigger": "engine",
"by": "first_quotation_order"
},
{
"from": "*",
"to": "option",
"trigger": "engine",
"by": "order_on_option"
},
{
"from": "*",
"to": "booked",
"trigger": "engine",
"by": "order_booked"
},
{
"from": "booked",
"to": "closed",
"trigger": "user_action",
"by": "close_trip"
}
]
}
]
},
{
"object": "purchase_order",
"dimensions": [
{
"dimension": "commercial",
"values": [
{
"value": "quotation",
"terminal": false
},
{
"value": "option",
"terminal": false
},
{
"value": "booked",
"terminal": false
},
{
"value": "cancelled",
"terminal": true
},
{
"value": "frozen",
"terminal": false
},
{
"value": "closed",
"terminal": true
}
],
"transitions": [
{
"from": "quotation",
"to": "booked",
"trigger": "user_action",
"by": "transition:booked"
},
{
"from": "quotation",
"to": "cancelled",
"trigger": "user_action",
"by": "transition:cancelled"
},
{
"from": "option",
"to": "booked",
"trigger": "user_action",
"by": "transition:booked"
},
{
"from": "option",
"to": "cancelled",
"trigger": "user_action",
"by": "transition:cancelled"
},
{
"from": "booked",
"to": "cancelled",
"trigger": "user_action",
"by": "transition:cancelled"
},
{
"from": "booked",
"to": "frozen",
"trigger": "user_action",
"by": "transition:frozen"
},
{
"from": "booked",
"to": "closed",
"trigger": "user_action",
"by": "transition:closed"
},
{
"from": "frozen",
"to": "booked",
"trigger": "user_action",
"by": "transition:booked"
},
{
"from": "frozen",
"to": "cancelled",
"trigger": "user_action",
"by": "transition:cancelled"
},
{
"from": "frozen",
"to": "closed",
"trigger": "user_action",
"by": "transition:closed"
},
{
"from": "*",
"to": "*",
"trigger": "line_rollup",
"by": "least_advanced_live_line"
}
]
},
{
"dimension": "payment",
"values": [
{
"value": "not_due",
"terminal": false
},
{
"value": "pending",
"terminal": false
},
{
"value": "authorised",
"terminal": false
},
{
"value": "partially_paid",
"terminal": false
},
{
"value": "paid",
"terminal": false
},
{
"value": "refunded",
"terminal": true
},
{
"value": "failed",
"terminal": false
}
],
"transitions": [
{
"from": "*",
"to": "authorised",
"trigger": "inbound_event",
"by": "payment.authorised",
"nativeStatus": null
},
{
"from": "*",
"to": "partially_paid",
"trigger": "inbound_event",
"by": "payment.partially_paid",
"nativeStatus": null
},
{
"from": "*",
"to": "paid",
"trigger": "inbound_event",
"by": "payment.captured",
"nativeStatus": null
},
{
"from": "*",
"to": "failed",
"trigger": "inbound_event",
"by": "payment.failed",
"nativeStatus": null
},
{
"from": "*",
"to": "refunded",
"trigger": "inbound_event",
"by": "payment.refunded",
"nativeStatus": null
},
{
"from": "*",
"to": "*",
"trigger": "line_rollup",
"by": "least_advanced_live_line"
}
]
},
{
"dimension": "fulfilment",
"values": [
{
"value": "not_started",
"terminal": false
},
{
"value": "requested",
"terminal": false
},
{
"value": "confirmed",
"terminal": false
},
{
"value": "fulfilled",
"terminal": true
},
{
"value": "not_fulfilled",
"terminal": true
},
{
"value": "cancelled",
"terminal": true
}
],
"transitions": [
{
"from": "*",
"to": "*",
"trigger": "line_rollup",
"by": "least_advanced_live_line"
}
]
},
{
"dimension": "billing",
"values": [
{
"value": "not_billed",
"terminal": false
},
{
"value": "invoiced",
"terminal": false
},
{
"value": "credited",
"terminal": false
},
{
"value": "closed",
"terminal": true
}
],
"transitions": [
{
"from": "*",
"to": "*",
"trigger": "line_rollup",
"by": "least_advanced_live_line"
}
]
}
]
},
{
"object": "order_line",
"dimensions": [
{
"dimension": "commercial",
"values": [
{
"value": "quotation",
"terminal": false
},
{
"value": "option",
"terminal": false
},
{
"value": "booked",
"terminal": false
},
{
"value": "cancelled",
"terminal": true
},
{
"value": "frozen",
"terminal": false
},
{
"value": "closed",
"terminal": true
}
],
"transitions": [
{
"from": "*",
"to": "booked",
"trigger": "inbound_event",
"by": "booking.confirmed",
"nativeStatus": null
},
{
"from": "*",
"to": "option",
"trigger": "inbound_event",
"by": "booking.optioned",
"nativeStatus": null
},
{
"from": "*",
"to": "cancelled",
"trigger": "inbound_event",
"by": "booking.cancelled",
"nativeStatus": null
},
{
"from": "*",
"to": "booked",
"trigger": "inbound_event",
"by": "onboard.posted",
"nativeStatus": null
},
{
"from": "*",
"to": "cancelled",
"trigger": "inbound_event",
"by": "onboard.voided",
"nativeStatus": null
},
{
"from": "*",
"to": "cancelled",
"trigger": "user_action",
"by": "remove_line"
}
]
},
{
"dimension": "payment",
"values": [
{
"value": "not_due",
"terminal": false
},
{
"value": "pending",
"terminal": false
},
{
"value": "authorised",
"terminal": false
},
{
"value": "partially_paid",
"terminal": false
},
{
"value": "paid",
"terminal": false
},
{
"value": "refunded",
"terminal": true
},
{
"value": "failed",
"terminal": false
}
],
"transitions": [
{
"from": "*",
"to": "authorised",
"trigger": "inbound_event",
"by": "payment.authorised",
"nativeStatus": null
},
{
"from": "*",
"to": "partially_paid",
"trigger": "inbound_event",
"by": "payment.partially_paid",
"nativeStatus": null
},
{
"from": "*",
"to": "paid",
"trigger": "inbound_event",
"by": "payment.captured",
"nativeStatus": null
},
{
"from": "*",
"to": "failed",
"trigger": "inbound_event",
"by": "payment.failed",
"nativeStatus": null
},
{
"from": "*",
"to": "refunded",
"trigger": "inbound_event",
"by": "payment.refunded",
"nativeStatus": null
}
]
},
{
"dimension": "fulfilment",
"values": [
{
"value": "not_started",
"terminal": false
},
{
"value": "requested",
"terminal": false
},
{
"value": "confirmed",
"terminal": false
},
{
"value": "fulfilled",
"terminal": true
},
{
"value": "not_fulfilled",
"terminal": true
},
{
"value": "cancelled",
"terminal": true
}
],
"transitions": [
{
"from": "*",
"to": "requested",
"trigger": "inbound_event",
"by": "booking.accepted",
"nativeStatus": null
},
{
"from": "*",
"to": "confirmed",
"trigger": "inbound_event",
"by": "booking.confirmed",
"nativeStatus": null
},
{
"from": "*",
"to": "not_fulfilled",
"trigger": "inbound_event",
"by": "booking.rejected",
"nativeStatus": null
},
{
"from": "*",
"to": "confirmed",
"trigger": "inbound_event",
"by": "booking.modified",
"nativeStatus": null
},
{
"from": "*",
"to": "cancelled",
"trigger": "inbound_event",
"by": "booking.cancelled",
"nativeStatus": null
},
{
"from": "*",
"to": "fulfilled",
"trigger": "inbound_event",
"by": "onboard.posted",
"nativeStatus": null
},
{
"from": "*",
"to": "cancelled",
"trigger": "inbound_event",
"by": "onboard.voided",
"nativeStatus": null
},
{
"from": "*",
"to": "confirmed",
"trigger": "inbound_event",
"by": "service.confirmed",
"nativeStatus": null
},
{
"from": "*",
"to": "fulfilled",
"trigger": "inbound_event",
"by": "service.fulfilled",
"nativeStatus": null
},
{
"from": "*",
"to": "not_fulfilled",
"trigger": "inbound_event",
"by": "service.not_fulfilled",
"nativeStatus": null
}
]
},
{
"dimension": "billing",
"values": [
{
"value": "not_billed",
"terminal": false
},
{
"value": "invoiced",
"terminal": false
},
{
"value": "credited",
"terminal": false
},
{
"value": "closed",
"terminal": true
}
],
"transitions": [
{
"from": "*",
"to": "invoiced",
"trigger": "inbound_event",
"by": "billing.invoiced",
"nativeStatus": null
},
{
"from": "*",
"to": "credited",
"trigger": "inbound_event",
"by": "billing.credited",
"nativeStatus": null
},
{
"from": "*",
"to": "closed",
"trigger": "inbound_event",
"by": "billing.closed",
"nativeStatus": null
}
]
}
]
}
]
}
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | not_enabled | Order orchestration is not enabled for the tenant. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |
Read the status model of one object
/order-orchestration/status-models/{object}Parameters
| Name | In | Required | Notes |
|---|---|---|---|
object | path | yes | one of trip, purchase_order, order_line |
Response 200
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | not_found | The trip, purchase order, quotation or configuration item does not exist. |
| 404 | not_enabled | Order orchestration is not enabled for the tenant. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |
Test how an inbound status would be applied
/order-orchestration/status-models/testHeaders: Idempotency-Key, plus X-Request-Id.
Request body
| Field | Type | Required | Notes |
|---|---|---|---|
system | string | yes | min 1 chars |
eventType | string | ||
nativeStatus | string | max 100 chars | |
current | object | ||
current.billing | enum: not_billed, invoiced, credited, closed | ||
current.commercial | enum: quotation, option, booked, cancelled, frozen, closed | ||
current.fulfilment | enum: not_started, requested, confirmed, fulfilled, not_fulfilled, cancelled | ||
current.payment | enum: not_due, pending, authorised, partially_paid, paid, refunded, failed |
Response 200
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | not_enabled | Order orchestration is not enabled for the tenant. |
| 409 | idempotency_in_progress | A request with this Idempotency-Key is still running. Retry after the Retry-After interval. |
| 422 | idempotency_key_reused | The Idempotency-Key was used for a different request. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |
List connected systems
/order-orchestration/systemsParameters
| Name | In | Required | Notes |
|---|---|---|---|
role | query | source | |
status | query | active | |
at | query | Evaluate effective dates at this time. | |
version | query | A configuration version number, latest or published. |
Response 200
/order-orchestration/systemsList connected systemscurl -X GET "$BASE/order-orchestration/systems" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Request-Id: req-0024"
HTTP/1.1 200
X-Request-Id: req-0024
{
"version": 0,
"state": "published",
"source": "tenant_file",
"items": [
{
"id": "reservation",
"name": "Reservation system",
"roles": [
"target"
],
"status": "active",
"effectiveFrom": null,
"route": {
"kind": "direct",
"via": null
},
"contract": null,
"ownerTeam": null,
"description": null,
"domains": [
"reservation"
],
"masterOf": [],
"referencesKept": [],
"baseReference": null,
"channels": [],
"capabilities": [],
"fieldMappings": [],
"executes": [
{
"ruleId": "anchor-reservation",
"name": "anchor-reservation",
"process": "*",
"window": "in_force"
}
],
"notifiedBy": [],
"statusMappings": [],
"events": [
{
"type": "create.requested",
"direction": "outbound",
"name": "create request",
"closes": [],
"threshold": {
"ruleId": "reservation-feedback-late",
"afterSeconds": 300,
"severity": "critical"
}
},
{
"type": "modify.requested",
"direction": "outbound",
"name": "modify request",
"closes": [],
"threshold": {
"ruleId": "reservation-feedback-late",
"afterSeconds": 300,
"severity": "critical"
}
},
{
"type": "cancel.requested",
"direction": "outbound",
"name": "cancel request",
"closes": [],
"threshold": {
"ruleId": "reservation-feedback-late",
"afterSeconds": 300,
"severity": "critical"
}
},
{
"type": "booking.confirmed",
"direction": "inbound",
"name": "booking.confirmed",
"closes": [
"create"
],
"threshold": null
},
{
"type": "booking.rejected",
"direction": "inbound",
"name": "booking.rejected",
"closes": [
"create"
],
"threshold": null
},
{
"type": "booking.modified",
"direction": "inbound",
"name": "booking.modified",
"closes": [
"modify"
],
"threshold": null
},
{
"type": "booking.cancelled",
"direction": "inbound",
"name": "booking.cancelled",
"closes": [
"cancel"
],
"threshold": null
}
]
},
{
"id": "onboard",
"name": "Onboard POS and guest account",
"roles": [
"target"
],
"status": "active",
"effectiveFrom": null,
"route": {
"kind": "direct",
"via": null
},
"contract": null,
"ownerTeam": null,
"description": null,
"domains": [
"onboard"
],
"masterOf": [],
"referencesKept": [],
"baseReference": null,
"channels": [],
"capabilities": [],
"fieldMappings": [],
"executes": [
{
"ruleId": "onboard-moment",
"name": "onboard-moment",
"process": "*",
"window": "in_force"
},
{
"ruleId": "excursions-onboard",
"name": "excursions-onboard",
"process": "*",
"window": "in_force"
},
{
"ruleId": "beverage-phase1",
"name": "beverage-phase1",
"process": "create",
"window": "in_force"
}
],
"notifiedBy": [],
"statusMappings": [],
"events": [
{
"type": "create.requested",
"direction": "outbound",
"name": "create request",
"closes": [],
"threshold": {
"ruleId": "feedback-late",
"afterSeconds": 3600,
"severity": "warning"
}
},
{
"type": "onboard.posted",
"direction": "inbound",
"name": "onboard.posted",
"closes": [
"create"
],
"threshold": null
}
]
},
{
"id": "excursions",
"name": "Excursion system",
"roles": [
"target"
],
"status": "active",
"effectiveFrom": null,
"route": {
"kind": "direct",
"via": null
},
"contract": null,
"ownerTeam": null,
"description": null,
"domains": [
"excursions"
],
"masterOf": [],
"referencesKept": [],
"baseReference": null,
"channels": [],
"capabilities": [],
"fieldMappings": [],
"executes": [
{
"ruleId": "excursions",
"name": "excursions",
"process": "*",
"window": "in_force"
}
],
"notifiedBy": [],
"statusMappings": [],
"events": [
{
"type": "create.requested",
"direction": "outbound",
"name": "create request",
"closes": [],
"threshold": {
"ruleId": "feedback-late",
"afterSeconds": 3600,
"severity": "warning"
}
},
{
"type": "service.confirmed",
"direction": "inbound",
"name": "service.confirmed",
"closes": [
"create"
],
"threshold": null
}
]
},
{
"id": "crm",
"name": "Customer and agency master",
"roles": [
"target"
],
"status": "active",
"effectiveFrom": null,
"route": {
"kind": "direct",
"via": null
},
"contract": null,
"ownerTeam": null,
"description": null,
"domains": [
"crm",
"loyalty"
],
"masterOf": [],
"referencesKept": [],
"baseReference": null,
"channels": [],
"capabilities": [],
"fieldMappings": [],
"executes": [],
"notifiedBy": [],
"statusMappings": [],
"events": []
},
{
"id": "finance",
"name": "Finance and billing",
"roles": [
"target"
],
"status": "active",
"effectiveFrom": null,
"route": {
"kind": "direct",
"via": null
},
"contract": null,
"ownerTeam": null,
"description": null,
"domains": [
"finance"
],
"masterOf": [],
"referencesKept": [],
"baseReference": null,
"channels": [],
"capabilities": [],
"fieldMappings": [],
"executes": [
{
"ruleId": "billing-finance",
"name": "billing-finance",
"process": "billing",
"window": "in_force"
}
],
"notifiedBy": [],
"statusMappings": [],
"events": []
}
]
}
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | not_enabled | Order orchestration is not enabled for the tenant. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |
Read a connected system and its rules
/order-orchestration/systems/{id}Parameters
| Name | In | Required | Notes |
|---|---|---|---|
id | path | yes |
Response 200
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | not_found | The trip, purchase order, quotation or configuration item does not exist. |
| 404 | not_enabled | Order orchestration is not enabled for the tenant. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |