# Shopify — Multi-Store Public Catalog Export (`jpmarketdata/shopify-multi-store-public-catalog-export`) Actor

Export full public Shopify catalogs across stores with every returned variant, exact prices, SKUs, options, availability and images. $0.0005 per product; no start fee.

- **URL**: https://apify.com/jpmarketdata/shopify-multi-store-public-catalog-export.md
- **Developed by:** [h ichi](https://apify.com/jpmarketdata) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 73.3% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.50 / 1,000 product exporteds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 — Multi-Store Public Catalog Export

**Price:** $0.0005 per delivered parent product, including every variant exposed by the public catalog feed. No start or secondary fee.

Export the complete accessible public catalog of selected Shopify stores for assortment and price research, with every returned variant, exact prices, SKUs, named options, availability, images and full plain descriptions. Independent tool, not affiliated with Shopify or merchants.

### Input

`domains` accepts 1–5 public store hosts or HTTP(S) root origins. Defaults Allbirds and ColourPop; empty filters retain the full catalog. No product/collection/account path, query, private host or credentials. `maxProductsPerStore` defaults 2,000 (maximum 2,500), `maxProducts` defaults 10,000 (maximum 12,500); all sources validate before delivery and global caps allocate fairly. `includeDescriptions=true` includes full contact-screened source plain descriptions for the same price.

### Output

One unique `(canonicalStore,productId)` parent row with every variant object returned by the public feed, IDs/SKUs/options, exact decimal price and nullable compare-at represented as empty string, public availability/shipping/tax flags, source tags/vendor/type/dates, options and all safe image links. Media/product pages are not requested. Availability is a public flag, not stock quantity or checkout delivery. Prices are source decimals, never guessed cents or rounded floats. Currency is the unambiguous native same-store /meta.json currency or empty; no inferred USD/conversion. Hidden/private/backend products or variants are not promised. Source JSON can impose its own variant bound; this Actor does not truncate returned variants. The example is illustrative.

Free `COVERAGE` distinguishes end-of-feed, fetched count, known total or null, page/output caps and unknown currency. Completeness is the paged accessible product feed; observations are non-atomic. Source failure is fatal before paid rows. Individual genuine empty feeds are free coverage; overall empty is an uncharged error with coverage. Dataset rows are products only; `RUN-SUMMARY` uniqueRows=deliveredRows=primary-event count.

### Limits

HTTP/JSON only, 256MB/300seconds, at most70requests including robots/metadata/redirects, ten250-product feed pages/store, 4MiB wire/8MiB decoded per response,64MiB transfer and24MiB staged JSON. Serial requests interleave stores with at least10s per origin and applicable crawl-delay. Residential routing with this spacing completed the measured ordinary692-product Allbirds and1,061-product ColourPop diagnostic catalogs; a1s scout interval rate-limited both page2s. Apify residential proxy is managed by the Actor, with a fresh connection per request. A GET that times out, hits a proxy transport error or receives a temporary HTTP 429 may be attempted once more, using one shared retry for the entire run and preserving request, transfer and time ceilings plus origin spacing. For 429, honor Retry-After (seconds or HTTP date) with a 10–60s wait; when absent wait20s. Invalid or longer waits, or insufficient remaining time, fail without retry. No retry for403, invalid data or other failures; no alternate backend. The proxy usage is included in the product price. Other sources may refuse public feeds. The proxy route requires a public IPv4 answer; every IPv4/IPv6 DNS answer is checked before a request.

Check robots before each origin and redirect. Reject credentials, private/reserved IPv4/IPv6/metadata destinations with a public IP pinned in the proxy CONNECT/forward destination and original merchant TLS/Host. The proxy gateway socket is pinned to the SDK-configured Apify endpoint; only that trusted runtime gateway may use Apify internal addresses. Merchant destinations always require public addresses. Native metadata must match the canonical merchant domain and Shopify identity; discard all other merchant metadata. Do not request the HTML root. Canonical redirects must retain exact meta.json path or products.json limit/page; reject secret/contact URLs, oversized/compression-bomb bodies, repeated IDs, malformed structure,403, exhausted429/timeout retries and required-source failures. Never fetch cart/account/order/admin/customer/private routes, product details/images or protected source data. Store terms apply; robots Allow/free source access is not commercial authorization.

### Privacy and charging

Screen all public text and URLs for contact/secret patterns. No person/customer/account/order/checkout data, cookies, tokens or raw body logs. Descriptions/media are public source material and do not confer redistribution rights.

One $0.0005 primary `product-exported` event per delivered parent product, including all returned variants and plain description; no start, content, enrichment, failure or summary fee.100products cost$0.05. Managed export is paid; the underlying anonymous source is free. No globally cheapest or paid-customer-proof claim.

# Actor input Schema

## `domains` (type: `array`):

One to five public store domains/root origins with an accessible products.json feed. Defaults complete Allbirds and ColourPop catalogs. No paths, query, credentials or private host. $0.0005 per delivered product. Managed residential routing is included; source DNS must provide a public IPv4 answer.

## `maxProductsPerStore` (type: `integer`):

Default 2,000 completes the measured ordinary stores. Maximum 2,500 within ten 250-product pages; source/output bounds are explicit. $0.0005 per delivered product.

## `maxProducts` (type: `integer`):

Default 10,000, maximum 12,500 parent product rows after fair store allocation. All selected sources validate before paid delivery. $0.0005 per delivered product.

## `includeDescriptions` (type: `boolean`):

Include complete source plain product descriptions, screened for contact patterns. No extra fee. Images remain public links and remain output links only. $0.0005 per delivered product.

## Actor input object example

```json
{
  "domains": [
    "www.allbirds.com",
    "colourpop.com"
  ],
  "maxProductsPerStore": 2000,
  "maxProducts": 10000,
  "includeDescriptions": true
}
```

# Actor output Schema

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

Public products, variants, observed prices, availability and source links.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("jpmarketdata/shopify-multi-store-public-catalog-export").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("jpmarketdata/shopify-multi-store-public-catalog-export").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 '{}' |
apify call jpmarketdata/shopify-multi-store-public-catalog-export --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jpmarketdata/shopify-multi-store-public-catalog-export"
        }
    }
}
```

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/oPt7CJQAoDFqxVlJC/builds/ibi63PUFfNmD0IXU9/openapi.json
