Skip to main content

Rate Categories

Rate categories are the participant types your experiences are priced by โ€” Adult, Child, Senior, Student, and so on โ€” plus any combo rates. They belong to your account: create, rename, reorder and retire them through this API, the dashboard, or the AI assistant. All three write through the same rules.

List Rate Categoriesโ€‹

Get all rate categories for your account.

GET /v1/settings/rate-categories

Authenticationโ€‹

Requires an API key with the settings:read scope.

Example Requestโ€‹

curl -X GET "https://app.equipdash.com/api/v1/settings/rate-categories" \
-H "Authorization: Bearer YOUR_API_KEY"

Responseโ€‹

{
"data": {
"rate_categories": [
{
"id": 1,
"label": "Adult",
"description": "Ages 13 and over",
"is_combo": false,
"components": null,
"seats_per_unit": 1,
"created_at": "2026-01-15T10:00:00+00:00",
"updated_at": "2026-01-15T10:00:00+00:00"
},
{
"id": 2,
"label": "Child",
"description": "Ages 5-12",
"created_at": "2026-01-15T10:00:00+00:00",
"updated_at": "2026-01-15T10:00:00+00:00"
},
{
"id": 3,
"label": "Senior",
"description": "Ages 65 and over",
"created_at": "2026-01-15T10:00:00+00:00",
"updated_at": "2026-01-15T10:00:00+00:00"
}
]
},
"meta": {
"request_id": "req_abc123",
"timestamp": "2026-02-01T10:00:00+00:00"
}
}

Get Rate Categoryโ€‹

Get a single rate category by ID.

GET /v1/settings/rate-categories/{id}

Path Parametersโ€‹

ParameterTypeDescription
idintegerRate category ID

Example Requestโ€‹

curl -X GET "https://app.equipdash.com/api/v1/settings/rate-categories/1" \
-H "Authorization: Bearer YOUR_API_KEY"

Responseโ€‹

{
"data": {
"id": 1,
"label": "Adult",
"description": "Ages 13 and over",
"created_at": "2026-01-15T10:00:00+00:00",
"updated_at": "2026-01-15T10:00:00+00:00"
},
"meta": {
"request_id": "req_abc123",
"timestamp": "2026-02-01T10:00:00+00:00"
}
}

Create Rate Categoryโ€‹

Add a participant type. Pass components instead to create a combo rate โ€” one flat price covering a set group.

POST /v1/settings/rate-categories

Authenticationโ€‹

Requires an API key with the settings:write scope.

Body Parametersโ€‹

ParameterTypeDescription
labelstringRequired. Customer-facing name, 2-100 characters. Must be unique in your account.
descriptionstring|nullOptional one-line note, max 100 characters.
componentsarray|nullCombo rates only. Each entry takes rate_category_id (an existing non-combo category) and quantity (1 or more).

Example Requestโ€‹

curl -X POST "https://app.equipdash.com/api/v1/settings/rate-categories" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"label": "Student",
"description": "Discounted rate - valid student ID"
}'

Creating a combo that covers two adults and two children:

curl -X POST "https://app.equipdash.com/api/v1/settings/rate-categories" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"label": "Family",
"components": [
{ "rate_category_id": 1, "quantity": 2 },
{ "rate_category_id": 2, "quantity": 2 }
]
}'

Responseโ€‹

Returns 201 Created with the new rate category.

Update Rate Categoryโ€‹

Rename a rate category or change its description. For a combo, send components to change who is included โ€” the list replaces the existing one. Omit it and the combo keeps its current members.

PATCH /v1/settings/rate-categories/{id}

Body Parametersโ€‹

ParameterTypeDescription
labelstringCustomer-facing name, 2-100 characters. Must be unique in your account.
descriptionstring|nullOne-line note, max 100 characters. Send null to clear it.
componentsarrayCombo rates only. Replaces the whole member list.

Example Requestโ€‹

curl -X PATCH "https://app.equipdash.com/api/v1/settings/rate-categories/2" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "label": "Child (5-12)", "description": "Ages 5-12" }'

