Categories & Collections API

Hierarchical product categories and curated collections.

Base: /api/v1/  |  X-Tenant-ID required  |  All read endpoints public
GET /api/v1/categories Public

Return the full category tree (parents + children nested).

Response

{ "success": true, "data": { "categories": [ { "id","name","slug","image_url","children": [ ... ] } ] } }
GET /api/v1/categories/:slug Public

Single category with its products.

Response

{ "success": true, "data": { "category": { "id","name","slug","products": [ ... ] } } }
GET /api/v1/collections Public

List all active collections.

Response

{ "success": true, "data": { "collections": [ { "id","name","slug","banner_url","sort_order" } ] } }
GET /api/v1/collections/:slug Public

Single collection with its associated products.

Response

{ "success": true, "data": { "collection": { "id","name","slug","products": [ ... ] } } }

Admin — Categories /api/v1/admin/categories

All admin endpoints require Authorization: Bearer <admin_token> and X-Tenant-ID.
POST /api/v1/admin/categories 🔒 Auth Requiredcategories:write

Create a new category.

Request Body

{ "name": "T-Shirts", "parent_id": null, "image_url": "...", "description": "...", "sort_order": 0 }

Response

{ "success": true, "data": { "category": { "id","name","slug","parent_id","sort_order" } } }
PUT /api/v1/admin/categories/:id 🔒 Auth Requiredcategories:write

Update a category.

Request Body

{ "name": "Tees", "sort_order": 1 }

Response

{ "success": true, "data": { "category": { ... } } }
DELETE /api/v1/admin/categories/:id 🔒 Auth Requiredcategories:write

Delete a category. Will fail if products are linked.

Response

{ "success": true, "data": null }

Admin — Collections /api/v1/admin/collections

POST /api/v1/admin/collections 🔒 Auth Requiredcategories:write

Create a collection.

Request Body

{ "name": "Summer Picks", "description": "...", "banner_url": "..." }

Response

{ "success": true, "data": { "collection": { ... } } }
POST /api/v1/admin/collections/:id/products 🔒 Auth Requiredcategories:write

Add a product to a collection.

Request Body

{ "product_id": "uuid", "sort_order": 0 }

Response

{ "success": true, "data": null }
DELETE /api/v1/admin/collections/:id/products/:pid 🔒 Auth Requiredcategories:write

Remove a product from a collection.

Response

{ "success": true, "data": null }