Skip to main content

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.

OperationEndpoint
Read the effective configurationGET /order-orchestration/config
Publish a new configuration versionPUT /order-orchestration/config
Read the configuration history and audit trailGET /order-orchestration/config/history
Roll back to an earlier configuration versionPOST /order-orchestration/config/rollback
Validate a configuration without publishing itPOST /order-orchestration/config/validate
Read the event catalogueGET /order-orchestration/event-types
Read one event typeGET /order-orchestration/event-types/{type}
Resolve which system executes a processGET /order-orchestration/ownership/resolve
Read the payment rulesGET /order-orchestration/payment-rules
Test a payment allocationPOST /order-orchestration/payment-rules/test
List execution-ownership rulesGET /order-orchestration/rules
Read an execution-ownership ruleGET /order-orchestration/rules/{id}
Read the status modelsGET /order-orchestration/status-models
Read the status model of one objectGET /order-orchestration/status-models/{object}
Test how an inbound status would be appliedPOST /order-orchestration/status-models/test
List connected systemsGET /order-orchestration/systems
Read a connected system and its rulesGET /order-orchestration/systems/{id}

Read the effective configuration​

GET/order-orchestration/config

Response 200

GET/order-orchestration/configRead the effective orchestration configuration
Request
curl -X GET "$BASE/order-orchestration/config" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Request-Id: req-0030"
Response
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
StatusCodeMeaning
400invalid_requestThe request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details.
401unauthenticatedThe bearer token is missing, invalid, expired or minted for another purpose.
403scope_forbiddenThe token is scoped to an agency or an access scope; this surface requires an unscoped tenant token.
404not_enabledOrder orchestration is not enabled for the tenant.
500internalUnexpected failure. Retry with the same Idempotency-Key.

Publish a new configuration version​

PUT/order-orchestration/config

Validates 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

FieldTypeRequiredNotes
configobjectyes
config.channelsarray of stringyesat least 1
config.event_cataloguearray of object
config.event_catalogue[].carries_external_refbooleandefault false
config.event_catalogue[].consumersarray of string
config.event_catalogue[].descriptionstring
config.event_catalogue[].namestring1–120 chars
config.event_catalogue[].native_statusstring1–100 chars
config.event_catalogue[].schema_versionstring1–20 chars
config.event_catalogue[].scopeenum: line, purchase_orderdefault "line"
config.event_catalogue[].setsobject
config.event_catalogue[].statusenum: active, deprecated
config.event_catalogue[].systemsarray of stringat least 1
config.event_catalogue[].typestringyespattern ^[a-z][a-z0-9_]*(\.[a-z][a-z0-9_]*)+$
config.feedbackobject
config.feedback.alert_rulesarray of object
config.feedback.expectationsarray of object
config.line_availabilityarray of object
config.line_availability[].channelsarray of stringyesat least 1
config.line_availability[].notestringmax 500 chars
config.line_availability[].product_typestringyesmin 1 chars
config.marketsarray of string
config.momentsarray of stringyesat least 1
config.outbound_eventsarray of object
config.outbound_events[].consumersarray of string
config.outbound_events[].descriptionstringmax 500 chars
config.outbound_events[].namestring1–120 chars
config.outbound_events[].schema_versionstring1–20 chars
config.outbound_events[].statusenum: active, deprecated
config.outbound_events[].typestringyespattern ^[a-z][a-z0-9_]*(\.[a-z][a-z0-9_]*)+$
config.ownership_rulesarray of object
config.ownership_rules[].effective_fromstring (date-time)
config.ownership_rules[].effective_untilstring (date-time)
config.ownership_rules[].idstringyespattern ^[a-z0-9][a-z0-9_.-]*$
config.ownership_rules[].namestring1–160 chars
config.ownership_rules[].notestringmax 500 chars
config.ownership_rules[].notifyarray of object
config.ownership_rules[].on_failureobject
config.ownership_rules[].ownerstringyesmin 1 chars
config.ownership_rules[].priorityintegerdefault 0
config.ownership_rules[].processstringyesmin 1 chars
config.ownership_rules[].whenobject
config.paymentsobject
config.payments.fullPaymentThresholdsarray of object
config.payments.overpaymentenum: hold_unallocated, rejectdefault "hold_unallocated"
config.payments.passengerSplitenum: equal, by_unit
config.payments.reallocateOnChangebooleandefault false
config.payments.rulesarray of object
config.payments.scenariosarray of objectyesat least 1
config.processesarray of stringdefault ["create","modify","cancel","payment","fulfilment","billing"]
config.quotationsobject
config.quotations.inactivity_daysinteger> 0; default 30
config.quotations.required_fieldsobject
config.systemsarray of object
config.systems[].base_referencestring1–200 chars
config.systems[].capabilitiesarray of object
config.systems[].channelsarray of string
config.systems[].contractobject
config.systems[].descriptionstringmax 500 chars
config.systems[].domainsarray of string
config.systems[].effective_fromstring (date-time)
config.systems[].field_mappingsarray of object
config.systems[].idstringyespattern ^[a-z][a-z0-9_-]*$
config.systems[].labelstringyesmin 1 chars
config.systems[].master_ofarray of string
config.systems[].owner_teamstring1–120 chars
config.systems[].references_keptarray of string
config.systems[].rolesarray of source, channel, targetat least 1
config.systems[].routeobject
config.systems[].statusenum: active, planned, retired
config.tripobjectyes
config.trip.anchor_product_typesarray of stringyesat least 1
config.trip.id_prefixstringpattern ^[A-Z][A-Z0-9]{0,5}$; default "TRP"
config.versioninteger≥ 0; default 0
expectedVersioninteger≥ 0
actorobjectyes
actor.idstringyesmin 1 chars
actor.namestring
actor.rolestring
actor.channelenum: form, change_desk, api, system, seedyes
reasonstringmax 2000 chars

