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.
| Operation | Endpoint |
|---|---|
| List group agreements | GET /group-agreements |
| Create a group agreement | POST /group-agreements |
| Read the agreement page | GET /group-agreements/{id} |
| Amend an agreement | PATCH /group-agreements/{id} |
| Read the allotments | GET /group-agreements/{id}/allotments |
| Submit, approve, counter-offer or refuse | POST /group-agreements/{id}/approval |
| Read berth holds | GET /group-agreements/{id}/berth-holds |
| Allocate held berths to a trip | POST /group-agreements/{id}/berth-holds/allocate |
| Move berths from one trip to another | POST /group-agreements/{id}/berth-holds/substitute |
| Vacate a trip's berths | POST /group-agreements/{id}/berth-holds/vacate |
| Cancel a trip on the agreement with a penalty | POST /group-agreements/{id}/cancellations |
| Preview converting a below-minimum agreement | GET /group-agreements/{id}/conversion-preview |
| Read free places | GET /group-agreements/{id}/free-places |
| Settle free places after departure | POST /group-agreements/{id}/free-places/settle |
| Open the order engine group for the agreement | POST /group-agreements/{id}/group |
| Read the ledger | GET /group-agreements/{id}/ledger |
| Read the name list | GET /group-agreements/{id}/name-list |
| Read onboard arrangements | GET /group-agreements/{id}/onboard |
| Record a receipt against a deposit stage | POST /group-agreements/{id}/receipts |
| Release units back to inventory | POST /group-agreements/{id}/releases |
| Release unnamed units at the name-list deadline | POST /group-agreements/{id}/releases/name-list-deadline |
| Read the payment schedule | GET /group-agreements/{id}/schedule |
| Record the final settlement | POST /group-agreements/{id}/settlement |
| Read the statement | GET /group-agreements/{id}/statement |
| Read the timeline | GET /group-agreements/{id}/timeline |
| Move an agreement to another state | POST /group-agreements/{id}/transitions |
| Read the version history | GET /group-agreements/{id}/versions |
List group agreements
/group-agreementsParameters
| Name | In | Required | Notes |
|---|---|---|---|
state | query | ||
agreementType | query | ||
seriesRef | query | ||
asOf | query | Read as of this date or time. Default now. |
Response 200
/group-agreementsList agreementscurl -X GET "$BASE/group-agreements" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Request-Id: req-0055"
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
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | group_bookings_not_enabled | Group bookings are not enabled for the tenant. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |
Create a group agreement
/group-agreementsA 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
| Field | Type | Required | Notes |
|---|---|---|---|
actor | object | yes | |
actor.channel | string | max 60 chars | |
actor.id | string | yes | 1–200 chars |
actor.name | string | max 200 chars | |
actor.role | string | yes | 1–100 chars |
agreementRef | string | 1–50 chars | |
agreementType | string | yes | 1–60 chars |
allotments | array of object | ||
allotments[].categoryRef | string | yes | 1–200 chars |
allotments[].inventoryRef | string | max 200 chars | |
allotments[].label | string | max 200 chars | |
allotments[].units | integer | yes | > 0 |
approval | object | ||
approval.counterOffer | object | ||
approval.counterOffer.categories | array of object | ||
approval.counterOffer.summary | string | yes | 1–1000 chars |
approval.deadline | string (date-time) | ||
approval.decidedAt | string (date-time) | ||
approval.decidedBy | string | max 200 chars | |
approval.reason | string | max 1000 chars | |
approval.status | enum: not_required, pending, approved, counter_offered, refused | yes | |
assumptions | array of string | ||
commission | object | yes | |
commission.basis | enum: fare_only | default "fare_only" | |
commission.clawback | enum: cancellation_inside_penalty_period | default "cancellation_inside_penalty_period" | |
commission.earnedAt | enum: full_payment | default "full_payment" | |
commission.percent | number | ≥ 0; ≤ 100; default 0 | |
commission.remittance | enum: net, gross, none | yes | |
currency | string | yes | pattern ^[A-Z]{3}$ |
departure | object | yes | |
departure.departureDate | string | yes | pattern ^\d{4}-\d{2}-\d{2}$ |
departure.label | string | max 200 chars | |
departure.ref | string | yes | 1–200 chars |
departure.returnDate | string | pattern ^\d{4}-\d{2}-\d{2}$ | |
depositStages | array of object | ||
depositStages[].amountPerBerthMinor | integer | > 0 | |
depositStages[].deferred | boolean | default false | |
depositStages[].dueDate | string | yes | pattern ^\d{4}-\d{2}-\d{2}$ |
depositStages[].key | string | yes | 1–60 chars |
depositStages[].kind | enum: per_berth, balance | yes | |
depositStages[].label | string | yes | 1–200 chars |
effectiveAt | one of several shapes | ||
expectedUnits | integer | > 0 | |
fare | object | yes | |
fare.chargesLabel | string | max 100 chars | |
fare.chargesPerGuestMinor | integer | ≥ 0; default 0 | |
fare.code | string | yes | 1–100 chars |
fare.priceValidUntil | string | pattern ^\d{4}-\d{2}-\d{2}$ | |
fare.snapshot | object | yes | |
fare.snapshot.capturedAt | string (date-time) | yes | |
fare.snapshot.categories | array of object | yes | at least 1 |
fare.snapshot.source | string | yes | 1–100 chars |
fare.version | integer | yes | > 0 |
freePlaces | object | ||
freePlaces.beneficiary | enum: holder, leader | default "holder" | |
freePlaces.commissionable | enum: false | default false | |
freePlaces.counted | enum: first_two_per_unit_full_fare | default "first_two_per_unit_full_fare" | |
freePlaces.earnedOn | enum: final_count | default "final_count" | |
freePlaces.perPaying | integer | yes | > 0 |
freePlaces.settlement | enum: after_departure, assigned_to_leader | default "after_departure" | |
freePlaces.value | enum: fare_at_group_average | default "fare_at_group_average" | |
holder | object | yes | |
holder.contact | string | max 320 chars | |
holder.kind | string | 1–60 chars | |
holder.name | string | max 200 chars | |
holder.ref | string | yes | 1–200 chars |
leader | object | ||
leader.contact | string | max 320 chars | |
leader.kind | string | 1–60 chars | |
leader.name | string | max 200 chars | |
leader.ref | string | yes | 1–200 chars |
minimumUnits | integer | yes | > 0 |
name | string | yes | 1–200 chars |
onboard | object | ||
onboard.dining | string | max 200 chars | |
onboard.meetingRoom | string | max 200 chars | |
onboard.notes | array of string | ||
organiser | object | yes | |
organiser.contact | string | max 320 chars | |
organiser.kind | string | 1–60 chars | |
organiser.name | string | max 200 chars | |
organiser.ref | string | yes | 1–200 chars |
release | object | ||
release.contractSignedAt | string | pattern ^\d{4}-\d{2}-\d{2}$ | |
release.freeReductionMaxUnits | integer | yes | ≥ 0 |
release.freeReductionUntil | string | yes | pattern ^\d{4}-\d{2}-\d{2}$ |
release.nameChangeCutoff | string | pattern ^\d{4}-\d{2}-\d{2}$ | |
release.nameChangeFeePerGuestMinor | integer | ≥ 0; default 0 | |
release.nameListDeadline | string | yes | pattern ^\d{4}-\d{2}-\d{2}$ |
release.optionExpiresAt | string | pattern ^\d{4}-\d{2}-\d{2}$ | |
seriesPosition | integer | > 0 | |
seriesRef | string | 1–100 chars | |
state | enum: requested, pending_approval, offered, contracted, names_closed, closed, settled, expired, refused, cancelled | ||
valueAdds | array of string |
Schema: apps/journeys/src/group-agreements/contracts.ts (CreateAgreementSchema)
Response 201
/group-agreementsCreate a block agreement for an incentive groupcurl -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"
}
}'
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
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | group_bookings_not_enabled | Group bookings are not enabled for the tenant. |
| 409 | idempotency_in_progress | A request with this Idempotency-Key is still running. Retry after the Retry-After interval. |
| 422 | below_group_threshold | The agreement is below the tenant's group threshold. |
| 422 | idempotency_key_reused | The Idempotency-Key was used for a different request. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |
Read the agreement page
/group-agreements/{id}The composite view of the agreement as of a date. The sections are also available on their own.
Parameters
| Name | In | Required | Notes |
|---|---|---|---|
id | path | yes |
Response 200
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | group_bookings_not_enabled | Group bookings are not enabled for the tenant. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |
Amend an agreement
/group-agreements/{id}Creates a new version and re-checks constraints.
Parameters
| Name | In | Required | Notes |
|---|---|---|---|
id | path | yes |
Headers: Idempotency-Key, plus X-Request-Id.
Request body
| Field | Type | Required | Notes |
|---|---|---|---|
actor | object | yes | |
actor.channel | string | max 60 chars | |
actor.id | string | yes | 1–200 chars |
actor.name | string | max 200 chars | |
actor.role | string | yes | 1–100 chars |
changes | object | yes | |
changes.agreementType | string | 1–60 chars | |
changes.assumptions | array of string | ||
changes.commission | object | ||
changes.commission.basis | enum: fare_only | default "fare_only" | |
changes.commission.clawback | enum: cancellation_inside_penalty_period | default "cancellation_inside_penalty_period" | |
changes.commission.earnedAt | enum: full_payment | default "full_payment" | |
changes.commission.percent | number | ≥ 0; ≤ 100; default 0 | |
changes.commission.remittance | enum: net, gross, none | yes | |
changes.currency | string | pattern ^[A-Z]{3}$ | |
changes.departure | object | ||
changes.departure.departureDate | string | yes | pattern ^\d{4}-\d{2}-\d{2}$ |
changes.departure.label | string | max 200 chars | |
changes.departure.ref | string | yes | 1–200 chars |
changes.departure.returnDate | string | pattern ^\d{4}-\d{2}-\d{2}$ | |
changes.depositStages | array of object | ||
changes.depositStages[].amountPerBerthMinor | integer | > 0 | |
changes.depositStages[].deferred | boolean | default false | |
changes.depositStages[].dueDate | string | yes | pattern ^\d{4}-\d{2}-\d{2}$ |
changes.depositStages[].key | string | yes | 1–60 chars |
changes.depositStages[].kind | enum: per_berth, balance | yes | |
changes.depositStages[].label | string | yes | 1–200 chars |
changes.expectedUnits | integer | > 0 | |
changes.fare | object | ||
changes.fare.chargesLabel | string | max 100 chars | |
changes.fare.chargesPerGuestMinor | integer | ≥ 0; default 0 | |
changes.fare.code | string | yes | 1–100 chars |
changes.fare.priceValidUntil | string | pattern ^\d{4}-\d{2}-\d{2}$ | |
changes.fare.snapshot | object | yes | |
changes.fare.version | integer | yes | > 0 |
changes.freePlaces | object | ||
changes.freePlaces.beneficiary | enum: holder, leader | default "holder" | |
changes.freePlaces.commissionable | enum: false | default false | |
changes.freePlaces.counted | enum: first_two_per_unit_full_fare | default "first_two_per_unit_full_fare" | |
changes.freePlaces.earnedOn | enum: final_count | default "final_count" | |
changes.freePlaces.perPaying | integer | yes | > 0 |
changes.freePlaces.settlement | enum: after_departure, assigned_to_leader | default "after_departure" | |
changes.freePlaces.value | enum: fare_at_group_average | default "fare_at_group_average" | |
changes.holder | object | ||
changes.holder.contact | string | max 320 chars | |
changes.holder.kind | string | 1–60 chars | |
changes.holder.name | string | max 200 chars | |
changes.holder.ref | string | yes | 1–200 chars |
changes.leader | object | ||
changes.leader.contact | string | max 320 chars | |
changes.leader.kind | string | 1–60 chars | |
changes.leader.name | string | max 200 chars | |
changes.leader.ref | string | yes | 1–200 chars |
changes.minimumUnits | integer | > 0 | |
changes.name | string | 1–200 chars | |
changes.onboard | object | ||
changes.onboard.dining | string | max 200 chars | |
changes.onboard.meetingRoom | string | max 200 chars | |
changes.onboard.notes | array of string | ||
changes.organiser | object | ||
changes.organiser.contact | string | max 320 chars | |
changes.organiser.kind | string | 1–60 chars | |
changes.organiser.name | string | max 200 chars | |
changes.organiser.ref | string | yes | 1–200 chars |
changes.release | object | ||
changes.release.contractSignedAt | string | pattern ^\d{4}-\d{2}-\d{2}$ | |
changes.release.freeReductionMaxUnits | integer | yes | ≥ 0 |
changes.release.freeReductionUntil | string | yes | pattern ^\d{4}-\d{2}-\d{2}$ |
changes.release.nameChangeCutoff | string | pattern ^\d{4}-\d{2}-\d{2}$ | |
changes.release.nameChangeFeePerGuestMinor | integer | ≥ 0; default 0 | |
changes.release.nameListDeadline | string | yes | pattern ^\d{4}-\d{2}-\d{2}$ |
changes.release.optionExpiresAt | string | pattern ^\d{4}-\d{2}-\d{2}$ | |
changes.seriesPosition | integer | > 0 | |
changes.seriesRef | string | 1–100 chars | |
changes.valueAdds | array of string | ||
effectiveAt | one of several shapes | ||
expectedVersion | integer | yes | > 0 |
reason | string | yes | 1–2000 chars |
Schema: apps/journeys/src/group-agreements/contracts.ts (AmendAgreementSchema)
Response 200
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | group_bookings_not_enabled | Group bookings are not enabled for the tenant. |
| 409 | agreement_version_conflict | The agreement's expectedVersion does not match. |
| 409 | agreement_closed | The agreement is in a terminal state. |
| 409 | idempotency_in_progress | A request with this Idempotency-Key is still running. Retry after the Retry-After interval. |
| 422 | idempotency_key_reused | The Idempotency-Key was used for a different request. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |
Read the allotments
/group-agreements/{id}/allotmentsParameters
| Name | In | Required | Notes |
|---|---|---|---|
id | path | yes |
Response 200
/group-agreements/GA-2026-E3E883/allotmentsRead the allotmentscurl -X GET "$BASE/group-agreements/GA-2026-E3E883/allotments" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Request-Id: req-0053"
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
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | group_bookings_not_enabled | Group bookings are not enabled for the tenant. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |
Submit, approve, counter-offer or refuse
/group-agreements/{id}/approvalParameters
| Name | In | Required | Notes |
|---|---|---|---|
id | path | yes |
Headers: Idempotency-Key, plus X-Request-Id.
Request body
| Field | Type | Required | Notes |
|---|---|---|---|
actor | object | yes | |
actor.channel | string | max 60 chars | |
actor.id | string | yes | 1–200 chars |
actor.name | string | max 200 chars | |
actor.role | string | yes | 1–100 chars |
counterOffer | object | ||
counterOffer.categories | array of object | ||
counterOffer.categories[].bestAvailableMinor | integer | > 0 | |
counterOffer.categories[].categoryRef | string | yes | 1–200 chars |
counterOffer.categories[].groupFareMinor | integer | yes | > 0 |
counterOffer.categories[].label | string | max 200 chars | |
counterOffer.summary | string | yes | 1–1000 chars |
deadline | string (date-time) | ||
decision | enum: submit, approve, counter_offer, refuse | yes | |
effectiveAt | one of several shapes | ||
reason | string | max 1000 chars |
Schema: apps/journeys/src/group-agreements/contracts.ts (ApprovalDecisionSchema)
Response 200
/group-agreements/GA-2026-E3E883/approvalApprove the agreementcurl -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"
}
}'
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
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 400 | reason_required | This action requires a reason. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | group_bookings_not_enabled | Group bookings are not enabled for the tenant. |
| 409 | not_pending_approval | The agreement or request is not pending approval. |
| 409 | idempotency_in_progress | A request with this Idempotency-Key is still running. Retry after the Retry-After interval. |
| 422 | idempotency_key_reused | The Idempotency-Key was used for a different request. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |
Read berth holds
/group-agreements/{id}/berth-holdsParameters
| Name | In | Required | Notes |
|---|---|---|---|
id | path | yes |
Response 200
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | group_bookings_not_enabled | Group bookings are not enabled for the tenant. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |
Allocate held berths to a trip
/group-agreements/{id}/berth-holds/allocateParameters
| Name | In | Required | Notes |
|---|---|---|---|
id | path | yes |
Headers: Idempotency-Key, plus X-Request-Id.
Request body
| Field | Type | Required | Notes |
|---|---|---|---|
actor | object | yes | |
actor.channel | string | max 60 chars | |
actor.id | string | yes | 1–200 chars |
actor.name | string | max 200 chars | |
actor.role | string | yes | 1–100 chars |
categoryRef | string | yes | 1–200 chars |
effectiveAt | one of several shapes | ||
guests | array of string | yes | at least 1 |
tripId | string | yes | 1–200 chars |
Schema: apps/journeys/src/group-agreements/contracts.ts (AllocateSchema)
Response 201
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | group_bookings_not_enabled | Group bookings are not enabled for the tenant. |
| 409 | agreement_not_contracted | The agreement is not contracted. |
| 409 | no_unit_available | No unit is left in the category. |
| 409 | idempotency_in_progress | A request with this Idempotency-Key is still running. Retry after the Retry-After interval. |
| 422 | idempotency_key_reused | The Idempotency-Key was used for a different request. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |
Move berths from one trip to another
/group-agreements/{id}/berth-holds/substituteParameters
| Name | In | Required | Notes |
|---|---|---|---|
id | path | yes |
Headers: Idempotency-Key, plus X-Request-Id.
Request body
| Field | Type | Required | Notes |
|---|---|---|---|
actor | object | yes | |
actor.channel | string | max 60 chars | |
actor.id | string | yes | 1–200 chars |
actor.name | string | max 200 chars | |
actor.role | string | yes | 1–100 chars |
effectiveAt | one of several shapes | ||
fromTripId | string | yes | 1–200 chars |
guests | array of string | yes | at least 1 |
reason | string | yes | 1–2000 chars |
toTripId | string | yes | 1–200 chars |
Schema: apps/journeys/src/group-agreements/contracts.ts (SubstituteSchema)
Response 200
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | group_bookings_not_enabled | Group bookings are not enabled for the tenant. |
| 409 | idempotency_in_progress | A request with this Idempotency-Key is still running. Retry after the Retry-After interval. |
| 422 | idempotency_key_reused | The Idempotency-Key was used for a different request. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |
Vacate a trip's berths
/group-agreements/{id}/berth-holds/vacateParameters
| Name | In | Required | Notes |
|---|---|---|---|
id | path | yes |
Headers: Idempotency-Key, plus X-Request-Id.
Request body
| Field | Type | Required | Notes |
|---|---|---|---|
actor | object | yes | |
actor.channel | string | max 60 chars | |
actor.id | string | yes | 1–200 chars |
actor.name | string | max 200 chars | |
actor.role | string | yes | 1–100 chars |
effectiveAt | one of several shapes | ||
reason | string | yes | 1–2000 chars |
tripId | string | yes | 1–200 chars |
Schema: apps/journeys/src/group-agreements/contracts.ts (VacateSchema)
Response 200
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | trip_not_on_agreement | The trip holds no berths on the agreement. |
| 404 | group_bookings_not_enabled | Group bookings are not enabled for the tenant. |
| 409 | idempotency_in_progress | A request with this Idempotency-Key is still running. Retry after the Retry-After interval. |
| 422 | idempotency_key_reused | The Idempotency-Key was used for a different request. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |
Cancel a trip on the agreement with a penalty
/group-agreements/{id}/cancellationsParameters
| Name | In | Required | Notes |
|---|---|---|---|
id | path | yes |
Headers: Idempotency-Key, plus X-Request-Id.
Request body
| Field | Type | Required | Notes |
|---|---|---|---|
actor | object | yes | |
actor.channel | string | max 60 chars | |
actor.id | string | yes | 1–200 chars |
actor.name | string | max 200 chars | |
actor.role | string | yes | 1–100 chars |
effectiveAt | one of several shapes | ||
idempotencyKey | string | yes | 1–200 chars |
insidePenaltyPeriod | boolean | yes | |
penaltyPercent | number | yes | ≥ 0; ≤ 100 |
reason | string | yes | 1–2000 chars |
tripId | string | yes | 1–200 chars |
Schema: apps/journeys/src/group-agreements/contracts.ts (CancellationSchema)
Response 200
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | group_bookings_not_enabled | Group bookings are not enabled for the tenant. |
| 409 | idempotency_in_progress | A request with this Idempotency-Key is still running. Retry after the Retry-After interval. |
| 422 | idempotency_key_reused | The Idempotency-Key was used for a different request. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |
Preview converting a below-minimum agreement
/group-agreements/{id}/conversion-previewParameters
| Name | In | Required | Notes |
|---|---|---|---|
id | path | yes |
Response 200
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | group_bookings_not_enabled | Group bookings are not enabled for the tenant. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |
Read free places
/group-agreements/{id}/free-placesParameters
| Name | In | Required | Notes |
|---|---|---|---|
id | path | yes |
Response 200
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | group_bookings_not_enabled | Group bookings are not enabled for the tenant. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |
Settle free places after departure
/group-agreements/{id}/free-places/settleParameters
| Name | In | Required | Notes |
|---|---|---|---|
id | path | yes |
Headers: Idempotency-Key, plus X-Request-Id.
Request body
| Field | Type | Required | Notes |
|---|---|---|---|
actor | object | yes | |
actor.channel | string | max 60 chars | |
actor.id | string | yes | 1–200 chars |
actor.name | string | max 200 chars | |
actor.role | string | yes | 1–100 chars |
effectiveAt | one of several shapes | ||
idempotencyKey | string | yes | 1–200 chars |
Schema: apps/journeys/src/group-agreements/contracts.ts (SettleFreePlacesSchema)
Response 200
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | group_bookings_not_enabled | Group bookings are not enabled for the tenant. |
| 409 | idempotency_in_progress | A request with this Idempotency-Key is still running. Retry after the Retry-After interval. |
| 422 | idempotency_key_reused | The Idempotency-Key was used for a different request. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |
Open the order engine group for the agreement
/group-agreements/{id}/groupParameters
| Name | In | Required | Notes |
|---|---|---|---|
id | path | yes |
Headers: Idempotency-Key, plus X-Request-Id.
Request body
| Field | Type | Required | Notes |
|---|---|---|---|
actor | object | yes | |
actor.channel | string | max 60 chars | |
actor.id | string | yes | 1–200 chars |
actor.name | string | max 200 chars | |
actor.role | string | yes | 1–100 chars |
Response 201
/group-agreements/GA-2026-E3E883/groupOpen the order engine group for the agreementcurl -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"
}
}'
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
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | group_bookings_not_enabled | Group bookings are not enabled for the tenant. |
| 409 | idempotency_in_progress | A request with this Idempotency-Key is still running. Retry after the Retry-After interval. |
| 422 | idempotency_key_reused | The Idempotency-Key was used for a different request. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |
Read the ledger
/group-agreements/{id}/ledgerParameters
| Name | In | Required | Notes |
|---|---|---|---|
id | path | yes |
Response 200
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | group_bookings_not_enabled | Group bookings are not enabled for the tenant. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |
Read the name list
/group-agreements/{id}/name-listParameters
| Name | In | Required | Notes |
|---|---|---|---|
id | path | yes |
Response 200
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | group_bookings_not_enabled | Group bookings are not enabled for the tenant. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |
Read onboard arrangements
/group-agreements/{id}/onboardParameters
| Name | In | Required | Notes |
|---|---|---|---|
id | path | yes |
Response 200
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | group_bookings_not_enabled | Group bookings are not enabled for the tenant. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |
Record a receipt against a deposit stage
/group-agreements/{id}/receiptsParameters
| Name | In | Required | Notes |
|---|---|---|---|
id | path | yes |
Headers: Idempotency-Key, plus X-Request-Id.
Request body
| Field | Type | Required | Notes |
|---|---|---|---|
actor | object | yes | |
actor.channel | string | max 60 chars | |
actor.id | string | yes | 1–200 chars |
actor.name | string | max 200 chars | |
actor.role | string | yes | 1–100 chars |
amountMinor | integer | yes | > 0 |
effectiveAt | one of several shapes | ||
externalRef | string | max 200 chars | |
idempotencyKey | string | yes | 1–200 chars |
method | string | yes | 1–60 chars |
payer | object | yes | |
payer.contact | string | max 320 chars | |
payer.name | string | max 200 chars | |
payer.ref | string | yes | 1–200 chars |
payer.role | string | yes | 1–60 chars |
stageKey | string | yes | 1–60 chars |
Schema: apps/journeys/src/group-agreements/contracts.ts (ReceiptSchema)
Response 201
/group-agreements/GA-2026-E3E883/receiptsRecord the contract depositcurl -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"
}
}'
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
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | group_bookings_not_enabled | Group bookings are not enabled for the tenant. |
| 409 | idempotency_in_progress | A request with this Idempotency-Key is still running. Retry after the Retry-After interval. |
| 422 | receipt_exceeds_due | The receipt exceeds what is due for the stage. |
| 422 | idempotency_key_reused | The Idempotency-Key was used for a different request. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |
Release units back to inventory
/group-agreements/{id}/releasesParameters
| Name | In | Required | Notes |
|---|---|---|---|
id | path | yes |
Headers: Idempotency-Key, plus X-Request-Id.
Request body
| Field | Type | Required | Notes |
|---|---|---|---|
actor | object | yes | |
actor.channel | string | max 60 chars | |
actor.id | string | yes | 1–200 chars |
actor.name | string | max 200 chars | |
actor.role | string | yes | 1–100 chars |
categoryRef | string | yes | 1–200 chars |
effectiveAt | one of several shapes | ||
reason | string | yes | 1–2000 chars |
units | integer | yes | > 0 |
Schema: apps/journeys/src/group-agreements/contracts.ts (ReleaseSchema)
Response 200
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | group_bookings_not_enabled | Group bookings are not enabled for the tenant. |
| 409 | idempotency_in_progress | A request with this Idempotency-Key is still running. Retry after the Retry-After interval. |
| 422 | idempotency_key_reused | The Idempotency-Key was used for a different request. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |
Release unnamed units at the name-list deadline
/group-agreements/{id}/releases/name-list-deadlineParameters
| Name | In | Required | Notes |
|---|---|---|---|
id | path | yes |
Headers: Idempotency-Key, plus X-Request-Id.
Request body
| Field | Type | Required | Notes |
|---|---|---|---|
actor | object | yes | |
actor.channel | string | max 60 chars | |
actor.id | string | yes | 1–200 chars |
actor.name | string | max 200 chars | |
actor.role | string | yes | 1–100 chars |
effectiveAt | one of several shapes |
Schema: apps/journeys/src/group-agreements/contracts.ts (AutoReleaseSchema)
Response 200
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | group_bookings_not_enabled | Group bookings are not enabled for the tenant. |
| 409 | idempotency_in_progress | A request with this Idempotency-Key is still running. Retry after the Retry-After interval. |
| 422 | idempotency_key_reused | The Idempotency-Key was used for a different request. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |
Read the payment schedule
/group-agreements/{id}/scheduleParameters
| Name | In | Required | Notes |
|---|---|---|---|
id | path | yes |
Response 200
/group-agreements/GA-2026-E3E883/scheduleRead the payment schedulecurl -X GET "$BASE/group-agreements/GA-2026-E3E883/schedule" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Request-Id: req-0052"
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
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | group_bookings_not_enabled | Group bookings are not enabled for the tenant. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |
Record the final settlement
/group-agreements/{id}/settlementParameters
| Name | In | Required | Notes |
|---|---|---|---|
id | path | yes |
Headers: Idempotency-Key, plus X-Request-Id.
Request body
| Field | Type | Required | Notes |
|---|---|---|---|
actor | object | yes | |
actor.channel | string | max 60 chars | |
actor.id | string | yes | 1–200 chars |
actor.name | string | max 200 chars | |
actor.role | string | yes | 1–100 chars |
cardPayments | array of object | ||
cardPayments[].amountMinor | integer | yes | > 0 |
cardPayments[].payer | object | yes | |
cardPayments[].payer.contact | string | max 320 chars | |
cardPayments[].payer.name | string | max 200 chars | |
cardPayments[].payer.ref | string | yes | 1–200 chars |
cardPayments[].tripId | string | yes | 1–200 chars |
effectiveAt | one of several shapes | ||
externalRef | string | max 200 chars | |
idempotencyKey | string | yes | 1–200 chars |
remittanceList | array of object | ||
remittanceList[].amountMinor | integer | yes | ≥ 0 |
remittanceList[].tripId | string | yes | 1–200 chars |
Schema: apps/journeys/src/group-agreements/contracts.ts (FinalSettlementSchema)
Response 200
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | group_bookings_not_enabled | Group bookings are not enabled for the tenant. |
| 409 | names_not_closed | The name list is not closed yet. |
| 409 | idempotency_in_progress | A request with this Idempotency-Key is still running. Retry after the Retry-After interval. |
| 422 | idempotency_key_reused | The Idempotency-Key was used for a different request. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |
Read the statement
/group-agreements/{id}/statementParameters
| Name | In | Required | Notes |
|---|---|---|---|
id | path | yes |
Response 200
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | group_bookings_not_enabled | Group bookings are not enabled for the tenant. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |
Read the timeline
/group-agreements/{id}/timelineParameters
| Name | In | Required | Notes |
|---|---|---|---|
id | path | yes |
Response 200
Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | group_bookings_not_enabled | Group bookings are not enabled for the tenant. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |
Move an agreement to another state
/group-agreements/{id}/transitionsrequested → 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
| Name | In | Required | Notes |
|---|---|---|---|
id | path | yes |
Headers: Idempotency-Key, plus X-Request-Id.
Request body
| Field | Type | Required | Notes |
|---|---|---|---|
actor | object | yes | |
actor.channel | string | max 60 chars | |
actor.id | string | yes | 1–200 chars |
actor.name | string | max 200 chars | |
actor.role | string | yes | 1–100 chars |
effectiveAt | one of several shapes | ||
reason | string | max 2000 chars | |
to | enum: requested, pending_approval, offered, contracted, names_closed, closed, settled, expired, refused, cancelled | yes |
Schema: apps/journeys/src/group-agreements/contracts.ts (TransitionSchema)
Response 200
/group-agreements/GA-2026-E3E883/transitionsMark the agreement as contractedcurl -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"
}
}'
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
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 400 | reason_required | This action requires a reason. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | group_bookings_not_enabled | Group bookings are not enabled for the tenant. |
| 409 | invalid_transition | The status transition is not allowed from the current status. |
| 409 | idempotency_in_progress | A request with this Idempotency-Key is still running. Retry after the Retry-After interval. |
| 422 | idempotency_key_reused | The Idempotency-Key was used for a different request. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |
Read the version history
/group-agreements/{id}/versionsParameters
| Name | In | Required | Notes |
|---|---|---|---|
id | path | yes |
Response 200
/group-agreements/GA-2026-E3E883/versionsRead the version historycurl -X GET "$BASE/group-agreements/GA-2026-E3E883/versions" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Request-Id: req-0054"
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
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | The request failed validation. The message names the first failing field; oms-ops and group surfaces also return every issue in details. |
| 401 | unauthenticated | The bearer token is missing, invalid, expired or minted for another purpose. |
| 403 | scope_forbidden | The token is scoped to an agency or an access scope; this surface requires an unscoped tenant token. |
| 404 | group_bookings_not_enabled | Group bookings are not enabled for the tenant. |
| 500 | internal | Unexpected failure. Retry with the same Idempotency-Key. |