Add Pricing
Add a new pricing rule to an experience.
Endpointโ
POST /v1/experiences/{id}/pricing
Authenticationโ
Requires an API key with the experiences:write scope.
Path Parametersโ
| Parameter | Type | Description |
|---|---|---|
id | integer | Experience ID |
Request Bodyโ
| Field | Type | Required | Description |
|---|---|---|---|
pricing_type | string | Yes | participant, group, or combo (a combo is one flat price for a set group of people โ rate_category must reference a combo rate category) |
price | number | Yes | Price amount |
rate_category | integer | No | Rate category ID |
season_id | integer | No | Season ID for seasonal pricing |
booking_option_id | integer | No | Which way of booking this price is for. Leave it out and the row prices the experience's first option |
max_participants | integer | No | Max participants for group pricing |
price_per_participant | number | No | Optional per-participant charge added on top of the group price (group pricing only) |
per_participant_included | integer | No | Participants the group base already covers (per group) before the per-participant charge starts โ e.g. 1 = "driver included". Only accepted with price_per_participant (group pricing). |
Example Request - Participant Pricingโ
curl -X POST "https://app.equipdash.com/api/v1/experiences/1/pricing" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"pricing_type": "participant",
"rate_category": 1,
"price": 45.00
}'
Example Request - Seasonal Pricingโ
curl -X POST "https://app.equipdash.com/api/v1/experiences/1/pricing" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"pricing_type": "participant",
"rate_category": 1,
"season_id": 1,
"price": 55.00
}'
Example Request - Pricing One Way of Bookingโ
curl -X POST "https://app.equipdash.com/api/v1/experiences/1/pricing" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"pricing_type": "group",
"price": 180.00,
"booking_option_id": 4321
}'
Example Request - Group Pricingโ
curl -X POST "https://app.equipdash.com/api/v1/experiences/1/pricing" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"pricing_type": "group",
"price": 200.00,
"max_participants": 6
}'
Responseโ
Success (201 Created)โ
{
"data": {
"id": 4,
"booking_option_id": null,
"season": null,
"pricing_type": "participant",
"rate_category": {
"id": 1,
"label": "Adult",
"description": "Ages 13+"
},
"price": 45.00,
"price_per_participant": null,
"max_participants": null,
"created_at": "2026-02-01T10:00:00+00:00",
"updated_at": "2026-02-01T10:00:00+00:00"
},
"meta": {
"request_id": "req_abc123",
"timestamp": "2026-02-01T10:00:00+00:00"
}
}
Errorsโ
| Status | Code | Description |
|---|---|---|
| 400 | validation_error | Invalid request body |
| 401 | authentication_required | No API key provided |
| 403 | insufficient_scope | API key lacks experiences:write scope |
| 404 | not_found | Experience, rate category, or season not found |
| 404 | resource_not_found | booking_option_id does not belong to this experience |
| 409 | conflict | Pricing rule already exists for this combination |
Validation Rulesโ
pricing_typemust beparticipant,group, orcombocombopricing requires a combo rate category (and a combo rate category can only be priced ascombo)pricemust be a positive numberrate_categorymust be a valid rate category ID if providedseason_idmust be a valid season ID if providedbooking_option_idmust belong to this experience. An option from another experience is refused rather than priced against the wrong onemax_participantsis only accepted forgrouppricing type (ignored forparticipantpricing)price_per_participantis only accepted forgrouppricing type (ignored forparticipantpricing)- If the experience uses seasonal pricing (
price_applies: seasonal),season_idis required - If the experience uses year-round pricing (
price_applies: yearRound),season_idmust not be provided
Notesโ
- You can have multiple pricing rules with different rate categories
- Price every option you offer. A booking that names an option with no price of its own is refused with
422 booking_creation_failed, rather than being charged another option's price - Seasonal pricing takes precedence over base pricing when dates match
- For group pricing,
max_participantsdefines the maximum group size for that price - For group pricing,
price_per_participantadds an optional per-head charge on top of the group base price, applied only to participants beyondper_participant_included(per group). Line total =quantity ร group price + price_per_participant ร max(0, actual_participants โ per_participant_included ร quantity)