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โ
| Parameter | Type | Description |
|---|---|---|
id | integer | Rate 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โ
| Parameter | Type | Description |
|---|---|---|
label | string | Required. Customer-facing name, 2-100 characters. Must be unique in your account. |
description | string|null | Optional one-line note, max 100 characters. |
components | array|null | Combo 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โ
| Parameter | Type | Description |
|---|---|---|
label | string | Customer-facing name, 2-100 characters. Must be unique in your account. |
description | string|null | One-line note, max 100 characters. Send null to clear it. |
components | array | Combo 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โ
| Parameter | Type | Description |
|---|---|---|
archived | boolean | Required. 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โ
| Parameter | Type | Description |
|---|---|---|
rate_category_ids | array | Required. 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โ
| Field | Type | Description |
|---|---|---|
id | integer | Unique rate category identifier |
label | string | Category name (e.g., "Adult", "Child") |
description | string|null | Description of who qualifies |
is_combo | boolean | Whether this is a combo rate covering a set group |
components | array|null | Combo rates only โ the categories inside, each with a quantity |
seats_per_unit | integer | Spots one unit of this rate takes on a session (1 for plain rates) |
sort_order | integer | Display position in your chosen order |
archived | boolean | Retired rates stay on existing bookings but are off the menu for new ones |
archived_at | string|null | ISO 8601 datetime the rate was retired |
created_at | string | ISO 8601 datetime |
updated_at | string | ISO 8601 datetime |
Common Rate Categoriesโ
| Label | Description |
|---|---|
| Adult | Ages 13+ or 18+ |
| Child | Ages 5-12 or 3-12 |
| Infant | Ages 0-4 (often free) |
| Senior | Ages 65+ |
| Student | With valid student ID |
| Military | Active 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โ
| Status | Code | Description |
|---|---|---|
| 400 | validation_error | Missing or invalid field โ a duplicate label, or a combo member that isn't a plain category in your account |
| 401 | authentication_required | No API key provided |
| 403 | insufficient_scope | API key lacks the settings:read (reads) or settings:write (writes) scope |
| 404 | not_found | Rate category not found |
| 409 | conflict | The 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
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 aquantity(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.