Skip to main content

Experience Pricing

Manage pricing for an experience. Experiences can have different prices based on rate categories (e.g., Adult, Child, Senior) and seasons.

Endpointsโ€‹

MethodEndpointDescription
GET/v1/experiences/{id}/pricingList pricing
GET/v1/experiences/{id}/pricing/{pricingId}Get pricing
POST/v1/experiences/{id}/pricingAdd 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โ€‹

TypeDescription
participantPrice per participant (most common)
groupFixed price for the entire group

How Pricing is Appliedโ€‹

When creating a booking:

  1. Rate Category: If specified, uses the pricing for that rate category
  2. Season: If the booking date falls within a season, seasonal pricing is used
  3. Fallback: Uses the base pricing (no season, default rate category)

Pricing Priorityโ€‹

  1. Seasonal pricing with matching rate category
  2. Base pricing with matching rate category
  3. Seasonal pricing without rate category
  4. 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