Skip to main content

Group agreements

Group agreements (blocks and rate-only agreements) with approval, contracting, berth holds, releases, receipts, settlement and a ledger. Every read can be taken as of a date.

OperationEndpoint
List group agreementsGET /group-agreements
Create a group agreementPOST /group-agreements
Read the agreement pageGET /group-agreements/{id}
Amend an agreementPATCH /group-agreements/{id}
Read the allotmentsGET /group-agreements/{id}/allotments
Submit, approve, counter-offer or refusePOST /group-agreements/{id}/approval
Read berth holdsGET /group-agreements/{id}/berth-holds
Allocate held berths to a tripPOST /group-agreements/{id}/berth-holds/allocate
Move berths from one trip to anotherPOST /group-agreements/{id}/berth-holds/substitute
Vacate a trip's berthsPOST /group-agreements/{id}/berth-holds/vacate
Cancel a trip on the agreement with a penaltyPOST /group-agreements/{id}/cancellations
Preview converting a below-minimum agreementGET /group-agreements/{id}/conversion-preview
Read free placesGET /group-agreements/{id}/free-places
Settle free places after departurePOST /group-agreements/{id}/free-places/settle
Open the order engine group for the agreementPOST /group-agreements/{id}/group
Read the ledgerGET /group-agreements/{id}/ledger
Read the name listGET /group-agreements/{id}/name-list
Read onboard arrangementsGET /group-agreements/{id}/onboard
Record a receipt against a deposit stagePOST /group-agreements/{id}/receipts
Release units back to inventoryPOST /group-agreements/{id}/releases
Release unnamed units at the name-list deadlinePOST /group-agreements/{id}/releases/name-list-deadline
Read the payment scheduleGET /group-agreements/{id}/schedule
Record the final settlementPOST /group-agreements/{id}/settlement
Read the statementGET /group-agreements/{id}/statement
Read the timelineGET /group-agreements/{id}/timeline
Move an agreement to another statePOST /group-agreements/{id}/transitions
Read the version historyGET /group-agreements/{id}/versions

List group agreements​

GET/group-agreements

Parameters

NameInRequiredNotes
statequery
agreementTypequery
seriesRefquery
asOfqueryRead as of this date or time. Default now.

Response 200

GET/group-agreementsList agreements
Request
curl -X GET "$BASE/group-agreements" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Request-Id: req-0055"
Response
HTTP/1.1 200
X-Request-Id: req-0055
{
"asOf": "2026-11-02T09:38:55.000Z",
"agreements": [
{
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"agreementRef": "GA-2026-E3E883",
"name": "Harbourline Pharma incentive 2027",
"agreementType": "incentive",
"typeLabel": "Incentive and MICE",
"shape": "block",
"state": "contracted",
"approval": "approved",
"holder": {
"ref": "AGY-HARBOURLINE",
"kind": "agency",
"name": "Harbourline Travel"
},
"organiser": {
"ref": "ORG-HLPHARMA",
"kind": "organisation",
"name": "Harbourline Pharma"
},
"departure": {
"ref": "MED7-2027-05-24",
"label": "Western Mediterranean, 24 May 2027",
"returnDate": "2027-05-31",
"departureDate": "2027-05-24"
},
"seriesRef": null,
"seriesPosition": null,
"groupId": "grp_GA-2026-BA3784",
"utilisation": {
"kind": "block",
"unitsHeld": 20,
"unitsLive": 20,
"unitsNamed": 0,
"berthsLive": 40,
"berthsNamed": 0,
"percentNamed": 0,
"expectedUnits": null
},
"nextDeadline": {
"key": "stage:D1",
"label": "Contract deposit due",
"date": "2026-12-01",
"status": "next"
}
}
]
}
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.
404group_bookings_not_enabledGroup bookings are not enabled for the tenant.
500internalUnexpected failure. Retry with the same Idempotency-Key.

Create a group agreement​

POST/group-agreements

A block agreement when it carries allotments, otherwise rate-only. Agreement types that require approval start in pending_approval.

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

Request body

FieldTypeRequiredNotes
actorobjectyes
actor.channelstringmax 60 chars
actor.idstringyes1–200 chars
actor.namestringmax 200 chars
actor.rolestringyes1–100 chars
agreementRefstring1–50 chars
agreementTypestringyes1–60 chars
allotmentsarray of object
allotments[].categoryRefstringyes1–200 chars
allotments[].inventoryRefstringmax 200 chars
allotments[].labelstringmax 200 chars
allotments[].unitsintegeryes> 0
approvalobject
approval.counterOfferobject
approval.counterOffer.categoriesarray of object
approval.counterOffer.summarystringyes1–1000 chars
approval.deadlinestring (date-time)
approval.decidedAtstring (date-time)
approval.decidedBystringmax 200 chars
approval.reasonstringmax 1000 chars
approval.statusenum: not_required, pending, approved, counter_offered, refusedyes
assumptionsarray of string
commissionobjectyes
commission.basisenum: fare_onlydefault "fare_only"
commission.clawbackenum: cancellation_inside_penalty_perioddefault "cancellation_inside_penalty_period"
commission.earnedAtenum: full_paymentdefault "full_payment"
commission.percentnumber≥ 0; ≤ 100; default 0
commission.remittanceenum: net, gross, noneyes
currencystringyespattern ^[A-Z]{3}$
departureobjectyes
departure.departureDatestringyespattern ^\d{4}-\d{2}-\d{2}$
departure.labelstringmax 200 chars
departure.refstringyes1–200 chars
departure.returnDatestringpattern ^\d{4}-\d{2}-\d{2}$
depositStagesarray of object
depositStages[].amountPerBerthMinorinteger> 0
depositStages[].deferredbooleandefault false
depositStages[].dueDatestringyespattern ^\d{4}-\d{2}-\d{2}$
depositStages[].keystringyes1–60 chars
depositStages[].kindenum: per_berth, balanceyes
depositStages[].labelstringyes1–200 chars
effectiveAtone of several shapes
expectedUnitsinteger> 0
fareobjectyes
fare.chargesLabelstringmax 100 chars
fare.chargesPerGuestMinorinteger≥ 0; default 0
fare.codestringyes1–100 chars
fare.priceValidUntilstringpattern ^\d{4}-\d{2}-\d{2}$
fare.snapshotobjectyes
fare.snapshot.capturedAtstring (date-time)yes
fare.snapshot.categoriesarray of objectyesat least 1
fare.snapshot.sourcestringyes1–100 chars
fare.versionintegeryes> 0
freePlacesobject
freePlaces.beneficiaryenum: holder, leaderdefault "holder"
freePlaces.commissionableenum: falsedefault false
freePlaces.countedenum: first_two_per_unit_full_faredefault "first_two_per_unit_full_fare"
freePlaces.earnedOnenum: final_countdefault "final_count"
freePlaces.perPayingintegeryes> 0
freePlaces.settlementenum: after_departure, assigned_to_leaderdefault "after_departure"
freePlaces.valueenum: fare_at_group_averagedefault "fare_at_group_average"
holderobjectyes
holder.contactstringmax 320 chars
holder.kindstring1–60 chars
holder.namestringmax 200 chars
holder.refstringyes1–200 chars
leaderobject
leader.contactstringmax 320 chars
leader.kindstring1–60 chars
leader.namestringmax 200 chars
leader.refstringyes1–200 chars
minimumUnitsintegeryes> 0
namestringyes1–200 chars
onboardobject
onboard.diningstringmax 200 chars
onboard.meetingRoomstringmax 200 chars
onboard.notesarray of string
organiserobjectyes
organiser.contactstringmax 320 chars
organiser.kindstring1–60 chars
organiser.namestringmax 200 chars
organiser.refstringyes1–200 chars
releaseobject
release.contractSignedAtstringpattern ^\d{4}-\d{2}-\d{2}$
release.freeReductionMaxUnitsintegeryes≥ 0
release.freeReductionUntilstringyespattern ^\d{4}-\d{2}-\d{2}$
release.nameChangeCutoffstringpattern ^\d{4}-\d{2}-\d{2}$
release.nameChangeFeePerGuestMinorinteger≥ 0; default 0
release.nameListDeadlinestringyespattern ^\d{4}-\d{2}-\d{2}$
release.optionExpiresAtstringpattern ^\d{4}-\d{2}-\d{2}$
seriesPositioninteger> 0
seriesRefstring1–100 chars
stateenum: requested, pending_approval, offered, contracted, names_closed, closed, settled, expired, refused, cancelled
valueAddsarray of string

Schema: apps/journeys/src/group-agreements/contracts.ts (CreateAgreementSchema)

Response 201

