Skip to main content

Mass change after a cancelled departure

The 12 April 2027 departure is cancelled for a technical reason. Every guest is moved to the 19 April departure at the price they paid. The requests and responses were captured from the service, with three booked trips on the cancelled departure.

1. Record the disruption​

POST/oms-ops/disruptionsRecord a cancelled departure
Request
curl -X POST "$BASE/oms-ops/disruptions" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Request-Id: req-0041" \
-H "Content-Type: application/json" \
-d '{
"kind": "departure_cancelled",
"reasonCode": "ship_technical",
"description": "Departure of 12 April 2027 cancelled; guests are offered the 19 April departure.",
"scope": {
"departureRefs": [
"MED7-2027-04-12"
],
"productKinds": [
"cruise"
]
},
"sourceSystem": "reservation",
"actor": {
"id": "ops-0007",
"name": "Paolo Ricci",
"role": "ops_manager",
"channel": "back_office"
}
}'
Response
HTTP/1.1 201
X-Request-Id: req-0041
{
"disruptionId": "dis_6aa95d68-a42d-4d47-8170-95390ba977c3",
"tenantId": "meridian",
"kind": "departure_cancelled",
"origin": "disruption",
"reasonCode": "ship_technical",
"description": "Departure of 12 April 2027 cancelled; guests are offered the 19 April departure.",
"scope": {
"departureRefs": [
"MED7-2027-04-12"
],
"productRefs": [],
"productKinds": [
"cruise"
],
"tripIds": [],
"lineStatuses": []
},
"occurredAt": "2026-11-02T09:30:17.000Z",
"sourceSystem": "reservation",
"status": "open",
"actor": {
"id": "ops-0007",
"name": "Paolo Ricci",
"role": "ops_manager",
"channel": "back_office"
},
"createdAt": "2026-11-02T09:30:17.000Z",
"updatedAt": "2026-11-02T09:30:17.000Z"
}

2. Plan the re-accommodation​

The plan selects the affected trips and lines, records the version of each line, and previews every trip. Nothing is applied yet. The response carries the commitToken.

