# Shopify Store Contact Extractor (`schnellscrapers/shopify-store-contact-extractor`) Actor

Extract Shopify store contacts from known storefront URLs: emails, phones, social profiles, store names, page titles, and source pages for B2B lead enrichment. Direct HTTP, no login required.

- **URL**: https://apify.com/schnellscrapers/shopify-store-contact-extractor.md
- **Developed by:** [Nate Schnell](https://apify.com/schnellscrapers) (community)
- **Categories:** Lead generation, E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 store contacts

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### What does Shopify Store Contact Extractor do?

Shopify Store Contact Extractor enriches a list of known public storefront URLs with contact and social data for B2B lead generation, agency prospecting, supplier discovery, and ecommerce market mapping. It fetches each homepage and a small number of same-site contact or about pages, then returns one clean record per store.

### What data can you extract from Shopify stores?

- Store identity — store URL, store name, page title, public meta description
- Contact channels — deduplicated email addresses and phone numbers
- Social profiles — Instagram, Facebook, TikTok, YouTube, LinkedIn, Pinterest, X, and Twitter links
- Extraction evidence — Shopify detection, fetched contact-page URLs, source pages, and UTC extraction time

The actor only returns public page data that is present in the supplied storefront pages. Contact fields are best-effort and may be empty for stores that do not publish them.

### How to use Shopify Store Contact Extractor

1. Open the actor and paste one or more public Shopify storefront URLs into the input box.
2. Set the contact-page limit, optional email or phone filters, and maximum records.
3. Click **Run**. Keep **Only Shopify stores** enabled when your input list contains mixed ecommerce sites.
4. Download the results as JSON, CSV, Excel, or via the dataset API.

For recurring agency or CRM workflows, start with `maxContactPagesPerStore: 2` and enable `requireEmail` when only email-ready leads are useful.

### How much does it cost?

The actor uses pay-per-event pricing: **$1.50 per 1,000 emitted store records** plus a **$0.005 actor-start event per run**. A billable record is a valid store that passes the selected filters and is written to the dataset. Failed URLs, non-Shopify stores, records without required contacts, and dry-run previews are not result events. Keep the contact-page limit low to control request time.

### Input

`storeUrls` is required and accepts one or more public storefront URLs. `maxContactPagesPerStore` controls bounded same-site contact/about enrichment; `onlyShopify`, `requireEmail`, and `requirePhone` filter before writes. Use `dryRun` to validate matches without creating dataset records.

```json
{
  "storeUrls": [
    "https://allbirds.com",
    "https://gymshark.com"
  ],
  "maxContactPagesPerStore": 2,
  "requireEmail": true,
  "maxItems": 20,
  "dryRun": false
}
```

### Output

Each record contains the normalized `storeUrl`, `storeName`, `pageTitle`, `description`, `isShopify`, `emails`, `phones`, `socialLinks`, `contactPageUrls`, `sourcePages`, and `extractedAt` fields.

```json
{
  "storeUrl": "https://www.allbirds.com",
  "storeName": "Allbirds",
  "pageTitle": "Allbirds: Comfortable, Sustainable Shoes & Apparel",
  "description": "The world's most comfortable shoes made with natural materials.",
  "isShopify": true,
  "emails": ["help@allbirds.com"],
  "phones": [],
  "socialLinks": ["https://www.instagram.com/allbirds"],
  "contactPageUrls": ["https://www.allbirds.com/contact"],
  "sourcePages": ["https://www.allbirds.com/", "https://www.allbirds.com/contact"],
  "extractedAt": "2026-08-29T00:00:00.000Z"
}
```

### Contact coverage and limitations

The extractor follows only same-host links signaled by `contact`, `about`, `support`, or `help`, and caps the number of follow-up pages per store. Password-protected stores, JavaScript-only contact data, and stores that do not publish an email or phone may produce partial records or be excluded by the selected filters.

### FAQ

#### Is it legal to scrape Shopify stores?

This actor reads public storefront pages. You are responsible for choosing lawful targets and use cases and for complying with applicable privacy, marketing, and data-protection rules.

#### Does it need a Shopify login or API key?

No. It uses direct public HTTP requests to the supplied storefront URLs.

#### Why is an email or phone field empty?

The store may not publish that contact channel, may render it only after JavaScript runs, or may block the requested page. Enable the corresponding requirement filter only when missing contacts should exclude the store.

# Actor input Schema

## `storeUrls` (type: `array`):

Known public storefront URLs to enrich, such as https://allbirds.com. Each URL produces at most one normalized store contact record.

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

Hard cap on emitted store contact records after filtering.

## `maxContactPagesPerStore` (type: `integer`):

Maximum same-site contact, about, support, or help pages fetched after each homepage. Set to 0 for homepage-only extraction.

## `requestTimeoutSecs` (type: `integer`):

Maximum time to wait for each public storefront page.

## `onlyShopify` (type: `boolean`):

Keep only records whose homepage or contact pages contain public Shopify storefront markers.

## `requireEmail` (type: `boolean`):

Exclude stores without a public email address before dataset writes and result billing.

## `requirePhone` (type: `boolean`):

Exclude stores without a public phone number before dataset writes and result billing.

## `dryRun` (type: `boolean`):

Fetch, parse, filter, and validate records without writing the dataset. Logs matched and written counts separately.

## Actor input object example

```json
{
  "storeUrls": [
    "https://allbirds.com",
    "https://gymshark.com"
  ],
  "maxItems": 100,
  "maxContactPagesPerStore": 2,
  "requestTimeoutSecs": 20,
  "onlyShopify": true,
  "requireEmail": false,
  "requirePhone": false,
  "dryRun": false
}
```

# Actor output Schema

## `records` (type: `string`):

Store URL, name, emails, phones, social links, contact pages, and extraction metadata.

# 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 = {
    "storeUrls": [
        "https://allbirds.com",
        "https://gymshark.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("schnellscrapers/shopify-store-contact-extractor").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 = { "storeUrls": [
        "https://allbirds.com",
        "https://gymshark.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("schnellscrapers/shopify-store-contact-extractor").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 '{
  "storeUrls": [
    "https://allbirds.com",
    "https://gymshark.com"
  ]
}' |
apify call schnellscrapers/shopify-store-contact-extractor --silent --output-dataset

```

## MCP server setup

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

```

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/J0MsE3W0Jcvo8RT9D/builds/QCXKjhdvQ22fZwGF4/openapi.json