POST/group-agreementsCreate a block agreement for an incentive group
Request
curl -X POST "$BASE/group-agreements" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Request-Id: req-0047" \
-H "Idempotency-Key: 1d8ef0bb-c48b-48ed-abd4-5a3811e77ad2" \
-H "Content-Type: application/json" \
-d '{
"name": "Harbourline Pharma incentive 2027",
"agreementType": "incentive",
"holder": {
"ref": "AGY-HARBOURLINE",
"name": "Harbourline Travel",
"kind": "agency"
},
"organiser": {
"ref": "ORG-HLPHARMA",
"name": "Harbourline Pharma",
"kind": "organisation"
},
"leader": {
"ref": "LEAD-0091",
"name": "Anna Moretti",
"kind": "person"
},
"departure": {
"ref": "MED7-2027-05-24",
"label": "Western Mediterranean, 24 May 2027",
"departureDate": "2027-05-24",
"returnDate": "2027-05-31"
},
"currency": "EUR",
"fare": {
"code": "GRP-INC-2027",
"version": 1,
"snapshot": {
"capturedAt": "2026-10-30T09:00:00Z",
"source": "pricing",
"categories": [
{
"categoryRef": "INSIDE-I1",
"label": "Inside",
"groupFareMinor": 61900,
"bestAvailableMinor": 71900
},
{
"categoryRef": "BALCONY-B2",
"label": "Balcony",
"groupFareMinor": 98900,
"bestAvailableMinor": 113400
},
{
"categoryRef": "SUITE-S1",
"label": "Suite",
"groupFareMinor": 189000,
"bestAvailableMinor": 214000
}
]
},
"priceValidUntil": "2026-12-15",
"chargesPerGuestMinor": 21000,
"chargesLabel": "Port charges"
},
"minimumUnits": 15,
"freePlaces": {
"perPaying": 20
},
"commission": {
"remittance": "net",
"percent": 10
},
"depositStages": [
{
"key": "D1",
"label": "Contract deposit",
"kind": "per_berth",
"amountPerBerthMinor": 15000,
"dueDate": "2026-12-01"
},
{
"key": "D2",
"label": "Second deposit",
"kind": "per_berth",
"amountPerBerthMinor": 25000,
"dueDate": "2027-02-24"
},
{
"key": "BAL",
"label": "Balance",
"kind": "balance",
"dueDate": "2027-04-09"
}
],
"release": {
"optionExpiresAt": "2026-12-15",
"freeReductionUntil": "2027-02-24",
"freeReductionMaxUnits": 3,
"nameListDeadline": "2027-04-09",
"nameChangeFeePerGuestMinor": 5000,
"nameChangeCutoff": "2027-05-17"
},
"allotments": [
{
"categoryRef": "INSIDE-I1",
"units": 4
},
{
"categoryRef": "BALCONY-B2",
"units": 14
},
{
"categoryRef": "SUITE-S1",
"units": 2
}
],
"assumptions": [],
"actor": {
"id": "sales-0031",
"name": "Sara Conti",
"role": "group_sales",
"channel": "back_office"
}
}'
Response
HTTP/1.1 201
X-Request-Id: req-0047
{
"name": "Harbourline Pharma incentive 2027",
"agreementType": "incentive",
"holder": {
"ref": "AGY-HARBOURLINE",
"name": "Harbourline Travel",
"kind": "agency"
},
"organiser": {
"ref": "ORG-HLPHARMA",
"name": "Harbourline Pharma",
"kind": "organisation"
},
"leader": {
"ref": "LEAD-0091",
"name": "Anna Moretti",
"kind": "person"
},
"departure": {
"ref": "MED7-2027-05-24",
"label": "Western Mediterranean, 24 May 2027",
"departureDate": "2027-05-24",
"returnDate": "2027-05-31"
},
"currency": "EUR",
"fare": {
"code": "GRP-INC-2027",
"version": 1,
"snapshot": {
"capturedAt": "2026-10-30T09:00:00Z",
"source": "pricing",
"categories": [
{
"categoryRef": "INSIDE-I1",
"label": "Inside",
"groupFareMinor": 61900,
"bestAvailableMinor": 71900
},
{
"categoryRef": "BALCONY-B2",
"label": "Balcony",
"groupFareMinor": 98900,
"bestAvailableMinor": 113400
},
{
"categoryRef": "SUITE-S1",
"label": "Suite",
"groupFareMinor": 189000,
"bestAvailableMinor": 214000
}
]
},
"priceValidUntil": "2026-12-15",
"chargesPerGuestMinor": 21000,
"chargesLabel": "Port charges"
},
"minimumUnits": 15,
"freePlaces": {
"perPaying": 20,
"counted": "first_two_per_unit_full_fare",
"value": "fare_at_group_average",
"earnedOn": "final_count",
"settlement": "after_departure",
"beneficiary": "holder",
"commissionable": false
},
"commission": {
"remittance": "net",
"percent": 10,
"basis": "fare_only",
"earnedAt": "full_payment",
"clawback": "cancellation_inside_penalty_period"
},
"depositStages": [
{
"key": "D1",
"label": "Contract deposit",
"kind": "per_berth",
"amountPerBerthMinor": 15000,
"dueDate": "2026-12-01",
"deferred": false
},
{
"key": "D2",
"label": "Second deposit",
"kind": "per_berth",
"amountPerBerthMinor": 25000,
"dueDate": "2027-02-24",
"deferred": false
},
{
"key": "BAL",
"label": "Balance",
"kind": "balance",
"dueDate": "2027-04-09",
"deferred": false
}
],
"release": {
"optionExpiresAt": "2026-12-15",
"freeReductionUntil": "2027-02-24",
"freeReductionMaxUnits": 3,
"nameListDeadline": "2027-04-09",
"nameChangeFeePerGuestMinor": 5000,
"nameChangeCutoff": "2027-05-17"
},
"valueAdds": [],
"assumptions": [],
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"agreementRef": "GA-2026-E3E883",
"contractId": "52060202-6147-40e3-a218-6ff1899b87ac",
"tenantId": "meridian",
"shape": "block",
"state": "pending_approval",
"approval": {
"status": "pending",
"deadline": "2026-11-05T09:33:59.000Z"
},
"groupId": null,
"version": 1,
"history": [
{
"at": "2026-11-02T09:33:59.000Z",
"action": "created",
"actor": {
"id": "sales-0031",
"name": "Sara Conti",
"role": "group_sales",
"channel": "back_office"
},
"version": 1,
"detail": {
"state": "pending_approval",
"units": 20,
"shape": "block"
}
}
],
"createdAt": "2026-11-02T09:33:59.000Z",
"updatedAt": "2026-11-02T09:33:59.000Z"
}
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.
404group_bookings_not_enabledGroup bookings are not enabled for the tenant.
409idempotency_in_progressA request with this Idempotency-Key is still running. Retry after the Retry-After interval.
422below_group_thresholdThe agreement is below the tenant's group threshold.
422idempotency_key_reusedThe Idempotency-Key was used for a different request.
500internalUnexpected failure. Retry with the same Idempotency-Key.

Read the agreement page​

GET/group-agreements/{id}

The composite view of the agreement as of a date. The sections are also available on their own.

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.
404group_bookings_not_enabledGroup bookings are not enabled for the tenant.
500internalUnexpected failure. Retry with the same Idempotency-Key.

Amend an agreement​

PATCH/group-agreements/{id}

Creates a new version and re-checks constraints.

Parameters

NameInRequiredNotes
idpathyes

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

Request body

FieldTypeRequiredNotes
actorobjectyes
actor.channelstringmax 60 chars
actor.idstringyes1–200 chars
actor.namestringmax 200 chars
actor.rolestringyes1–100 chars
changesobjectyes
changes.agreementTypestring1–60 chars
changes.assumptionsarray of string
changes.commissionobject
changes.commission.basisenum: fare_onlydefault "fare_only"
changes.commission.clawbackenum: cancellation_inside_penalty_perioddefault "cancellation_inside_penalty_period"
changes.commission.earnedAtenum: full_paymentdefault "full_payment"
changes.commission.percentnumber≥ 0; ≤ 100; default 0
changes.commission.remittanceenum: net, gross, noneyes
changes.currencystringpattern ^[A-Z]{3}$
changes.departureobject
changes.departure.departureDatestringyespattern ^\d{4}-\d{2}-\d{2}$
changes.departure.labelstringmax 200 chars
changes.departure.refstringyes1–200 chars
changes.departure.returnDatestringpattern ^\d{4}-\d{2}-\d{2}$
changes.depositStagesarray of object
changes.depositStages[].amountPerBerthMinorinteger> 0
changes.depositStages[].deferredbooleandefault false
changes.depositStages[].dueDatestringyespattern ^\d{4}-\d{2}-\d{2}$
changes.depositStages[].keystringyes1–60 chars
changes.depositStages[].kindenum: per_berth, balanceyes
changes.depositStages[].labelstringyes1–200 chars
changes.expectedUnitsinteger> 0
changes.fareobject
changes.fare.chargesLabelstringmax 100 chars
changes.fare.chargesPerGuestMinorinteger≥ 0; default 0
changes.fare.codestringyes1–100 chars
changes.fare.priceValidUntilstringpattern ^\d{4}-\d{2}-\d{2}$
changes.fare.snapshotobjectyes
changes.fare.versionintegeryes> 0
changes.freePlacesobject
changes.freePlaces.beneficiaryenum: holder, leaderdefault "holder"
changes.freePlaces.commissionableenum: falsedefault false
changes.freePlaces.countedenum: first_two_per_unit_full_faredefault "first_two_per_unit_full_fare"
changes.freePlaces.earnedOnenum: final_countdefault "final_count"
changes.freePlaces.perPayingintegeryes> 0
changes.freePlaces.settlementenum: after_departure, assigned_to_leaderdefault "after_departure"
changes.freePlaces.valueenum: fare_at_group_averagedefault "fare_at_group_average"
changes.holderobject
changes.holder.contactstringmax 320 chars
changes.holder.kindstring1–60 chars
changes.holder.namestringmax 200 chars
changes.holder.refstringyes1–200 chars
changes.leaderobject
changes.leader.contactstringmax 320 chars
changes.leader.kindstring1–60 chars
changes.leader.namestringmax 200 chars
changes.leader.refstringyes1–200 chars
changes.minimumUnitsinteger> 0
changes.namestring1–200 chars
changes.onboardobject
changes.onboard.diningstringmax 200 chars
changes.onboard.meetingRoomstringmax 200 chars
changes.onboard.notesarray of string
changes.organiserobject
changes.organiser.contactstringmax 320 chars
changes.organiser.kindstring1–60 chars
changes.organiser.namestringmax 200 chars
changes.organiser.refstringyes1–200 chars
changes.releaseobject
changes.release.contractSignedAtstringpattern ^\d{4}-\d{2}-\d{2}$
changes.release.freeReductionMaxUnitsintegeryes≥ 0
changes.release.freeReductionUntilstringyespattern ^\d{4}-\d{2}-\d{2}$
changes.release.nameChangeCutoffstringpattern ^\d{4}-\d{2}-\d{2}$
changes.release.nameChangeFeePerGuestMinorinteger≥ 0; default 0
changes.release.nameListDeadlinestringyespattern ^\d{4}-\d{2}-\d{2}$
changes.release.optionExpiresAtstringpattern ^\d{4}-\d{2}-\d{2}$
changes.seriesPositioninteger> 0
changes.seriesRefstring1–100 chars
changes.valueAddsarray of string
effectiveAtone of several shapes
expectedVersionintegeryes> 0
reasonstringyes1–2000 chars

Schema: apps/journeys/src/group-agreements/contracts.ts (AmendAgreementSchema)

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.
404group_bookings_not_enabledGroup bookings are not enabled for the tenant.
409agreement_version_conflictThe agreement's expectedVersion does not match.
409agreement_closedThe agreement is in a terminal state.
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 allotments​

GET/group-agreements/{id}/allotments

Parameters

NameInRequiredNotes
idpathyes

Response 200

GET/group-agreements/GA-2026-E3E883/allotmentsRead the allotments
Request
curl -X GET "$BASE/group-agreements/GA-2026-E3E883/allotments" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Request-Id: req-0053"
Response
HTTP/1.1 200
X-Request-Id: req-0053
{
"asOf": "2026-11-02T09:37:41.000Z",
"agreementRef": "GA-2026-E3E883",
"allotments": [
{
"allotmentId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:BALCONY-B2",
"categoryRef": "BALCONY-B2",
"label": "Balcony",
"inventoryRef": null,
"inventorySource": "Reservation system inventory",
"unitsHeld": 14,
"berthsPerUnit": 2,
"units": {
"named": 0,
"unnamed": 14,
"released": 0,
"forfeited": 0,
"vacated": 0
},
"berths": {
"held": 28,
"named": 0,
"unnamed": 28
},
"groupFareMinor": 98900,
"bestAvailableMinor": 113400
},
{
"allotmentId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:INSIDE-I1",
"categoryRef": "INSIDE-I1",
"label": "Inside",
"inventoryRef": null,
"inventorySource": "Reservation system inventory",
"unitsHeld": 4,
"berthsPerUnit": 2,
"units": {
"named": 0,
"unnamed": 4,
"released": 0,
"forfeited": 0,
"vacated": 0
},
"berths": {
"held": 8,
"named": 0,
"unnamed": 8
},
"groupFareMinor": 61900,
"bestAvailableMinor": 71900
},
{
"allotmentId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:SUITE-S1",
"categoryRef": "SUITE-S1",
"label": "Suite",
"inventoryRef": null,
"inventorySource": "Reservation system inventory",
"unitsHeld": 2,
"berthsPerUnit": 2,
"units": {
"named": 0,
"unnamed": 2,
"released": 0,
"forfeited": 0,
"vacated": 0
},
"berths": {
"held": 4,
"named": 0,
"unnamed": 4
},
"groupFareMinor": 189000,
"bestAvailableMinor": 214000
}
]
}
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.
404group_bookings_not_enabledGroup bookings are not enabled for the tenant.
500internalUnexpected failure. Retry with the same Idempotency-Key.

Submit, approve, counter-offer or refuse​

POST/group-agreements/{id}/approval

Parameters

NameInRequiredNotes
idpathyes

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

Request body

