List products
Retrieves a paginated list of products with extensive filtering and sorting options. Supports filtering by categories, collections, tags, attributes, brands, markets, status, product numbers, dates, and more. Returns products with all related data including variants, prices, and market status.
/api/v1/{team_slug}/{app_slug}/products- API
- Management
- OpenAPI
- management-api
- Updated
- Apr 26, 2026
management-api:GET:/api/v1/{team_slug}/{app_slug}/products
Retrieves a paginated list of products with extensive filtering and sorting options. Supports filtering by categories, collections, tags, attributes, brands, markets, status, product numbers, dates, and more. Returns products with all related data including variants, prices, and market status.
API ownership
- API family: Management API
- Best for: Trusted back-office workflows that create, update, organize, or delete merchant-owned data.
- Do not use from: Browser-only storefront code or public clients.
- Guide route: /apis/management/latest
The OpenAPI contract defines the method, path, parameters, request body, and responses for this operation.
Operation
- Method:
GET - Path:
/api/v1/\{team_slug\}/\{app_slug\}/products - Summary: List products
- Description: Retrieves a paginated list of products with extensive filtering and sorting options. Supports filtering by categories, collections, tags, attributes, brands, markets, status, product numbers, dates, and more. Returns products with all related data including variants, prices, and market status.
- OpenAPI contract: management-api
- Operation ID: Not documented in the OpenAPI contract.
Operation key uses API family, method, and path because this OpenAPI contract does not publish an operation ID.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
| page | query | No | integer | Page number (default is 1) |
| per-page | query | No | integer | Amount of products per page. Minimum 0 and max 100 (default is 20) |
| app_slug | path | Yes | string | App slug |
| team_slug | path | Yes | string | Team slug |
| categories | query | No | string[] | Filter by category URI |
| main-category-id | query | No | string[] | Filter by main category ID(s) (UUID). Only matches products whose main category relationship points at one of these categories |
| collections | query | No | string[] | Filter by collection URI |
| attributes | query | No | string[] | Filter by attributes. The format should be template_key/attribute_key. e.g colors/black |
| brands | query | No | string[] | Filter by brand name |
| markets | query | No | string[] | Filter by market slugs (commercial availability - products with variant prices in these markets) |
| search | query | No | string | Search on product name |
| product-number | query | No | string[] | Filter by exact product number/SKU (case-insensitive, supports multiple values) |
| status | query | No | string[] | Search by status, active | inactive | draft | incomplete |
| sort-order | query | No | string | Sort order. Should be one of ASC or DESC. Default DESC |
| sort-key | query | No | string | The key to sort on. Can be one of product-name, product-number, created-at, updated-at, status, category, tag, collection. (Default is created_at). When sorting by category, tag, or collection order, you must also filter by a single corresponding item. |
| tags | query | No | string[] | Filter by tag keys |
| smart-listing | query | No | string[] | Filter by smart-listing slug(s). A product matches if any variant belongs to one of these smart-listings |
| static-listing | query | No | string[] | Filter by static-listing slug(s). A product matches if any variant belongs to one of these static-listings |
| dont-match-publishing-rules | query | No | boolean | Only show products which don't follow the publishing rules for the specific app |
| created-at-before | query | No | string | ISO 8601 date. Fetch products created before this date. |
| created-at-after | query | No | string | ISO 8601 date. Fetch products created after this date. |
| updated-at-before | query | No | string | ISO 8601 date. Fetch products updated before this date. |
| updated-at-after | query | No | string | ISO 8601 date. Fetch products updated after this date. |
| has-description | query | No | boolean | Filter by whether product description exists. |
| description-includes | query | No | string | Filter by substring in description. |
| has-translations | query | No | boolean | Filter by whether any product translations exist. |
| has-translations-for-locale | query | No | string | Filter by products that have a translation in the given locale (e.g. 'en'). Combines with has-translations. |
| has-product-relation | query | No | boolean | Filter by whether any product relation exist. |
| product-relation-type | query | No | string | Filter on a specific product relation type |
| product-market-status | query | No | string[] | Filter by marketing status (active, inactive, draft, incomplete, archived). Can be combined with product-market-status-market and/or product-market-status-store-group |
| product-market-status-market | query | No | string[] | Filter products by marketing status in specific market(s). Requires product-market-status to be specified |
| product-market-status-store-group | query | No | string | Filter products by marketing status in specific store group/channel. Requires product-market-status to be specified |
| product-ids | query | No | string[] | Filter by product ids |
| no-categories | query | No | boolean | Filter products that have no categories |
| no-variants | query | No | boolean | Filter products that have no variants |
| channel-id | query | No | string | Filter products that are members of the given channel (UUID). Each product response includes its channel_statuses memberships when present. |
| channel-status | query | No | string | Filter products in the given channel by status (active or incomplete). Requires channel-id. |
| not-collections | query | No | string[] | Exclude products in any collection; supports multiple collection URI values |
| not-attributes | query | No | string[] | Exclude products matching attributes. Format template_key/attribute_key e.g colors/black |
| not-brands | query | No | string[] | Exclude products whose brand (or series parent) name matches |
| not-markets | query | No | string[] | Exclude products with variant prices in these market slugs |
| not-product-number | query | No | string[] | Exclude products by exact product number/SKU (case-insensitive, supports multiple values) |
| not-status | query | No | string[] | Exclude products with these statuses |
| not-tags | query | No | string[] | Exclude products tagged with these tag keys |
| not-smart-listing | query | No | string[] | Exclude products with any variant in these smart-listing slugs |
| not-static-listing | query | No | string[] | Exclude products with any variant in these static-listing slugs |
| not-description-includes | query | No | string | Exclude products whose description contains this substring. NULL/empty descriptions are kept. |
| not-has-translations-for-locale | query | No | string | Exclude products that have a translation in the given locale (e.g. 'en'). |
| not-product-relation-type | query | No | string | Exclude products whose product relation matches the given type |
| not-product-market-status | query | No | string[] | Exclude products with marketing status (active, inactive, draft, incomplete, archived). Can be combined with not-product-market-status-market and/or not-product-market-status-store-group |
| not-product-market-status-market | query | No | string[] | Exclude products with marketing status in specific market(s). Requires not-product-market-status to be specified |
| not-product-market-status-store-group | query | No | string | Exclude products with marketing status in a specific store group/channel. Requires not-product-market-status to be specified |
| not-product-ids | query | No | string[] | Exclude products with these product ids |
| not-channel-id | query | No | string[] | Exclude products that are members of the given channel (UUID) |
| not-channel-status | query | No | string | Exclude products in the given channel by status (active or incomplete). Requires not-channel-id. |
Request body
Not documented in the OpenAPI contract.
Responses
| Status | Description | Content |
|---|---|---|
| 200 | Product list | application/json (object) |
| 400 | Invalid query parameter | application/json (object) |
| 401 | Unauthorized | application/json (object) |
| 403 | Forbidden | application/json (object) |
| 500 | Internal Server Error | application/json (object) |
200 - object
Product List
| Property | Type | Required | Details |
|---|---|---|---|
data | object[] | Yes | - |
success | boolean | No | - |
total | integer | No | - |
total_pages | integer | No | - |
Product
| Property | Type | Required | Details |
|---|---|---|---|
attributes | object[] | No | Product attributes |
brand | object | No | Brand of the product |
categories | object[] | No | Associated categories |
channel_statuses | object[] | No | - |
collections | object[] | No | Associated collections |
created_at | string | No | Creation timestamp |
custom | object | No | - |
description | string | No | Description of the product |
exclude_from_feeds | boolean | No | If the products should exist in feeds or not |
files | object[] | No | Product files |
html_description | string | No | Html description |
html_short_description | string | No | Html short description |
id | string | No | Product ID |
images | object[] | No | Images of the product |
market_status | object[] | No | - |
markets | object[] | No | Associated markets |
meta_description | string | No | Meta description for SEO |
meta_title | string | No | Meta title for SEO |
package_dimensions | object | No | The package dimensions |
product_dimensions | object | No | The products dimensions |
product_name | string | No | VariantName of the product |
product_number | string | No | Product number |
product_type | string | No | Product type |
redirects | object[] | No | Product redirects |
relations | object[] | No | Product relations |
schedules | object[] | No | - |
short_description | string | No | Short description of the product |
slug | string | No | Slug for the product |
status | string | No | Status of the product |
tags | object[] | No | Product tags |
tax_group_id | string | No | The id of the tax group |
third_part_links | object[] | No | - |
translations | object | No | Product translations |
updated_at | string | No | Last updated timestamp |
variant_groups | object[] | No | Variant groups with images, attributes, videos |
variants | object[] | No | Product variants |
videos | object[] | No | Videos of the product |
Attribute
| Property | Type | Required | Details |
|---|---|---|---|
created_at | string | No | - |
description | string | No | - |
filterable | boolean | No | - |
id | string | No | - |
key | string | No | - |
name | string | No | - |
template_key | string | No | - |
template_name | string | No | - |
translatable | boolean | No | - |
translations | object | No | - |
updated_at | string | No | - |
values | object | No | - |
Product Brand
| Property | Type | Required | Details |
|---|---|---|---|
address | object | No | - |
email | string | No | - |
id | string | No | - |
name | string | No | - |
series | object | No | - |
slug | string | No | - |
Product Category
| Property | Type | Required | Details |
|---|---|---|---|
attributes | object[] | No | - |
children | object[] | No | - |
cover_url | string | No | - |
created_at | string | No | - |
description | string | No | - |
google_product_category_id | string | No | - |
id | string | No | - |
is_main_category | boolean | No | - |
name | string | No | - |
order | integer | No | - |
parent_id | string | No | - |
redirects | object[] | No | - |
seo | object | No | - |
slug | string | No | - |
sort_order | integer | No | - |
status | string | No | - |
translations | object | No | - |
updated_at | string | No | - |
uri | string | No | - |
Product Channel Status
| Property | Type | Required | Details |
|---|---|---|---|
channel_id | string | No | - |
channel_slug | string | No | - |
status | string | No | - |
Product Collection
| Property | Type | Required | Details |
|---|---|---|---|
children | object[] | No | - |
created_at | string | No | - |
id | string | No | - |
order | integer | No | - |
parent_id | string | No | - |
redirects | object[] | No | - |
slug | string | Yes | - |
status | enum("active", "inactive", "draft") | Yes | - |
title | string | No | - |
translations | object | No | - |
updated_at | string | No | - |
uri | string | No | - |
File
| Property | Type | Required | Details |
|---|---|---|---|
attributes | object[] | No | - |
created_at | string | No | - |
folder_id | string | No | - |
id | string | No | - |
public | boolean | No | - |
title | string | No | - |
translations | object | No | - |
type | string | No | - |
updated_at | string | No | - |
url | string | No | - |
Image With Priority
| Property | Type | Required | Details |
|---|---|---|---|
alt | string | No | - |
app_id | string | No | - |
attributes | object[] | No | - |
blurhash | string | No | - |
copyright | string | No | - |
custom | object | No | - |
folder_id | string | No | - |
id | string | No | - |
parent_id | string | No | - |
priority | integer | No | - |
public | boolean | No | - |
status | string | No | - |
title | string | No | - |
translations | object | No | - |
url | string | No | - |
Market Status
| Property | Type | Required | Details |
|---|---|---|---|
created_at | string | No | - |
market_id | string | No | - |
market_slug | string | No | - |
status | string | No | - |
store_group_id | string | No | - |
store_group_slug | string | No | - |
updated_at | string | No | - |
Market
| Property | Type | Required | Details |
|---|---|---|---|
active | boolean | No | - |
country_codes | string[] | No | - |
created_at | string | No | - |
currency_code | string | No | - |
id | string | No | - |
locale | string | No | - |
name | string | No | - |
slug | string | No | - |
updated_at | string | No | - |
Dimensions
| Property | Type | Required | Details |
|---|---|---|---|
capacity_milliliter | integer | No | min: 0 the capacity in milliliter |
depth | integer | No | min: 0 The products depth in millimeter |
diameter | integer | No | min: 0 the products diameter in millimeter |
height | integer | No | min: 0 The products height in millimeter |
length | integer | No | min: 0 The products length in millimeter |
weight | integer | No | min: 0 The products weight in grams |
width | integer | No | min: 0 The products width in millimeter |
Redirects
| Property | Type | Required | Details |
|---|---|---|---|
id | string | No | - |
item_id | string | No | - |
locale | string | No | - |
new_slug | string | No | - |
old_slug | string | No | - |
type | enum("product", "page", "collection", "category", "product_bundle") | No | - |
Relation
| Property | Type | Required | Details |
|---|---|---|---|
direction | string | No | - |
id | string | No | - |
primary_product_id | string | No | - |
products | object[] | No | - |
title | string | No | - |
type | string | No | - |
type_id | string | No | - |
Job
| Property | Type | Required | Details |
|---|---|---|---|
add_category_names | string[] | No | - |
add_collection_names | string[] | No | - |
add_tag_names | string[] | No | - |
execute_at | string | No | Date when the job should run |
finished_at | string | No | If a job is finished will this timestamp be filled |
group_id | string | No | - |
id | string | No | - |
item_id | string | No | - |
item_name | string | No | - |
item_type | string | No | - |
remove_category_names | string[] | No | - |
remove_collection_names | string[] | No | - |
remove_tag_names | string[] | No | - |
to_amount_cents_with_tax | integer | No | - |
to_market_id | string | No | - |
to_market_status | string | No | - |
to_on_sale | boolean | No | - |
to_sale_amount_cents_with_tax | integer | No | - |
to_start_sale_timestamp | string | No | - |
to_status | string | No | - |
to_stop_sale_timestamp | string | No | - |
to_store_group_id | string | No | - |
Product Tag
| Property | Type | Required | Details |
|---|---|---|---|
attributes | object[] | No | - |
created_at | string | No | - |
filterable | boolean | No | - |
id | string | No | - |
key | string | No | - |
markets | object[] | No | - |
name | string | No | - |
order | integer | No | - |
schedules | object[] | No | - |
status | string | No | - |
translations | object | No | - |
updated_at | string | No | - |
Third Party Link
| Property | Type | Required | Details |
|---|---|---|---|
created_at | string | No | - |
id | string | No | - |
title | string | No | - |
type | string | No | - |
updated_at | string | No | - |
url | string | No | - |
Product Translations
| Property | Type | Required | Details |
|---|---|---|---|
description | object[] | No | - |
html_description | object[] | No | - |
html_short_description | object[] | No | - |
meta_description | object[] | No | - |
meta_title | object[] | No | - |
name | object[] | No | - |
short_description | object[] | No | - |
slug | object[] | No | - |
Variant Group
| Property | Type | Required | Details |
|---|---|---|---|
attributes | object[] | No | - |
channel_statuses | object[] | No | - |
created_at | string | No | - |
description | string | No | - |
id | string | No | - |
images | object[] | No | - |
name | string | No | - |
priority | integer | No | - |
product_id | string | No | - |
slug | string | No | - |
tags | object[] | No | - |
translations | object | No | - |
updated_at | string | No | - |
variants | object[] | No | - |
videos | object[] | No | - |
Variant
| Property | Type | Required | Details |
|---|---|---|---|
attributes | object[] | No | - |
created_at | string | No | - |
custom_fields | object | No | - |
id | string | No | - |
images | object[] | No | Images of the product |
listings | object | No | - |
parent_product_id | string | No | - |
purchase_price | object | No | - |
shipping_attributes | string[] | No | - |
status | string | No | - |
store_group | object[] | No | Product StoreGroup |
tags | object[] | No | - |
translations | object | No | - |
updated_at | string | No | - |
validate_stock | boolean | No | - |
variant_dimensions | object | No | - |
variant_group_id | string | No | - |
variant_name | string | No | - |
variant_number | string | No | - |
videos | object[] | No | Videos of the product |
warehouse_variant_stock | object[] | No | - |
Video
| Property | Type | Required | Details |
|---|---|---|---|
attributes | object[] | No | - |
description | string | No | - |
folder_id | string | No | - |
id | string | No | - |
path | string | No | - |
public | boolean | No | - |
status | string | No | - |
title | string | No | - |
translations | object | No | - |
variants | object[] | No | - |
{
"data": [
{
"attributes": [
{
"created_at": null,
"description": null,
"filterable": null,
"id": null,
"key": null,
"name": null,
"template_key": null,
"template_name": null,
"translatable": null,
"translations": null,
"updated_at": null,
"values": null
}
],
"brand": {
"address": {
"city": null,
"co_address": null,
"country": null,
"house_number": null,
"postal_code": null,
"state_province": null,
"street_address": null
},
"email": "string",
"id": "string",
"name": "string",
"series": {
"id": null,
"name": null,
"slug": null
},
"slug": "string"
},
"categories": [
{
"attributes": null,
"children": null,
"cover_url": null,
"created_at": null,
"description": null,
"google_product_category_id": null,
"id": null,
"is_main_category": null,
"name": null,
"order": null,
"parent_id": null,
"redirects": null,
"seo": null,
"slug": null,
"sort_order": null,
"status": null,
"translations": null,
"updated_at": null,
"uri": null
}
],
"channel_statuses": [
{
"channel_id": null,
"channel_slug": null,
"status": null
}
],
"collections": [
{
"children": null,
"created_at": null,
"id": null,
"order": null,
"parent_id": null,
"redirects": null,
"slug": null,
"status": null,
"title": null,
"translations": null,
"updated_at": null,
"uri": null
}
],
"created_at": "string",
"custom": {},
"description": "string",
"exclude_from_feeds": false,
"files": [
{
"attributes": null,
"created_at": null,
"folder_id": null,
"id": null,
"public": null,
"title": null,
"translations": null,
"type": null,
"updated_at": null,
"url": null
}
],
"html_description": "string",
"html_short_description": "string",
"id": "string",
"images": [
{
"alt": null,
"app_id": null,
"attributes": null,
"blurhash": null,
"copyright": null,
"custom": null,
"folder_id": null,
"id": null,
"parent_id": null,
"priority": null,
"public": null,
"status": null,
"title": null,
"translations": null,
"url": null
}
],
"market_status": [
{
"created_at": null,
"market_id": null,
"market_slug": null,
"status": null,
"store_group_id": null,
"store_group_slug": null,
"updated_at": null
}
],
"markets": [
{
"active": null,
"country_codes": null,
"created_at": null,
"currency_code": null,
"id": null,
"locale": null,
"name": null,
"slug": null,
"updated_at": null
}
],
"meta_description": "string",
"meta_title": "string",
"package_dimensions": {
"capacity_milliliter": 0,
"depth": 0,
"diameter": 0,
"height": 0,
"length": 0,
"weight": 0,
"width": 0
},
"product_dimensions": {
"capacity_milliliter": 0,
"depth": 0,
"diameter": 0,
"height": 0,
"length": 0,
"weight": 0,
"width": 0
},
"product_name": "string",
"product_number": "string",
"product_type": "string",
"redirects": [
{
"id": null,
"item_id": null,
"locale": null,
"new_slug": null,
"old_slug": null,
"type": null
}
],
"relations": [
{
"direction": null,
"id": null,
"primary_product_id": null,
"products": null,
"title": null,
"type": null,
"type_id": null
}
],
"schedules": [
{
"add_category_names": null,
"add_collection_names": null,
"add_tag_names": null,
"execute_at": null,
"finished_at": null,
"group_id": null,
"id": null,
"item_id": null,
"item_name": null,
"item_type": null,
"remove_category_names": null,
"remove_collection_names": null,
"remove_tag_names": null,
"to_amount_cents_with_tax": null,
"to_market_id": null,
"to_market_status": null,
"to_on_sale": null,
"to_sale_amount_cents_with_tax": null,
"to_start_sale_timestamp": null,
"to_status": null,
"to_stop_sale_timestamp": null,
"to_store_group_id": null
}
],
"short_description": "string",
"slug": "string",
"status": "string",
"tags": [
{
"attributes": null,
"created_at": null,
"filterable": null,
"id": null,
"key": null,
"markets": null,
"name": null,
"order": null,
"schedules": null,
"status": null,
"translations": null,
"updated_at": null
}
],
"tax_group_id": "string",
"third_part_links": [
{
"created_at": null,
"id": null,
"title": null,
"type": null,
"updated_at": null,
"url": null
}
],
"translations": {
"description": [],
"html_description": [],
"html_short_description": [],
"meta_description": [],
"meta_title": [],
"name": [],
"short_description": [],
"slug": []
},
"updated_at": "string",
"variant_groups": [
{
"attributes": null,
"channel_statuses": null,
"created_at": null,
"description": null,
"id": null,
"images": null,
"name": null,
"priority": null,
"product_id": null,
"slug": null,
"tags": null,
"translations": null,
"updated_at": null,
"variants": null,
"videos": null
}
],
"variants": [
{
"attributes": null,
"created_at": null,
"custom_fields": null,
"id": null,
"images": null,
"listings": null,
"parent_product_id": null,
"purchase_price": null,
"shipping_attributes": null,
"status": null,
"store_group": null,
"tags": null,
"translations": null,
"updated_at": null,
"validate_stock": null,
"variant_dimensions": null,
"variant_group_id": null,
"variant_name": null,
"variant_number": null,
"videos": null,
"warehouse_variant_stock": null
}
],
"videos": [
{
"attributes": null,
"description": null,
"folder_id": null,
"id": null,
"path": null,
"public": null,
"status": null,
"title": null,
"translations": null,
"variants": null
}
]
}
],
"success": false,
"total": 0,
"total_pages": 0
}400 - object
Error Message
| Property | Type | Required | Details |
|---|---|---|---|
details | string[] | No | - |
message | string | No | - |
success | boolean | Yes | - |
Generated example (synthetic):
{
"details": [
"string"
],
"message": "string",
"success": false
}401 - object
Error Message
| Property | Type | Required | Details |
|---|---|---|---|
details | string[] | No | - |
message | string | No | - |
success | boolean | Yes | - |
Generated example (synthetic):
{
"details": [
"string"
],
"message": "string",
"success": false
}403 - object
Error Message
| Property | Type | Required | Details |
|---|---|---|---|
details | string[] | No | - |
message | string | No | - |
success | boolean | Yes | - |
Generated example (synthetic):
{
"details": [
"string"
],
"message": "string",
"success": false
}500 - object
Error Message
| Property | Type | Required | Details |
|---|---|---|---|
details | string[] | No | - |
message | string | No | - |
success | boolean | Yes | - |
Generated example (synthetic):
{
"details": [
"string"
],
"message": "string",
"success": false
}Contract identity
Use these fields to confirm you are implementing the intended endpoint contract.
- API family: Management API
- Method:
GET - Path:
/api/v1/\{team_slug\}/\{app_slug\}/products - Operation ID: Not documented in the OpenAPI contract.
- OpenAPI tag: Products
- OpenAPI summary: List products