Response 200

PUT/order-orchestration/configPublish the configuration with the new channel
Request
curl -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"
}'
Response
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
StatusCodeMeaning
400invalid_requestThe request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details.
401unauthenticatedThe bearer token is missing, invalid, expired or minted for another purpose.
403scope_forbiddenThe token is scoped to an agency or an access scope; this surface requires an unscoped tenant token.
404not_enabledOrder orchestration is not enabled for the tenant.
409version_conflictThe expectedVersion does not match the current version.
409idempotency_in_progressA request with this Idempotency-Key is still running. Retry after the Retry-After interval.
422invalid_configThe configuration failed validation; see issues.
422idempotency_key_reusedThe Idempotency-Key was used for a different request.
500internalUnexpected failure. Retry with the same Idempotency-Key.

Read the configuration history and audit trail​

GET/order-orchestration/config/history

Response 200

GET/order-orchestration/config/historyRead the configuration history and audit trail
Request
curl -X GET "$BASE/order-orchestration/config/history" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Request-Id: req-0034"
Response
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
StatusCodeMeaning
400invalid_requestThe request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details.
401unauthenticatedThe bearer token is missing, invalid, expired or minted for another purpose.
403scope_forbiddenThe token is scoped to an agency or an access scope; this surface requires an unscoped tenant token.
404not_enabledOrder orchestration is not enabled for the tenant.
500internalUnexpected failure. Retry with the same Idempotency-Key.

Roll back to an earlier configuration version​

POST/order-orchestration/config/rollback

A rollback is a new version whose document equals the older one.

Headers: Idempotency-Key, plus X-Request-Id.

Request body

FieldTypeRequiredNotes
toVersionintegeryes≥ 1
expectedVersioninteger≥ 0
actorobjectyes
actor.idstringyesmin 1 chars
actor.namestring
actor.rolestring
actor.channelenum: form, change_desk, api, system, seedyes
reasonstringmax 2000 chars

Response 200

Errors
StatusCodeMeaning
400invalid_requestThe request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details.
401unauthenticatedThe bearer token is missing, invalid, expired or minted for another purpose.
403scope_forbiddenThe token is scoped to an agency or an access scope; this surface requires an unscoped tenant token.
404not_foundThe trip, purchase order, quotation or configuration item does not exist.
404not_enabledOrder orchestration is not enabled for the tenant.
409version_conflictThe expectedVersion does not match the current version.
409idempotency_in_progressA request with this Idempotency-Key is still running. Retry after the Retry-After interval.
422idempotency_key_reusedThe Idempotency-Key was used for a different request.
500internalUnexpected failure. Retry with the same Idempotency-Key.

Validate a configuration without publishing it​

POST/order-orchestration/config/validate

Headers: Idempotency-Key, plus X-Request-Id.

Request body

