# Shopify Catalog ## Overview | Property | Value | |----------|-------| | **Status** | active | | **Method** | `GET` | | **Endpoint** | `/v2/shopify/catalog` | | **Base URL** | `https://api.piloterr.com` | | **Credit Cost** | 1 credit per call | | **Documentation** | https://www.piloterr.com/library/shopify-catalog | ## Description List products from a Shopify shop. query is the shop domain or a URL on that shop. page and limit choose the slice. ## Authentication - **Key Name:** `x-api-key` - **Location:** HTTP Header - **Get an API key:** https://app.piloterr.com/register ## Example Request ```bash curl --location --request GET 'https://api.piloterr.com/v2/shopify/catalog' \ --header 'Content-Type: application/json' \ --header 'x-api-key: YOUR_API_KEY' ``` ## Example Response ### Decathlon catalog, first product ```json { "results": [ { "id": 8209730371646, "url": "https://www.decathlon.com/products/men-s-hiking-jacket-mh500-brown", "tags": [ "Down Jackets", "FAMILY: 11413", "GENDER: MEN'S", "Men", "Men's", "MODEL: 8943726", "NATURE_ID: 25032", "New", "OneProductMigration", "PRODUCT_TYPE: Padded Jacket", "SPORT: mountain trekking", "SUPER_MODEL: 362762" ], "image": { "alt": null, "src": "https://cdn.shopify.com/s/files/1/1330/6287/files/default_61e4eded-7b52-4c7e-b922-fdfec444efd1.jpg?v=1793283479", "width": 969, "height": 969, "position": 1 }, "title": "Quechua Men’s MH500 Synthetic Puffer Jacket", "handle": "men-s-hiking-jacket-mh500-brown", "images": [ { "alt": null, "src": "https://cdn.shopify.com/s/files/1/1330/6287/files/default_61e4eded-7b52-4c7e-b922-fdfec444efd1.jpg?v=1793283479", "width": 969, "height": 969, "position": 1 }, { "alt": null, "src": "https://cdn.shopify.com/s/files/1/1330/6287/files/default_81cfeb13-15fb-4730-a3f1-cfb30cd8bf58.jpg?v=1793283479", "width": 969, "height": 969, "position": 2 }, { "alt": null, "src": "https://cdn.shopify.com/s/files/1/1330/6287/files/default_3dd23a97-fcb7-4d04-bdb6-ca888c2d245a.jpg?v=1793283479", "width": 969, "height": 969, "position": 3 }, { "alt": null, "src": "https://cdn.shopify.com/s/files/1/1330/6287/files/default_9e3d1445-c382-4f3e-8db8-7066695630c1.jpg?v=1793283479", "width": 969, "height": 969, "position": 4 }, { "alt": null, "src": "https://cdn.shopify.com/s/files/1/1330/6287/files/default_d890c30c-dc0c-4ae1-b26a-51be87a45b90.jpg?v=1793283479", "width": 969, "height": 969, "position": 5 }, { "alt": null, "src": "https://cdn.shopify.com/s/files/1/1330/6287/files/default_369047ee-4680-41dd-b28f-f9e0b613968e.jpg?v=1793283479", "width": 969, "height": 969, "position": 6 }, { "alt": null, "src": "https://cdn.shopify.com/s/files/1/1330/6287/files/default_8767ccae-471e-49f1-a0ad-bdab8c5928a6.jpg?v=1793283479", "width": 969, "height": 969, "position": 7 }, { "alt": null, "src": "https://cdn.shopify.com/s/files/1/1330/6287/files/default_17936e65-04e6-46ba-ac28-1eebd651dc03.jpg?v=1793283479", "width": 969, "height": 969, "position": 8 } ], "vendor": "Quechua", "options": [ { "name": "Size", "values": [ "S", "2XL", "M", "3XL", "L", "XL" ], "position": 1 } ], "variants": [ { "id": 43182120337470, "sku": "5544385", "grams": 440, "price": 69.99, "title": "S", "option1": "S", "option2": null, "option3": null, "available": true, "price_display": "69.99", "compare_at_price": null, "compare_at_price_display": null }, { "id": 43182140358718, "sku": "5544389", "grams": 548, "price": 69.99, "title": "2XL", "option1": "2XL", "option2": null, "option3": null, "available": true, "price_display": "69.99", "compare_at_price": null, "compare_at_price_display": null }, { "id": 43182160216126, "sku": "5544386", "grams": 456, "price": 69.99, "title": "M", "option1": "M", "option2": null, "option3": null, "available": true, "price_display": "69.99", "compare_at_price": null, "compare_at_price_display": null }, { "id": 43194906083390, "sku": "5544390", "grams": 564, "price": 69.99, "title": "3XL", "option1": "3XL", "option2": null, "option3": null, "available": true, "price_display": "69.99", "compare_at_price": null, "compare_at_price_display": null }, { "id": 43194907426878, "sku": "5544387", "grams": 472, "price": 69.99, "title": "L", "option1": "L", "option2": null, "option3": null, "available": true, "price_display": "69.99", "compare_at_price": null, "compare_at_price_display": null }, { "id": 43194910769214, "sku": "5544388", "grams": 502, "price": 69.99, "title": "XL", "option1": "XL", "option2": null, "option3": null, "available": true, "price_display": "69.99", "compare_at_price": null, "compare_at_price_display": null } ], "created_at": "2026-08-10T07:57:16-07:00", "updated_at": "2026-10-30T10:41:35-07:00", "description": "When the temperature drops, this down jacket is your perfect companion, offering warmth, slim fit, a hood and ideal comfort for your excursions or everyday wear", "product_type": "Padded Jacket", "published_at": "2026-10-29T06:59:49-07:00" } ], "pagination": { "next": "https://www.decathlon.com/products.json?limit=1&page=2", "page": 1, "per_page": 1, "total_pages": null, "total_results": null } } ``` ## Documentation ## Overview The Shopify Catalog API lists products from a public Shopify shop. `query` is the shop domain or any URL on that shop, such as `decathlon.com` or `https://www.decathlon.com`. A product link on the same host selects that shop too. `shopify.com` and `apps.shopify.com` are rejected. The shop's public `/products.json` feed is returned as `results` and `pagination`. ## Quickstart ``` GET https://api.piloterr.com/v2/shopify/catalog?query=https://www.decathlon.com&page=1&limit=30 ``` ## Parameters | Parameter | Type | Required | Description | |---|---|---|---| | `query` | string | yes | Shop domain or shop URL. `decathlon.com` and `https://www.decathlon.com/products/some-handle` both read the Decathlon shop. | | `page` | integer | no | Page number, starting at 1. Omit it for page 1. `page=2` is the next slice. | | `limit` | integer | no | Items on this page. Default 30. Maximum 250. | ## Response fields | Field | Type | Description | |---|---|---| | `results[].title` | string | Product title | | `results[].handle` | string | Product handle | | `results[].url` | string | Product URL on the shop | | `results[].vendor` | string | Vendor | | `results[].product_type` | string | Product type | | `results[].tags` | array | Tags | | `results[].description` | string | Product description | | `results[].variants[].price` | number | Variant price | | `results[].variants[].price_display` | string | Price label, without a trailing dash | | `results[].variants[].compare_at_price` | number or null | Compare-at price when the shop sends one | | `results[].variants[].available` | boolean | Variant availability | | `results[].image.src` | string | First image URL | | `pagination.page` | number | Requested page | | `pagination.per_page` | number | Requested limit | | `pagination.total_results` | null | The shop JSON does not include a total | | `pagination.total_pages` | null | The shop JSON does not include a page count | | `pagination.next` | string or null | Next shop JSON URL when this page is full, otherwise null | ## Use cases - Walk a merchant catalog for price and availability checks - Import the first pages of a Shopify shop into a PIM - Follow `pagination.next` until the shop runs out of products ## Error codes | Code | Meaning | |---|---| | 400 | Missing query, a domain that is not a shop, or `page` / `limit` out of range | | 403 | The shop blocked the JSON feed | | 404 | This page has no products | | 500 | The feed could not be fetched |