Renaming a rate updates it everywhere it appears, including on existing bookings.

Retire a Rate Categoryโ€‹

Stop offering a rate on new bookings without losing it. Existing bookings and pricing keep it; it disappears from every new-booking surface. This is the right call for any rate already in use.

PATCH /v1/settings/rate-categories/{id}/archived

Body Parametersโ€‹

ParameterTypeDescription
archivedbooleanRequired. true retires the rate, false offers it again.

Example Requestโ€‹

curl -X PATCH "https://app.equipdash.com/api/v1/settings/rate-categories/4/archived" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "archived": true }'

A plain rate that a live combo is built from cannot be retired until that combo is retired first.

Delete Rate Categoryโ€‹

Permanently remove a rate category. Only possible while nothing is priced by it and no combo includes it โ€” otherwise retire it instead.

DELETE /v1/settings/rate-categories/{id}

Example Requestโ€‹

curl -X DELETE "https://app.equipdash.com/api/v1/settings/rate-categories/4" \
-H "Authorization: Bearer YOUR_API_KEY"

Responseโ€‹

Returns 204 No Content.

Reorder Rate Categoriesโ€‹

Set the order rates are listed in everywhere customers and staff see them โ€” booking widget, point of sale, experience pricing. Send every id in the order you want, first at the top.

POST /v1/settings/rate-categories/reorder

Body Parametersโ€‹

ParameterTypeDescription
rate_category_idsarrayRequired. Every rate category id, in display order. Ids that aren't yours are ignored.

Example Requestโ€‹

curl -X POST "https://app.equipdash.com/api/v1/settings/rate-categories/reorder" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "rate_category_ids": [3, 1, 2] }'

Response Fieldsโ€‹

FieldTypeDescription
idintegerUnique rate category identifier
labelstringCategory name (e.g., "Adult", "Child")
descriptionstring|nullDescription of who qualifies
is_combobooleanWhether this is a combo rate covering a set group
componentsarray|nullCombo rates only โ€” the categories inside, each with a quantity
seats_per_unitintegerSpots one unit of this rate takes on a session (1 for plain rates)
sort_orderintegerDisplay position in your chosen order
archivedbooleanRetired rates stay on existing bookings but are off the menu for new ones
archived_atstring|nullISO 8601 datetime the rate was retired
created_atstringISO 8601 datetime
updated_atstringISO 8601 datetime

Common Rate Categoriesโ€‹

LabelDescription
AdultAges 13+ or 18+
ChildAges 5-12 or 3-12
InfantAges 0-4 (often free)
SeniorAges 65+
StudentWith valid student ID
MilitaryActive duty or veteran

Using Rate Categoriesโ€‹

Use the rate category ID when adding pricing to experiences:

curl -X POST "https://app.equipdash.com/api/v1/experiences/5/pricing" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"pricing_type": "participant",
"rate_category": 1,
"price": 45.00
}'

Errorsโ€‹

StatusCodeDescription
400validation_errorMissing or invalid field โ€” a duplicate label, or a combo member that isn't a plain category in your account
401authentication_requiredNo API key provided
403insufficient_scopeAPI key lacks the settings:read (reads) or settings:write (writes) scope
404not_foundRate category not found
409conflictThe rate prices an experience, or a combo is built from it โ€” retire it instead

Notesโ€‹

  • Rate categories are global to your account and can be used across all experiences
  • Labels are unique per account
  • A rate that prices anything can never be deleted, only retired โ€” its label is still needed by the bookings that used it
  • Retired rates are hidden from the list endpoint by default; the dashboard shows them under Archived
Combo rate categories

A rate category with is_combo: true is a combo โ€” one flat price that covers a set group of people (for example a family price covering several spots). Combos carry:

  • components โ€” the plain rate categories inside the combo, each with a quantity (e.g. 2 x Adult, 2 x Child)
  • seats_per_unit โ€” how many spots one combo takes on a session

Combos are priced on an experience with pricing_type: "combo" (see Add pricing), and a booking line using a combo reserves quantity x seats_per_unit spots.