Shopify's Admin API is per-store and requires OAuth, which is useless for cross-store product discovery. Google aggressively indexes Shopify product pages with product schema markup, which means you can discover Shopify products at scale via Google SERP. This tutorial shows how to use Scavio to find Shopify products across every store.
Prerequisites
- Python 3.8+
- A Scavio API key
- A target product category or search term
Walkthrough
Step 1: Build a Shopify-targeted Google query
Use site operators and Shopify-specific URL patterns.
query = 'site:myshopify.com OR "powered by shopify" wireless earbuds under $50'Step 2: Call Scavio for structured results
Scavio returns product-schema data when available.
import requests, os
def shopify_search(query):
r = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': os.environ['SCAVIO_API_KEY']},
json={'query': query, 'num_results': 30})
return r.json().get('organic_results', [])Step 3: Filter to Shopify stores
Keep results that come from actual Shopify storefronts.
def is_shopify(url):
return 'myshopify.com' in url or any(m in url for m in ['/products/', '/collections/'])
shopify_results = [r for r in shopify_search(query) if is_shopify(r['link'])]Step 4: Extract product data
For each Shopify URL, fetch the page and parse the structured data.
def extract_product(url):
r = requests.post('https://api.scavio.dev/api/v1/extract',
headers={'x-api-key': os.environ['SCAVIO_API_KEY']},
json={'url': url, 'render_js': True, 'extract_schema': 'Product'})
return r.json().get('schema', {})Step 5: Assemble catalog
Build a normalized product catalog from the extracted data.
catalog = []
for r in shopify_results[:10]:
product = extract_product(r['link'])
if product:
catalog.append({
'title': product.get('name'),
'price': product.get('offers', {}).get('price'),
'store': r['link'].split('/')[2],
'url': r['link']
})
print(catalog)Python Example
import os, requests
API_KEY = os.environ['SCAVIO_API_KEY']
def shopify_products(query, limit=10):
r = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'query': f'{query} site:myshopify.com OR "powered by shopify"', 'num_results': 30})
results = [o for o in r.json().get('organic_results', []) if '/products/' in o['link']]
catalog = []
for res in results[:limit]:
product = requests.post('https://api.scavio.dev/api/v1/extract',
headers={'x-api-key': API_KEY},
json={'url': res['link'], 'render_js': True, 'extract_schema': 'Product'}).json().get('schema', {})
if product:
catalog.append({'title': product.get('name'), 'price': product.get('offers', {}).get('price'), 'url': res['link']})
return catalog
print(shopify_products('wireless earbuds under 50'))JavaScript Example
const API_KEY = process.env.SCAVIO_API_KEY;
async function shopifyProducts(query) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST',
headers: { 'x-api-key': API_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({ query: `${query} "powered by shopify"`, num_results: 30 })
});
const results = (await r.json()).organic_results.filter(o => o.link.includes('/products/'));
const catalog = [];
for (const res of results.slice(0, 10)) {
const p = await fetch('https://api.scavio.dev/api/v1/extract', {
method: 'POST',
headers: { 'x-api-key': API_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({ url: res.link, render_js: true, extract_schema: 'Product' })
});
const { schema } = await p.json();
if (schema?.name) catalog.push({ title: schema.name, price: schema.offers?.price, url: res.link });
}
return catalog;
}
console.log(await shopifyProducts('wireless earbuds under 50'));Expected Output
A list of Shopify products across many stores, normalized with title, price, and URL. Dropshippers and competitive researchers can use this to find winning products without per-store Shopify API keys.