POST/oms-ops/disruptions/dis_6aa95d68-a42d-4d47-8170-95390ba977c3/mass-changesPlan the re-accommodation with same-price protection
Request
curl -X POST "$BASE/oms-ops/disruptions/dis_6aa95d68-a42d-4d47-8170-95390ba977c3/mass-changes" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Request-Id: req-0042" \
-H "Content-Type: application/json" \
-d '{
"spec": {
"kind": "re_accommodation",
"targetDepartureRef": "MED7-2027-04-19",
"categoryMapping": {},
"protection": {
"ruleId": "same-price"
},
"targetPrices": {
"BALCONY-B2": {
"amountMinor": 252000
}
}
},
"actor": {
"id": "ops-0007",
"name": "Paolo Ricci",
"role": "ops_manager",
"channel": "back_office"
},
"reason": "Move affected guests to the next departure"
}'
Response
HTTP/1.1 201
X-Request-Id: req-0042
{
"change": {
"changeId": "mc_510291cb-9863-4349-b300-eaaf0d44f0d6",
"tenantId": "meridian",
"disruptionId": "dis_6aa95d68-a42d-4d47-8170-95390ba977c3",
"kind": "re_accommodation",
"status": "planned",
"spec": {
"kind": "re_accommodation",
"targetDepartureRef": "MED7-2027-04-19",
"categoryMapping": {},
"protection": {
"ruleId": "same-price"
},
"targetPrices": {
"BALCONY-B2": {
"amountMinor": 252000,
"perTraveller": false
}
}
},
"rollbackOf": null,
"rolledBackBy": null,
"commitToken": "3f1d37d6df1a7b076339f1f93da107f4",
"population": {
"trips": 3,
"lines": 3
},
"counts": {
"total": 3,
"pending": 3,
"applied": 0,
"failed": 0,
"needs_person": 0,
"skipped": 0,
"rolled_back": 0,
"rollback_conflict": 0
},
"actor": {
"id": "ops-0007",
"name": "Paolo Ricci",
"role": "ops_manager",
"channel": "back_office"
},
"reason": "Move affected guests to the next departure",
"createdAt": "2026-11-02T09:30:54.000Z",
"updatedAt": "2026-11-02T09:30:54.000Z",
"startedAt": null,
"finishedAt": null,
"throughputPerSecond": null
},
"preview": [
{
"changeId": "mc_510291cb-9863-4349-b300-eaaf0d44f0d6",
"tripId": "TRP-F0A893B4CB27",
"status": "pending",
"attempts": 0,
"error": null,
"plan": {
"lines": [
{
"lineId": "L-4364586D534F",
"expectedVersion": 3
}
]
},
"before": null,
"after": null,
"outcome": null,
"updatedAt": "2026-11-02T09:30:54.000Z"
},
{
"changeId": "mc_510291cb-9863-4349-b300-eaaf0d44f0d6",
"tripId": "TRP-976512C541CF",
"status": "pending",
"attempts": 0,
"error": null,
"plan": {
"lines": [
{
"lineId": "L-A349D3520C1B",
"expectedVersion": 3
}
]
},
"before": null,
"after": null,
"outcome": null,
"updatedAt": "2026-11-02T09:30:54.000Z"
},
{
"changeId": "mc_510291cb-9863-4349-b300-eaaf0d44f0d6",
"tripId": "TRP-8232B7FF83C4",
"status": "pending",
"attempts": 0,
"error": null,
"plan": {
"lines": [
{
"lineId": "L-0A54E44D0375",
"expectedVersion": 4
}
]
},
"before": null,
"after": null,
"outcome": null,
"updatedAt": "2026-11-02T09:30:54.000Z"
}
]
}

3. Commit​

Committing with the token applies the change trip by trip. A line that changed since the plan fails its item instead of being overwritten.

POST/oms-ops/mass-changes/mc_510291cb-9863-4349-b300-eaaf0d44f0d6/commitCommit the planned change with its commit token
Request
curl -X POST "$BASE/oms-ops/mass-changes/mc_510291cb-9863-4349-b300-eaaf0d44f0d6/commit" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Request-Id: req-0043" \
-H "Content-Type: application/json" \
-d '{
"commitToken": "3f1d37d6df1a7b076339f1f93da107f4",
"actor": {
"id": "ops-0007",
"name": "Paolo Ricci",
"role": "ops_manager",
"channel": "back_office"
}
}'
Response
HTTP/1.1 200
X-Request-Id: req-0043
{
"kind": "re_accommodation",
"spec": {
"kind": "re_accommodation",
"protection": {
"ruleId": "same-price"
},
"targetPrices": {
"BALCONY-B2": {
"amountMinor": 252000,
"perTraveller": false
}
},
"categoryMapping": {},
"targetDepartureRef": "MED7-2027-04-19"
},
"actor": {
"id": "ops-0007",
"name": "Paolo Ricci",
"role": "ops_manager",
"channel": "back_office"
},
"counts": {
"total": 3,
"pending": 0,
"applied": 3,
"failed": 0,
"needs_person": 0,
"skipped": 0,
"rolled_back": 0,
"rollback_conflict": 0
},
"reason": "Move affected guests to the next departure",
"status": "completed",
"changeId": "mc_510291cb-9863-4349-b300-eaaf0d44f0d6",
"tenantId": "meridian",
"createdAt": "2026-11-02T09:30:54.000Z",
"startedAt": "2026-11-02T09:31:31.000Z",
"updatedAt": "2026-11-02T09:30:54.000Z",
"finishedAt": "2026-11-02T09:31:31.000Z",
"population": {
"lines": 3,
"trips": 3
},
"rollbackOf": null,
"commitToken": "3f1d37d6df1a7b076339f1f93da107f4",
"disruptionId": "dis_6aa95d68-a42d-4d47-8170-95390ba977c3",
"rolledBackBy": null,
"throughputPerSecond": 3000,
"contact": {
"requested": 8,
"trips": 3
}
}