FieldTypeRequiredNotes
actorobjectyes
actor.channelstringmax 60 chars
actor.idstringyes1–200 chars
actor.namestringmax 200 chars
actor.rolestringyes1–100 chars
counterOfferobject
counterOffer.categoriesarray of object
counterOffer.categories[].bestAvailableMinorinteger> 0
counterOffer.categories[].categoryRefstringyes1–200 chars
counterOffer.categories[].groupFareMinorintegeryes> 0
counterOffer.categories[].labelstringmax 200 chars
counterOffer.summarystringyes1–1000 chars
deadlinestring (date-time)
decisionenum: submit, approve, counter_offer, refuseyes
effectiveAtone of several shapes
reasonstringmax 1000 chars

Schema: apps/journeys/src/group-agreements/contracts.ts (ApprovalDecisionSchema)

Response 200

POST/group-agreements/GA-2026-E3E883/approvalApprove the agreement
Request
curl -X POST "$BASE/group-agreements/GA-2026-E3E883/approval" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Request-Id: req-0048" \
-H "Content-Type: application/json" \
-d '{
"decision": "approve",
"reason": "Within incentive guidelines",
"actor": {
"id": "rm-0005",
"name": "Luca Ferri",
"role": "revenue_manager",
"channel": "back_office"
}
}'
Response
HTTP/1.1 200
X-Request-Id: req-0048
{
"fare": {
"code": "GRP-INC-2027",
"version": 1,
"snapshot": {
"source": "pricing",
"capturedAt": "2026-10-30T09:00:00Z",
"categories": [
{
"label": "Inside",
"categoryRef": "INSIDE-I1",
"groupFareMinor": 61900,
"bestAvailableMinor": 71900
},
{
"label": "Balcony",
"categoryRef": "BALCONY-B2",
"groupFareMinor": 98900,
"bestAvailableMinor": 113400
},
{
"label": "Suite",
"categoryRef": "SUITE-S1",
"groupFareMinor": 189000,
"bestAvailableMinor": 214000
}
]
},
"chargesLabel": "Port charges",
"priceValidUntil": "2026-12-15",
"chargesPerGuestMinor": 21000
},
"name": "Harbourline Pharma incentive 2027",
"shape": "block",
"state": "offered",
"holder": {
"ref": "AGY-HARBOURLINE",
"kind": "agency",
"name": "Harbourline Travel"
},
"leader": {
"ref": "LEAD-0091",
"kind": "person",
"name": "Anna Moretti"
},
"groupId": null,
"history": [
{
"at": "2026-11-02T09:33:59.000Z",
"actor": {
"id": "sales-0031",
"name": "Sara Conti",
"role": "group_sales",
"channel": "back_office"
},
"action": "created",
"detail": {
"shape": "block",
"state": "pending_approval",
"units": 20
},
"version": 1
},
{
"at": "2026-11-02T09:34:36.000Z",
"action": "approval_approve",
"actor": {
"id": "rm-0005",
"name": "Luca Ferri",
"role": "revenue_manager",
"channel": "back_office"
},
"version": 2,
"detail": {
"state": "offered",
"from": "pending_approval",
"reason": "Within incentive guidelines"
}
}
],
"release": {
"optionExpiresAt": "2026-12-15",
"nameChangeCutoff": "2027-05-17",
"nameListDeadline": "2027-04-09",
"freeReductionUntil": "2027-02-24",
"freeReductionMaxUnits": 3,
"nameChangeFeePerGuestMinor": 5000
},
"version": 2,
"approval": {
"status": "approved",
"decidedBy": "Luca Ferri",
"decidedAt": "2026-11-02T09:34:36.000Z",
"deadline": "2026-11-05T09:33:59.000Z",
"reason": "Within incentive guidelines"
},
"currency": "EUR",
"tenantId": "meridian",
"createdAt": "2026-11-02T09:33:59.000Z",
"departure": {
"ref": "MED7-2027-05-24",
"label": "Western Mediterranean, 24 May 2027",
"returnDate": "2027-05-31",
"departureDate": "2027-05-24"
},
"organiser": {
"ref": "ORG-HLPHARMA",
"kind": "organisation",
"name": "Harbourline Pharma"
},
"updatedAt": "2026-11-02T09:34:36.000Z",
"valueAdds": [],
"commission": {
"basis": "fare_only",
"percent": 10,
"clawback": "cancellation_inside_penalty_period",
"earnedAt": "full_payment",
"remittance": "net"
},
"contractId": "52060202-6147-40e3-a218-6ff1899b87ac",
"freePlaces": {
"value": "fare_at_group_average",
"counted": "first_two_per_unit_full_fare",
"earnedOn": "final_count",
"perPaying": 20,
"settlement": "after_departure",
"beneficiary": "holder",
"commissionable": false
},
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"assumptions": [],
"agreementRef": "GA-2026-E3E883",
"minimumUnits": 15,
"agreementType": "incentive",
"depositStages": [
{
"key": "D1",
"kind": "per_berth",
"label": "Contract deposit",
"dueDate": "2026-12-01",
"deferred": false,
"amountPerBerthMinor": 15000
},
{
"key": "D2",
"kind": "per_berth",
"label": "Second deposit",
"dueDate": "2027-02-24",
"deferred": false,
"amountPerBerthMinor": 25000
},
{
"key": "BAL",
"kind": "balance",
"label": "Balance",
"dueDate": "2027-04-09",
"deferred": 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.
400reason_requiredThis action requires a reason.
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.
404group_bookings_not_enabledGroup bookings are not enabled for the tenant.
409not_pending_approvalThe agreement or request is not pending approval.
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 berth holds​

GET/group-agreements/{id}/berth-holds

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.
404group_bookings_not_enabledGroup bookings are not enabled for the tenant.
500internalUnexpected failure. Retry with the same Idempotency-Key.

Allocate held berths to a trip​

POST/group-agreements/{id}/berth-holds/allocate

Parameters

NameInRequiredNotes
idpathyes

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

Request body

FieldTypeRequiredNotes
actorobjectyes
actor.channelstringmax 60 chars
actor.idstringyes1–200 chars
actor.namestringmax 200 chars
actor.rolestringyes1–100 chars
categoryRefstringyes1–200 chars
effectiveAtone of several shapes
guestsarray of stringyesat least 1
tripIdstringyes1–200 chars

Schema: apps/journeys/src/group-agreements/contracts.ts (AllocateSchema)

Response 201

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.
404group_bookings_not_enabledGroup bookings are not enabled for the tenant.
409agreement_not_contractedThe agreement is not contracted.
409no_unit_availableNo unit is left in the category.
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.

Move berths from one trip to another​

POST/group-agreements/{id}/berth-holds/substitute

Parameters

NameInRequiredNotes
idpathyes

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

Request body

FieldTypeRequiredNotes
actorobjectyes
actor.channelstringmax 60 chars
actor.idstringyes1–200 chars
actor.namestringmax 200 chars
actor.rolestringyes1–100 chars
effectiveAtone of several shapes
fromTripIdstringyes1–200 chars
guestsarray of stringyesat least 1
reasonstringyes1–2000 chars
toTripIdstringyes1–200 chars

Schema: apps/journeys/src/group-agreements/contracts.ts (SubstituteSchema)

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.
404group_bookings_not_enabledGroup bookings are 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.

Vacate a trip's berths​

POST/group-agreements/{id}/berth-holds/vacate

Parameters

NameInRequiredNotes
idpathyes

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

Request body

FieldTypeRequiredNotes
actorobjectyes
actor.channelstringmax 60 chars
actor.idstringyes1–200 chars
actor.namestringmax 200 chars
actor.rolestringyes1–100 chars
effectiveAtone of several shapes
reasonstringyes1–2000 chars
tripIdstringyes1–200 chars

Schema: apps/journeys/src/group-agreements/contracts.ts (VacateSchema)

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.
404trip_not_on_agreementThe trip holds no berths on the agreement.
404group_bookings_not_enabledGroup bookings are 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.

Cancel a trip on the agreement with a penalty​

POST/group-agreements/{id}/cancellations

Parameters

NameInRequiredNotes
idpathyes

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

Request body

FieldTypeRequiredNotes
actorobjectyes
actor.channelstringmax 60 chars
actor.idstringyes1–200 chars
actor.namestringmax 200 chars
actor.rolestringyes1–100 chars
effectiveAtone of several shapes
idempotencyKeystringyes1–200 chars
insidePenaltyPeriodbooleanyes
penaltyPercentnumberyes≥ 0; ≤ 100
reasonstringyes1–2000 chars
tripIdstringyes1–200 chars

Schema: apps/journeys/src/group-agreements/contracts.ts (CancellationSchema)

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.
404group_bookings_not_enabledGroup bookings are 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.

Preview converting a below-minimum agreement​

GET/group-agreements/{id}/conversion-preview

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.
404group_bookings_not_enabledGroup bookings are not enabled for the tenant.
500internalUnexpected failure. Retry with the same Idempotency-Key.

Read free places​

GET/group-agreements/{id}/free-places

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.
404group_bookings_not_enabledGroup bookings are not enabled for the tenant.
500internalUnexpected failure. Retry with the same Idempotency-Key.

Settle free places after departure​

POST/group-agreements/{id}/free-places/settle

Parameters

NameInRequiredNotes
idpathyes

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

Request body

FieldTypeRequiredNotes
actorobjectyes
actor.channelstringmax 60 chars
actor.idstringyes1–200 chars
actor.namestringmax 200 chars
actor.rolestringyes1–100 chars
effectiveAtone of several shapes
idempotencyKeystringyes1–200 chars

Schema: apps/journeys/src/group-agreements/contracts.ts (SettleFreePlacesSchema)

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.
404group_bookings_not_enabledGroup bookings are 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.

Open the order engine group for the agreement​

POST/group-agreements/{id}/group

Parameters

NameInRequiredNotes
idpathyes

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

Request body

FieldTypeRequiredNotes
actorobjectyes
actor.channelstringmax 60 chars
actor.idstringyes1–200 chars
actor.namestringmax 200 chars
actor.rolestringyes1–100 chars

Response 201

POST/group-agreements/GA-2026-E3E883/groupOpen the order engine group for the agreement
Request
curl -X POST "$BASE/group-agreements/GA-2026-E3E883/group" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Request-Id: req-0050" \
-H "Content-Type: application/json" \
-d '{
"actor": {
"id": "sales-0031",
"name": "Sara Conti",
"role": "group_sales",
"channel": "back_office"
}
}'
Response
HTTP/1.1 201
X-Request-Id: req-0050
{
"groupId": "grp_GA-2026-BA3784",
"tenantId": "meridian",
"name": "Harbourline Pharma incentive 2027",
"groupType": "incentive",
"status": "confirmed",
"organiser": {
"ref": "ORG-HLPHARMA",
"name": "Harbourline Pharma"
},
"agreement": {
"agreementRef": "GA-2026-E3E883",
"contractRef": "52060202-6147-40e3-a218-6ff1899b87ac",
"negotiatedConditions": {
"priceListRef": "GRP-INC-2027@1",
"currency": "EUR",
"terms": []
},
"paymentLogic": {
"anchor": "group",
"pattern": "agency_bulk",
"scenario": "group_deposit",
"instalments": []
},
"constraints": {
"inherited": {
"departureRef": "MED7-2027-05-24"
},
"constrainedProductKinds": [
"cruise"
],
"allowedAdditionKinds": [
"excursion",
"beverage"
],
"allowedValues": {
"categoryRef": [
"BALCONY-B2",
"INSIDE-I1",
"SUITE-S1"
]
},
"promotionsOnTop": false,
"ruleReasons": {
"departureRef": "Booked under the group agreement \"Harbourline Pharma incentive 2027\" for Western Mediterranean, 24 May 2027. Another departure needs its own agreement.",
"categoryRef": "Only the categories held for the group (Balcony, Inside, Suite) are sold at the group fare.",
"promotions": "The group fare is the agreed price. Individual promotions do not apply on top of it.",
"additions": "Extras outside the agreement are limited to excursion, beverage."
}
}
},
"version": 1,
"history": [
{
"at": "2026-11-02T09:35:50.000Z",
"action": "created",
"actor": {
"id": "sales-0031",
"name": "Sara Conti",
"role": "group_sales",
"channel": "back_office"
},
"version": 1,
"detail": {
"status": "confirmed"
}
}
],
"createdAt": "2026-11-02T09:35:50.000Z",
"updatedAt": "2026-11-02T09:35:50.000Z"
}
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.
404group_bookings_not_enabledGroup bookings are 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 ledger​

GET/group-agreements/{id}/ledger

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.
404group_bookings_not_enabledGroup bookings are not enabled for the tenant.
500internalUnexpected failure. Retry with the same Idempotency-Key.

Read the name list​

GET/group-agreements/{id}/name-list

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.
404group_bookings_not_enabledGroup bookings are not enabled for the tenant.
500internalUnexpected failure. Retry with the same Idempotency-Key.

Read onboard arrangements​

GET/group-agreements/{id}/onboard

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.
404group_bookings_not_enabledGroup bookings are not enabled for the tenant.
500internalUnexpected failure. Retry with the same Idempotency-Key.

Record a receipt against a deposit stage​

POST/group-agreements/{id}/receipts

Parameters

NameInRequiredNotes
idpathyes

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

Request body

FieldTypeRequiredNotes
actorobjectyes
actor.channelstringmax 60 chars
actor.idstringyes1–200 chars
actor.namestringmax 200 chars
actor.rolestringyes1–100 chars
amountMinorintegeryes> 0
effectiveAtone of several shapes
externalRefstringmax 200 chars
idempotencyKeystringyes1–200 chars
methodstringyes1–60 chars
payerobjectyes
payer.contactstringmax 320 chars
payer.namestringmax 200 chars
payer.refstringyes1–200 chars
payer.rolestringyes1–60 chars
stageKeystringyes1–60 chars

Schema: apps/journeys/src/group-agreements/contracts.ts (ReceiptSchema)

Response 201

POST/group-agreements/GA-2026-E3E883/receiptsRecord the contract deposit
Request
curl -X POST "$BASE/group-agreements/GA-2026-E3E883/receipts" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Request-Id: req-0051" \
-H "Content-Type: application/json" \
-d '{
"stageKey": "D1",
"amountMinor": 600000,
"method": "bank_transfer",
"payer": {
"ref": "AGY-HARBOURLINE",
"name": "Harbourline Travel",
"role": "agency"
},
"externalRef": "BANK-REF-77120",
"idempotencyKey": "d1-GA-2026-E3E883",
"actor": {
"id": "sales-0031",
"name": "Sara Conti",
"role": "group_sales",
"channel": "back_office"
}
}'
Response
HTTP/1.1 201
X-Request-Id: req-0051
{
"receiptRef": "grc_5bb8e0a1-5528-46fe-b8c5-81d2b223172a",
"stageKey": "D1",
"amountMinor": 600000,
"creditAppliedMinor": 0,
"payer": {
"ref": "AGY-HARBOURLINE",
"name": "Harbourline Travel",
"role": "agency"
},
"method": "bank_transfer",
"externalRef": "BANK-REF-77120",
"effectiveAt": "2026-11-02T09:36:27.000Z",
"entries": [
{
"entryId": "gle_3481e2e4-2db6-4bde-abfe-95accc106486",
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"groupId": "grp_GA-2026-BA3784",
"entryType": "on_account",
"holdId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:BALCONY-B2:1:1",
"tripId": null,
"stageKey": "D1",
"amountMinor": 15000,
"currency": "EUR",
"receiptRef": "grc_5bb8e0a1-5528-46fe-b8c5-81d2b223172a",
"reverses": null,
"detail": {
"source": "cash"
},
"effectiveAt": "2026-11-02T09:36:27.000Z",
"createdAt": "2026-11-02T09:36:27.000Z"
},
{
"entryId": "gle_0cb41370-84b9-4404-8a52-59a95d559fd9",
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"groupId": "grp_GA-2026-BA3784",
"entryType": "on_account",
"holdId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:BALCONY-B2:1:2",
"tripId": null,
"stageKey": "D1",
"amountMinor": 15000,
"currency": "EUR",
"receiptRef": "grc_5bb8e0a1-5528-46fe-b8c5-81d2b223172a",
"reverses": null,
"detail": {
"source": "cash"
},
"effectiveAt": "2026-11-02T09:36:27.000Z",
"createdAt": "2026-11-02T09:36:27.000Z"
},
{
"entryId": "gle_183be069-a250-4cd4-a2bb-ea651a0bd1f2",
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"groupId": "grp_GA-2026-BA3784",
"entryType": "on_account",
"holdId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:BALCONY-B2:2:1",
"tripId": null,
"stageKey": "D1",
"amountMinor": 15000,
"currency": "EUR",
"receiptRef": "grc_5bb8e0a1-5528-46fe-b8c5-81d2b223172a",
"reverses": null,
"detail": {
"source": "cash"
},
"effectiveAt": "2026-11-02T09:36:27.000Z",
"createdAt": "2026-11-02T09:36:27.000Z"
},
{
"entryId": "gle_2834ffd9-b655-4792-8f3a-e2a4cb01017f",
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"groupId": "grp_GA-2026-BA3784",
"entryType": "on_account",
"holdId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:BALCONY-B2:2:2",
"tripId": null,
"stageKey": "D1",
"amountMinor": 15000,
"currency": "EUR",
"receiptRef": "grc_5bb8e0a1-5528-46fe-b8c5-81d2b223172a",
"reverses": null,
"detail": {
"source": "cash"
},
"effectiveAt": "2026-11-02T09:36:27.000Z",
"createdAt": "2026-11-02T09:36:27.000Z"
},
{
"entryId": "gle_d987febf-a446-46f3-9fe7-306342dabec2",
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"groupId": "grp_GA-2026-BA3784",
"entryType": "on_account",
"holdId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:BALCONY-B2:3:1",
"tripId": null,
"stageKey": "D1",
"amountMinor": 15000,
"currency": "EUR",
"receiptRef": "grc_5bb8e0a1-5528-46fe-b8c5-81d2b223172a",
"reverses": null,
"detail": {
"source": "cash"
},
"effectiveAt": "2026-11-02T09:36:27.000Z",
"createdAt": "2026-11-02T09:36:27.000Z"
},
{
"entryId": "gle_4ed9cf81-9fc6-4fdc-b194-08bbdc730c10",
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"groupId": "grp_GA-2026-BA3784",
"entryType": "on_account",
"holdId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:BALCONY-B2:3:2",
"tripId": null,
"stageKey": "D1",
"amountMinor": 15000,
"currency": "EUR",
"receiptRef": "grc_5bb8e0a1-5528-46fe-b8c5-81d2b223172a",
"reverses": null,
"detail": {
"source": "cash"
},
"effectiveAt": "2026-11-02T09:36:27.000Z",
"createdAt": "2026-11-02T09:36:27.000Z"
},
{
"entryId": "gle_12c0ae53-e153-4522-b5aa-91073f98f55f",
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"groupId": "grp_GA-2026-BA3784",
"entryType": "on_account",
"holdId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:BALCONY-B2:4:1",
"tripId": null,
"stageKey": "D1",
"amountMinor": 15000,
"currency": "EUR",
"receiptRef": "grc_5bb8e0a1-5528-46fe-b8c5-81d2b223172a",
"reverses": null,
"detail": {
"source": "cash"
},
"effectiveAt": "2026-11-02T09:36:27.000Z",
"createdAt": "2026-11-02T09:36:27.000Z"
},
{
"entryId": "gle_92125bf8-a561-4fc3-82f0-ca2b6888b46d",
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"groupId": "grp_GA-2026-BA3784",
"entryType": "on_account",
"holdId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:BALCONY-B2:4:2",
"tripId": null,
"stageKey": "D1",
"amountMinor": 15000,
"currency": "EUR",
"receiptRef": "grc_5bb8e0a1-5528-46fe-b8c5-81d2b223172a",
"reverses": null,
"detail": {
"source": "cash"
},
"effectiveAt": "2026-11-02T09:36:27.000Z",
"createdAt": "2026-11-02T09:36:27.000Z"
},
{
"entryId": "gle_9934739b-2465-45d1-9041-55ac381a3571",
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"groupId": "grp_GA-2026-BA3784",
"entryType": "on_account",
"holdId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:BALCONY-B2:5:1",
"tripId": null,
"stageKey": "D1",
"amountMinor": 15000,
"currency": "EUR",
"receiptRef": "grc_5bb8e0a1-5528-46fe-b8c5-81d2b223172a",
"reverses": null,
"detail": {
"source": "cash"
},
"effectiveAt": "2026-11-02T09:36:27.000Z",
"createdAt": "2026-11-02T09:36:27.000Z"
},
{
"entryId": "gle_d5a00907-24fb-4d99-bc03-fe2aa0a93b2f",
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"groupId": "grp_GA-2026-BA3784",
"entryType": "on_account",
"holdId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:BALCONY-B2:5:2",
"tripId": null,
"stageKey": "D1",
"amountMinor": 15000,
"currency": "EUR",
"receiptRef": "grc_5bb8e0a1-5528-46fe-b8c5-81d2b223172a",
"reverses": null,
"detail": {
"source": "cash"
},
"effectiveAt": "2026-11-02T09:36:27.000Z",
"createdAt": "2026-11-02T09:36:27.000Z"
},
{
"entryId": "gle_0ebc3961-367f-4a62-8b11-1202c32be1a1",
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"groupId": "grp_GA-2026-BA3784",
"entryType": "on_account",
"holdId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:BALCONY-B2:6:1",
"tripId": null,
"stageKey": "D1",
"amountMinor": 15000,
"currency": "EUR",
"receiptRef": "grc_5bb8e0a1-5528-46fe-b8c5-81d2b223172a",
"reverses": null,
"detail": {
"source": "cash"
},
"effectiveAt": "2026-11-02T09:36:27.000Z",
"createdAt": "2026-11-02T09:36:27.000Z"
},
{
"entryId": "gle_9571f90f-9624-4a4a-a8ca-40074f87817e",
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"groupId": "grp_GA-2026-BA3784",
"entryType": "on_account",
"holdId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:BALCONY-B2:6:2",
"tripId": null,
"stageKey": "D1",
"amountMinor": 15000,
"currency": "EUR",
"receiptRef": "grc_5bb8e0a1-5528-46fe-b8c5-81d2b223172a",
"reverses": null,
"detail": {
"source": "cash"
},
"effectiveAt": "2026-11-02T09:36:27.000Z",
"createdAt": "2026-11-02T09:36:27.000Z"
},
{
"entryId": "gle_d0edb407-5565-4a49-84f8-e26bae5692c7",
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"groupId": "grp_GA-2026-BA3784",
"entryType": "on_account",
"holdId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:BALCONY-B2:7:1",
"tripId": null,
"stageKey": "D1",
"amountMinor": 15000,
"currency": "EUR",
"receiptRef": "grc_5bb8e0a1-5528-46fe-b8c5-81d2b223172a",
"reverses": null,
"detail": {
"source": "cash"
},
"effectiveAt": "2026-11-02T09:36:27.000Z",
"createdAt": "2026-11-02T09:36:27.000Z"
},
{
"entryId": "gle_19cd3f44-6865-40c0-8654-97b75cab846b",
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"groupId": "grp_GA-2026-BA3784",
"entryType": "on_account",
"holdId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:BALCONY-B2:7:2",
"tripId": null,
"stageKey": "D1",
"amountMinor": 15000,
"currency": "EUR",
"receiptRef": "grc_5bb8e0a1-5528-46fe-b8c5-81d2b223172a",
"reverses": null,
"detail": {
"source": "cash"
},
"effectiveAt": "2026-11-02T09:36:27.000Z",
"createdAt": "2026-11-02T09:36:27.000Z"
},
{
"entryId": "gle_c5b3e667-b859-4cce-954d-61f5002ef0ea",
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"groupId": "grp_GA-2026-BA3784",
"entryType": "on_account",
"holdId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:BALCONY-B2:8:1",
"tripId": null,
"stageKey": "D1",
"amountMinor": 15000,
"currency": "EUR",
"receiptRef": "grc_5bb8e0a1-5528-46fe-b8c5-81d2b223172a",
"reverses": null,
"detail": {
"source": "cash"
},
"effectiveAt": "2026-11-02T09:36:27.000Z",
"createdAt": "2026-11-02T09:36:27.000Z"
},
{
"entryId": "gle_4e738ba1-7c83-4a4c-8075-b08f2ead4262",
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"groupId": "grp_GA-2026-BA3784",
"entryType": "on_account",
"holdId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:BALCONY-B2:8:2",
"tripId": null,
"stageKey": "D1",
"amountMinor": 15000,
"currency": "EUR",
"receiptRef": "grc_5bb8e0a1-5528-46fe-b8c5-81d2b223172a",
"reverses": null,
"detail": {
"source": "cash"
},
"effectiveAt": "2026-11-02T09:36:27.000Z",
"createdAt": "2026-11-02T09:36:27.000Z"
},
{
"entryId": "gle_68d183e6-71a8-4463-acc9-b68be24ecc93",
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"groupId": "grp_GA-2026-BA3784",
"entryType": "on_account",
"holdId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:BALCONY-B2:9:1",
"tripId": null,
"stageKey": "D1",
"amountMinor": 15000,
"currency": "EUR",
"receiptRef": "grc_5bb8e0a1-5528-46fe-b8c5-81d2b223172a",
"reverses": null,
"detail": {
"source": "cash"
},
"effectiveAt": "2026-11-02T09:36:27.000Z",
"createdAt": "2026-11-02T09:36:27.000Z"
},
{
"entryId": "gle_2c66b2ca-0ba8-40b0-b368-e7341cace4ce",
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"groupId": "grp_GA-2026-BA3784",
"entryType": "on_account",
"holdId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:BALCONY-B2:9:2",
"tripId": null,
"stageKey": "D1",
"amountMinor": 15000,
"currency": "EUR",
"receiptRef": "grc_5bb8e0a1-5528-46fe-b8c5-81d2b223172a",
"reverses": null,
"detail": {
"source": "cash"
},
"effectiveAt": "2026-11-02T09:36:27.000Z",
"createdAt": "2026-11-02T09:36:27.000Z"
},
{
"entryId": "gle_d0826b57-f82b-43f4-a84e-eaaa8458b94b",
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"groupId": "grp_GA-2026-BA3784",
"entryType": "on_account",
"holdId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:BALCONY-B2:10:1",
"tripId": null,
"stageKey": "D1",
"amountMinor": 15000,
"currency": "EUR",
"receiptRef": "grc_5bb8e0a1-5528-46fe-b8c5-81d2b223172a",
"reverses": null,
"detail": {
"source": "cash"
},
"effectiveAt": "2026-11-02T09:36:27.000Z",
"createdAt": "2026-11-02T09:36:27.000Z"
},
{
"entryId": "gle_d8628841-6109-4881-8711-cdeb82219e53",
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"groupId": "grp_GA-2026-BA3784",
"entryType": "on_account",
"holdId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:BALCONY-B2:10:2",
"tripId": null,
"stageKey": "D1",
"amountMinor": 15000,
"currency": "EUR",
"receiptRef": "grc_5bb8e0a1-5528-46fe-b8c5-81d2b223172a",
"reverses": null,
"detail": {
"source": "cash"
},
"effectiveAt": "2026-11-02T09:36:27.000Z",
"createdAt": "2026-11-02T09:36:27.000Z"
},
{
"entryId": "gle_164d9033-7001-41c2-8402-5ad2d4e75661",
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"groupId": "grp_GA-2026-BA3784",
"entryType": "on_account",
"holdId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:BALCONY-B2:11:1",
"tripId": null,
"stageKey": "D1",
"amountMinor": 15000,
"currency": "EUR",
"receiptRef": "grc_5bb8e0a1-5528-46fe-b8c5-81d2b223172a",
"reverses": null,
"detail": {
"source": "cash"
},
"effectiveAt": "2026-11-02T09:36:27.000Z",
"createdAt": "2026-11-02T09:36:27.000Z"
},
{
"entryId": "gle_fbaa075a-9f05-4c01-9da9-f3a39da96fff",
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"groupId": "grp_GA-2026-BA3784",
"entryType": "on_account",
"holdId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:BALCONY-B2:11:2",
"tripId": null,
"stageKey": "D1",
"amountMinor": 15000,
"currency": "EUR",
"receiptRef": "grc_5bb8e0a1-5528-46fe-b8c5-81d2b223172a",
"reverses": null,
"detail": {
"source": "cash"
},
"effectiveAt": "2026-11-02T09:36:27.000Z",
"createdAt": "2026-11-02T09:36:27.000Z"
},
{
"entryId": "gle_7daf3970-0527-4464-9379-6cfdb43954ad",
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"groupId": "grp_GA-2026-BA3784",
"entryType": "on_account",
"holdId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:BALCONY-B2:12:1",
"tripId": null,
"stageKey": "D1",
"amountMinor": 15000,
"currency": "EUR",
"receiptRef": "grc_5bb8e0a1-5528-46fe-b8c5-81d2b223172a",
"reverses": null,
"detail": {
"source": "cash"
},
"effectiveAt": "2026-11-02T09:36:27.000Z",
"createdAt": "2026-11-02T09:36:27.000Z"
},
{
"entryId": "gle_d90e022e-9983-487d-b0ec-d064cb84c694",
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"groupId": "grp_GA-2026-BA3784",
"entryType": "on_account",
"holdId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:BALCONY-B2:12:2",
"tripId": null,
"stageKey": "D1",
"amountMinor": 15000,
"currency": "EUR",
"receiptRef": "grc_5bb8e0a1-5528-46fe-b8c5-81d2b223172a",
"reverses": null,
"detail": {
"source": "cash"
},
"effectiveAt": "2026-11-02T09:36:27.000Z",
"createdAt": "2026-11-02T09:36:27.000Z"
},
{
"entryId": "gle_1664d26a-0722-4035-9ada-264e87db2bf2",
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"groupId": "grp_GA-2026-BA3784",
"entryType": "on_account",
"holdId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:BALCONY-B2:13:1",
"tripId": null,
"stageKey": "D1",
"amountMinor": 15000,
"currency": "EUR",
"receiptRef": "grc_5bb8e0a1-5528-46fe-b8c5-81d2b223172a",
"reverses": null,
"detail": {
"source": "cash"
},
"effectiveAt": "2026-11-02T09:36:27.000Z",
"createdAt": "2026-11-02T09:36:27.000Z"
},
{
"entryId": "gle_86c2be26-8336-489b-ad97-d8f7555e5e05",
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"groupId": "grp_GA-2026-BA3784",
"entryType": "on_account",
"holdId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:BALCONY-B2:13:2",
"tripId": null,
"stageKey": "D1",
"amountMinor": 15000,
"currency": "EUR",
"receiptRef": "grc_5bb8e0a1-5528-46fe-b8c5-81d2b223172a",
"reverses": null,
"detail": {
"source": "cash"
},
"effectiveAt": "2026-11-02T09:36:27.000Z",
"createdAt": "2026-11-02T09:36:27.000Z"
},
{
"entryId": "gle_88226226-b3a5-46f5-8431-8d246fe1290b",
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"groupId": "grp_GA-2026-BA3784",
"entryType": "on_account",
"holdId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:BALCONY-B2:14:1",
"tripId": null,
"stageKey": "D1",
"amountMinor": 15000,
"currency": "EUR",
"receiptRef": "grc_5bb8e0a1-5528-46fe-b8c5-81d2b223172a",
"reverses": null,
"detail": {
"source": "cash"
},
"effectiveAt": "2026-11-02T09:36:27.000Z",
"createdAt": "2026-11-02T09:36:27.000Z"
},
{
"entryId": "gle_d23673c7-731f-4d19-9689-dcc5ebce962e",
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"groupId": "grp_GA-2026-BA3784",
"entryType": "on_account",
"holdId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:BALCONY-B2:14:2",
"tripId": null,
"stageKey": "D1",
"amountMinor": 15000,
"currency": "EUR",
"receiptRef": "grc_5bb8e0a1-5528-46fe-b8c5-81d2b223172a",
"reverses": null,
"detail": {
"source": "cash"
},
"effectiveAt": "2026-11-02T09:36:27.000Z",
"createdAt": "2026-11-02T09:36:27.000Z"
},
{
"entryId": "gle_de13ad6e-08de-49c5-840a-f1b13fa44e8a",
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"groupId": "grp_GA-2026-BA3784",
"entryType": "on_account",
"holdId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:INSIDE-I1:1:1",
"tripId": null,
"stageKey": "D1",
"amountMinor": 15000,
"currency": "EUR",
"receiptRef": "grc_5bb8e0a1-5528-46fe-b8c5-81d2b223172a",
"reverses": null,
"detail": {
"source": "cash"
},
"effectiveAt": "2026-11-02T09:36:27.000Z",
"createdAt": "2026-11-02T09:36:27.000Z"
},
{
"entryId": "gle_ddea7ee6-964d-4648-b253-2f9994b078c0",
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"groupId": "grp_GA-2026-BA3784",
"entryType": "on_account",
"holdId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:INSIDE-I1:1:2",
"tripId": null,
"stageKey": "D1",
"amountMinor": 15000,
"currency": "EUR",
"receiptRef": "grc_5bb8e0a1-5528-46fe-b8c5-81d2b223172a",
"reverses": null,
"detail": {
"source": "cash"
},
"effectiveAt": "2026-11-02T09:36:27.000Z",
"createdAt": "2026-11-02T09:36:27.000Z"
},
{
"entryId": "gle_42e80d95-0179-4647-98ad-367946a91c77",
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"groupId": "grp_GA-2026-BA3784",
"entryType": "on_account",
"holdId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:INSIDE-I1:2:1",
"tripId": null,
"stageKey": "D1",
"amountMinor": 15000,
"currency": "EUR",
"receiptRef": "grc_5bb8e0a1-5528-46fe-b8c5-81d2b223172a",
"reverses": null,
"detail": {
"source": "cash"
},
"effectiveAt": "2026-11-02T09:36:27.000Z",
"createdAt": "2026-11-02T09:36:27.000Z"
},
{
"entryId": "gle_fc36a8b3-d8b1-4ccf-b499-fee34acfc34e",
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"groupId": "grp_GA-2026-BA3784",
"entryType": "on_account",
"holdId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:INSIDE-I1:2:2",
"tripId": null,
"stageKey": "D1",
"amountMinor": 15000,
"currency": "EUR",
"receiptRef": "grc_5bb8e0a1-5528-46fe-b8c5-81d2b223172a",
"reverses": null,
"detail": {
"source": "cash"
},
"effectiveAt": "2026-11-02T09:36:27.000Z",
"createdAt": "2026-11-02T09:36:27.000Z"
},
{
"entryId": "gle_5e9d14d4-c2f4-4925-be02-46ebd9783603",
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"groupId": "grp_GA-2026-BA3784",
"entryType": "on_account",
"holdId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:INSIDE-I1:3:1",
"tripId": null,
"stageKey": "D1",
"amountMinor": 15000,
"currency": "EUR",
"receiptRef": "grc_5bb8e0a1-5528-46fe-b8c5-81d2b223172a",
"reverses": null,
"detail": {
"source": "cash"
},
"effectiveAt": "2026-11-02T09:36:27.000Z",
"createdAt": "2026-11-02T09:36:27.000Z"
},
{
"entryId": "gle_c5ea6bf4-3d1f-43de-87e6-b6059627637a",
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"groupId": "grp_GA-2026-BA3784",
"entryType": "on_account",
"holdId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:INSIDE-I1:3:2",
"tripId": null,
"stageKey": "D1",
"amountMinor": 15000,
"currency": "EUR",
"receiptRef": "grc_5bb8e0a1-5528-46fe-b8c5-81d2b223172a",
"reverses": null,
"detail": {
"source": "cash"
},
"effectiveAt": "2026-11-02T09:36:27.000Z",
"createdAt": "2026-11-02T09:36:27.000Z"
},
{
"entryId": "gle_1582ab1e-cbc3-4ffc-8f75-65c5177c2054",
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"groupId": "grp_GA-2026-BA3784",
"entryType": "on_account",
"holdId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:INSIDE-I1:4:1",
"tripId": null,
"stageKey": "D1",
"amountMinor": 15000,
"currency": "EUR",
"receiptRef": "grc_5bb8e0a1-5528-46fe-b8c5-81d2b223172a",
"reverses": null,
"detail": {
"source": "cash"
},
"effectiveAt": "2026-11-02T09:36:27.000Z",
"createdAt": "2026-11-02T09:36:27.000Z"
},
{
"entryId": "gle_03750096-805e-467e-8120-76f6522cc857",
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"groupId": "grp_GA-2026-BA3784",
"entryType": "on_account",
"holdId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:INSIDE-I1:4:2",
"tripId": null,
"stageKey": "D1",
"amountMinor": 15000,
"currency": "EUR",
"receiptRef": "grc_5bb8e0a1-5528-46fe-b8c5-81d2b223172a",
"reverses": null,
"detail": {
"source": "cash"
},
"effectiveAt": "2026-11-02T09:36:27.000Z",
"createdAt": "2026-11-02T09:36:27.000Z"
},
{
"entryId": "gle_66f5af5f-37aa-4131-a59d-c2364586187d",
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"groupId": "grp_GA-2026-BA3784",
"entryType": "on_account",
"holdId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:SUITE-S1:1:1",
"tripId": null,
"stageKey": "D1",
"amountMinor": 15000,
"currency": "EUR",
"receiptRef": "grc_5bb8e0a1-5528-46fe-b8c5-81d2b223172a",
"reverses": null,
"detail": {
"source": "cash"
},
"effectiveAt": "2026-11-02T09:36:27.000Z",
"createdAt": "2026-11-02T09:36:27.000Z"
},
{
"entryId": "gle_99b97ee8-5ebe-48fa-bbf0-99ccb44463dd",
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"groupId": "grp_GA-2026-BA3784",
"entryType": "on_account",
"holdId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:SUITE-S1:1:2",
"tripId": null,
"stageKey": "D1",
"amountMinor": 15000,
"currency": "EUR",
"receiptRef": "grc_5bb8e0a1-5528-46fe-b8c5-81d2b223172a",
"reverses": null,
"detail": {
"source": "cash"
},
"effectiveAt": "2026-11-02T09:36:27.000Z",
"createdAt": "2026-11-02T09:36:27.000Z"
},
{
"entryId": "gle_22d6dd51-1485-449d-88a3-e32e12e65238",
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"groupId": "grp_GA-2026-BA3784",
"entryType": "on_account",
"holdId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:SUITE-S1:2:1",
"tripId": null,
"stageKey": "D1",
"amountMinor": 15000,
"currency": "EUR",
"receiptRef": "grc_5bb8e0a1-5528-46fe-b8c5-81d2b223172a",
"reverses": null,
"detail": {
"source": "cash"
},
"effectiveAt": "2026-11-02T09:36:27.000Z",
"createdAt": "2026-11-02T09:36:27.000Z"
},
{
"entryId": "gle_9c9b62cb-95db-4abb-9244-4abd32fffe73",
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"groupId": "grp_GA-2026-BA3784",
"entryType": "on_account",
"holdId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51:SUITE-S1:2:2",
"tripId": null,
"stageKey": "D1",
"amountMinor": 15000,
"currency": "EUR",
"receiptRef": "grc_5bb8e0a1-5528-46fe-b8c5-81d2b223172a",
"reverses": null,
"detail": {
"source": "cash"
},
"effectiveAt": "2026-11-02T09:36:27.000Z",
"createdAt": "2026-11-02T09:36:27.000Z"
}
],
"idempotent": 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.
404group_bookings_not_enabledGroup bookings are not enabled for the tenant.
409idempotency_in_progressA request with this Idempotency-Key is still running. Retry after the Retry-After interval.
422receipt_exceeds_dueThe receipt exceeds what is due for the stage.
422idempotency_key_reusedThe Idempotency-Key was used for a different request.
500internalUnexpected failure. Retry with the same Idempotency-Key.

Release units back to inventory​

POST/group-agreements/{id}/releases

Parameters

NameInRequiredNotes
idpathyes

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

Request body

FieldTypeRequiredNotes
actorobjectyes
actor.channelstringmax 60 chars
actor.idstringyes1–200 chars
actor.namestringmax 200 chars
actor.rolestringyes1–100 chars
categoryRefstringyes1–200 chars
effectiveAtone of several shapes
reasonstringyes1–2000 chars
unitsintegeryes> 0

Schema: apps/journeys/src/group-agreements/contracts.ts (ReleaseSchema)

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.
404group_bookings_not_enabledGroup bookings are 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.

Release unnamed units at the name-list deadline​

POST/group-agreements/{id}/releases/name-list-deadline

Parameters

NameInRequiredNotes
idpathyes

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

Request body

FieldTypeRequiredNotes
actorobjectyes
actor.channelstringmax 60 chars
actor.idstringyes1–200 chars
actor.namestringmax 200 chars
actor.rolestringyes1–100 chars
effectiveAtone of several shapes

Schema: apps/journeys/src/group-agreements/contracts.ts (AutoReleaseSchema)

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.
404group_bookings_not_enabledGroup bookings are 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 payment schedule​

GET/group-agreements/{id}/schedule

Parameters

NameInRequiredNotes
idpathyes

Response 200

GET/group-agreements/GA-2026-E3E883/scheduleRead the payment schedule
Request
curl -X GET "$BASE/group-agreements/GA-2026-E3E883/schedule" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Request-Id: req-0052"
Response
HTTP/1.1 200
X-Request-Id: req-0052
{
"asOf": "2026-11-02T09:37:04.000Z",
"agreementRef": "GA-2026-E3E883",
"schedule": {
"asOf": "2026-11-02T09:37:04.000Z",
"stages": [
{
"key": "D1",
"label": "Contract deposit",
"kind": "per_berth",
"dueDate": "2026-12-01",
"deferred": false,
"dueMinor": 600000,
"receivedMinor": 600000,
"creditAppliedMinor": 0,
"status": "paid",
"berths": 40
},
{
"key": "D2",
"label": "Second deposit",
"kind": "per_berth",
"dueDate": "2027-02-24",
"deferred": false,
"dueMinor": 1000000,
"receivedMinor": 0,
"creditAppliedMinor": 0,
"status": "upcoming",
"berths": 40
},
{
"key": "BAL",
"label": "Balance",
"kind": "balance",
"dueDate": "2027-04-09",
"deferred": false,
"dueMinor": 0,
"receivedMinor": 0,
"creditAppliedMinor": 0,
"status": "upcoming",
"berths": 40
}
],
"trips": [],
"nextDue": {
"key": "D2",
"label": "Second deposit",
"kind": "per_berth",
"dueDate": "2027-02-24",
"deferred": false,
"dueMinor": 1000000,
"receivedMinor": 0,
"creditAppliedMinor": 0,
"status": "upcoming",
"berths": 40
}
}
}
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.
404group_bookings_not_enabledGroup bookings are not enabled for the tenant.
500internalUnexpected failure. Retry with the same Idempotency-Key.

Record the final settlement​

POST/group-agreements/{id}/settlement

Parameters

NameInRequiredNotes
idpathyes

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

Request body

FieldTypeRequiredNotes
actorobjectyes
actor.channelstringmax 60 chars
actor.idstringyes1–200 chars
actor.namestringmax 200 chars
actor.rolestringyes1–100 chars
cardPaymentsarray of object
cardPayments[].amountMinorintegeryes> 0
cardPayments[].payerobjectyes
cardPayments[].payer.contactstringmax 320 chars
cardPayments[].payer.namestringmax 200 chars
cardPayments[].payer.refstringyes1–200 chars
cardPayments[].tripIdstringyes1–200 chars
effectiveAtone of several shapes
externalRefstringmax 200 chars
idempotencyKeystringyes1–200 chars
remittanceListarray of object
remittanceList[].amountMinorintegeryes≥ 0
remittanceList[].tripIdstringyes1–200 chars

Schema: apps/journeys/src/group-agreements/contracts.ts (FinalSettlementSchema)

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.
404group_bookings_not_enabledGroup bookings are not enabled for the tenant.
409names_not_closedThe name list is not closed yet.
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 statement​

GET/group-agreements/{id}/statement

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.
404group_bookings_not_enabledGroup bookings are not enabled for the tenant.
500internalUnexpected failure. Retry with the same Idempotency-Key.

Read the timeline​

GET/group-agreements/{id}/timeline

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.
404group_bookings_not_enabledGroup bookings are not enabled for the tenant.
500internalUnexpected failure. Retry with the same Idempotency-Key.

Move an agreement to another state​

POST/group-agreements/{id}/transitions

requested → pending_approval, offered, refused or cancelled; pending_approval → offered, refused, expired or cancelled; offered → pending_approval, contracted, expired or cancelled; contracted → names_closed or cancelled; names_closed → closed or cancelled; closed → settled.

Parameters

NameInRequiredNotes
idpathyes

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

Request body

FieldTypeRequiredNotes
actorobjectyes
actor.channelstringmax 60 chars
actor.idstringyes1–200 chars
actor.namestringmax 200 chars
actor.rolestringyes1–100 chars
effectiveAtone of several shapes
reasonstringmax 2000 chars
toenum: requested, pending_approval, offered, contracted, names_closed, closed, settled, expired, refused, cancelledyes

Schema: apps/journeys/src/group-agreements/contracts.ts (TransitionSchema)

Response 200

POST/group-agreements/GA-2026-E3E883/transitionsMark the agreement as contracted
Request
curl -X POST "$BASE/group-agreements/GA-2026-E3E883/transitions" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Request-Id: req-0049" \
-H "Content-Type: application/json" \
-d '{
"to": "contracted",
"reason": "Contract signed by the agency",
"actor": {
"id": "sales-0031",
"name": "Sara Conti",
"role": "group_sales",
"channel": "back_office"
}
}'
Response
HTTP/1.1 200
X-Request-Id: req-0049
{
"fare": {
"code": "GRP-INC-2027",
"version": 1,
"snapshot": {
"source": "pricing",
"capturedAt": "2026-10-30T09:00:00Z",
"categories": [
{
"label": "Inside",
"categoryRef": "INSIDE-I1",
"groupFareMinor": 61900,
"bestAvailableMinor": 71900
},
{
"label": "Balcony",
"categoryRef": "BALCONY-B2",
"groupFareMinor": 98900,
"bestAvailableMinor": 113400
},
{
"label": "Suite",
"categoryRef": "SUITE-S1",
"groupFareMinor": 189000,
"bestAvailableMinor": 214000
}
]
},
"chargesLabel": "Port charges",
"priceValidUntil": "2026-12-15",
"chargesPerGuestMinor": 21000
},
"name": "Harbourline Pharma incentive 2027",
"shape": "block",
"state": "contracted",
"holder": {
"ref": "AGY-HARBOURLINE",
"kind": "agency",
"name": "Harbourline Travel"
},
"leader": {
"ref": "LEAD-0091",
"kind": "person",
"name": "Anna Moretti"
},
"groupId": null,
"history": [
{
"at": "2026-11-02T09:33:59.000Z",
"actor": {
"id": "sales-0031",
"name": "Sara Conti",
"role": "group_sales",
"channel": "back_office"
},
"action": "created",
"detail": {
"shape": "block",
"state": "pending_approval",
"units": 20
},
"version": 1
},
{
"at": "2026-11-02T09:34:36.000Z",
"actor": {
"id": "rm-0005",
"name": "Luca Ferri",
"role": "revenue_manager",
"channel": "back_office"
},
"action": "approval_approve",
"detail": {
"from": "pending_approval",
"state": "offered",
"reason": "Within incentive guidelines"
},
"version": 2
},
{
"at": "2026-11-02T09:35:13.000Z",
"action": "contracted",
"actor": {
"id": "sales-0031",
"name": "Sara Conti",
"role": "group_sales",
"channel": "back_office"
},
"version": 3,
"detail": {
"state": "contracted",
"from": "offered",
"reason": "Contract signed by the agency"
}
}
],
"release": {
"optionExpiresAt": "2026-12-15",
"nameChangeCutoff": "2027-05-17",
"nameListDeadline": "2027-04-09",
"freeReductionUntil": "2027-02-24",
"freeReductionMaxUnits": 3,
"nameChangeFeePerGuestMinor": 5000
},
"version": 3,
"approval": {
"reason": "Within incentive guidelines",
"status": "approved",
"deadline": "2026-11-05T09:33:59.000Z",
"decidedAt": "2026-11-02T09:34:36.000Z",
"decidedBy": "Luca Ferri"
},
"currency": "EUR",
"tenantId": "meridian",
"createdAt": "2026-11-02T09:33:59.000Z",
"departure": {
"ref": "MED7-2027-05-24",
"label": "Western Mediterranean, 24 May 2027",
"returnDate": "2027-05-31",
"departureDate": "2027-05-24"
},
"organiser": {
"ref": "ORG-HLPHARMA",
"kind": "organisation",
"name": "Harbourline Pharma"
},
"updatedAt": "2026-11-02T09:35:13.000Z",
"valueAdds": [],
"commission": {
"basis": "fare_only",
"percent": 10,
"clawback": "cancellation_inside_penalty_period",
"earnedAt": "full_payment",
"remittance": "net"
},
"contractId": "52060202-6147-40e3-a218-6ff1899b87ac",
"freePlaces": {
"value": "fare_at_group_average",
"counted": "first_two_per_unit_full_fare",
"earnedOn": "final_count",
"perPaying": 20,
"settlement": "after_departure",
"beneficiary": "holder",
"commissionable": false
},
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"assumptions": [],
"agreementRef": "GA-2026-E3E883",
"minimumUnits": 15,
"agreementType": "incentive",
"depositStages": [
{
"key": "D1",
"kind": "per_berth",
"label": "Contract deposit",
"dueDate": "2026-12-01",
"deferred": false,
"amountPerBerthMinor": 15000
},
{
"key": "D2",
"kind": "per_berth",
"label": "Second deposit",
"dueDate": "2027-02-24",
"deferred": false,
"amountPerBerthMinor": 25000
},
{
"key": "BAL",
"kind": "balance",
"label": "Balance",
"dueDate": "2027-04-09",
"deferred": 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.
400reason_requiredThis action requires a reason.
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.
404group_bookings_not_enabledGroup bookings are not enabled for the tenant.
409invalid_transitionThe status transition is not allowed from the current status.
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 version history​

GET/group-agreements/{id}/versions

Parameters

NameInRequiredNotes
idpathyes

Response 200

GET/group-agreements/GA-2026-E3E883/versionsRead the version history
Request
curl -X GET "$BASE/group-agreements/GA-2026-E3E883/versions" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Request-Id: req-0054"
Response
HTTP/1.1 200
X-Request-Id: req-0054
{
"agreementRef": "GA-2026-E3E883",
"versions": [
{
"version": 1,
"action": "created",
"document": {
"fare": {
"code": "GRP-INC-2027",
"version": 1,
"snapshot": {
"source": "pricing",
"capturedAt": "2026-10-30T09:00:00Z",
"categories": [
{
"label": "Inside",
"categoryRef": "INSIDE-I1",
"groupFareMinor": 61900,
"bestAvailableMinor": 71900
},
{
"label": "Balcony",
"categoryRef": "BALCONY-B2",
"groupFareMinor": 98900,
"bestAvailableMinor": 113400
},
{
"label": "Suite",
"categoryRef": "SUITE-S1",
"groupFareMinor": 189000,
"bestAvailableMinor": 214000
}
]
},
"chargesLabel": "Port charges",
"priceValidUntil": "2026-12-15",
"chargesPerGuestMinor": 21000
},
"name": "Harbourline Pharma incentive 2027",
"shape": "block",
"state": "pending_approval",
"holder": {
"ref": "AGY-HARBOURLINE",
"kind": "agency",
"name": "Harbourline Travel"
},
"leader": {
"ref": "LEAD-0091",
"kind": "person",
"name": "Anna Moretti"
},
"groupId": null,
"history": [
{
"at": "2026-11-02T09:33:59.000Z",
"actor": {
"id": "sales-0031",
"name": "Sara Conti",
"role": "group_sales",
"channel": "back_office"
},
"action": "created",
"detail": {
"shape": "block",
"state": "pending_approval",
"units": 20
},
"version": 1
}
],
"release": {
"optionExpiresAt": "2026-12-15",
"nameChangeCutoff": "2027-05-17",
"nameListDeadline": "2027-04-09",
"freeReductionUntil": "2027-02-24",
"freeReductionMaxUnits": 3,
"nameChangeFeePerGuestMinor": 5000
},
"version": 1,
"approval": {
"status": "pending",
"deadline": "2026-11-05T09:33:59.000Z"
},
"currency": "EUR",
"tenantId": "meridian",
"createdAt": "2026-11-02T09:33:59.000Z",
"departure": {
"ref": "MED7-2027-05-24",
"label": "Western Mediterranean, 24 May 2027",
"returnDate": "2027-05-31",
"departureDate": "2027-05-24"
},
"organiser": {
"ref": "ORG-HLPHARMA",
"kind": "organisation",
"name": "Harbourline Pharma"
},
"updatedAt": "2026-11-02T09:33:59.000Z",
"valueAdds": [],
"commission": {
"basis": "fare_only",
"percent": 10,
"clawback": "cancellation_inside_penalty_period",
"earnedAt": "full_payment",
"remittance": "net"
},
"contractId": "52060202-6147-40e3-a218-6ff1899b87ac",
"freePlaces": {
"value": "fare_at_group_average",
"counted": "first_two_per_unit_full_fare",
"earnedOn": "final_count",
"perPaying": 20,
"settlement": "after_departure",
"beneficiary": "holder",
"commissionable": false
},
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"assumptions": [],
"agreementRef": "GA-2026-E3E883",
"minimumUnits": 15,
"agreementType": "incentive",
"depositStages": [
{
"key": "D1",
"kind": "per_berth",
"label": "Contract deposit",
"dueDate": "2026-12-01",
"deferred": false,
"amountPerBerthMinor": 15000
},
{
"key": "D2",
"kind": "per_berth",
"label": "Second deposit",
"dueDate": "2027-02-24",
"deferred": false,
"amountPerBerthMinor": 25000
},
{
"key": "BAL",
"kind": "balance",
"label": "Balance",
"dueDate": "2027-04-09",
"deferred": false
}
]
},
"createdAt": "2026-11-02T09:33:59.000Z"
},
{
"version": 2,
"action": "approval_approve",
"document": {
"fare": {
"code": "GRP-INC-2027",
"version": 1,
"snapshot": {
"source": "pricing",
"capturedAt": "2026-10-30T09:00:00Z",
"categories": [
{
"label": "Inside",
"categoryRef": "INSIDE-I1",
"groupFareMinor": 61900,
"bestAvailableMinor": 71900
},
{
"label": "Balcony",
"categoryRef": "BALCONY-B2",
"groupFareMinor": 98900,
"bestAvailableMinor": 113400
},
{
"label": "Suite",
"categoryRef": "SUITE-S1",
"groupFareMinor": 189000,
"bestAvailableMinor": 214000
}
]
},
"chargesLabel": "Port charges",
"priceValidUntil": "2026-12-15",
"chargesPerGuestMinor": 21000
},
"name": "Harbourline Pharma incentive 2027",
"shape": "block",
"state": "offered",
"holder": {
"ref": "AGY-HARBOURLINE",
"kind": "agency",
"name": "Harbourline Travel"
},
"leader": {
"ref": "LEAD-0091",
"kind": "person",
"name": "Anna Moretti"
},
"groupId": null,
"history": [
{
"at": "2026-11-02T09:33:59.000Z",
"actor": {
"id": "sales-0031",
"name": "Sara Conti",
"role": "group_sales",
"channel": "back_office"
},
"action": "created",
"detail": {
"shape": "block",
"state": "pending_approval",
"units": 20
},
"version": 1
},
{
"at": "2026-11-02T09:34:36.000Z",
"actor": {
"id": "rm-0005",
"name": "Luca Ferri",
"role": "revenue_manager",
"channel": "back_office"
},
"action": "approval_approve",
"detail": {
"from": "pending_approval",
"state": "offered",
"reason": "Within incentive guidelines"
},
"version": 2
}
],
"release": {
"optionExpiresAt": "2026-12-15",
"nameChangeCutoff": "2027-05-17",
"nameListDeadline": "2027-04-09",
"freeReductionUntil": "2027-02-24",
"freeReductionMaxUnits": 3,
"nameChangeFeePerGuestMinor": 5000
},
"version": 2,
"approval": {
"reason": "Within incentive guidelines",
"status": "approved",
"deadline": "2026-11-05T09:33:59.000Z",
"decidedAt": "2026-11-02T09:34:36.000Z",
"decidedBy": "Luca Ferri"
},
"currency": "EUR",
"tenantId": "meridian",
"createdAt": "2026-11-02T09:33:59.000Z",
"departure": {
"ref": "MED7-2027-05-24",
"label": "Western Mediterranean, 24 May 2027",
"returnDate": "2027-05-31",
"departureDate": "2027-05-24"
},
"organiser": {
"ref": "ORG-HLPHARMA",
"kind": "organisation",
"name": "Harbourline Pharma"
},
"updatedAt": "2026-11-02T09:34:36.000Z",
"valueAdds": [],
"commission": {
"basis": "fare_only",
"percent": 10,
"clawback": "cancellation_inside_penalty_period",
"earnedAt": "full_payment",
"remittance": "net"
},
"contractId": "52060202-6147-40e3-a218-6ff1899b87ac",
"freePlaces": {
"value": "fare_at_group_average",
"counted": "first_two_per_unit_full_fare",
"earnedOn": "final_count",
"perPaying": 20,
"settlement": "after_departure",
"beneficiary": "holder",
"commissionable": false
},
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"assumptions": [],
"agreementRef": "GA-2026-E3E883",
"minimumUnits": 15,
"agreementType": "incentive",
"depositStages": [
{
"key": "D1",
"kind": "per_berth",
"label": "Contract deposit",
"dueDate": "2026-12-01",
"deferred": false,
"amountPerBerthMinor": 15000
},
{
"key": "D2",
"kind": "per_berth",
"label": "Second deposit",
"dueDate": "2027-02-24",
"deferred": false,
"amountPerBerthMinor": 25000
},
{
"key": "BAL",
"kind": "balance",
"label": "Balance",
"dueDate": "2027-04-09",
"deferred": false
}
]
},
"createdAt": "2026-11-02T09:34:36.000Z"
},
{
"version": 3,
"action": "contracted",
"document": {
"fare": {
"code": "GRP-INC-2027",
"version": 1,
"snapshot": {
"source": "pricing",
"capturedAt": "2026-10-30T09:00:00Z",
"categories": [
{
"label": "Inside",
"categoryRef": "INSIDE-I1",
"groupFareMinor": 61900,
"bestAvailableMinor": 71900
},
{
"label": "Balcony",
"categoryRef": "BALCONY-B2",
"groupFareMinor": 98900,
"bestAvailableMinor": 113400
},
{
"label": "Suite",
"categoryRef": "SUITE-S1",
"groupFareMinor": 189000,
"bestAvailableMinor": 214000
}
]
},
"chargesLabel": "Port charges",
"priceValidUntil": "2026-12-15",
"chargesPerGuestMinor": 21000
},
"name": "Harbourline Pharma incentive 2027",
"shape": "block",
"state": "contracted",
"holder": {
"ref": "AGY-HARBOURLINE",
"kind": "agency",
"name": "Harbourline Travel"
},
"leader": {
"ref": "LEAD-0091",
"kind": "person",
"name": "Anna Moretti"
},
"groupId": null,
"history": [
{
"at": "2026-11-02T09:33:59.000Z",
"actor": {
"id": "sales-0031",
"name": "Sara Conti",
"role": "group_sales",
"channel": "back_office"
},
"action": "created",
"detail": {
"shape": "block",
"state": "pending_approval",
"units": 20
},
"version": 1
},
{
"at": "2026-11-02T09:34:36.000Z",
"actor": {
"id": "rm-0005",
"name": "Luca Ferri",
"role": "revenue_manager",
"channel": "back_office"
},
"action": "approval_approve",
"detail": {
"from": "pending_approval",
"state": "offered",
"reason": "Within incentive guidelines"
},
"version": 2
},
{
"at": "2026-11-02T09:35:13.000Z",
"actor": {
"id": "sales-0031",
"name": "Sara Conti",
"role": "group_sales",
"channel": "back_office"
},
"action": "contracted",
"detail": {
"from": "offered",
"state": "contracted",
"reason": "Contract signed by the agency"
},
"version": 3
}
],
"release": {
"optionExpiresAt": "2026-12-15",
"nameChangeCutoff": "2027-05-17",
"nameListDeadline": "2027-04-09",
"freeReductionUntil": "2027-02-24",
"freeReductionMaxUnits": 3,
"nameChangeFeePerGuestMinor": 5000
},
"version": 3,
"approval": {
"reason": "Within incentive guidelines",
"status": "approved",
"deadline": "2026-11-05T09:33:59.000Z",
"decidedAt": "2026-11-02T09:34:36.000Z",
"decidedBy": "Luca Ferri"
},
"currency": "EUR",
"tenantId": "meridian",
"createdAt": "2026-11-02T09:33:59.000Z",
"departure": {
"ref": "MED7-2027-05-24",
"label": "Western Mediterranean, 24 May 2027",
"returnDate": "2027-05-31",
"departureDate": "2027-05-24"
},
"organiser": {
"ref": "ORG-HLPHARMA",
"kind": "organisation",
"name": "Harbourline Pharma"
},
"updatedAt": "2026-11-02T09:35:13.000Z",
"valueAdds": [],
"commission": {
"basis": "fare_only",
"percent": 10,
"clawback": "cancellation_inside_penalty_period",
"earnedAt": "full_payment",
"remittance": "net"
},
"contractId": "52060202-6147-40e3-a218-6ff1899b87ac",
"freePlaces": {
"value": "fare_at_group_average",
"counted": "first_two_per_unit_full_fare",
"earnedOn": "final_count",
"perPaying": 20,
"settlement": "after_departure",
"beneficiary": "holder",
"commissionable": false
},
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"assumptions": [],
"agreementRef": "GA-2026-E3E883",
"minimumUnits": 15,
"agreementType": "incentive",
"depositStages": [
{
"key": "D1",
"kind": "per_berth",
"label": "Contract deposit",
"dueDate": "2026-12-01",
"deferred": false,
"amountPerBerthMinor": 15000
},
{
"key": "D2",
"kind": "per_berth",
"label": "Second deposit",
"dueDate": "2027-02-24",
"deferred": false,
"amountPerBerthMinor": 25000
},
{
"key": "BAL",
"kind": "balance",
"label": "Balance",
"dueDate": "2027-04-09",
"deferred": false
}
]
},
"createdAt": "2026-11-02T09:35:13.000Z"
},
{
"version": 4,
"action": "money_received",
"document": {
"fare": {
"code": "GRP-INC-2027",
"version": 1,
"snapshot": {
"source": "pricing",
"capturedAt": "2026-10-30T09:00:00Z",
"categories": [
{
"label": "Inside",
"categoryRef": "INSIDE-I1",
"groupFareMinor": 61900,
"bestAvailableMinor": 71900
},
{
"label": "Balcony",
"categoryRef": "BALCONY-B2",
"groupFareMinor": 98900,
"bestAvailableMinor": 113400
},
{
"label": "Suite",
"categoryRef": "SUITE-S1",
"groupFareMinor": 189000,
"bestAvailableMinor": 214000
}
]
},
"chargesLabel": "Port charges",
"priceValidUntil": "2026-12-15",
"chargesPerGuestMinor": 21000
},
"name": "Harbourline Pharma incentive 2027",
"shape": "block",
"state": "contracted",
"holder": {
"ref": "AGY-HARBOURLINE",
"kind": "agency",
"name": "Harbourline Travel"
},
"leader": {
"ref": "LEAD-0091",
"kind": "person",
"name": "Anna Moretti"
},
"groupId": "grp_GA-2026-BA3784",
"history": [
{
"at": "2026-11-02T09:33:59.000Z",
"actor": {
"id": "sales-0031",
"name": "Sara Conti",
"role": "group_sales",
"channel": "back_office"
},
"action": "created",
"detail": {
"shape": "block",
"state": "pending_approval",
"units": 20
},
"version": 1
},
{
"at": "2026-11-02T09:34:36.000Z",
"actor": {
"id": "rm-0005",
"name": "Luca Ferri",
"role": "revenue_manager",
"channel": "back_office"
},
"action": "approval_approve",
"detail": {
"from": "pending_approval",
"state": "offered",
"reason": "Within incentive guidelines"
},
"version": 2
},
{
"at": "2026-11-02T09:35:13.000Z",
"actor": {
"id": "sales-0031",
"name": "Sara Conti",
"role": "group_sales",
"channel": "back_office"
},
"action": "contracted",
"detail": {
"from": "offered",
"state": "contracted",
"reason": "Contract signed by the agency"
},
"version": 3
},
{
"at": "2026-11-02T09:36:27.000Z",
"actor": {
"id": "sales-0031",
"name": "Sara Conti",
"role": "group_sales",
"channel": "back_office"
},
"action": "money_received",
"detail": {
"state": "contracted",
"method": "bank_transfer",
"stageKey": "D1",
"amountMinor": 600000,
"creditMinor": 0
},
"version": 4
}
],
"release": {
"optionExpiresAt": "2026-12-15",
"nameChangeCutoff": "2027-05-17",
"nameListDeadline": "2027-04-09",
"freeReductionUntil": "2027-02-24",
"freeReductionMaxUnits": 3,
"nameChangeFeePerGuestMinor": 5000
},
"version": 4,
"approval": {
"reason": "Within incentive guidelines",
"status": "approved",
"deadline": "2026-11-05T09:33:59.000Z",
"decidedAt": "2026-11-02T09:34:36.000Z",
"decidedBy": "Luca Ferri"
},
"currency": "EUR",
"tenantId": "meridian",
"createdAt": "2026-11-02T09:33:59.000Z",
"departure": {
"ref": "MED7-2027-05-24",
"label": "Western Mediterranean, 24 May 2027",
"returnDate": "2027-05-31",
"departureDate": "2027-05-24"
},
"organiser": {
"ref": "ORG-HLPHARMA",
"kind": "organisation",
"name": "Harbourline Pharma"
},
"updatedAt": "2026-11-02T09:36:27.000Z",
"valueAdds": [],
"commission": {
"basis": "fare_only",
"percent": 10,
"clawback": "cancellation_inside_penalty_period",
"earnedAt": "full_payment",
"remittance": "net"
},
"contractId": "52060202-6147-40e3-a218-6ff1899b87ac",
"freePlaces": {
"value": "fare_at_group_average",
"counted": "first_two_per_unit_full_fare",
"earnedOn": "final_count",
"perPaying": 20,
"settlement": "after_departure",
"beneficiary": "holder",
"commissionable": false
},
"agreementId": "ga_6ae9915a-64e2-4ff7-b2d0-dc0c420b8f51",
"assumptions": [],
"agreementRef": "GA-2026-E3E883",
"minimumUnits": 15,
"agreementType": "incentive",
"depositStages": [
{
"key": "D1",
"kind": "per_berth",
"label": "Contract deposit",
"dueDate": "2026-12-01",
"deferred": false,
"amountPerBerthMinor": 15000
},
{
"key": "D2",
"kind": "per_berth",
"label": "Second deposit",
"dueDate": "2027-02-24",
"deferred": false,
"amountPerBerthMinor": 25000
},
{
"key": "BAL",
"kind": "balance",
"label": "Balance",
"dueDate": "2027-04-09",
"deferred": false
}
]
},
"createdAt": "2026-11-02T09:36:27.000Z"
}
]
}
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.
404group_bookings_not_enabledGroup bookings are not enabled for the tenant.
500internalUnexpected failure. Retry with the same Idempotency-Key.