Skip to main content

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โ€‹

ParameterTypeDescription
idintegerExperience ID

Request Bodyโ€‹

FieldTypeRequiredDescription
pricing_typestringYesparticipant, group, or combo (a combo is one flat price for a set group of people โ€” rate_category must reference a combo rate category)
pricenumberYesPrice amount
rate_categoryintegerNoRate category ID
season_idintegerNoSeason ID for seasonal pricing
booking_option_idintegerNoWhich way of booking this price is for. Leave it out and the row prices the experience's first option
max_participantsintegerNoMax participants for group pricing
price_per_participantnumberNoOptional per-participant charge added on top of the group price (group pricing only)
per_participant_includedintegerNoParticipants 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โ€‹

StatusCodeDescription
400validation_errorInvalid request body
401authentication_requiredNo API key provided
403insufficient_scopeAPI key lacks experiences:write scope
404not_foundExperience, rate category, or season not found
404resource_not_foundbooking_option_id does not belong to this experience
409conflictPricing rule already exists for this combination

Validation Rulesโ€‹

  • pricing_type must be participant, group, or combo
  • combo pricing requires a combo rate category (and a combo rate category can only be priced as combo)
  • price must be a positive number
  • rate_category must be a valid rate category ID if provided
  • season_id must be a valid season ID if provided
  • booking_option_id must belong to this experience. An option from another experience is refused rather than priced against the wrong one
  • max_participants is only accepted for group pricing type (ignored for participant pricing)
  • price_per_participant is only accepted for group pricing type (ignored for participant pricing)
  • If the experience uses seasonal pricing (price_applies: seasonal), season_id is required
  • If the experience uses year-round pricing (price_applies: yearRound), season_id must 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_participants defines the maximum group size for that price
  • For group pricing, price_per_participant adds an optional per-head charge on top of the group base price, applied only to participants beyond per_participant_included (per group). Line total = quantity ร— group price + price_per_participant ร— max(0, actual_participants โˆ’ per_participant_included ร— quantity)