Create Store Product
Create a new store product.
Endpointโ
POST /v1/store-products
Authenticationโ
Requires an API key with the store:write scope.
Request Bodyโ
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Product name (max 255 characters) |
sku | string | No | Stock keeping unit (max 100 characters) |
brief_description | string | No | Short description (max 500 characters) |
long_description | string | No | Full description |
category_id | integer | No | Primary store category ID. Use category_ids for multiple categories. |
category_ids | integer[] | No | Put the product in multiple store categories (primary first). The first id becomes the primary (also returned as category). Takes precedence over category_id. |
price | number | Yes | Selling price (min 0) |
compare_at_price | number | No | Original/RRP price (min 0) |
status | string | No | active or archived (default: draft) |
track_inventory | boolean | No | Enable stock tracking (default: false) |
inventory_tracking | string | No | Tracking mode: group or item (default: group) |
stock_quantity | integer | No | Initial stock quantity (min 0) |
weight | number | No | Product weight (min 0) |
weight_unit | string | No | Weight unit: kg, lb, g, or oz |
dimensions | string | No | Product dimensions (max 255 characters) |
max_per_booking | integer|null | No | The most one customer can buy in one order, 1 to 9999. null for no limit |
is_standalone | boolean | No | Available as a standalone product (default: true) |
staff_only | boolean | No | Staff only: sold in POS, the app, the API and by Dash, never on the booking page (default: false) |
who_can_buy | string | No | everyone, staff_only or off (add-on only). Sets is_standalone and staff_only together |
Responseโ
Success (201 Created)โ
{
"data": {
"id": 5,
"name": "Helmet Liner",
"sku": "HL-001",
"brief_description": "Replacement helmet liner",
"long_description": null,
"category": {
"id": 3,
"name": "Accessories"
},
"price": 12.99,
"compare_at_price": null,
"status": "active",
"track_inventory": true,
"inventory_tracking": "group",
"stock_quantity": 100,
"weight": 0.1,
"weight_unit": "kg",
"dimensions": null,
"variations": false,
"max_per_booking": 3,
"is_standalone": true,
"images": [],
"variation_options": [],
"product_variations": [],
"created_at": "2026-02-13T12:00:00+00:00",
"updated_at": "2026-02-13T12:00:00+00:00"
},
"meta": {
"request_id": "req_abc123",
"timestamp": "2026-02-13T12:00:00+00:00"
}
}
Errorsโ
| Status | Code | Description |
|---|---|---|
| 401 | authentication_required | No API key provided |
| 401 | invalid_api_key | Invalid API key |
| 403 | insufficient_scope | API key lacks store:write scope |
| 422 | validation_error | Invalid request body |
| 422 | store_product_error | Business logic error (e.g., plan limit reached) |
Example Requestโ
curl -X POST "https://app.equipdash.com/api/v1/store-products" \
-H "Authorization: Bearer eqd_live_abc123xyz789..." \
-H "Content-Type: application/json" \
-d '{
"name": "Helmet Liner",
"sku": "HL-001",
"brief_description": "Replacement helmet liner",
"category_id": 3,
"price": 12.99,
"status": "active",
"track_inventory": true,
"inventory_tracking": "group",
"stock_quantity": 100,
"weight": 0.1,
"weight_unit": "kg",
"max_per_booking": 3,
"is_standalone": true,
"staff_only": false,
"who_can_buy": "everyone"
}'