# Shopify & Ecommerce Store Leads (`platleads/shopify-store-leads`) Actor

Find Shopify, WooCommerce, Wix and other online stores by country, category, tools and apps, with emails, phones and social profiles. Export to a spreadsheet, or schedule it to get new stores every day.

- **URL**: https://apify.com/platleads/shopify-store-leads.md
- **Developed by:** [PlatLeads](https://apify.com/platleads) (community)
- **Categories:** Lead generation, E-commerce
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 stores

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 & Ecommerce Store Leads

Find online stores on Shopify, WooCommerce, Wix and other platforms, and download them as a spreadsheet. Each store comes with its country, category, products and prices, the tools and apps it uses, its social profiles and, where the store publishes them, its emails, phone numbers and WhatsApp numbers. On Apify's free plan a run returns a sample of up to 50 stores with contact details hidden; see Pricing below.

Not affiliated with Shopify, WooCommerce or Wix.

### What you can use it for

- **Lead lists**: stores in the countries and categories you sell to, with contact details, for an agency, an app or a service.
- **Stores that use a tool**: stores running Klaviyo, Judge.me, Gorgias or a competitor of yours, picked from the Technologies list.
- **New stores every day**: a store that opened this week is still choosing its apps, agencies and suppliers. Schedule a daily run with *Only stores found since the last run* and each run returns just the stores found since the one before.

### How it works

New stores are found every day, and every store is checked again regularly. A run searches that list rather than visiting websites, so it finishes in minutes, not hours.

1. Choose the filters. Every filter is optional, and filters combine: a store has to match all of them. A filter with several values matches any of them. Runs return stores that are open now; see `status` below for stores behind a password page.
2. Set **Maximum stores**: the run stops there, or earlier at the maximum cost per run you set on the run's options.
3. Start the run. Download the results as CSV, Excel, JSON or HTML, or send them on with Apify integrations such as Google Sheets, Make, Zapier or n8n.

### Input example

US beauty stores on Shopify that use Klaviyo, at most 500:

```json
{
  "platform": ["shopify"],
  "country": ["US"],
  "category": ["beauty-cosmetics"],
  "technologies": ["klaviyo"],
  "maxRows": 500
}
```

### More lead lists

| Leads | Settings |
| --- | --- |
| Stores on a competitor's email tool | **Technologies**: Mailchimp, Omnisend |
| Shopify stores collecting reviews with Judge.me | **Shopify apps**: `judgeme` |
| Stores with live chat or a helpdesk | **More filters**: `{"technology_category": ["customer_support"]}` |
| Stores that started Facebook or Instagram ads in the last 30 days | **More filters**: `{"meta_ads": "active"}` |
| Stores running many Meta ads | **More filters**: `{"fb_ad_count": {"min": 20}}` |
| Stores with a wholesale page | **More filters**: `{"pages": ["wholesale"]}` |
| Established stores with a large catalog | **Minimum products**: 500, **More filters**: `{"followers": {"min": 10000}}` |

### Output

One row per store, newest first unless you choose otherwise. The **Output format** option *Nested JSON* returns each store as the nested object behind these columns, with lists kept as lists and a few more details, such as followers per network and each app's icon and App Store page. Its keys differ from the column names: `id` for `domain` (there is no `url`), `created_at` for `found_at`, `contact.email`, `contact.phone` and `contact.whatsapp` for the contact columns, `social.link` and `social.total_followers` for the social columns, `product` for the product columns, `fb_ads.count` and `fb_ads.last_start_date` for the Meta ads columns, `technologies.active` and `apps.active` as lists of objects, and a `shopify` object for the `shopify_` columns.

New stores are added every day, and every store is checked again regularly; `updated_at` says when it last was. The Source column says how each value is collected:

- **Observed**: read directly from the store's website or a public source such as the Meta Ad Library.
- **Derived**: calculated from observed values, such as an average price.
- **Inferred**: detected by rules or an AI model. Right for most stores, but it can be wrong.
- **Estimated**: an approximate number, such as a follower count shown as 1.2K on the profile.

`apps` and the `shopify_` columns are only filled in for Shopify stores.

| Column | Source | Description |
| --- | --- | --- |
| `domain`, `url` | Observed | The store's domain and homepage. |
| `title` | Observed | The store name shown in the browser tab. |
| `platform` | Derived | The ecommerce platform, detected from the storefront code: `shopify`, `woocommerce`, `wix`, `prestashop`, `bigcommerce`, `magento`, a smaller platform under its own name, or `custom` for a storefront built in-house. |
| `status` | Derived | `active`, or `password_protected` for a store behind a password page, whose other details may date from before it closed. Runs return only active stores unless you set `status` in More filters or tick *Only stores found since the last run*. |
| `country` | Inferred | Where the store is based, not where it sells, as a code such as `US`. Shopify stores use the country registered with Shopify; on other platforms it is inferred from store settings, phone numbers, the domain and the currency. |
| `language` | Inferred | The main language of the storefront, as a code such as `en`. |
| `categories` | Inferred | Category and subcategory, e.g. `Apparel & Accessories / Shoes & Footwear`, assigned by an AI model from the store's name, description and products. Stores with no products and no description are not classified. |
| `description` | Observed | The short description the store gives search engines. |
| `emails` | Observed | Email addresses on the store's own domain, from the homepage and contact page. Free-mail and third-party addresses are left out. |
| `phones` | Observed | Phone numbers from the homepage and contact page: in international format (`+…`) when the site gives the country code, otherwise as written locally, so one number can appear in both forms. |
| `whatsapp` | Observed | WhatsApp numbers from chat links and buttons, as digits with the country code and no `+`. |
| `instagram`, `facebook`, `tiktok`, `youtube`, `twitter`, `pinterest`, `linkedin` | Observed | The store's profile on each network, when the homepage links to one. |
| `total_followers` | Estimated | Followers across the store's Facebook, Instagram, TikTok, YouTube and Pinterest profiles we could read, as precise as the profiles show them. |
| `product_count` | Observed | Number of products in the catalog. Approximate on platforms that do not publish a count. |
| `avg_price`, `avg_price_usd` | Derived | Average product price in the store's currency, from a sample of its products, and the same average in US dollars. |
| `currency` | Observed | The currency the store sells in, e.g. `USD`. |
| `meta_ads_30d` | Estimated | Facebook and Instagram ads the store started in the last 30 days, from the Meta Ad Library. |
| `meta_ads_last_started` | Observed | Start date of the store's most recent Facebook or Instagram ad, at midnight UTC. |
| `technologies` | Inferred | Third-party tools detected in the storefront code, on any platform: email, reviews, subscriptions, support, search, ads and more. |
| `apps` | Inferred | Shopify apps detected in the storefront code. |
| `is_dropshipping` | Inferred | `true` when the store's category links, Shopify apps or product vendors point to dropshipping. Empty otherwise, and not cleared once set. |
| `is_print_on_demand` | Inferred | `true` when the store's Shopify apps or product vendors point to print on demand. Empty otherwise, and not cleared once set. |
| `is_cod` | Inferred | Whether the storefront offers cash on delivery. |
| `has_ios_app`, `has_android_app` | Inferred | Whether the homepage links to the store's own app on the App Store or Google Play. |
| `shopify_domain` | Observed | The store's permanent `*.myshopify.com` address. |
| `shopify_theme` | Observed | The Shopify theme, e.g. `Dawn`. |
| `shopify_registration_country`, `shopify_province`, `shopify_city` | Observed | The country, state or province, and city registered with Shopify. |
| `shopify_ships_to` | Observed | Countries the store ships to, from its shipping settings. `*` means the rest of the world. |
| `shopify_payment_methods` | Observed | Wallets offered at checkout: `SHOP_PAY`, `PAYPAL`, `APPLE_PAY`, `GOOGLE_PAY`, `AMAZON_PAY`. |
| `shopify_offers_installments` | Observed | Whether checkout offers Shop Pay Installments. |
| `found_at` | Observed | When we first found the store. Runs sort by it. |
| `updated_at` | Observed | When we last checked the store. |

A column is empty when the store does not have that detail. Not every store publishes an email or phone number, so keep the WhatsApp and social columns too: they reach stores that have no email.

#### Not in the data

- Revenue, traffic or visit estimates.
- Employee counts or named contacts.
- Private data or anything behind a login.
- Tracking pixels, the date of the newest product, the platform a store used before, pages linked from the homepage, the domain registration date and Shopify Plus. You can filter by these in More filters, but they are not in the results.

### Get new stores every day

Tick **Only stores found since the last run**, then create a schedule for the Actor in Apify, for example every morning. Each run returns the stores found since the previous run with the same filters, oldest first, and remembers where it stopped in a key-value store in your account. A run stopped by *Maximum stores* or by its maximum cost leaves the rest for the next run.

- The first run starts from *Found in the last N days*, or one day back if that is empty.
- Changing any filter starts a new sequence from the first-run start.
- Stores still behind a password page are included, because many new stores are when we find them. The `status` column tells them apart.
- Each store is checked against the filters once, in the first run after it is found. Choose filters that are known from the start: platform, domain type and domain ending. Country is inferred when a store is found and, for Shopify stores, replaced soon after by the country registered with Shopify, so a sync by country can miss the few stores whose country changes. Categories, followers and ads are often filled in later, so a new store filtered on them is usually left out for good.

### More filters

The **More filters (JSON)** field takes any of the filters below, and the form's own filters too, for example `{"meta_ads": "active", "followers": {"min": 1000}}` or `{"platform": ["opencart"]}` for a platform the form does not list. A filter set there replaces the same filter set in the form.

Filters combine with AND, except `category` and `subcategory`, whose values are pooled. A filter that takes several values matches any of them, except `traits`, where all must match. Values are not case-sensitive, except for `theme` and `province`. Where a description mentions `unknown`, send it to match stores without a value, e.g. `"social_platforms": ["unknown"]`. A filter shown with an example rather than its values, such as `theme`, `province` or `tld`, takes the value as it appears in the data; a value we do not have returns no stores rather than an error.

| Filter | Format | Description |
| --- | --- | --- |
| `province` | Array of values | The state, province or region the merchant registered with Shopify, such as California or Ontario. Shopify only asks for one in some countries. Write each value as country code and name, e.g. US:California. Shopify only. Example: `["GB:England"]`. |
| `subcategory` | Array of values | A subcategory. Assigned by an AI model; send `unknown` for stores it has not classified yet. Category and subcategory values combine: a store in any of them matches. Values: `mens-clothing`, `womens-clothing`, `shoes-footwear`, `handbags-backpacks`, `hats-headwear`, `sunglasses-eyewear`, `lingerie-intimates`, `graphic-tees-merch`, `home-decor`, `kitchen-dining`, `bedding-bath`, `lighting`, `garden-outdoor`, `candles-fragrance`, `storage-organization`, `wall-art-prints`, `coffee-tea`, `snacks-confectionery`, `wine-spirits`, `specialty-foods`, `organic-special-diet`, `meal-kits`, `bakery-desserts`, `meat-seafood`, `sauces-spices`, `restaurant-takeaway`, `makeup`, `skincare`, `haircare`, `nail-care`, `fragrances`, `beauty-tools`, `bath-body`, `mens-grooming`, `marketing-seo`, `web-design-development`, `business-consulting`, `printing-services`, `real-estate-property`, `funeral-memorial`, `local-services`, `art-supplies`, `musical-instruments`, `craft-supplies`, `jewelry-making`, `stickers-decals`, `music-vinyl-records`, `vitamins-supplements`, `fitness-nutrition`, `medical-devices`, `wellness-relaxation`, `weight-management`, `pain-relief-mobility`, `mens-health`, `research-peptides`, `phones-tablets`, `computers-laptops`, `audio-headphones`, `cameras-drones`, `smart-home`, `accessories-cables`, `gaming-pc-components`, `power-solar-batteries`, `fine-jewelry`, `fashion-jewelry`, `watches`, `body-jewelry`, `commercial-equipment`, `safety-workwear`, `janitorial-supplies`, `packaging-shipping`, `lab-scientific`, `agriculture-farm`, `personalized-gifts`, `gift-baskets`, `novelty-gag-gifts`, `greeting-cards`, `party-supplies`, `holiday-decor`, `seasonal-costumes`, `online-courses`, `tutorials-workshops`, `coaching-mentoring`, `educational-materials`, `gym-fitness`, `outdoor-recreation`, `hunting-shooting`, `team-sports`, `water-sports`, `cycling`, `golf`, `hand-tools`, `power-tools`, `plumbing-electrical`, `fasteners-hardware`, `paint-supplies`, `parts-components`, `auto-parts`, `motorcycle-parts`, `car-accessories`, `tires-wheels`, `vehicle-electronics`, `physical-books`, `ebooks-digital`, `comics-manga`, `audiobooks`, `dog-supplies`, `cat-supplies`, `pet-food-treats`, `aquarium-reptile`, `pet-grooming`, `general-store`, `living-room`, `bedroom-furniture`, `office-furniture`, `outdoor-furniture`, `action-figures`, `board-games-puzzles`, `video-games`, `educational-toys`, `dolls-plush`, `baby-clothing`, `baby-gear-strollers`, `diapers-feeding`, `maternity`, `nursery-decor`, `kids-clothing`, `kids-school-supplies`, `game-credits-topup`, `digital-downloads`, `memberships-communities`, `vintage-antiques`, `trading-cards`, `coins-stamps`, `memorabilia`, `writing-instruments`, `paper-notebooks`, `desk-accessories`, `printers-ink`, `saas-subscriptions`, `mobile-apps`, `software-tools`, `themes-templates`, `vapes-e-cigarettes`, `cbd-products`, `cannabis-dispensary`, `smoking-accessories`, `tobacco-cigars`, `luggage-suitcases`, `travel-accessories`, `travel-organizers`, `adult-toys`, `sexual-wellness`, `erotic-lingerie`, `bridal-gowns`, `wedding-decor`, `wedding-favors`, `bridesmaids-groomsmen`, `wedding-invitations`. |
| `status` | Array of values | Whether visitors can open the store. Password-protected stores are usually not launched yet or temporarily closed. Only active stores are returned unless you set it. Values: `active`, `password_protected`. |
| `currency` | Array of values | The currency the store sells in. Values: `USD`, `EUR`, `GBP`, `INR`, `CAD`, `AUD`, `BRL`, `IRT`, `PLN`, `MXN`, `PKR`, `VND`, `ZAR`, `JPY`, `TRY`, `COP`, `CHF`, `CLP`, `SEK`, `AED`, `NZD`, `RON`, `DKK`, `ILS`, `ARS`, `BDT`, `SGD`, `EGP`, `MYR`, `HUF`, `IDR`, `HKD`, `PEN`, `CZK`, `NOK`, `MAD`, `TWD`, `UAH`, `THB`, `NGN`, `PHP`, `IRR`, `KRW`, `SAR`, `DZD`, `RUB`, `RSD`, `CNY`, `XOF`, `KES`, `LKR`, `KWD`, `UYU`, `GTQ`, `CRC`, `TND`, `GHS`, `QAR`, `ISK`, `DOP`, `BGN`, `BYN`, `BAM`, `JOD`, `PYG`, `GEL`, `XAF`, `OMR`, `KZT`, `NPR`, `MKD`, `HNL`, `BHD`, `MDL`, `ALL`, `TTD`, `BOB`, `IQD`, `UGX`, `MUR`, `JMD`, `AMD`, `AZN`, `XPF`, `TZS`, `UZS`, `GNF`, `AOA`, `KHR`, `BSD`, `VES`, `MNT`, `LYD`, `ZMW`, `LBP`, `NAD`. |
| `ships_to` | Array of values | Countries the store delivers to, from its Shopify shipping settings. `*` (Worldwide) matches stores that ship everywhere. Shopify only. Example: `["US"]`. |
| `latest_product_at` | {min, max} ISO 8601 | When the store last added a product. Shopify & WooCommerce only. |
| `social_platforms` | Array of values | Stores that link to a profile on any of the chosen networks. Send `unknown` for stores with no social profile. Values: `instagram`, `facebook`, `youtube`, `tiktok`, `twitter`, `linkedin`, `pinterest`. |
| `followers` | {min, max} | Followers across all of the store's social profiles. |
| `meta_ads` | One value | Whether the store advertises on Facebook and Instagram: started an ad in the last 30 days, has run ads at some point, or never seen advertising. Values: `active`, `ever`, `never`. |
| `fb_ad_count` | {min, max} | Number of Meta ads the store started in the last 30 days. |
| `tracker_platforms` | Array of values | Stores with a tracking pixel from any of the chosen vendors. Send `unknown` for stores with no pixel at all. Values: `google_analytics`, `google_tag_manager`, `google_ads`, `facebook`, `tiktok`, `pinterest`. |
| `business_model` | Array of values | How the store fulfils orders: dropshipping, print on demand or cash on delivery. Dropshipping is read from a store's category links, Shopify apps and product vendors, print on demand from its Shopify apps and product vendors, and cash on delivery from page content. Values: `dropshipping`, `pod`, `cod`. |
| `traits` | Array of values | Stores that match every chosen trait. Shopify Plus and Offers Installments (Shop Pay Installments) apply to Shopify stores only. Values: `shopify_plus`, `has_mobile_app`, `platform_changed`, `offers_installments`. |
| `previous_platforms` | Array of values | The platform a store ran on before its current one. Only switches seen since we started tracking the store are known. Values: `woocommerce`, `shopify`, `wix`, `custom`, `magento`, `prestashop`, `bigcommerce`, `opencart`, `nuvemshop`, `shoplazza`, `youcan`, `shopline`, `fourthwall`, `sfcc`, `vtex`, `hostinger`, `jtl`, `magento1`, `zencart`, `cafe24`, `empretienda`, `godomall`, `kormozone`, `lightspeed`, `mixin`, `sazito`, `shoper`, `shopware`, `virtuemart`, `bigcartel`, `botble`, `epages`, `freewebstore`, `haravan`, `modified`, `nopcommerce`, `oxid`, `salla`, `shoptet`, `squarespace`, `volusion`, `webnode`. |
| `pages` | Array of values | Stores that link to the chosen page types, such as wholesale, affiliate or shipping. Values: `contact`, `privacy`, `about`, `terms`, `returns`, `shipping`, `faq`, `tracking`, `wholesale`, `affiliate`. |
| `technology_category` | Array of values | Stores running any tool in the chosen categories. Combined with technologies, a store must match both. Values: `page_builder`, `ads_analytics`, `email_sms_marketing`, `customer_support`, `reviews_ugc`, `accessibility_compliance`, `upsell_conversion`, `search_merchandising`, `subscriptions_loyalty`, `localization`, `affiliate_referral`, `payments_bnpl`, `shipping_returns`. |
| `theme` | Array of values | The theme the storefront is built on, such as Dawn, Prestige or the retired Debut. Custom themes keep whatever name their developer gave them. Shopify only. Example: `["Dawn"]`. |
| `domain_type` | Array of values | A custom domain, or a platform address such as myshopify.com. Values: `custom`, `platform`. |
| `tld` | Array of values | The domain ending, such as .com or .co.uk. Example: `["com"]`. |
| `domain_registered` | {min, max} ISO 8601 | When the domain was registered. |

Formats:

- **Array of values**: `"currency": ["USD", "EUR"]`, up to 100 values
- **{min, max}**: `"followers": {"min": 1000, "max": 50000}`; either bound can be left out
- **{min, max} ISO 8601**: `"domain_registered": {"min": "2026-01-01"}`; a date without a time means midnight UTC, so a `max` of `2026-01-31` stops at the start of that day
- **One value**: `"meta_ads": "active"`

### Pricing

You pay for each store saved, whether or not it has contact details, at the price per 1,000 stores shown on the Pricing tab; higher Apify plans pay less. To cap what a run can cost, set **Maximum stores**, or the maximum cost per run in the run options.

On Apify's free plan a run returns up to 50 stores, at most 200 stores a day in all, and their contact details come back as `Paid access only`, so you can see which stores have them. The free credit Apify gives new accounts does not change this: full results need a paid Apify plan.

### Support

Questions, problems and requests for new filters or fields go in the Issues tab. Include the run's input when something looks wrong.

# Actor input Schema

## `platform` (type: `array`):

Leave empty for every platform.

## `country` (type: `array`):

Two-letter country codes, such as US, GB or DE. This is the country the store is based in, not where it ships: for Shopify stores, the country it registered with Shopify, filled in soon after the store is found.

## `category` (type: `array`):

What the store sells. Stores found in the last few days may not have a category yet.

## `language` (type: `array`):

The main language of the store's website.

## `keyword` (type: `string`):

Matches a phrase, or all of its words in one field: domain, title, description, product types, vendors or newest product name. Separate up to 10 alternatives with commas. A term that looks like a domain or store URL is looked up as a domain instead.

## `foundWithinDays` (type: `integer`):

Only stores we first found in the last N days. New stores are found every day. Leave empty for stores of any age.

## `technologies` (type: `array`):

Tools detected on the store's homepage, on any platform: email, reviews, chat, subscriptions, ads and more. Matches stores using any of them.

## `apps` (type: `array`):

Apps from the Shopify App Store, by the last part of the app's address: apps.shopify.com/judgeme is judgeme. Shopify stores only.

## `minProducts` (type: `integer`):

The number of products in the store's catalog.

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

The number of products in the store's catalog.

## `minAvgPrice` (type: `integer`):

The average price of the store's products, converted to US dollars.

## `maxAvgPrice` (type: `integer`):

The average price of the store's products, converted to US dollars.

## `advancedFilters` (type: `object`):

Filters as JSON, for example {"meta_ads": "active", "followers": {"min": 1000}}. A filter set here replaces the same filter set in the form above.

## `onlyNew` (type: `boolean`):

For scheduled runs: each run returns only the stores found since the last run with the same filters, oldest first. The first run starts from the days set in 'Found in the last N days', or 1 day back if that is empty. Changing any filter starts over. Includes stores still behind a password page, as many new stores are; the status column tells them apart.

## `sort` (type: `string`):

By the date we first found the store. Runs with 'Only stores found since the last run' always go oldest first.

## `maxRows` (type: `integer`):

Each store saved is one result you pay for. The run stops here, or earlier at your maximum cost per run. On Apify's free plan a run returns at most 50 stores.

## `outputFormat` (type: `string`):

Nested JSON adds what does not fit in a column, such as followers per network and links to each app.

## Actor input object example

```json
{
  "platform": [
    "shopify"
  ],
  "country": [
    "US"
  ],
  "onlyNew": false,
  "sort": "newest",
  "maxRows": 100,
  "outputFormat": "table"
}
```

# Actor output Schema

## `stores` (type: `string`):

One row per store, with the columns described in the README.

# 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 = {
    "platform": [
        "shopify"
    ],
    "country": [
        "US"
    ],
    "maxRows": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("platleads/shopify-store-leads").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 = {
    "platform": ["shopify"],
    "country": ["US"],
    "maxRows": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("platleads/shopify-store-leads").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 '{
  "platform": [
    "shopify"
  ],
  "country": [
    "US"
  ],
  "maxRows": 100
}' |
apify call platleads/shopify-store-leads --silent --output-dataset

```

## MCP server setup

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

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/83kGqrKbgObosN0BA/builds/XHbssZuv5vi9N1ri5/openapi.json
