Product Series

Curate ordered collections of products with translations and hero media

GET /admin/api/series

List all series with product counts. By default hidden series are excluded; pass include_hidden=true to list everything.

Parameters

Name Type Required Description
include_hidden boolean optional When true, include series where visible=false.

Response 200

{
  "series": [
    {
      "id": 1,
      "name": "Spring 2026",
      "slug": "spring-2026",
      "description": "Our Spring 2026 collection.",
      "hero_media_id": 42,
      "hero_media_url": "https://cdn.zeroshop.io/tenants/abc/media/spring-hero.jpg",
      "visible": true,
      "sort_order": 0,
      "product_count": 18,
      "created_at": "2026-02-01T08:00:00Z",
      "updated_at": "2026-03-15T12:30:00Z"
    },
    {
      "id": 2,
      "name": "Founder Picks",
      "slug": "founder-picks",
      "description": "Hand-picked by the founder.",
      "hero_media_id": null,
      "hero_media_url": null,
      "visible": true,
      "sort_order": 1,
      "product_count": 6,
      "created_at": "2026-03-01T10:00:00Z",
      "updated_at": "2026-03-01T10:00:00Z"
    }
  ]
}

Example

curl "https://yourshop.zeroshop.io/admin/api/series?include_hidden=true" \
  -H "Authorization: Bearer zspat_..."
POST /admin/api/series

Create a new series.

Request Body

{
  "name": "Spring 2026",
  "slug": "spring-2026",
  "description": "Our Spring 2026 collection.",
  "hero_media_id": 42,
  "visible": true,
  "sort_order": 0,
  "translations": {
    "es": {
      "name": "Primavera 2026",
      "description": "Nuestra colección de primavera 2026."
    }
  }
}

Response 201

{
  "id": 1,
  "name": "Spring 2026",
  "slug": "spring-2026",
  "description": "Our Spring 2026 collection.",
  "hero_media_id": 42,
  "hero_media_url": "https://cdn.zeroshop.io/tenants/abc/media/spring-hero.jpg",
  "visible": true,
  "sort_order": 0,
  "product_count": 0,
  "created_at": "2026-02-01T08:00:00Z",
  "updated_at": "2026-02-01T08:00:00Z"
}

Example

curl -X POST "https://yourshop.zeroshop.io/admin/api/series" \
  -H "Authorization: Bearer zspat_..." \
  -H "Content-Type: application/json" \
  -d '{"name": "Spring 2026", "slug": "spring-2026", "visible": true}'
GET /admin/api/series/{id}

Get a single series, including per-locale translations.

Parameters

Name Type Required Description
id integer required Series ID

Response 200

{
  "id": 1,
  "name": "Spring 2026",
  "slug": "spring-2026",
  "description": "Our Spring 2026 collection.",
  "hero_media_id": 42,
  "hero_media_url": "https://cdn.zeroshop.io/tenants/abc/media/spring-hero.jpg",
  "visible": true,
  "sort_order": 0,
  "product_count": 18,
  "translations": {
    "es": {
      "name": "Primavera 2026",
      "description": "Nuestra colección de primavera 2026."
    }
  },
  "created_at": "2026-02-01T08:00:00Z",
  "updated_at": "2026-03-15T12:30:00Z"
}

Example

curl "https://yourshop.zeroshop.io/admin/api/series/1" \
  -H "Authorization: Bearer zspat_..."
PUT /admin/api/series/{id}

Update a series. All fields are optional; omitted fields are unchanged.

Parameters

Name Type Required Description
id integer required Series ID

Request Body

{
  "name": "Spring/Summer 2026",
  "description": "Expanded Spring/Summer edit.",
  "hero_media_id": 58,
  "visible": true,
  "sort_order": 0
}

Response 204

Example

curl -X PUT "https://yourshop.zeroshop.io/admin/api/series/1" \
  -H "Authorization: Bearer zspat_..." \
  -H "Content-Type: application/json" \
  -d '{"name": "Spring/Summer 2026", "visible": true}'
DELETE /admin/api/series/{id}

Delete a series. Products belonging to the series are automatically unlinked (the foreign key is set to NULL).

Parameters

Name Type Required Description
id integer required Series ID

Response 204

Example

curl -X DELETE "https://yourshop.zeroshop.io/admin/api/series/1" \
  -H "Authorization: Bearer zspat_..."
GET /admin/api/series/{id}/products

List products in a series, ordered by the series's curated sort order.

Parameters

Name Type Required Description
id integer required Series ID

Response 200

{
  "products": [
    {
      "id": 482,
      "name": "Linen Shirt",
      "slug": "linen-shirt",
      "price_cents": 8999,
      "primary_image_url": "https://cdn.zeroshop.io/tenants/abc/media/linen-shirt.jpg",
      "series_sort_order": 0
    },
    {
      "id": 491,
      "name": "Chino Shorts",
      "slug": "chino-shorts",
      "price_cents": 6499,
      "primary_image_url": "https://cdn.zeroshop.io/tenants/abc/media/chino-shorts.jpg",
      "series_sort_order": 1
    }
  ]
}

Example

curl "https://yourshop.zeroshop.io/admin/api/series/1/products" \
  -H "Authorization: Bearer zspat_..."
PUT /admin/api/series/{id}/products/order

Reorder products in a series. The product_ids array defines the new order — index 0 becomes series_sort_order 0, and so on. All listed products must already be members of the series.

Parameters

Name Type Required Description
id integer required Series ID

Request Body

{
  "product_ids": [
    491,
    482,
    507
  ]
}

Response 204

Example

curl -X PUT "https://yourshop.zeroshop.io/admin/api/series/1/products/order" \
  -H "Authorization: Bearer zspat_..." \
  -H "Content-Type: application/json" \
  -d '{"product_ids": [491, 482, 507]}'
DELETE /admin/api/series/{id}/products/{product_id}

Remove a product from the series. The product itself is not deleted — only its series association.

Parameters

Name Type Required Description
id integer required Series ID
product_id integer required Product ID

Response 204

Example

curl -X DELETE "https://yourshop.zeroshop.io/admin/api/series/1/products/482" \
  -H "Authorization: Bearer zspat_..."

We value your privacy

We use cookies for essential site functionality and, with your consent, analytics to understand how our platform is used. No personal data is shared with third parties. See our Privacy Policy for details.