FieldTypeRequiredNotes
configobjectyes
config.channelsarray of stringyesat least 1
config.event_cataloguearray of object
config.event_catalogue[].carries_external_refbooleandefault false
config.event_catalogue[].consumersarray of string
config.event_catalogue[].descriptionstring
config.event_catalogue[].namestring1–120 chars
config.event_catalogue[].native_statusstring1–100 chars
config.event_catalogue[].schema_versionstring1–20 chars
config.event_catalogue[].scopeenum: line, purchase_orderdefault "line"
config.event_catalogue[].setsobject
config.event_catalogue[].statusenum: active, deprecated
config.event_catalogue[].systemsarray of stringat least 1
config.event_catalogue[].typestringyespattern ^[a-z][a-z0-9_]*(\.[a-z][a-z0-9_]*)+$
config.feedbackobject
config.feedback.alert_rulesarray of object
config.feedback.expectationsarray of object
config.line_availabilityarray of object
config.line_availability[].channelsarray of stringyesat least 1
config.line_availability[].notestringmax 500 chars
config.line_availability[].product_typestringyesmin 1 chars
config.marketsarray of string
config.momentsarray of stringyesat least 1
config.outbound_eventsarray of object
config.outbound_events[].consumersarray of string
config.outbound_events[].descriptionstringmax 500 chars
config.outbound_events[].namestring1–120 chars
config.outbound_events[].schema_versionstring1–20 chars
config.outbound_events[].statusenum: active, deprecated
config.outbound_events[].typestringyespattern ^[a-z][a-z0-9_]*(\.[a-z][a-z0-9_]*)+$
config.ownership_rulesarray of object
config.ownership_rules[].effective_fromstring (date-time)
config.ownership_rules[].effective_untilstring (date-time)
config.ownership_rules[].idstringyespattern ^[a-z0-9][a-z0-9_.-]*$
config.ownership_rules[].namestring1–160 chars
config.ownership_rules[].notestringmax 500 chars
config.ownership_rules[].notifyarray of object
config.ownership_rules[].on_failureobject
config.ownership_rules[].ownerstringyesmin 1 chars
config.ownership_rules[].priorityintegerdefault 0
config.ownership_rules[].processstringyesmin 1 chars
config.ownership_rules[].whenobject
config.paymentsobject
config.payments.fullPaymentThresholdsarray of object
config.payments.overpaymentenum: hold_unallocated, rejectdefault "hold_unallocated"
config.payments.passengerSplitenum: equal, by_unit
config.payments.reallocateOnChangebooleandefault false
config.payments.rulesarray of object
config.payments.scenariosarray of objectyesat least 1
config.processesarray of stringdefault ["create","modify","cancel","payment","fulfilment","billing"]
config.quotationsobject
config.quotations.inactivity_daysinteger> 0; default 30
config.quotations.required_fieldsobject
config.systemsarray of object
config.systems[].base_referencestring1–200 chars
config.systems[].capabilitiesarray of object
config.systems[].channelsarray of string
config.systems[].contractobject
config.systems[].descriptionstringmax 500 chars
config.systems[].domainsarray of string
config.systems[].effective_fromstring (date-time)
config.systems[].field_mappingsarray of object
config.systems[].idstringyespattern ^[a-z][a-z0-9_-]*$
config.systems[].labelstringyesmin 1 chars
config.systems[].master_ofarray of string
config.systems[].owner_teamstring1–120 chars
config.systems[].references_keptarray of string
config.systems[].rolesarray of source, channel, targetat least 1
config.systems[].routeobject
config.systems[].statusenum: active, planned, retired
config.tripobjectyes
config.trip.anchor_product_typesarray of stringyesat least 1
config.trip.id_prefixstringpattern ^[A-Z][A-Z0-9]{0,5}$; default "TRP"
config.versioninteger≥ 0; default 0

Response 200

POST/order-orchestration/config/validateDry-run a configuration that registers a new channel
Request
curl -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": []
}
}'
Response
HTTP/1.1 200
X-Request-Id: req-0031
{
"ok": true,
"issues": []
}
POST/order-orchestration/config/validateDry-run a configuration with a rule that names an unknown system
Request
curl -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": []
}
}'
Response
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
StatusCodeMeaning
400invalid_requestThe request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details.
401unauthenticatedThe bearer token is missing, invalid, expired or minted for another purpose.
403scope_forbiddenThe token is scoped to an agency or an access scope; this surface requires an unscoped tenant token.
404not_enabledOrder orchestration is not enabled for the tenant.
409idempotency_in_progressA request with this Idempotency-Key is still running. Retry after the Retry-After interval.
422idempotency_key_reusedThe Idempotency-Key was used for a different request.
500internalUnexpected failure. Retry with the same Idempotency-Key.