4. Follow the outcome per trip​

GET/oms-ops/mass-changes/mc_510291cb-9863-4349-b300-eaaf0d44f0d6/itemsRead the per-trip items
Request
curl -X GET "$BASE/oms-ops/mass-changes/mc_510291cb-9863-4349-b300-eaaf0d44f0d6/items" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Request-Id: req-0045"
Response
HTTP/1.1 200
X-Request-Id: req-0045
{
"items": [
{
"changeId": "mc_510291cb-9863-4349-b300-eaaf0d44f0d6",
"tripId": "TRP-F0A893B4CB27",
"status": "applied",
"attempts": 1,
"error": null,
"plan": {
"lines": [
{
"lineId": "L-4364586D534F",
"expectedVersion": 3
}
]
},
"before": [
{
"poId": "PO-16FF30EC289C",
"roles": {
"payer": {
"ref": "CUST-20419",
"name": "Giulia Rossi"
},
"booker": {
"ref": "CUST-20419",
"name": "Giulia Rossi"
},
"travellers": [
{
"ref": "PAX-01"
},
{
"ref": "PAX-02"
}
]
},
"lineId": "L-4364586D534F",
"market": "IT",
"status": "booked",
"tripId": "TRP-F0A893B4CB27",
"channel": "web",
"groupId": null,
"currency": "EUR",
"updatedAt": "2026-11-02T09:06:42.000Z",
"attributes": {
"poType": "standard",
"source": "order_orchestration",
"offerId": "ALL-INCLUSIVE-2027",
"quantity": 1,
"poSequence": 1,
"departureAt": "2027-04-12T17:00:00Z",
"externalRef": "RSV-66676AEB-000001",
"orderVersion": 4,
"promotionIds": [
"EARLY-BOOKING-10"
],
"quoteLineRef": "q-line-1",
"sourceSystem": "reservation",
"billingStatus": "not_billed",
"paymentStatus": "not_due",
"reservationRef": "RSV-66676AEB-000001",
"tripCustomerRef": "CUST-20419",
"fulfilmentStatus": "confirmed"
},
"productRef": "MED7-2027-04-12",
"amountMinor": 238000,
"categoryRef": "BALCONY-B2",
"lineVersion": 3,
"productKind": "cruise",
"departureRef": "MED7-2027-04-12"
}
],
"after": [
{
"poId": "PO-16FF30EC289C",
"roles": {
"payer": {
"ref": "CUST-20419",
"name": "Giulia Rossi"
},
"booker": {
"ref": "CUST-20419",
"name": "Giulia Rossi"
},
"travellers": [
{
"ref": "PAX-01"
},
{
"ref": "PAX-02"
}
]
},
"lineId": "L-4364586D534F",
"market": "IT",
"status": "booked",
"tripId": "TRP-F0A893B4CB27",
"channel": "web",
"groupId": null,
"currency": "EUR",
"updatedAt": "2026-11-02T09:31:31.000Z",
"attributes": {
"poType": "standard",
"source": "order_orchestration",
"offerId": "ALL-INCLUSIVE-2027",
"quantity": 1,
"poSequence": 1,
"departureAt": "2027-04-12T17:00:00Z",
"externalRef": "RSV-66676AEB-000001",
"orderVersion": 4,
"promotionIds": [
"EARLY-BOOKING-10"
],
"quoteLineRef": "q-line-1",
"sourceSystem": "reservation",
"billingStatus": "not_billed",
"paymentStatus": "not_due",
"reservationRef": "RSV-66676AEB-000001",
"reAccommodation": {
"upgradedTo": null,
"disruptionId": "dis_6aa95d68-a42d-4d47-8170-95390ba977c3",
"fromProductRef": "MED7-2027-04-12",
"protectionRule": "same_price",
"fromCategoryRef": "BALCONY-B2",
"fromDepartureRef": "MED7-2027-04-12",
"protectionRuleId": "same-price",
"originalAmountMinor": 238000
},
"tripCustomerRef": "CUST-20419",
"fulfilmentStatus": "confirmed"
},
"productRef": "MED7-2027-04-12",
"amountMinor": 238000,
"categoryRef": "BALCONY-B2",
"lineVersion": 4,
"productKind": "cruise",
"departureRef": "MED7-2027-04-19"
}
],
"outcome": {
"rule": "same_price",
"lines": {
"L-4364586D534F": {
"amountMinor": 238000,
"explanation": [
{
"flag": "individual",
"mode": "select",
"basis": "booking",
"input": 0,
"layer": "target_price",
"reason": {
"key": "price_protection.target_price",
"params": {
"category": "BALCONY-B2",
"departure": "MED7-2027-04-19",
"travellers": 2
}
},
"ruleId": null,
"source": {
"kind": "runtime",
"condition": "target:MED7-2027-04-19"
},
"contribution": 252000,
"runningTotal": 252000
},
{
"flag": "individual",
"mode": "replace",
"basis": "booking",
"input": 252000,
"layer": "price_protection",
"reason": {
"key": "price_protection.same_price",
"params": {
"target": 252000,
"original": 238000
}
},
"ruleId": "same-price",
"source": {
"kind": "runtime",
"condition": "disruption:dis_6aa95d68-a42d-4d47-8170-95390ba977c3"
},
"contribution": -14000,
"runningTotal": 238000
}
],
"targetMinor": 252000,
"originalMinor": 238000
}
},
"ruleId": "same-price",
"priceDeltaMinor": 0
},
"updatedAt": "2026-11-02T09:31:31.000Z"
},
{
"changeId": "mc_510291cb-9863-4349-b300-eaaf0d44f0d6",
"tripId": "TRP-976512C541CF",
"status": "applied",
"attempts": 1,
"error": null,
"plan": {
"lines": [
{
"lineId": "L-A349D3520C1B",
"expectedVersion": 3
}
]
},
"before": [
{
"poId": "PO-B3A0355DEB58",
"roles": {
"travellers": [
{
"ref": "PAX-01"
},
{
"ref": "PAX-02"
}
]
},
"lineId": "L-A349D3520C1B",
"market": "IT",
"status": "booked",
"tripId": "TRP-976512C541CF",
"channel": "web",
"groupId": null,
"currency": "EUR",
"updatedAt": "2026-11-02T09:06:42.000Z",
"attributes": {
"poType": "standard",
"source": "order_orchestration",
"offerId": "ALL-INCLUSIVE-2027",
"quantity": 1,
"poSequence": 1,
"departureAt": "2027-04-12T17:00:00Z",
"externalRef": "RSV-8CA144DF-000002",
"orderVersion": 4,
"promotionIds": [
"EARLY-BOOKING-10"
],
"quoteLineRef": "q-line-1",
"sourceSystem": "reservation",
"billingStatus": "not_billed",
"paymentStatus": "not_due",
"reservationRef": "RSV-8CA144DF-000002",
"tripCustomerRef": "CUST-20533",
"fulfilmentStatus": "confirmed"
},
"productRef": "MED7-2027-04-12",
"amountMinor": 238000,
"categoryRef": "BALCONY-B2",
"lineVersion": 3,
"productKind": "cruise",
"departureRef": "MED7-2027-04-12"
}
],
"after": [
{
"poId": "PO-B3A0355DEB58",
"roles": {
"travellers": [
{
"ref": "PAX-01"
},
{
"ref": "PAX-02"
}
]
},
"lineId": "L-A349D3520C1B",
"market": "IT",
"status": "booked",
"tripId": "TRP-976512C541CF",
"channel": "web",
"groupId": null,
"currency": "EUR",
"updatedAt": "2026-11-02T09:31:31.000Z",
"attributes": {
"poType": "standard",
"source": "order_orchestration",
"offerId": "ALL-INCLUSIVE-2027",
"quantity": 1,
"poSequence": 1,
"departureAt": "2027-04-12T17:00:00Z",
"externalRef": "RSV-8CA144DF-000002",
"orderVersion": 4,
"promotionIds": [
"EARLY-BOOKING-10"
],
"quoteLineRef": "q-line-1",
"sourceSystem": "reservation",
"billingStatus": "not_billed",
"paymentStatus": "not_due",
"reservationRef": "RSV-8CA144DF-000002",
"reAccommodation": {
"upgradedTo": null,
"disruptionId": "dis_6aa95d68-a42d-4d47-8170-95390ba977c3",
"fromProductRef": "MED7-2027-04-12",
"protectionRule": "same_price",
"fromCategoryRef": "BALCONY-B2",
"fromDepartureRef": "MED7-2027-04-12",
"protectionRuleId": "same-price",
"originalAmountMinor": 238000
},
"tripCustomerRef": "CUST-20533",
"fulfilmentStatus": "confirmed"
},
"productRef": "MED7-2027-04-12",
"amountMinor": 238000,
"categoryRef": "BALCONY-B2",
"lineVersion": 4,
"productKind": "cruise",
"departureRef": "MED7-2027-04-19"
}
],
"outcome": {
"rule": "same_price",
"lines": {
"L-A349D3520C1B": {
"amountMinor": 238000,
"explanation": [
{
"flag": "individual",
"mode": "select",
"basis": "booking",
"input": 0,
"layer": "target_price",
"reason": {
"key": "price_protection.target_price",
"params": {
"category": "BALCONY-B2",
"departure": "MED7-2027-04-19",
"travellers": 2
}
},
"ruleId": null,
"source": {
"kind": "runtime",
"condition": "target:MED7-2027-04-19"
},
"contribution": 252000,
"runningTotal": 252000
},
{
"flag": "individual",
"mode": "replace",
"basis": "booking",
"input": 252000,
"layer": "price_protection",
"reason": {
"key": "price_protection.same_price",
"params": {
"target": 252000,
"original": 238000
}
},
"ruleId": "same-price",
"source": {
"kind": "runtime",
"condition": "disruption:dis_6aa95d68-a42d-4d47-8170-95390ba977c3"
},
"contribution": -14000,
"runningTotal": 238000
}
],
"targetMinor": 252000,
"originalMinor": 238000
}
},
"ruleId": "same-price",
"priceDeltaMinor": 0
},
"updatedAt": "2026-11-02T09:31:31.000Z"
},
{
"changeId": "mc_510291cb-9863-4349-b300-eaaf0d44f0d6",
"tripId": "TRP-8232B7FF83C4",
"status": "applied",
"attempts": 1,
"error": null,
"plan": {
"lines": [
{
"lineId": "L-0A54E44D0375",
"expectedVersion": 4
}
]
},
"before": [
{
"poId": "PO-25CE761780FC",
"roles": {
"travellers": [
{
"ref": "PAX-01"
},
{
"ref": "PAX-02"
}
]
},
"lineId": "L-0A54E44D0375",
"market": "IT",
"status": "booked",
"tripId": "TRP-8232B7FF83C4",
"channel": "web",
"groupId": null,
"currency": "EUR",
"updatedAt": "2026-11-02T09:06:42.000Z",
"attributes": {
"poType": "standard",
"source": "order_orchestration",
"offerId": "ALL-INCLUSIVE-2027",
"quantity": 1,
"poSequence": 1,
"departureAt": "2027-04-12T17:00:00Z",
"externalRef": "RSV-078AC95B-000003",
"orderVersion": 4,
"promotionIds": [
"EARLY-BOOKING-10"
],
"quoteLineRef": "q-line-1",
"sourceSystem": "reservation",
"billingStatus": "not_billed",
"paymentStatus": "not_due",
"reservationRef": "RSV-078AC95B-000003",
"tripCustomerRef": "CUST-20617",
"fulfilmentStatus": "confirmed"
},
"productRef": "MED7-2027-04-12",
"amountMinor": 238000,
"categoryRef": "BALCONY-B2",
"lineVersion": 4,
"productKind": "cruise",
"departureRef": "MED7-2027-04-12"
}
],
"after": [
{
"poId": "PO-25CE761780FC",
"roles": {
"travellers": [
{
"ref": "PAX-01"
},
{
"ref": "PAX-02"
}
]
},
"lineId": "L-0A54E44D0375",
"market": "IT",
"status": "booked",
"tripId": "TRP-8232B7FF83C4",
"channel": "web",
"groupId": null,
"currency": "EUR",
"updatedAt": "2026-11-02T09:31:31.000Z",
"attributes": {
"poType": "standard",
"source": "order_orchestration",
"offerId": "ALL-INCLUSIVE-2027",
"quantity": 1,
"poSequence": 1,
"departureAt": "2027-04-12T17:00:00Z",
"externalRef": "RSV-078AC95B-000003",
"orderVersion": 4,
"promotionIds": [
"EARLY-BOOKING-10"
],
"quoteLineRef": "q-line-1",
"sourceSystem": "reservation",
"billingStatus": "not_billed",
"paymentStatus": "not_due",
"reservationRef": "RSV-078AC95B-000003",
"reAccommodation": {
"upgradedTo": null,
"disruptionId": "dis_6aa95d68-a42d-4d47-8170-95390ba977c3",
"fromProductRef": "MED7-2027-04-12",
"protectionRule": "same_price",
"fromCategoryRef": "BALCONY-B2",
"fromDepartureRef": "MED7-2027-04-12",
"protectionRuleId": "same-price",
"originalAmountMinor": 238000
},
"tripCustomerRef": "CUST-20617",
"fulfilmentStatus": "confirmed"
},
"productRef": "MED7-2027-04-12",
"amountMinor": 238000,
"categoryRef": "BALCONY-B2",
"lineVersion": 5,
"productKind": "cruise",
"departureRef": "MED7-2027-04-19"
}
],
"outcome": {
"rule": "same_price",
"lines": {
"L-0A54E44D0375": {
"amountMinor": 238000,
"explanation": [
{
"flag": "individual",
"mode": "select",
"basis": "booking",
"input": 0,
"layer": "target_price",
"reason": {
"key": "price_protection.target_price",
"params": {
"category": "BALCONY-B2",
"departure": "MED7-2027-04-19",
"travellers": 2
}
},
"ruleId": null,
"source": {
"kind": "runtime",
"condition": "target:MED7-2027-04-19"
},
"contribution": 252000,
"runningTotal": 252000
},
{
"flag": "individual",
"mode": "replace",
"basis": "booking",
"input": 252000,
"layer": "price_protection",
"reason": {
"key": "price_protection.same_price",
"params": {
"target": 252000,
"original": 238000
}
},
"ruleId": "same-price",
"source": {
"kind": "runtime",
"condition": "disruption:dis_6aa95d68-a42d-4d47-8170-95390ba977c3"
},
"contribution": -14000,
"runningTotal": 238000
}
],
"targetMinor": 252000,
"originalMinor": 238000
}
},
"ruleId": "same-price",
"priceDeltaMinor": 0
},
"updatedAt": "2026-11-02T09:31:31.000Z"
}
]
}

