Experience Pricing
Manage pricing for an experience. Experiences can have different prices based on rate categories (e.g., Adult, Child, Senior) and seasons.
Endpointsโ
| Method | Endpoint | Description |
|---|---|---|
| GET | /v1/experiences/{id}/pricing | List pricing |
| GET | /v1/experiences/{id}/pricing/{pricingId} | Get pricing |
| POST | /v1/experiences/{id}/pricing | Add pricing |
| PATCH | /v1/experiences/{id}/pricing/{pricingId} | Update pricing |
| DELETE | /v1/experiences/{id}/pricing/{pricingId} | Delete pricing |
Authenticationโ
All pricing endpoints require an API key with the experiences:read scope for GET requests, and experiences:write scope for POST/PATCH/DELETE requests.
Which way of booking the price is forโ
An experience can be sold more than one way - a class shop might sell "Group class", "Semi-private" and "Private session" from the same experience. Each booking option carries its own prices, so a price row belongs to one of them.
Send booking_option_id on Add pricing or Update pricing to say which. Leave it out and the row prices the experience's first option, which is what every price row written before booking options existed does, so a shop that sells its experience one way has nothing to change.
# The private session costs 180.00, whatever the shared session costs
curl -X POST "https://app.equipdash.com/api/v1/experiences/1234567/pricing" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{"pricing_type": "group", "price": 180.00, "booking_option_id": 4321}'
# Read back what that one way of booking costs
curl "https://app.equipdash.com/api/v1/experiences/1234567/pricing?booking_option_id=4321" \
-H "Authorization: Bearer YOUR_API_KEY"
An option id from a different experience comes back 404 resource_not_found, so a price can never land on another experience's option.
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. Price every option you offer.
Pricing Typesโ
| Type | Description |
|---|---|
participant | Price per participant (most common) |
group | Fixed price for the entire group |
How Pricing is Appliedโ
When creating a booking:
- Rate Category: If specified, uses the pricing for that rate category
- Season: If the booking date falls within a season, seasonal pricing is used
- Fallback: Uses the base pricing (no season, default rate category)
Pricing Priorityโ
- Seasonal pricing with matching rate category
- Base pricing with matching rate category
- Seasonal pricing without rate category
- Base pricing without rate category
Common Patternsโ
Multi-tier Participant Pricingโ
# Adult pricing
curl -X POST ".../experiences/1/pricing" \
-d '{"pricing_type": "participant", "rate_category": 1, "price": 45.00}'
# Child pricing
curl -X POST ".../experiences/1/pricing" \
-d '{"pricing_type": "participant", "rate_category": 2, "price": 25.00}'
# Senior pricing
curl -X POST ".../experiences/1/pricing" \
-d '{"pricing_type": "participant", "rate_category": 3, "price": 35.00}'
# Combo (one flat price for a set group, e.g. Family = 2 x Adult + 2 x Child)
curl -X POST https://app.equipdash.com/api/v1/experiences/12/pricing \
-H "Authorization: Bearer $API_KEY" \
-d '{"pricing_type": "combo", "rate_category": 4, "price": 285.00}'
Seasonal Pricingโ
# Base adult price
curl -X POST ".../experiences/1/pricing" \
-d '{"pricing_type": "participant", "rate_category": 1, "price": 45.00}'
# Summer peak adult price
curl -X POST ".../experiences/1/pricing" \
-d '{"pricing_type": "participant", "rate_category": 1, "season_id": 1, "price": 65.00}'
Notesโ
- Rate categories are configured in your supplier settings (see Rate Categories)
- Seasons are configured in your supplier settings
- Deleting a pricing rule does not affect existing bookings
- Every response carries
booking_option_id, so you can tell which way of booking each row prices