Read the event catalogue​

GET/order-orchestration/event-types

Parameters

NameInRequiredNotes
directionqueryinbound or outbound.
systemqueryOnly types mapped for this system.

Response 200

GET/order-orchestration/event-typesRead the inbound event catalogue
Request
curl -X GET "$BASE/order-orchestration/event-types" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Request-Id: req-0028"
Response
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
StatusCodeMeaning
400invalid_requestThe request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details.
401unauthenticatedThe bearer token is missing, invalid, expired or minted for another purpose.
403scope_forbiddenThe token is scoped to an agency or an access scope; this surface requires an unscoped tenant token.
404not_enabledOrder orchestration is not enabled for the tenant.
500internalUnexpected failure. Retry with the same Idempotency-Key.

Read one event type​

GET/order-orchestration/event-types/{type}

Parameters

NameInRequiredNotes
typepathyes

Response 200

Errors
StatusCodeMeaning
400invalid_requestThe request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details.
401unauthenticatedThe bearer token is missing, invalid, expired or minted for another purpose.
403scope_forbiddenThe token is scoped to an agency or an access scope; this surface requires an unscoped tenant token.
404not_foundThe trip, purchase order, quotation or configuration item does not exist.
404not_enabledOrder orchestration is not enabled for the tenant.
500internalUnexpected failure. Retry with the same Idempotency-Key.

Resolve which system executes a process​

GET/order-orchestration/ownership/resolve

Evaluates the ownership rules for a process, product type, channel and moment and returns the owner with the trace of every rule considered.

Parameters

NameInRequiredNotes
processqueryyescreate
productTypequeryyes
channelqueryyes
momentqueryyes
marketquery
atquery

Response 200

GET/order-orchestration/ownership/resolveResolve which system owns a process
Request
curl -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"
Response
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
StatusCodeMeaning
400invalid_requestThe request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details.
401unauthenticatedThe bearer token is missing, invalid, expired or minted for another purpose.
403scope_forbiddenThe token is scoped to an agency or an access scope; this surface requires an unscoped tenant token.
404not_enabledOrder orchestration is not enabled for the tenant.
500internalUnexpected failure. Retry with the same Idempotency-Key.

Read the payment rules​

GET/order-orchestration/payment-rules

Response 200

Errors
StatusCodeMeaning
400invalid_requestThe request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details.
401unauthenticatedThe bearer token is missing, invalid, expired or minted for another purpose.
403scope_forbiddenThe token is scoped to an agency or an access scope; this surface requires an unscoped tenant token.
404not_enabledOrder orchestration is not enabled for the tenant.
500internalUnexpected failure. Retry with the same Idempotency-Key.

Test a payment allocation​

POST/order-orchestration/payment-rules/test

Shows 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
StatusCodeMeaning
400invalid_requestThe request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details.
401unauthenticatedThe bearer token is missing, invalid, expired or minted for another purpose.
403scope_forbiddenThe token is scoped to an agency or an access scope; this surface requires an unscoped tenant token.
404not_enabledOrder orchestration is not enabled for the tenant.
409idempotency_in_progressA request with this Idempotency-Key is still running. Retry after the Retry-After interval.
422idempotency_key_reusedThe Idempotency-Key was used for a different request.
500internalUnexpected failure. Retry with the same Idempotency-Key.

List execution-ownership rules​

GET/order-orchestration/rules

Parameters

NameInRequiredNotes
processqueryOnly rules for this process.
systemqueryOnly rules executed by this system.

Response 200

GET/order-orchestration/rulesList execution-ownership rules
Request
curl -X GET "$BASE/order-orchestration/rules" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Request-Id: req-0025"
Response
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
StatusCodeMeaning
400invalid_requestThe request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details.
401unauthenticatedThe bearer token is missing, invalid, expired or minted for another purpose.
403scope_forbiddenThe token is scoped to an agency or an access scope; this surface requires an unscoped tenant token.
404not_enabledOrder orchestration is not enabled for the tenant.
500internalUnexpected failure. Retry with the same Idempotency-Key.

Read an execution-ownership rule​

GET/order-orchestration/rules/{id}