5. Roll back​

The ship is repaired and the departure reinstated. Rolling back reverses every applied item, with a reason.

POST/oms-ops/mass-changes/mc_510291cb-9863-4349-b300-eaaf0d44f0d6/rollbackRoll the change back
Request
curl -X POST "$BASE/oms-ops/mass-changes/mc_510291cb-9863-4349-b300-eaaf0d44f0d6/rollback" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Request-Id: req-0046" \
-H "Content-Type: application/json" \
-d '{
"actor": {
"id": "ops-0007",
"name": "Paolo Ricci",
"role": "ops_manager",
"channel": "back_office"
},
"reason": "Departure reinstated after repair"
}'
Response
HTTP/1.1 200
X-Request-Id: req-0046
{
"original": {
"kind": "re_accommodation",
"spec": {
"kind": "re_accommodation",
"protection": {
"ruleId": "same-price"
},
"targetPrices": {
"BALCONY-B2": {
"amountMinor": 252000,
"perTraveller": false
}
},
"categoryMapping": {},
"targetDepartureRef": "MED7-2027-04-19"
},
"actor": {
"id": "ops-0007",
"name": "Paolo Ricci",
"role": "ops_manager",
"channel": "back_office"
},
"counts": {
"total": 3,
"pending": 0,
"applied": 0,
"failed": 0,
"needs_person": 0,
"skipped": 0,
"rolled_back": 3,
"rollback_conflict": 0
},
"reason": "Move affected guests to the next departure",
"status": "rolled_back",
"changeId": "mc_510291cb-9863-4349-b300-eaaf0d44f0d6",
"tenantId": "meridian",
"createdAt": "2026-11-02T09:30:54.000Z",
"startedAt": "2026-11-02T09:31:31.000Z",
"updatedAt": "2026-11-02T09:30:54.000Z",
"finishedAt": "2026-11-02T09:31:31.000Z",
"population": {
"lines": 3,
"trips": 3
},
"rollbackOf": null,
"commitToken": "3f1d37d6df1a7b076339f1f93da107f4",
"disruptionId": "dis_6aa95d68-a42d-4d47-8170-95390ba977c3",
"rolledBackBy": "mc_2398b4e3-7636-4cec-b823-19c6ba76c7d7",
"throughputPerSecond": 3000,
"contact": {
"requested": 8,
"trips": 3
}
},
"rollback": {
"kind": "rollback",
"spec": {
"kind": "rollback"
},
"actor": {
"id": "ops-0007",
"name": "Paolo Ricci",
"role": "ops_manager",
"channel": "back_office"
},
"counts": {
"total": 3,
"failed": 0,
"applied": 0,
"pending": 0,
"skipped": 0,
"rolled_back": 3,
"needs_person": 0,
"rollback_conflict": 0
},
"reason": "Departure reinstated after repair",
"status": "completed",
"contact": {
"trips": 3,
"requested": 8
},
"changeId": "mc_2398b4e3-7636-4cec-b823-19c6ba76c7d7",
"tenantId": "meridian",
"createdAt": "2026-11-02T09:33:22.000Z",
"startedAt": "2026-11-02T09:33:22.000Z",
"updatedAt": "2026-11-02T09:33:22.000Z",
"finishedAt": "2026-11-02T09:33:22.000Z",
"population": {
"lines": 3,
"trips": 3
},
"rollbackOf": "mc_510291cb-9863-4349-b300-eaaf0d44f0d6",
"commitToken": "",
"disruptionId": "dis_6aa95d68-a42d-4d47-8170-95390ba977c3",
"rolledBackBy": null,
"throughputPerSecond": 3000
}
}

In production​

  • Read GET /oms-ops/disruptions/{id}/impact before planning, to size the change by market, channel and category.
  • Use POST /oms-ops/mass-changes/{id}/dry-run before committing a large change.
  • Route exceptions (for example trips with special services) to a team with the operations policy; they appear in GET /oms-ops/work-items.
  • Offer guests the choice between the alternative and a refund with guestChoice in the plan; record their answers with POST /oms-ops/mass-changes/{id}/items/{tripId}/guest-choice.
  • Consumers of the outbox receive oms.order.changed per trip and oms.notification.requested for each customer communication.