Shopify Store Leads & Contacts API by StoreInspect avatar

Shopify Store Leads & Contacts API by StoreInspect

Pricing

from $2.00 / 1,000 store search results

Go to Apify Store
Shopify Store Leads & Contacts API by StoreInspect

Shopify Store Leads & Contacts API by StoreInspect

Try five real Shopify store results per account with no StoreInspect data charge. Filter by country, category and apps. Use paid search, domain enrichment and explicitly confirmed contact reveals when you need more.

Pricing

from $2.00 / 1,000 store search results

Rating

0.0

(0)

Developer

StoreInspect

StoreInspect

Maintained by Community

Actor stats

0

Bookmarked

61

Total users

19

Monthly active users

3 days ago

Last modified

Share

Get Shopify store domains, names, countries, categories, detected apps and pixels, traffic and revenue tiers, and contact availability. Export the dataset as JSON, CSV or Excel. No StoreInspect account or API key is needed.

Your first run

In Apify Console, choose Try real stores, select a country or category, and click Start. Or paste this into the Console's JSON input editor:

{
"mode": "trial_stores",
"country": "US",
"category": "beauty",
"limit": 5
}

Open the run's Dataset tab to see real store rows. The OUTPUT record contains the remaining trial allowance and whether the response was replayed. This is a Console input, not an HTTP request body for a different service.

Trial and pricing

Every verified Apify account, including free-plan accounts, can receive 25 store rows in total, with at most 25 per request. The allowance is stored by StoreInspect and shared across runs, saved tasks and Standby calls. Changing the result count, starting concurrent runs, or switching between those interfaces does not reset it.

The trial includes store identity, country/category, traffic and revenue tiers, Shopify Plus signals, apps/pixels, theme, and aggregate contact availability. It does not include individual contact previews, names, emails, phone numbers or LinkedIn URLs. Traffic and revenue tiers are estimates; Plus and technology fields are detection signals.

Identical trial input returns the same saved rows, including after the allowance is used. It does not refresh the data or spend more allowance. The retrieval timestamp is in OUTPUT. Stores no longer visible in the catalog are omitted on replay. Different searches consume the remaining allowance; a partially covered request returns fewer rows. Up to 20 distinct completed trial searches are allowed, including empty searches. Empty results do not use store rows. Validation and backend failures do not consume allowance. Trial pagination is unavailable.

When no allowance remains for a new search, a standard run finishes with an apify_trial_exhausted notice and status message. A Standby call returns HTTP 402. A notice is not a store result. Reuse the original input to retrieve its saved rows, or choose search_stores with a paid Apify plan for more data.

No StoreInspect data events are charged for trial or sample mode. Apify's synthetic Actor-start event and platform usage can still apply according to the pricing shown in Console. The trial is available to the owner and automatic Store tests under the same quota; repeated default inputs replay their real trial rows.

Paid eventPrice
Store search result$0.002 per store
Store enrichment$0.005 per found domain
Contact preview$0.001 per preview
Contact reveal$0.075 per newly revealed contact

A five-store paid search costs $0.01 in StoreInspect events, plus applicable Apify charges. Only returned/covered results are delivered; an Apify charge limit can truncate a response. Set the run's maximum charge in Console. Dataset rows do not incur an additional StoreInspect data event. Check Apify's Pricing tab for current prices.

Existing search_stores runs remain paid for paid-plan users. Free-plan store searches use the capped trial. Enrichment, contact searches and reveals require a paid Apify plan. A successful run, a dataset row, or a charge attempt does not establish paid revenue.

Search form and advanced filters

Use Country code (such as US), Category, App (such as Klaviyo), and Result count for ordinary searches. App means the store uses that app. Blank controls add no filter. An otherwise empty trial defaults to US stores.

Advanced JSON stays available in filters. Each advanced field takes precedence over the corresponding simple control: countries replaces Country, categories replaces Category, and the entire apps object replaces App, including its any, all or none operators. Other advanced filters combine with the simple controls. An explicit empty advanced field also overrides its simple control. Simple controls work for store and contact searches; enrichment and reveal reject them.

Console input for a paid search:

{
"mode": "search_stores",
"filters": {
"countries": ["US"],
"categories": ["beauty"],
"apps": { "none": ["Klaviyo"] }
},
"limit": 5
}

Supported advanced filters include countries, category slugs, traffic/revenue tiers, Shopify Plus, apps and pixels (any/all/none), contact availability and roles, theme type/outdated status, iOS app availability, checkout signals, active Meta ad count, estimated store creation date and first discovery date. Unsupported or malformed combinations may be rejected; refer to StoreInspect's API filter reference for exact values. query remains an alias for filters in mode-based input. filters takes precedence when both are present.

Paid searches return next_cursor when another page is available. Keep the same filters and result count when passing that cursor. Do not reuse it in trial mode. Searches can return an empty dataset; broaden the filters and retry.

Three ready-to-run Console inputs

These trial examples use two, two and one row respectively, fitting well within a fresh 25-row allowance. If you already used the trial on different inputs, switch to search_stores with a paid Apify plan. At those limits, paid store-event costs are $0.004, $0.004 and $0.002, respectively, plus applicable Apify charges. No example reveals contacts.

US beauty stores:

{"mode":"trial_stores","country":"US","category":"beauty","limit":2,"push_data":true}

Stores using Klaviyo:

{"mode":"trial_stores","app":"Klaviyo","limit":2,"push_data":true}

Shopify Plus stores with contact availability:

{"mode":"trial_stores","filters":{"shopify_plus":true,"contacts":{"has_revealable_contacts":true}},"limit":1,"push_data":true}

These are real catalog searches; availability changes. Save an input as an Apify task to reuse it. Versioned JSON and the idempotent task-provisioning command are in the repository's examples/ and scripts/example-tasks.mjs. The provisioning script supports a separate --publish step after rollout to publish those tasks with the store-intelligence dataset view.

Enrich domains

Console input:

{
"mode": "enrich_domains",
"domains": ["allbirds.com"],
"include": ["store", "technologies"]
}

Enrichment charges for found domains. Add "contact_previews" to include to request separately charged previews. contact_roles and max_contacts_per_store restrict those previews. Enrichment never implicitly reveals contact channels. The domain list controls result count; limit is a search control.

Contact previews and explicit reveals

A store's contacts_summary is aggregate availability. A paid contact preview is an individual masked record with a contact ID, first name, obfuscated last name, role/title and channel-availability flags. It contains no email, phone or LinkedIn URL, even if that contact was previously revealed.

Console input for previews:

{
"mode": "search_contacts",
"country": "US",
"person": { "roles_any": ["founder", "owner"] },
"max_contacts_per_store": 1,
"limit": 3
}

For contact search, advanced store takes precedence over filters, then query. Simple controls fill absent fields in that selected object.

Copy a real contact ID from the preview, then explicitly confirm the reveal. Console input template (replace the placeholder):

{
"mode": "reveal_contacts",
"contact_ids": ["<CONTACT_ID_FROM_PREVIEW>"],
"confirm_spend_credits": true
}

This is a paid action. Available exportable channels are returned only after confirmation and charge verification. Previously revealed contacts for the same Apify user do not incur another reveal charge when StoreInspect can verify the prior reveal. A charge limit can reduce newly revealed contacts. Missing or unusable contacts can cause a request error; use current preview IDs.

Standard runs through the Apify API

The body here is the same Console input. Replace <APIFY_TOKEN> with your own token; keep it private.

curl -X POST 'https://api.apify.com/v2/acts/storeinspect~shopify-store-search/run-sync-get-dataset-items' \
-H 'Authorization: Bearer <APIFY_TOKEN>' \
-H 'Content-Type: application/json' \
-d '{"mode":"trial_stores","country":"US","limit":5}'

Standby HTTP endpoints

Send JSON and your Apify token to https://storeinspect--shopify-store-search.apify.actor. Standby uses the caller's Apify account. The trial allowance is the same as in Console runs.

EndpointRequest and billing
POST /Console-style input with mode; defaults to trial_stores
POST /stores/search/trialStore filters and limit; persistent trial, no store-event charge
POST /stores/searchPaid store search; free-plan users use the trial
POST /stores/enrichDomains and includes; paid enrichment and optional previews
POST /contacts/searchPerson/store filters; paid previews
POST /contacts/revealContact IDs and explicit confirmation; paid new reveals
GET /Service information

HTTP body for the trial endpoint (no mode needed):

curl -X POST 'https://storeinspect--shopify-store-search.apify.actor/stores/search/trial' \
-H 'Authorization: Bearer <APIFY_TOKEN>' \
-H 'Content-Type: application/json' \
-d '{"filters":{"countries":["US"]},"limit":5,"push_data":true}'

Endpoint-specific bodies use filters for store search, store and person for contact search, domains/include for enrichment, and contact_ids/confirm_spend_credits for reveal. The mode wrapper accepts the corresponding Console inputs above. Existing endpoint paths and paid JSON inputs remain supported.

Standby success responses contain ok, mode, endpoint, dataset_items_written and result. Store results use result.data[], nested technologies.apps/pixels, and contacts_summary. Trial results additionally include trial.allowance, remaining, queries_remaining, replayed, retrieved_at, exhausted and store_events_charged: 0. This metadata describes the trial and is not payment confirmation.

Dataset rows retain their original nested data and add flat columns: apps become app_names, pixels become pixels, and aggregate contact count becomes contacts_count. Each row includes _storeinspect workflow metadata. push_data:false skips dataset writes; it does not skip allowance or billing. Standard runs also save the response to the OUTPUT record.

Explicit mode:"sample" remains available for a synthetic example without live data. Empty input now runs the live trial. Existing tasks explicitly selecting sample keep that behavior.

Troubleshooting

  • Trial exhausted: reuse the original input for its saved rows, or use search_stores on a paid Apify plan.
  • Paid-plan notice: enrichment, contact previews and reveals require a paid Apify plan.
  • Empty search: use fewer filters; no result does not imply an operational failure.
  • Invalid input: check the mode, filter structure and country code; trial does not accept a cursor.
  • Operational failure: retry the same input. Trial replays avoid consuming allowance twice. Paid quote/reveal reservations protect normal charge retries, but report charged runs with no delivered data through Issues.

For support, include the run ID, requested workflow and approximate time. Do not include tokens or revealed contact data.