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 departureRequest
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 protectionRequest
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 tokenRequest
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 itemsRequest
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 backRequest
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}/impactbefore planning, to size the change by market, channel and category. - Use
POST /oms-ops/mass-changes/{id}/dry-runbefore 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
guestChoicein the plan; record their answers withPOST /oms-ops/mass-changes/{id}/items/{tripId}/guest-choice. - Consumers of the outbox receive
oms.order.changedper trip andoms.notification.requestedfor each customer communication.