# Shopify Products Scraper & API: $1 per 1,000 rows (`dododata/shopify-products-scraper`) Actor

Every product of any Shopify store as clean JSON: prices as numbers, sale and stock flags, variants with SKUs, optional stock counts and barcodes. $1/1,000.

- **URL**: https://apify.com/dododata/shopify-products-scraper.md
- **Developed by:** [Dodo Data](https://apify.com/dododata) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 1,000 product rows

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Shopify Products Scraper & API: $1 per 1,000 rows

Get every product of any Shopify store as clean JSON. **28 fields per product, 439 products from two stores in 9 seconds**: prices as numbers, sale and stock flags, every variant with its SKU, images, and the store's own currency. One row per product, or one row per variant for SKU-level price and stock monitoring.

Paste store URLs (or collection URLs). The Actor reads the public product feed every Shopify storefront serves, so it is fast, light on the store, and returns exactly what the shop shows.

### What you get

Ten real rows from the run of 2026-09-17 (shortened here: descriptions to 120 characters, two variants, one image and five tags per product; the dataset carries everything):

```json
[
  {
    "id": "shopify:www.allbirds.com:4373802877072",
    "store": "www.allbirds.com",
    "store_name": "Allbirds",
    "currency": "USD",
    "country": "US",
    "product_id": "4373802877072",
    "title": "Trino® Tubers - Navy Night",
    "handle": "trino-tubers-navy-night",
    "vendor": "Allbirds",
    "product_type": "Socks",
    "tags": [
      "allbirds::carbon-score => 2.61",
      "allbirds::cfId => color-trino-tm-tubers-navy-night",
      "allbirds::complete => true",
      "allbirds::edition => limited",
      "allbirds::gender => unisex"
    ],
    "description": "The Trino Tubers is a tube sock that hugs just below your calf and features a no-slip sole. Made with natural materia…",
    "price_min": 4,
    "price_max": 4,
    "compare_at_price_max": 16,
    "on_sale": true,
    "discount_percent": 75,
    "available": false,
    "variants_count": 4,
    "variants": [
      {
        "variant_id": "31338069262480",
        "variant_title": "S (W5-7)",
        "sku": "ST1UNNT101",
        "price": 4,
        "compare_at_price": 16,
        "on_sale": true,
        "available": false,
        "option1": "S (W5-7)",
        "option2": null,
        "option3": null,
        "grams": 99
      },
      {
        "variant_id": "31338069295248",
        "variant_title": "M (W8-10 / M8)",
        "sku": "ST1UNNT102",
        "price": 4,
        "compare_at_price": 16,
        "on_sale": true,
        "available": false,
        "option1": "M (W8-10 / M8)",
        "option2": null,
        "option3": null,
        "grams": 105
      }
    ],
    "options": [
      {
        "name": "Size",
        "values": [
          "S (W5-7)",
          "M (W8-10 / M8)",
          "L (W11 / M9-12)",
          "XL (M13-14)"
        ]
      }
    ],
    "image": "https://cdn.shopify.com/s/files/1/1104/4168/products/ST1UNNT_SOCKS_NAVY_NIGHT_FRONT.png?v=1666820168",
    "images": [
      "https://cdn.shopify.com/s/files/1/1104/4168/products/ST1UNNT_SOCKS_NAVY_NIGHT_FRONT.png?v=1666820168"
    ],
    "created_at": "2020-01-27T18:07:11-08:00",
    "updated_at": "2026-09-17T12:05:43-07:00",
    "published_at": "2026-06-16T11:02:01-07:00",
    "url": "https://www.allbirds.com/products/trino-tubers-navy-night",
    "scraped_at": "2026-09-17T19:05:45.076Z"
  },
  {
    "id": "shopify:www.deathwishcoffee.com:7347711901751",
    "store": "www.deathwishcoffee.com",
    "store_name": "Death Wish Coffee",
    "currency": "USD",
    "country": "US",
    "product_id": "7347711901751",
    "title": "Daily Grind Women's Corduroy Workwear Jacket",
    "handle": "daily-grind-womens-corduroy-workwear-jacket",
    "vendor": "Sportiqe",
    "product_type": "Apparel",
    "tags": [
      "Apparel",
      "Men",
      "Merch",
      "Sale",
      "Unisex"
    ],
    "description": "Embrace the daily grind.\nSo soft it’s almost criminal but tough enough to survive the hardest of days, this limited-e…",
    "price_min": 65,
    "price_max": 65,
    "compare_at_price_max": 90,
    "on_sale": true,
    "discount_percent": 28,
    "available": true,
    "variants_count": 5,
    "variants": [
      {
        "variant_id": "41900193808439",
        "variant_title": "S",
        "sku": "UJKINS02",
        "price": 65,
        "compare_at_price": 90,
        "on_sale": true,
        "available": true,
        "option1": "S",
        "option2": null,
        "option3": null,
        "grams": 765
      },
      {
        "variant_id": "41900193841207",
        "variant_title": "M",
        "sku": "UJKINS03",
        "price": 65,
        "compare_at_price": 90,
        "on_sale": true,
        "available": true,
        "option1": "M",
        "option2": null,
        "option3": null,
        "grams": 820
      }
    ],
    "options": [
      {
        "name": "Size",
        "values": [
          "S",
          "M",
          "L",
          "XL",
          "2XL"
        ]
      }
    ],
    "image": "https://cdn.shopify.com/s/files/1/0271/7209/files/DeathWishCoffee_October2025_Product_WomensJacket_Front_Web.jpg?v=1761234563",
    "images": [
      "https://cdn.shopify.com/s/files/1/0271/7209/files/DeathWishCoffee_October2025_Product_WomensJacket_Front_Web.jpg?v=1761234563"
    ],
    "created_at": "2025-09-29T11:53:46-04:00",
    "updated_at": "2026-09-17T15:05:44-04:00",
    "published_at": "2026-08-31T15:18:53-04:00",
    "url": "https://www.deathwishcoffee.com/products/daily-grind-womens-corduroy-workwear-jacket",
    "scraped_at": "2026-09-17T19:05:45.796Z"
  },
  {
    "id": "shopify:www.deathwishcoffee.com:7347711770679",
    "store": "www.deathwishcoffee.com",
    "store_name": "Death Wish Coffee",
    "currency": "USD",
    "country": "US",
    "product_id": "7347711770679",
    "title": "Rough Cut Canvas Jacket",
    "handle": "rough-cut-canvas-jacket",
    "vendor": "Sportiqe",
    "product_type": "Apparel",
    "tags": [
      "Apparel",
      "Men",
      "Merch",
      "Sale",
      "Unisex"
    ],
    "description": "Cut through the cold.\nMade of heavyweight cotton canvas, this limited-edition jacket doesn't flinch when the going ge…",
    "price_min": 75,
    "price_max": 75,
    "compare_at_price_max": 100,
    "on_sale": true,
    "discount_percent": 25,
    "available": true,
    "variants_count": 6,
    "variants": [
      {
        "variant_id": "41900193513527",
        "variant_title": "S",
        "sku": "UJBWEST02",
        "price": 75,
        "compare_at_price": 100,
        "on_sale": true,
        "available": true,
        "option1": "S",
        "option2": null,
        "option3": null,
        "grams": 1066
      },
      {
        "variant_id": "41900193546295",
        "variant_title": "M",
        "sku": "UJBWEST03",
        "price": 75,
        "compare_at_price": 100,
        "on_sale": true,
        "available": true,
        "option1": "M",
        "option2": null,
        "option3": null,
        "grams": 1126
      }
    ],
    "options": [
      {
        "name": "Size",
        "values": [
          "S",
          "M",
          "L",
          "XL",
          "2XL",
          "3XL"
        ]
      }
    ],
    "image": "https://cdn.shopify.com/s/files/1/0271/7209/files/DeathWishCoffee_October2025_Product_MensJacket_Front_Web.jpg?v=1761234420",
    "images": [
      "https://cdn.shopify.com/s/files/1/0271/7209/files/DeathWishCoffee_October2025_Product_MensJacket_Front_Web.jpg?v=1761234420"
    ],
    "created_at": "2025-09-29T11:53:00-04:00",
    "updated_at": "2026-09-17T15:05:44-04:00",
    "published_at": "2026-08-31T15:18:52-04:00",
    "url": "https://www.deathwishcoffee.com/products/rough-cut-canvas-jacket",
    "scraped_at": "2026-09-17T19:05:45.796Z"
  },
  {
    "id": "shopify:www.allbirds.com:7369944137808",
    "store": "www.allbirds.com",
    "store_name": "Allbirds",
    "currency": "USD",
    "country": "US",
    "product_id": "7369944137808",
    "title": "Free Returns Coverage",
    "handle": "free-returns-coverage",
    "vendor": "re:do",
    "product_type": "return,package_protection",
    "tags": [
      "ATTV_GLOBAL_EXCLUSION_TAG",
      "exclude_rebuy",
      "klaviyo_reviews_exclude",
      "NOREVIEWS",
      "redo-package-protection"
    ],
    "description": "",
    "price_min": 0.8,
    "price_max": 2.98,
    "compare_at_price_max": 2.98,
    "on_sale": false,
    "discount_percent": 73,
    "available": true,
    "variants_count": 2,
    "variants": [
      {
        "variant_id": "42436493115472",
        "variant_title": "$0.80",
        "sku": "x-redo",
        "price": 0.8,
        "compare_at_price": 0.8,
        "on_sale": false,
        "available": true,
        "option1": "$0.80",
        "option2": null,
        "option3": null,
        "grams": 0
      },
      {
        "variant_id": "42436493148240",
        "variant_title": "$2.98",
        "sku": "x-redo",
        "price": 2.98,
        "compare_at_price": 2.98,
        "on_sale": false,
        "available": true,
        "option1": "$2.98",
        "option2": null,
        "option3": null,
        "grams": 0
      }
    ],
    "options": [
      {
        "name": "Price",
        "values": [
          "$0.80",
          "$2.98"
        ]
      }
    ],
    "image": "https://cdn.shopify.com/s/files/1/1104/4168/files/Screenshot_2026-06-11_at_10.12.01_AM.png?v=1781197934",
    "images": [
      "https://cdn.shopify.com/s/files/1/1104/4168/files/Screenshot_2026-06-11_at_10.12.01_AM.png?v=1781197934"
    ],
    "created_at": "2026-06-05T07:14:57-07:00",
    "updated_at": "2026-09-17T12:05:43-07:00",
    "published_at": "2026-09-02T11:33:11-07:00",
    "url": "https://www.allbirds.com/products/free-returns-coverage",
    "scraped_at": "2026-09-17T19:05:45.031Z"
  },
  {
    "id": "shopify:www.allbirds.com:7218356060240",
    "store": "www.allbirds.com",
    "store_name": "Allbirds",
    "currency": "USD",
    "country": "US",
    "product_id": "7218356060240",
    "title": "Men's Strider Explore - Natural Black (Dark Grey Sole)",
    "handle": "mens-strider-explore",
    "vendor": "Allbirds",
    "product_type": "Shoes",
    "tags": [
      "allbirds::carbon-score => undefined",
      "allbirds::cfId => color-187a11c8f0327fffbdefb2c298f2ce22",
      "allbirds::complete => true",
      "allbirds::edition => classic",
      "allbirds::gender => mens"
    ],
    "description": "From exploring urban landscapes to tackling the trails (or both), this active shoe is here for it all. Extra-grippy l…",
    "price_min": 130,
    "price_max": 130,
    "compare_at_price_max": null,
    "on_sale": false,
    "discount_percent": null,
    "available": false,
    "variants_count": 13,
    "variants": [
      {
        "variant_id": "41334293889104",
        "variant_title": "8",
        "sku": "A11768M080",
        "price": 130,
        "compare_at_price": null,
        "on_sale": false,
        "available": false,
        "option1": "8",
        "option2": null,
        "option3": null,
        "grams": 919
      },
      {
        "variant_id": "41334293921872",
        "variant_title": "8.5",
        "sku": "A11768M085",
        "price": 130,
        "compare_at_price": null,
        "on_sale": false,
        "available": false,
        "option1": "8.5",
        "option2": null,
        "option3": null,
        "grams": 936
      }
    ],
    "options": [
      {
        "name": "Size",
        "values": [
          "8",
          "8.5",
          "9",
          "9.5",
          "10",
          "10.5",
          "11",
          "11.5",
          "12",
          "12.5",
          "13",
          "13.5",
          "14"
        ]
      }
    ],
    "image": "https://cdn.shopify.com/s/files/1/1104/4168/files/A11768_25Q4_Strider-Explore-Natural-Black-Dark-Grey-Sole_PDP_LEFT.png?v=1759336475",
    "images": [
      "https://cdn.shopify.com/s/files/1/1104/4168/files/A11768_25Q4_Strider-Explore-Natural-Black-Dark-Grey-Sole_PDP_LEFT.png?v=1759336475"
    ],
    "created_at": "2025-09-10T12:47:47-07:00",
    "updated_at": "2026-09-17T12:05:43-07:00",
    "published_at": "2026-08-26T10:22:14-07:00",
    "url": "https://www.allbirds.com/products/mens-strider-explore",
    "scraped_at": "2026-09-17T19:05:45.039Z"
  },
  {
    "id": "shopify:www.allbirds.com:7205198004304",
    "store": "www.allbirds.com",
    "store_name": "Allbirds",
    "currency": "USD",
    "country": "US",
    "product_id": "7205198004304",
    "title": "Women's Dasher NZ - Blizzard/Deep Navy (Blizzard Sole)",
    "handle": "womens-dasher-nz-blizzard-deep-navy",
    "vendor": "Allbirds",
    "product_type": "Shoes",
    "tags": [
      "allbirds::carbon-score => undefined",
      "allbirds::cfId => color-c09d6e63b4a11feebc68f762220735d5",
      "allbirds::complete => true",
      "allbirds::edition => classic",
      "allbirds::gender => womens"
    ],
    "description": "A new take on our fan-favorite Dasher, made for busy days and spontaneous plans. Lightweight, breathable comfort keep…",
    "price_min": 140,
    "price_max": 140,
    "compare_at_price_max": null,
    "on_sale": false,
    "discount_percent": null,
    "available": true,
    "variants_count": 13,
    "variants": [
      {
        "variant_id": "41271218896976",
        "variant_title": "5",
        "sku": "A12464W050",
        "price": 140,
        "compare_at_price": null,
        "on_sale": false,
        "available": true,
        "option1": "5",
        "option2": null,
        "option3": null,
        "grams": 761
      },
      {
        "variant_id": "41271218929744",
        "variant_title": "5.5",
        "sku": "A12464W055",
        "price": 140,
        "compare_at_price": null,
        "on_sale": false,
        "available": true,
        "option1": "5.5",
        "option2": null,
        "option3": null,
        "grams": 761
      }
    ],
    "options": [
      {
        "name": "Size",
        "values": [
          "5",
          "5.5",
          "6",
          "6.5",
          "7",
          "7.5",
          "8",
          "8.5",
          "9",
          "9.5",
          "10",
          "10.5",
          "11"
        ]
      }
    ],
    "image": "https://cdn.shopify.com/s/files/1/1104/4168/files/A12464_26Q1_Dasher-NZ-Blizzard-Deep-Navy-Blizzard_PDP_LEFT_e38509e9-51da-49a3-a794-53de6797a109.png?v=1768948779",
    "images": [
      "https://cdn.shopify.com/s/files/1/1104/4168/files/A12464_26Q1_Dasher-NZ-Blizzard-Deep-Navy-Blizzard_PDP_LEFT_e38509e9-51da-49a3-a794-53de6797a109.png?v=1768948779"
    ],
    "created_at": "2025-08-06T20:08:21-07:00",
    "updated_at": "2026-09-17T12:05:43-07:00",
    "published_at": "2026-08-24T09:55:31-07:00",
    "url": "https://www.allbirds.com/products/womens-dasher-nz-blizzard-deep-navy",
    "scraped_at": "2026-09-17T19:05:45.040Z"
  },
  {
    "id": "shopify:www.allbirds.com:7205191974992",
    "store": "www.allbirds.com",
    "store_name": "Allbirds",
    "currency": "USD",
    "country": "US",
    "product_id": "7205191974992",
    "title": "Men's Dasher NZ - Anthracite (Dark Anthracite Sole)",
    "handle": "mens-dasher-nz-anthracite",
    "vendor": "Allbirds",
    "product_type": "Shoes",
    "tags": [
      "allbirds::carbon-score => undefined",
      "allbirds::cfId => color-ec0dcc8441508c674c885b8c8a990cfa",
      "allbirds::complete => true",
      "allbirds::edition => limited",
      "allbirds::gender => mens"
    ],
    "description": "A new take on our fan-favorite Dasher, made for busy days and spontaneous plans. Lightweight, breathable comfort keep…",
    "price_min": 140,
    "price_max": 140,
    "compare_at_price_max": null,
    "on_sale": false,
    "discount_percent": null,
    "available": true,
    "variants_count": 13,
    "variants": [
      {
        "variant_id": "41271176757328",
        "variant_title": "8",
        "sku": "A12417M080",
        "price": 140,
        "compare_at_price": null,
        "on_sale": false,
        "available": false,
        "option1": "8",
        "option2": null,
        "option3": null,
        "grams": 914
      },
      {
        "variant_id": "41271176790096",
        "variant_title": "8.5",
        "sku": "A12417M085",
        "price": 140,
        "compare_at_price": null,
        "on_sale": false,
        "available": false,
        "option1": "8.5",
        "option2": null,
        "option3": null,
        "grams": 927
      }
    ],
    "options": [
      {
        "name": "Size",
        "values": [
          "8",
          "8.5",
          "9",
          "9.5",
          "10",
          "10.5",
          "11",
          "11.5",
          "12",
          "12.5",
          "13",
          "14",
          "15"
        ]
      }
    ],
    "image": "https://cdn.shopify.com/s/files/1/1104/4168/files/A12416_26Q1_Dasher-NZ-Anthracite-Dark-Anthr_PDP_LEFT.png?v=1768948005",
    "images": [
      "https://cdn.shopify.com/s/files/1/1104/4168/files/A12416_26Q1_Dasher-NZ-Anthracite-Dark-Anthr_PDP_LEFT.png?v=1768948005"
    ],
    "created_at": "2025-08-06T18:54:33-07:00",
    "updated_at": "2026-09-17T12:05:43-07:00",
    "published_at": "2026-08-24T09:53:01-07:00",
    "url": "https://www.allbirds.com/products/mens-dasher-nz-anthracite",
    "scraped_at": "2026-09-17T19:05:45.041Z"
  },
  {
    "id": "shopify:www.deathwishcoffee.com:7237656248375",
    "store": "www.deathwishcoffee.com",
    "store_name": "Death Wish Coffee",
    "currency": "USD",
    "country": "US",
    "product_id": "7237656248375",
    "title": "Death Grip Bottle Opener",
    "handle": "death-grip-bottle-opener",
    "vendor": "BAMKO",
    "product_type": "Accessories",
    "tags": [
      "Accessories",
      "Gifting",
      "Merch"
    ],
    "description": "To the window...\nTo literally any wall you can think of. Perfect for any basement bar, man cave or she-shed, you won'…",
    "price_min": 8,
    "price_max": 8,
    "compare_at_price_max": null,
    "on_sale": false,
    "discount_percent": null,
    "available": true,
    "variants_count": 1,
    "variants": [
      {
        "variant_id": "41524646871095",
        "variant_title": "Default Title",
        "sku": "UWMDWC25",
        "price": 8,
        "compare_at_price": null,
        "on_sale": false,
        "available": true,
        "option1": "Default Title",
        "option2": null,
        "option3": null,
        "grams": 54
      }
    ],
    "options": [
      {
        "name": "Title",
        "values": [
          "Default Title"
        ]
      }
    ],
    "image": "https://cdn.shopify.com/s/files/1/0271/7209/files/DeathWishCoffee_March2025_Product_BottleOpener_Front2_Web.jpg?v=1741809353",
    "images": [
      "https://cdn.shopify.com/s/files/1/0271/7209/files/DeathWishCoffee_March2025_Product_BottleOpener_Front2_Web.jpg?v=1741809353"
    ],
    "created_at": "2025-03-06T09:27:54-05:00",
    "updated_at": "2026-09-17T15:05:44-04:00",
    "published_at": "2026-09-16T15:20:29-04:00",
    "url": "https://www.deathwishcoffee.com/products/death-grip-bottle-opener",
    "scraped_at": "2026-09-17T19:05:45.789Z"
  },
  {
    "id": "shopify:www.deathwishcoffee.com:7509119434807",
    "store": "www.deathwishcoffee.com",
    "store_name": "Death Wish Coffee",
    "currency": "USD",
    "country": "US",
    "product_id": "7509119434807",
    "title": "Call of the Wild Mug",
    "handle": "call-of-the-wild-mug",
    "vendor": "Deneen Pottery",
    "product_type": "Mugs",
    "tags": [
      "HCM",
      "Merch",
      "Mug",
      "Society of Strong Coffee"
    ],
    "description": "The chase never ends.\nInspired by the elusive nature and enduring power of the stag, this limited-edition mug is a sy…",
    "price_min": 38,
    "price_max": 38,
    "compare_at_price_max": null,
    "on_sale": false,
    "discount_percent": null,
    "available": true,
    "variants_count": 1,
    "variants": [
      {
        "variant_id": "42401565179959",
        "variant_title": "Default Title",
        "sku": "UMSTAG26K",
        "price": 38,
        "compare_at_price": null,
        "on_sale": false,
        "available": true,
        "option1": "Default Title",
        "option2": null,
        "option3": null,
        "grams": 794
      }
    ],
    "options": [
      {
        "name": "Title",
        "values": [
          "Default Title"
        ]
      }
    ],
    "image": "https://cdn.shopify.com/s/files/1/0271/7209/files/DeathWishCoffee_September2026_Product_Mug_Stag_Front_EA.jpg?v=1789400417",
    "images": [
      "https://cdn.shopify.com/s/files/1/0271/7209/files/DeathWishCoffee_September2026_Product_Mug_Stag_Front_EA.jpg?v=1789400417"
    ],
    "created_at": "2026-08-20T16:27:00-04:00",
    "updated_at": "2026-09-17T15:05:44-04:00",
    "published_at": "2026-09-15T10:34:05-04:00",
    "url": "https://www.deathwishcoffee.com/products/call-of-the-wild-mug",
    "scraped_at": "2026-09-17T19:05:45.791Z"
  },
  {
    "id": "shopify:www.deathwishcoffee.com:7459550658615",
    "store": "www.deathwishcoffee.com",
    "store_name": "Death Wish Coffee",
    "currency": "USD",
    "country": "US",
    "product_id": "7459550658615",
    "title": "Allfather’s Aloha Button Up",
    "handle": "allfathers-aloha-button-up",
    "vendor": "BAMKO",
    "product_type": "Apparel",
    "tags": [
      "Apparel",
      "Men",
      "Merch",
      "Unisex",
      "Valhalla Java"
    ],
    "description": "Dress like a legend.\nIt's time to trade your boring button-up for one worthy of the gods. Donning a full front-to-bac…",
    "price_min": 40,
    "price_max": 40,
    "compare_at_price_max": null,
    "on_sale": false,
    "discount_percent": null,
    "available": true,
    "variants_count": 6,
    "variants": [
      {
        "variant_id": "42247555907639",
        "variant_title": "S",
        "sku": "USHVJA02",
        "price": 40,
        "compare_at_price": null,
        "on_sale": false,
        "available": true,
        "option1": "S",
        "option2": null,
        "option3": null,
        "grams": 236
      },
      {
        "variant_id": "42247555940407",
        "variant_title": "M",
        "sku": "USHVJA03",
        "price": 40,
        "compare_at_price": null,
        "on_sale": false,
        "available": true,
        "option1": "M",
        "option2": null,
        "option3": null,
        "grams": 252
      }
    ],
    "options": [
      {
        "name": "Size",
        "values": [
          "S",
          "M",
          "L",
          "XL",
          "2XL",
          "3XL"
        ]
      }
    ],
    "image": "https://cdn.shopify.com/s/files/1/0271/7209/files/DeathWishCoffee_June2026_Product_ValhallahJava_GraphicShirt_Front_Web2.jpg?v=1782323548",
    "images": [
      "https://cdn.shopify.com/s/files/1/0271/7209/files/DeathWishCoffee_June2026_Product_ValhallahJava_GraphicShirt_Front_Web2.jpg?v=1782323548"
    ],
    "created_at": "2026-05-27T11:05:04-04:00",
    "updated_at": "2026-09-17T15:05:44-04:00",
    "published_at": "2026-09-10T09:40:11-04:00",
    "url": "https://www.deathwishcoffee.com/products/allfathers-aloha-button-up",
    "scraped_at": "2026-09-17T19:05:45.792Z"
  }
]
```

In that run 23 of 439 products were on sale (priced below their compare-at price) and 246 were in stock.

### What people use it for

- **Monitor competitor prices and stock**. For example, "every morning, which of my rival's SKUs changed price or sold out". Use **One row per: Variant**, schedule it daily, and compare on the stable `id`.
- **Find what is on sale**. For example, "all discounted products across these 50 streetwear stores, with the discount in percent". Turn on **Only on sale**.
- **Build a catalogue or a product feed**. For example, "titles, images, variants and prices from my suppliers' stores into my own database or an AI agent".

### Why not build it yourself

Building this yourself: pagination, collections, variant maths, sale logic, currency per store, HTML descriptions, stores that answer differently: about 8 hours, then upkeep. This Actor: **$1.00 per 1,000 rows**, and when something changes we fix it within 48 hours. Every Apify account includes $5 of free usage a month, so your first 5,000 rows cost nothing.

**Founding price:** $1.00 per 1,000 rows for the first 100 users. It then rises to $1.50. Users who joined at the founding price keep it.

### Proof

| | |
|---|---|
| Success rate (staging runs on Apify, 17–18 Sept 2026) | 100% from 4 runs, 20 requests, 0 failed attempts |
| Last verified against live stores | 2026-09-18 |
| Typical run | 439 products from 2 stores in 5 to 9 seconds |
| Issues answered within | 6 hours |
| Changes fixed within | 48 hours |

Changelog at the bottom of this page, and every fix is dated.

### What we deliberately do not collect

- No personal data. This Actor reads products, not people: no store-owner contacts, no e-mails, no phone numbers, no customer reviews. E-mail addresses and phone numbers inside product descriptions are replaced with `[email removed]` / `[phone removed]`.
- Public storefront feed only. No logins, no admin API, no checkout.
- Light on the store: 250 products per request, pages of one store read one after another, at most 5 requests a second overall.
- This Actor declares **limited permissions**: it can only write to its own dataset.

### How to run it

1. Click **Run**. The defaults read two sample stores (Allbirds and Death Wish Coffee, about 440 products).
2. Replace them with your own **Store or collection URLs**, for example `https://www.allbirds.com`, `allbirds.com`, or `https://www.allbirds.com/collections/mens`. Hundreds of stores per run are fine.
3. Choose **One row per** product or variant, and narrow with **Keywords**, **Only in stock**, **Only on sale**.
   Turn on **Include stock and barcodes** for stock counts, barcodes and inventory policy per variant (details below). Products that do not match are never saved and never charged.
4. Set **Max rows** to cap the run. That is also your spend cap.
5. Download as JSON, CSV or Excel, or call it from the API or from an AI agent through the Apify MCP server.

### Stock counts and barcodes

The catalogue feed carries prices and an in-stock flag, but not quantities or barcodes. Those live on a second public
endpoint, one request per product, which **Include stock and barcodes** reads for you. It adds `inventory_quantity`,
`barcode`, `inventory_tracked` and `inventory_policy` to every variant, plus `total_inventory` per product.

Three things we are careful about, because each of them silently corrupts a dataset:

- **Shopify reports `999999` for variants whose stock it does not track** (digital add-ons, made-to-order). That is a
  placeholder, not a quantity. Those variants get `inventory_quantity: null` and are left out of `total_inventory`.
- **A missing figure is `null`, never `0`.** Zero means sold out, which is a real signal; "this shop publishes no
  numbers" is not the same thing, and the two must not be mixed.
- **Whether a shop publishes any of this is the merchant's choice**, so some stores return barcodes without
  quantities, or an internal code where you expected a GTIN. Quantities can also be negative when a shop has oversold.

It costs one extra request per product, so leave it off when you only need prices.

In **variant mode** each row is one variant: the product fields are repeated, the nested `variants` list is replaced by top-level `variant_id`, `variant_title`, `sku`, `price`, `compare_at_price`, `option1`–`option3` and `grams`, `id` and `url` point at the variant, and **Only in stock** / **Only on sale** apply to the variant itself.

Good to know: a small number of stores switch their product feed off or protect it; those are reported in the log and skipped, and you are not charged for them. A site that is not on Shopify is reported the same way.

### Related Actors

- [Career Page Jobs Scraper](https://apify.com/dododata/career-site-jobs-scraper): jobs from Greenhouse, Lever, Ashby and four more career-page systems
- [France Travail Jobs Scraper](https://apify.com/dododata/francetravail-jobs-scraper): French public-service job offers with salary as numbers

### Input reference

| Field | Default | Meaning |
|---|---|---|
| `startUrls` | two sample stores | Store or collection URLs |
| `rowPer` | `product` | `product` (variants nested) or `variant` (one row per SKU) |
| `includeInventory` | false | Add stock, barcode and inventory policy per variant (one extra request per product) |
| `keywords` | none | Keep products whose title, vendor, type or tags contain one of these |
| `onlyAvailable` | false | Keep only products in stock |
| `onlyOnSale` | false | Keep only discounted products |
| `maxItems` | 500 | Stop after this many rows |
| `maxConcurrency` | 5 | Parallel requests |
| `useProxy` | true | Use Apify proxy (recommended) |

### Changelog

- 2026-09-17, v0.1: first release. Verified against live stores on 17 and 18 September 2026.

# Actor input Schema

## `startUrls` (type: `array`):

Any Shopify store (https://www.allbirds.com) or one of its collections (https://www.allbirds.com/collections/mens). Any page of the store works. Leave empty to try the Actor on two sample stores.

## `rowPer` (type: `string`):

Variant mode is the one to use for price and stock monitoring at SKU level. You pay per row.

## `includeInventory` (type: `boolean`):

Read each product a second time to add stock count, barcode and inventory policy per variant, plus a total\_inventory roll-up. Costs one extra request per product, so runs are slower. The fields are only filled when the merchant publishes them, and variants the shop does not track stay null instead of reporting Shopify's 999999 placeholder.

## `keywords` (type: `array`):

Keep only products whose title, vendor, type or tags contain one of these words. Filtered-out products are not saved and not charged.

## `onlyAvailable` (type: `boolean`):

Keep only products with at least one variant available to buy.

## `onlyOnSale` (type: `boolean`):

Keep only products priced below their compare-at price.

## `maxItems` (type: `integer`):

Stop after this many rows across all stores. You pay per row, so this is also your budget cap.

## `maxConcurrency` (type: `integer`):

Parallel requests. 5 is polite and fast enough for most sites.

## `useProxy` (type: `boolean`):

Recommended. Turn off only for testing.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.allbirds.com"
    },
    {
      "url": "https://www.deathwishcoffee.com"
    }
  ],
  "rowPer": "product",
  "includeInventory": false,
  "keywords": [],
  "onlyAvailable": false,
  "onlyOnSale": false,
  "maxItems": 500,
  "maxConcurrency": 5,
  "useProxy": true
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://www.allbirds.com"
        },
        {
            "url": "https://www.deathwishcoffee.com"
        }
    ],
    "keywords": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("dododata/shopify-products-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": [
        { "url": "https://www.allbirds.com" },
        { "url": "https://www.deathwishcoffee.com" },
    ],
    "keywords": [],
}

# Run the Actor and wait for it to finish
run = client.actor("dododata/shopify-products-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.allbirds.com"
    },
    {
      "url": "https://www.deathwishcoffee.com"
    }
  ],
  "keywords": []
}' |
apify call dododata/shopify-products-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dododata/shopify-products-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/127lh2CCG4dcc859C/builds/gsMtvtDNkpbRNs706/openapi.json
