Catalog API
Browse the base product catalogue — blank garments, accessories, variants, and print areas. This is the same catalogue that powers the allthe storefront. Data is read-only.
Base URL: https://developer.allthe.com/api/v1
Required scope: catalog:read
Endpoints
| Method | Path | Description |
| ------ | -------------------------------------------- | ---------------------------- |
| GET | /catalog/products | List base products |
| GET | /catalog/products/{id} | Fetch a single base product |
| GET | /catalog/products/{id}/variants | List variants (size × colour)|
| GET | /catalog/products/{id}/print-areas | List available print areas |
List products
GET /catalog/products
Query parameters
| Name | Type | Description |
| -------- | ------- | ------------------------------------------------------------- |
| q | string | Case-insensitive search on title and master_sku. |
| gender | string | Filter by gender (male, female, unisex, kids, …). |
| brand | string | Filter by brand slug (e.g. gildan). |
| limit | integer | Page size, 1–100. Default 25. |
| cursor | string | Product id from a previous page's next_cursor. |
Example
curl "https://developer.allthe.com/api/v1/catalog/products?limit=2&gender=unisex" \
-H "Authorization: Bearer pat_live_..."
{
"data": [
{
"id": "ckl9...",
"master_sku": "G6400-BLK",
"title": "Gildan Softstyle T-Shirt",
"description": "Mid-weight 150gsm ringspun cotton tee.",
"retail_description": "Our everyday softstyle classic.",
"status": "active",
"brand": { "id": "brnd_01", "name": "Gildan", "slug": "gildan" },
"category": { "id": "cat_tees", "name": "T-Shirts", "slug": "t-shirts" },
"sub_category": null,
"attributes": {
"gender": "unisex",
"age_group": "adult",
"fit": "regular",
"fabric": "100% ringspun cotton",
"gsm": 150,
"size_range": "XS–3XL",
"country_of_origin": "HN",
"organic": false,
"sustainably": false,
"tagless": true,
"accreditations": ["OEKO-TEX"],
"features": ["Side-seamed", "Set-in sleeves"]
},
"weight_kg": 0.15,
"commodity_code": "6109100010",
"mocks": {
"front_url": "https://cdn.allthe.com/mocks/g6400-front.png",
"back_url": "https://cdn.allthe.com/mocks/g6400-back.png"
},
"template_url": "https://cdn.allthe.com/templates/g6400.psd",
"created_at": "2025-09-12T08:22:14.000Z",
"updated_at": "2026-02-03T11:10:02.000Z"
}
],
"has_more": true,
"next_cursor": "ckl9..."
}
Fetch a product
GET /catalog/products/{id}
Returns a single product in the same shape as the list response data[].
curl "https://developer.allthe.com/api/v1/catalog/products/ckl9..." \
-H "Authorization: Bearer pat_live_..."
Returns 404 not_found if the product is archived, suspended, or does not exist.
List variants
GET /catalog/products/{id}/variants
Each base product has one variant per size × colour combination. Only active variants are returned.
Query parameters
| Name | Type | Description |
| -------- | ------- | -------------------------------------------------------- |
| limit | integer | Page size, 1–100. Default 25. |
| cursor | string | Variant id from a previous page's next_cursor. |
{
"data": [
{
"id": "ckv1...",
"product_id": "ckl9...",
"sku": "G6400-BLK-M",
"size": "M",
"colour": "Black",
"colour_hex": "#0A0A0A",
"active": true,
"mocks": {
"front_url": "https://cdn.allthe.com/mocks/g6400-blk-front.png",
"back_url": null
},
"created_at": "2025-09-12T08:22:14.000Z",
"updated_at": "2026-02-03T11:10:02.000Z"
}
],
"has_more": false,
"next_cursor": null
}
For live stock levels, use the Stock API with the variant id.
List print areas
GET /catalog/products/{id}/print-areas
The set of print areas available for a product, including print method, physical dimensions, and DPI. Use these to validate artwork before creating a customer product.
{
"data": [
{
"id": "cka1...",
"product_id": "ckl9...",
"name": "Front Chest",
"print_method": { "id": "pm_dtg", "name": "DTG" },
"width_mm": 300,
"height_mm": 400,
"dpi": 300,
"file_format": "PNG",
"mock_side": "front",
"artwork_guide_url": "https://cdn.allthe.com/guides/g6400-front-chest.pdf"
}
]
}
Print areas are not paginated — most products have fewer than ten.
Pagination
All list endpoints use cursor-based pagination. Pass the previous response's next_cursor as the cursor query parameter to fetch the next page. When has_more is false, next_cursor is null and there is nothing more to fetch.
# page 1
curl ".../catalog/products?limit=50" -H "Authorization: Bearer $TOKEN"
# page 2
curl ".../catalog/products?limit=50&cursor=ckl9..." -H "Authorization: Bearer $TOKEN"
Cursors are opaque — do not parse them. They are stable only relative to their list query; changing filters invalidates the cursor.