Export your full catalog
Pull every product, with attributes and assets fully expanded, in one paginated operation.
Pull your entire product catalog, with attributes and assets included, without a separate call per product or per image. This guide covers paging through a large result set and expanding related data inline, the pattern behind tools like catalog-production plugins, platform migrations, and backups.
Prerequisites
- A bearer token. See the Quickstart guide for the authentication flow.
- An idea of which fields you actually need. Requesting only those fields keeps each page smaller and the export faster.
Steps
-
Request the first page with the fields you need.
curl -G "https://pim.plytix.com/api/v3/products" \ -H "Authorization: Bearer <access_token>" \ --data-urlencode "_fields=sku" \ --data-urlencode "_fields=label" \ --data-urlencode "_fields=attributes" \ --data-urlencode "_fields=categories" \ --data-urlencode "_fields=assets" \ --data-urlencode "_page_size=100"_fieldsaccepts repeated values. Requestingcategoriesorassetsreturns them fully expanded, with no separate call and no_expandparameter needed.FLAG
_expanddoes not work on this endpoint in this project's testing, despite appearing in some Plytix API documentation. Expansion happens automatically per_fieldsvalue instead, as shown above. -
Follow the
next_pagelink until it stops appearing.Every response includes a
paginationobject:{ "data": [ /* ... */ ], "pagination": { "next_page": "https://pim.plytix.com/api/v3/products?_fields=sku&_page=2" } }Request
pagination.next_pagedirectly. It's a complete URL, including every filter and field you sent on the first call. The default page size is 25; setting_page_sizeexplicitly (as in step 1) reduces the number of requests for a large catalog. Stop when a response has nonext_pagevalue. -
Read the expanded asset and category data directly from each product.
{ "sku": "BAG-10157", "categories": [{ "id": "...", "name": "Backpacks", "path": ["Website Taxonomy", "Bags & Luggage", "Backpacks"] }], "assets": [{ "id": "...", "content_type": "image/jpeg", "path": "..." }] }Because
assetsreturns the full asset object, including its file path, your export doesn't need a separate request per image. This replaces the per-asset lookup that earlier API versions required. -
Scope the export if you don't need the whole catalog.
Combine
_fieldswith a filter, for example to export only one category:curl -G "https://pim.plytix.com/api/v3/products" \ -H "Authorization: Bearer <access_token>" \ --data-urlencode "categories.name=Backpacks" \ --data-urlencode "_fields=sku"See "Build a Marketplace-Specific Product Feed" for more filtering patterns aimed at a specific audience or destination.
Troubleshooting
- Problem: A field you requested with
_fieldsdoesn't appear in the response, but you also don't see an error.- Solution: Some invalid field names are silently dropped rather than rejected. Double-check the exact field name against the product's full response shape.
- Prevention: Confirm a field name against one full, unfiltered product response before building it into a bulk export.
- Problem: Requesting
_fields=category_ids(or another field ending in_ids) returns an error instead of the field.- Solution: This is intentional. Plytix hides
_ids-suffixed fields from API responses to avoid exposing internal data structure. Use the expanded plural form instead, for example_fields=categories, which returns the same relationship fully expanded. - Prevention: Request the expanded relationship (
categories,assets) directly rather than its_idsfield, as shown in step 1.
- Solution: This is intentional. Plytix hides
- Problem:
_fieldsdoesn't seem to narrow the response on a single-product lookup.- Solution:
_fieldsonly applies to the search endpoint (GET /products), not toGET /products/{id}, which always returns the full product. Use the search endpoint for a sparse-field export.
- Solution: