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.