Parameters

NameInRequiredNotes
idpathyes

Response 200

Errors
StatusCodeMeaning
400invalid_requestThe request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details.
401unauthenticatedThe bearer token is missing, invalid, expired or minted for another purpose.
403scope_forbiddenThe token is scoped to an agency or an access scope; this surface requires an unscoped tenant token.
404not_foundThe trip, purchase order, quotation or configuration item does not exist.
404not_enabledOrder orchestration is not enabled for the tenant.
500internalUnexpected failure. Retry with the same Idempotency-Key.

Read the status models​

GET/order-orchestration/status-models

Response 200

GET/order-orchestration/status-modelsRead the status models
Request
curl -X GET "$BASE/order-orchestration/status-models" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Request-Id: req-0027"
Response
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
StatusCodeMeaning
400invalid_requestThe request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details.
401unauthenticatedThe bearer token is missing, invalid, expired or minted for another purpose.
403scope_forbiddenThe token is scoped to an agency or an access scope; this surface requires an unscoped tenant token.
404not_enabledOrder orchestration is not enabled for the tenant.
500internalUnexpected failure. Retry with the same Idempotency-Key.

Read the status model of one object​

GET/order-orchestration/status-models/{object}

Parameters

NameInRequiredNotes
objectpathyesone of trip, purchase_order, order_line

Response 200

Errors
StatusCodeMeaning
400invalid_requestThe request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details.
401unauthenticatedThe bearer token is missing, invalid, expired or minted for another purpose.
403scope_forbiddenThe token is scoped to an agency or an access scope; this surface requires an unscoped tenant token.
404not_foundThe trip, purchase order, quotation or configuration item does not exist.
404not_enabledOrder orchestration is not enabled for the tenant.
500internalUnexpected failure. Retry with the same Idempotency-Key.

Test how an inbound status would be applied​

POST/order-orchestration/status-models/test

Headers: Idempotency-Key, plus X-Request-Id.

Request body

FieldTypeRequiredNotes
systemstringyesmin 1 chars
eventTypestring
nativeStatusstringmax 100 chars
currentobject
current.billingenum: not_billed, invoiced, credited, closed
current.commercialenum: quotation, option, booked, cancelled, frozen, closed
current.fulfilmentenum: not_started, requested, confirmed, fulfilled, not_fulfilled, cancelled
current.paymentenum: not_due, pending, authorised, partially_paid, paid, refunded, failed

Response 200

Errors
StatusCodeMeaning
400invalid_requestThe request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details.
401unauthenticatedThe bearer token is missing, invalid, expired or minted for another purpose.
403scope_forbiddenThe token is scoped to an agency or an access scope; this surface requires an unscoped tenant token.
404not_enabledOrder orchestration is not enabled for the tenant.
409idempotency_in_progressA request with this Idempotency-Key is still running. Retry after the Retry-After interval.
422idempotency_key_reusedThe Idempotency-Key was used for a different request.
500internalUnexpected failure. Retry with the same Idempotency-Key.

List connected systems​

GET/order-orchestration/systems

Parameters

NameInRequiredNotes
rolequerysource
statusqueryactive
atqueryEvaluate effective dates at this time.
versionqueryA configuration version number, latest or published.

Response 200

GET/order-orchestration/systemsList connected systems
Request
curl -X GET "$BASE/order-orchestration/systems" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Request-Id: req-0024"
Response
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
StatusCodeMeaning
400invalid_requestThe request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details.
401unauthenticatedThe bearer token is missing, invalid, expired or minted for another purpose.
403scope_forbiddenThe token is scoped to an agency or an access scope; this surface requires an unscoped tenant token.
404not_enabledOrder orchestration is not enabled for the tenant.
500internalUnexpected failure. Retry with the same Idempotency-Key.

Read a connected system and its rules​

GET/order-orchestration/systems/{id}

Parameters

NameInRequiredNotes
idpathyes

Response 200

Errors
StatusCodeMeaning
400invalid_requestThe request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details.
401unauthenticatedThe bearer token is missing, invalid, expired or minted for another purpose.
403scope_forbiddenThe token is scoped to an agency or an access scope; this surface requires an unscoped tenant token.
404not_foundThe trip, purchase order, quotation or configuration item does not exist.
404not_enabledOrder orchestration is not enabled for the tenant.
500internalUnexpected failure. Retry with the same Idempotency-Key.