API Reference
Complete documentation for the ShoppingScraper API. Monitor prices, track competitors, and extract product data across Google Shopping, Amazon, Bol.com, and Coolblue.
Your first API call in 30 seconds
api_key=YOUR_KEY
curl "https://api.shoppingscraper.com/offers?site=shopping.google.nl&ean=8720246689310&api_key=YOUR_API_KEY"
import httpx
response = httpx.get("https://api.shoppingscraper.com/offers", params={
"site": "shopping.google.nl",
"ean": "8720246689310",
"api_key": "YOUR_API_KEY"
})
data = response.json()
for offer in data["results"][0]["offers"]:
print(f"{offer['sellerName']}: €{offer['totalPrice']}")
const response = await fetch(
"https://api.shoppingscraper.com/offers?" +
new URLSearchParams({
site: "shopping.google.nl",
ean: "8720246689310",
api_key: "YOUR_API_KEY"
})
);
const data = await response.json();
data.results[0].offers.forEach(offer =>
console.log(`${offer.sellerName}: €${offer.totalPrice}`)
);
$response = file_get_contents(
"https://api.shoppingscraper.com/offers?" . http_build_query([
"site" => "shopping.google.nl",
"ean" => "8720246689310",
"api_key" => "YOUR_API_KEY"
])
);
$data = json_decode($response, true);
foreach ($data["results"][0]["offers"] as $offer) {
echo $offer["sellerName"] . ": €" . $offer["totalPrice"] . "\n";
}
Authentication
Every API request requires your API key.
api_key query parameter. Find your API key on the Settings page.Example:
https://api.shoppingscraper.com/offers?site=shopping.google.nl&ean=8720246689310&api_key=YOUR_API_KEY
Base URL
Common Parameters
shopping.google.nl, amazon.de, bol.com, global)
nl, de, be, fr, uk)
nl, fr, de)
How do I get competitor prices from Google Shopping?
Search and compare prices across Google Shopping in 30+ countries.
/offers?site=shopping.google.{cc}&ean={ean}
Get all seller offers for a product on Google Shopping. Returns prices, merchants, delivery info, and direct links.
Parameters
shopping.google.nl, shopping.google.de)
true = only InStock offers, false = only OutOfStock offers. Omit to return all offers (default).
Example Request
curl "https://api.shoppingscraper.com/offers?site=shopping.google.nl&ean=8720246689310&api_key=YOUR_API_KEY"import httpx
response = httpx.get("https://api.shoppingscraper.com/offers", params={
"site": "shopping.google.nl",
"ean": "8720246689310",
"api_key": "YOUR_API_KEY"
})
data = response.json()
for offer in data["results"][0]["offers"]:
print(f"{offer['sellerName']}: €{offer['totalPrice']}")const response = await fetch(
"https://api.shoppingscraper.com/offers?" +
new URLSearchParams({
site: "shopping.google.nl",
ean: "8720246689310",
api_key: "YOUR_API_KEY"
})
);
const data = await response.json();
data.results[0].offers.forEach(offer =>
console.log(`${offer.sellerName}: €${offer.totalPrice}`)
);$response = file_get_contents(
"https://api.shoppingscraper.com/offers?" . http_build_query([
"site" => "shopping.google.nl",
"ean" => "8720246689310",
"api_key" => "YOUR_API_KEY"
])
);
$data = json_decode($response, true);
foreach ($data["results"][0]["offers"] as $offer) {
echo $offer["sellerName"] . ": €" . $offer["totalPrice"] . "\n";
}Example Response
{
"results": [
{
"ean": "8720246689310",
"sku": "5110113098602114035",
"url": "https://www.google.com/search?udm=28&q=...",
"title": "Homra Koniq Rvs Prullenbak | 30 Liter | Geurfilter | Zwart",
"brand": "Homra",
"thumbnail": "https://encrypted-tbn0.gstatic.com/shopping?q=tbn:...",
"availability": "InStock",
"currency": "EUR",
"offers": [
{
"sellerName": "Prullenbakkie.nl",
"sellerCode": "5075228619",
"sellerReference": "https://prullenbakkie.nl/...",
"price": "69.95",
"formerPrice": null,
"shippingPrice": "5.95",
"totalPrice": "75.90",
"condition": "New",
"availability": "InStock",
"shippingMethod": "standard"
}
]
}
]
}
Response Fields
InStock, OutOfStock, or null/offers?site=amazon.{cc}&ean={ean}
Get all seller offers for a product on Amazon. Returns prices, seller names, conditions, and Prime eligibility.
Parameters
amazon.nl, amazon.de, amazon.co.uk, amazon.fr)Example Request
curl "https://api.shoppingscraper.com/offers?site=amazon.nl&ean=8719514342125&api_key=YOUR_API_KEY"import httpx
response = httpx.get("https://api.shoppingscraper.com/offers", params={
"site": "amazon.nl",
"ean": "8719514342125",
"api_key": "YOUR_API_KEY"
})
data = response.json()
for offer in data["results"][0]["offers"]:
print(f"{offer['sellerName']}: €{offer['totalPrice']}")const response = await fetch(
"https://api.shoppingscraper.com/offers?" +
new URLSearchParams({
site: "amazon.nl",
ean: "8719514342125",
api_key: "YOUR_API_KEY"
})
);
const data = await response.json();
data.results[0].offers.forEach(offer =>
console.log(`${offer.sellerName}: €${offer.totalPrice}`)
);$response = file_get_contents(
"https://api.shoppingscraper.com/offers?" . http_build_query([
"site" => "amazon.nl",
"ean" => "8719514342125",
"api_key" => "YOUR_API_KEY"
])
);
$data = json_decode($response, true);
foreach ($data["results"][0]["offers"] as $offer) {
echo $offer["sellerName"] . ": €" . $offer["totalPrice"] . "\n";
}Example Response
{
"results": [
{
"ean": "8719514342125",
"sku": "B09CV78GV1",
"url": "https://amazon.nl/dp/B09CV78GV1",
"title": "Philips Hue Motion Sensor",
"brand": "Philips Hue",
"thumbnail": "https://m.media-amazon.com/images/I/31iHNJt0NVL.jpg",
"availability": "InStock",
"currency": "EUR",
"offers": [
{
"sellerName": "Amazon",
"sellerReference": 0,
"price": "35.95",
"shippingPrice": "0.00",
"totalPrice": "35.95",
"condition": "New",
"shippingMethod": "standard"
},
{
"sellerName": "Light Gallery Netherlands",
"sellerReference": "ARYP5Y47C1A8",
"price": "37.50",
"shippingPrice": "0.00",
"totalPrice": "37.50",
"condition": "New",
"shippingMethod": "standard"
}
]
}
]
}
/offers?site=bol.com&ean={ean}&gl={cc}&hl={lang}
Get all seller offers for a product on Bol.com. Supports Netherlands and Belgium with language options.
Parameters
bol.comnl or benl or frExample Request
curl "https://api.shoppingscraper.com/offers?site=bol.com&ean=8720246689310&gl=nl&hl=nl&api_key=YOUR_API_KEY"import httpx
response = httpx.get("https://api.shoppingscraper.com/offers", params={
"site": "bol.com",
"ean": "8720246689310",
"gl": "nl",
"hl": "nl",
"api_key": "YOUR_API_KEY"
})
data = response.json()
for offer in data["results"][0]["offers"]:
print(f"{offer['sellerName']}: €{offer['totalPrice']}")const response = await fetch(
"https://api.shoppingscraper.com/offers?" +
new URLSearchParams({
site: "bol.com",
ean: "8720246689310",
gl: "nl",
hl: "nl",
api_key: "YOUR_API_KEY"
})
);
const data = await response.json();
data.results[0].offers.forEach(offer =>
console.log(`${offer.sellerName}: €${offer.totalPrice}`)
);$response = file_get_contents(
"https://api.shoppingscraper.com/offers?" . http_build_query([
"site" => "bol.com",
"ean" => "8720246689310",
"gl" => "nl",
"hl" => "nl",
"api_key" => "YOUR_API_KEY"
])
);
$data = json_decode($response, true);
foreach ($data["results"][0]["offers"] as $offer) {
echo $offer["sellerName"] . ": €" . $offer["totalPrice"] . "\n";
}Example Response
{
"results": [
{
"ean": "8720246689310",
"sku": "9300000152042024",
"url": "https://www.bol.com/nl/nl/p/homra-koniq-rvs-prullenbak/9300000152042024/",
"title": "Homra Koniq RVS Prullenbak 30 Liter met Geurfilter",
"brand": "Homra",
"thumbnail": "https://media.s-bol.com/xBL5RAnp48Xr/97x155.jpg",
"availability": "InStock",
"currency": "EUR",
"offers": [
{
"sellerName": "Homra Official",
"sellerReference": "...",
"price": "79.95",
"shippingPrice": "0.00",
"totalPrice": "79.95",
"condition": "New",
"shippingMethod": "standard"
}
]
}
]
}
/offers?site=coolblue.{cc}&ean={ean}
Get Coolblue offers for a product. Supports NL, BE, and DE storefronts.
Parameters
coolblue.nl, coolblue.be, coolblue.de)Example Request
curl "https://api.shoppingscraper.com/offers?site=coolblue.nl&ean=8719514342125&api_key=YOUR_API_KEY"import httpx
response = httpx.get("https://api.shoppingscraper.com/offers", params={
"site": "coolblue.nl",
"ean": "8719514342125",
"api_key": "YOUR_API_KEY"
})
data = response.json()
for offer in data["results"][0]["offers"]:
print(f"{offer['sellerName']}: €{offer['totalPrice']}")const response = await fetch(
"https://api.shoppingscraper.com/offers?" +
new URLSearchParams({
site: "coolblue.nl",
ean: "8719514342125",
api_key: "YOUR_API_KEY"
})
);
const data = await response.json();
data.results[0].offers.forEach(offer =>
console.log(`${offer.sellerName}: €${offer.totalPrice}`)
);$response = file_get_contents(
"https://api.shoppingscraper.com/offers?" . http_build_query([
"site" => "coolblue.nl",
"ean" => "8719514342125",
"api_key" => "YOUR_API_KEY"
])
);
$data = json_decode($response, true);
foreach ($data["results"][0]["offers"] as $offer) {
echo $offer["sellerName"] . ": €" . $offer["totalPrice"] . "\n";
}Example Response
{
"results": [
{
"ean": 8719514342125,
"sku": "890049",
"url": "https://www.coolblue.nl/product/890049",
"title": "Philips Hue Motion Sensor",
"availability": "InStock",
"currency": "EUR",
"offers": [
{
"sellerName": "Coolblue",
"sellerReference": null,
"price": "44.99",
"shippingPrice": "0.00",
"totalPrice": "44.99",
"condition": "Nieuw",
"shippingMethod": null
}
]
}
]
}
How do I compare prices across all marketplaces?
Compare prices from various sources found across the web in a single request.
/offers?site=global&ean={ean}&gl={cc}
Cross-marketplace price comparison. Returns offers from various sources found across the web for a single product.
Parameters
globalnl, de, be, fr, uk)Example Request
curl "https://api.shoppingscraper.com/offers?site=global&ean=5702017416663&gl=nl&api_key=YOUR_API_KEY"import httpx
response = httpx.get("https://api.shoppingscraper.com/offers", params={
"site": "global",
"ean": "5702017416663",
"gl": "nl",
"api_key": "YOUR_API_KEY"
})
data = response.json()
for offer in data["results"]["offers"]:
print(f"{offer['sellerName']}: €{offer['totalPrice']}")const response = await fetch(
"https://api.shoppingscraper.com/offers?" +
new URLSearchParams({
site: "global",
ean: "5702017416663",
gl: "nl",
api_key: "YOUR_API_KEY"
})
);
const data = await response.json();
data.results.offers.forEach(offer =>
console.log(`${offer.sellerName}: €${offer.totalPrice}`)
);$response = file_get_contents(
"https://api.shoppingscraper.com/offers?" . http_build_query([
"site" => "global",
"ean" => "5702017416663",
"gl" => "nl",
"api_key" => "YOUR_API_KEY"
])
);
$data = json_decode($response, true);
foreach ($data["results"]["offers"] as $offer) {
echo $offer["sellerName"] . ": €" . $offer["totalPrice"] . "\n";
}Example Response
{
"results": {
"ean": "05702017416663",
"sku": null,
"title": "LEGO Botanicals Wilde Bloemen Boeket 10313",
"availability": "InStock",
"currency": "EUR",
"offers": [
{
"sellerName": "Amazon",
"sellerReference": "https://www.klarna.com/nl/api/...",
"price": "41.24",
"shippingPrice": "0.00",
"totalPrice": "41.24",
"condition": "New",
"shippingMethod": "standard",
"sellerImage": "https://assets.klarnacdn.net/..."
},
{
"sellerName": "Coolblue",
"price": "43.99",
"shippingPrice": "0.00",
"totalPrice": "43.99",
"condition": "New",
"shippingMethod": "standard"
},
{
"sellerName": "Intertoys",
"price": "44.99",
"shippingPrice": "0.00",
"totalPrice": "44.99",
"condition": "New",
"shippingMethod": "standard"
}
]
}
}
Response Fields
How do I get product images and descriptions?
Retrieve product details, images, specifications, and descriptions from any marketplace.
/info?site=shopping.google.{cc}&ean={ean}
Get product information from Google Shopping including title, description, images, and specifications.
Parameters
Example Request
curl "https://api.shoppingscraper.com/info?site=shopping.google.nl&ean=8720246689310&api_key=YOUR_API_KEY"import httpx
response = httpx.get("https://api.shoppingscraper.com/info", params={
"site": "shopping.google.nl",
"ean": "8720246689310",
"api_key": "YOUR_API_KEY"
})
data = response.json()
product = data["results"][0]
print(f"Title: {product['title']}")
print(f"Description: {product.get('description', 'N/A')}")const response = await fetch(
"https://api.shoppingscraper.com/info?" +
new URLSearchParams({
site: "shopping.google.nl",
ean: "8720246689310",
api_key: "YOUR_API_KEY"
})
);
const data = await response.json();
const product = data.results[0];
console.log(`Title: ${product.title}`);$response = file_get_contents(
"https://api.shoppingscraper.com/info?" . http_build_query([
"site" => "shopping.google.nl",
"ean" => "8720246689310",
"api_key" => "YOUR_API_KEY"
])
);
$data = json_decode($response, true);
$product = $data["results"][0];
echo "Title: " . $product["title"] . "\n";Example Response
{
"results": [
{
"ean": "8720246689310",
"sku": "5110113098602114035",
"url": "https://www.google.com/search?udm=28&q=...",
"title": "Homra Koniq Rvs Prullenbak | 30 Liter",
"thumbnail": "https://encrypted-tbn0.gstatic.com/shopping?q=tbn:...",
"description": "Stijlvolle pedaalemmer van Homra...",
"specs": {
"Merk": "Homra",
"Inhoud": "30 Liter",
"Materiaal": "RVS"
}
}
]
}
Response Fields
/info?site=amazon.{cc}&ean={ean}
Get detailed product information from Amazon including title, ASIN, brand, images, ratings, and specifications.
Parameters
Example Request
curl "https://api.shoppingscraper.com/info?site=amazon.nl&ean=8719514342125&api_key=YOUR_API_KEY"import httpx
response = httpx.get("https://api.shoppingscraper.com/info", params={
"site": "amazon.nl",
"ean": "8719514342125",
"api_key": "YOUR_API_KEY"
})
product = response.json()["results"][0]
print(f"{product['brand']}: {product['title']}")const response = await fetch(
"https://api.shoppingscraper.com/info?" +
new URLSearchParams({ site: "amazon.nl", ean: "8719514342125", api_key: "YOUR_API_KEY" })
);
const { results } = await response.json();
console.log(`${results[0].brand}: ${results[0].title}`);$response = file_get_contents("https://api.shoppingscraper.com/info?" . http_build_query([
"site" => "amazon.nl", "ean" => "8719514342125", "api_key" => "YOUR_API_KEY"
]));
$product = json_decode($response, true)["results"][0];
echo $product["brand"] . ": " . $product["title"] . "\n";Example Response
{
"results": [
{
"ean": null,
"sku": "B09CV78GV1",
"url": "https://www.amazon.nl/dp/B09CV78GV1",
"title": "Philips Hue Motion Sensor",
"brand": "Philips Hue",
"thumbnail": "https://m.media-amazon.com/images/I/61uoayxlUYL.jpg",
"description": "The smart Philips Hue motion sensor combines ease of use and energy efficiency...",
"specs": {
"Brand": "Philips Hue",
"Colour": "White",
"Power source": "Battery Powered",
"Item weight": "78 Grams",
"ASIN": "B09CV78GV1"
}
}
]
}
/info?site=bol.com&ean={ean}
Get product information from Bol.com including title, brand, images, ratings, and specifications.
Parameters
bol.comExample Request
curl "https://api.shoppingscraper.com/info?site=bol.com&ean=8720246689310&api_key=YOUR_API_KEY"import httpx
response = httpx.get("https://api.shoppingscraper.com/info", params={
"site": "bol.com", "ean": "8720246689310", "api_key": "YOUR_API_KEY"
})
product = response.json()["results"][0]
print(f"{product['brand']}: {product['title']}")
print(f"Categories: {' > '.join(product.get('categories', []))}")const response = await fetch(
"https://api.shoppingscraper.com/info?" +
new URLSearchParams({ site: "bol.com", ean: "8720246689310", api_key: "YOUR_API_KEY" })
);
const { results } = await response.json();
console.log(results[0].categories.join(" > "));$response = file_get_contents("https://api.shoppingscraper.com/info?" . http_build_query([
"site" => "bol.com", "ean" => "8720246689310", "api_key" => "YOUR_API_KEY"
]));
$product = json_decode($response, true)["results"][0];
echo implode(" > ", $product["categories"]) . "\n";Example Response
{
"results": [
{
"ean": null,
"sku": "9300000152042024",
"url": "https://www.bol.com/nl/nl/p/mtaA/9300000152042024/",
"title": "Homra Koniq RVS Prullenbak 30 Liter met Geurfilter",
"brand": "Homra",
"thumbnail": "https://media.s-bol.com/xBL5RAnp48Xr/755x1200.jpg",
"categories": ["Huishouden", "Prullenbakken", "Pedaalemmers"],
"description": "<p>Deze zwarte pedaalemmer is perfect voor in de keuken...</p>",
"specs": {
"Volume in liters": "30 l",
"Kleur": "Zwart",
"Materiaal": "RVS",
"Soft-close": "Ja",
"EAN": "8720246689310"
}
}
]
}
/info?site=coolblue.{cc}&ean={ean}
Get product information from Coolblue including title, brand, images, rating, and specifications.
Parameters
Example Request
curl "https://api.shoppingscraper.com/info?site=coolblue.nl&ean=8719514342125&api_key=YOUR_API_KEY"import httpx
response = httpx.get("https://api.shoppingscraper.com/info", params={
"site": "coolblue.nl", "ean": "8719514342125", "api_key": "YOUR_API_KEY"
})
product = response.json()["results"][0]
print(f"{product['brand']}: {product['title']}")const response = await fetch(
"https://api.shoppingscraper.com/info?" +
new URLSearchParams({ site: "coolblue.nl", ean: "8719514342125", api_key: "YOUR_API_KEY" })
);
const { results } = await response.json();
console.log(`${results[0].brand}: ${results[0].title}`);$response = file_get_contents("https://api.shoppingscraper.com/info?" . http_build_query([
"site" => "coolblue.nl", "ean" => "8719514342125", "api_key" => "YOUR_API_KEY"
]));
$product = json_decode($response, true)["results"][0];
echo $product["brand"] . ": " . $product["title"] . "\n";Example Response
{
"results": [
{
"ean": null,
"sku": "890049",
"url": "https://www.coolblue.nl/product/890049",
"title": "Philips Hue Motion Sensor",
"brand": "Philips Hue",
"thumbnail": "https://image.coolblue.nl/...",
"description": "Activate your Hue lights when moving...",
"specs": {
"Type": "Motion Sensor",
"Smart Home": "Hue Bridge required"
}
}
]
}
How do I track the Amazon Buy Box?
Monitor Buy Box holders and prices on Amazon and Bol.com.
/buybox?site=amazon.{cc}&ean={ean}
Get the current Amazon Buy Box holder, price, and details. Essential for competitive pricing strategies.
Parameters
Example Request
curl "https://api.shoppingscraper.com/buybox?site=amazon.nl&ean=8719514342125&api_key=YOUR_API_KEY"import httpx
response = httpx.get("https://api.shoppingscraper.com/buybox", params={
"site": "amazon.nl", "ean": "8719514342125", "api_key": "YOUR_API_KEY"
})
buybox = response.json()["results"][0]["offers"]
print(f"Buy Box: {buybox['sellerName']} at €{buybox['totalPrice']}")const response = await fetch(
"https://api.shoppingscraper.com/buybox?" +
new URLSearchParams({ site: "amazon.nl", ean: "8719514342125", api_key: "YOUR_API_KEY" })
);
const { results } = await response.json();
const bb = results[0].offers;
console.log(`Buy Box: ${bb.sellerName} at €${bb.totalPrice}`);$response = file_get_contents("https://api.shoppingscraper.com/buybox?" . http_build_query([
"site" => "amazon.nl", "ean" => "8719514342125", "api_key" => "YOUR_API_KEY"
]));
$bb = json_decode($response, true)["results"][0]["offers"];
echo "Buy Box: " . $bb["sellerName"] . " at €" . $bb["totalPrice"] . "\n";Example Response
{
"results": [
{
"ean": 8719514342125,
"sku": "B09CV78GV1",
"offers": {
"sellerName": "Amazon",
"sellerReference": 0,
"price": "35.95",
"shippingPrice": "0.00",
"totalPrice": "35.95",
"condition": "New",
"shippingMethod": "standard"
}
}
]
}
Response Fields
/buybox?site=bol.com&ean={ean}&gl={cc}&hl={lang}
Get the current Bol.com Buy Box holder and price. Track who is winning the buy button.
Parameters
bol.comnl or benl or frExample Request
curl "https://api.shoppingscraper.com/buybox?site=bol.com&ean=8720246689310&gl=nl&hl=nl&api_key=YOUR_API_KEY"import httpx
response = httpx.get("https://api.shoppingscraper.com/buybox", params={
"site": "bol.com", "ean": "8720246689310", "gl": "nl", "hl": "nl", "api_key": "YOUR_API_KEY"
})
buybox = response.json()["results"][0]["offers"]
print(f"Buy Box: {buybox['sellerName']} at €{buybox['totalPrice']}")const response = await fetch(
"https://api.shoppingscraper.com/buybox?" +
new URLSearchParams({ site: "bol.com", ean: "8720246689310", gl: "nl", hl: "nl", api_key: "YOUR_API_KEY" })
);
const { results } = await response.json();
console.log(`Buy Box: ${results[0].offers.sellerName}`);$response = file_get_contents("https://api.shoppingscraper.com/buybox?" . http_build_query([
"site" => "bol.com", "ean" => "8720246689310", "gl" => "nl", "hl" => "nl", "api_key" => "YOUR_API_KEY"
]));
$bb = json_decode($response, true)["results"][0]["offers"];
echo "Buy Box: " . implode(", ", $bb["sellerName"]) . "\n";Example Response
{
"results": [
{
"ean": "8720246689310",
"sku": "9300000152042024",
"offers": {
"sellerName": ["Homra Official"],
"sellerReference": null,
"price": "79.95",
"shippingPrice": "0.00",
"totalPrice": "79.95",
"condition": "New",
"shippingMethod": "standard"
}
}
]
}
How do I get product variants (colors, sizes)?
Retrieve product variant dimensions like color, size, and capacity from Google Shopping.
/variants?site=shopping.google.{cc}&sku={sku}
Get all variant options (color, size, storage, etc.) for a Google Shopping product using its SKU (catalog ID). Returns variant dimensions with thumbnails and linked catalog IDs.
Parameters
Example Request
curl "https://api.shoppingscraper.com/variants?site=shopping.google.nl&sku=2400394333200541296&api_key=YOUR_API_KEY"import httpx
response = httpx.get("https://api.shoppingscraper.com/variants", params={
"site": "shopping.google.nl",
"sku": "2400394333200541296",
"api_key": "YOUR_API_KEY"
})
data = response.json()
for dim in data["dimensions"]:
print(f"{dim['name']}: {[opt['label'] for opt in dim['options']]}")const response = await fetch(
"https://api.shoppingscraper.com/variants?" +
new URLSearchParams({
site: "shopping.google.nl",
sku: "2400394333200541296",
api_key: "YOUR_API_KEY"
})
);
const data = await response.json();
data.dimensions.forEach(dim =>
console.log(`${dim.name}: ${dim.options.map(o => o.label).join(", ")}`)
);$response = file_get_contents(
"https://api.shoppingscraper.com/variants?" . http_build_query([
"site" => "shopping.google.nl",
"sku" => "2400394333200541296",
"api_key" => "YOUR_API_KEY"
])
);
$data = json_decode($response, true);
foreach ($data["dimensions"] as $dim) {
echo $dim["name"] . ": " . implode(", ", array_column($dim["options"], "label")) . "\n";
}Example Response
{
"site": "shopping.google.nl",
"sku": "2400394333200541296",
"title": "Sonos Era 100 Wit",
"brand": "Sonos",
"description": "De Sonos Era 100 is de volgende generatie...",
"images": ["https://encrypted-tbn0.gstatic.com/shopping?q=..."],
"dimensions": [
{
"name": "Kleur",
"options": [
{
"label": "Zwart",
"selected": false,
"catalogid": "10957394025014972498",
"mid": "491647912",
"title": "Sonos Era 100 Zwart",
"thumbnail": null
},
{
"label": "Wit",
"selected": true,
"catalogid": "2400394333200541296",
"mid": "491647912",
"title": "Sonos Era 100 Wit",
"thumbnail": null
}
]
}
],
"credits_charged": 6
}
Response Fields
How do I get product reviews from Google Shopping?
Retrieve review summaries, ratings breakdown, and individual user reviews for any Google Shopping product.
/reviews?site=shopping.google.{cc}&sku={sku}
Get review data for a Google Shopping product including average rating, total review count, star distribution, and individual user reviews with pagination.
Parameters
Example Request
curl "https://api.shoppingscraper.com/reviews?site=shopping.google.nl&sku=2400394333200541296&api_key=YOUR_API_KEY"import httpx
response = httpx.get("https://api.shoppingscraper.com/reviews", params={
"site": "shopping.google.nl",
"sku": "2400394333200541296",
"api_key": "YOUR_API_KEY"
})
data = response.json()
summary = data["review_summary"]
print(f"Rating: {summary['average_rating']}/5 ({summary['total_reviews']} reviews)")
for review in data["user_reviews"]:
print(f" {review['rating']}/5 - {review['text'][:80]}...")const response = await fetch(
"https://api.shoppingscraper.com/reviews?" +
new URLSearchParams({
site: "shopping.google.nl",
sku: "2400394333200541296",
api_key: "YOUR_API_KEY"
})
);
const data = await response.json();
console.log(`Rating: ${data.review_summary.average_rating}/5`);
data.user_reviews.forEach(r =>
console.log(` ${r.rating}/5 - ${r.text.slice(0, 80)}...`)
);$response = file_get_contents(
"https://api.shoppingscraper.com/reviews?" . http_build_query([
"site" => "shopping.google.nl",
"sku" => "2400394333200541296",
"api_key" => "YOUR_API_KEY"
])
);
$data = json_decode($response, true);
$summary = $data["review_summary"];
echo "Rating: " . $summary["average_rating"] . "/5 (" . $summary["total_reviews"] . " reviews)\n";
foreach ($data["user_reviews"] as $review) {
echo " " . $review["rating"] . "/5 - " . substr($review["text"], 0, 80) . "...\n";
}Example Response
{
"sku": "2400394333200541296",
"title": "Sonos Era 100 Wit",
"country": "nl",
"review_summary": {
"average_rating": 4.5,
"total_reviews": 29285
},
"review_breakdown": {
"star_counts": [0, 0, 0, 0, 0]
},
"user_reviews": [
{
"rating": 5,
"text": "Geweldige speaker met uitstekende geluidskwaliteit...",
"author": "Reviewer Name",
"date": "2024-12-15",
"source": "google.com"
}
],
"page": 1,
"has_next_page": true
}
Response Fields
Can I search by product name instead of EAN?
Search Google Shopping by keyword and discover products with prices.
/search/googleshopping/{cc}?keyword={query}&page={n}
Search Google Shopping by keyword. Returns product listings with prices and merchant info. Supports pagination.
Parameters
nl, de, fr, uk, us)Example Request
curl "https://api.shoppingscraper.com/search/googleshopping/nl?keyword=airpods&page=1&api_key=YOUR_API_KEY"import httpx
response = httpx.get("https://api.shoppingscraper.com/search/googleshopping/nl", params={
"keyword": "airpods", "page": 1, "api_key": "YOUR_API_KEY"
})
data = response.json()["shoppingscraper"]
print(f"Found {data['stats']['results']} results")
for product in data["results"]:
print(f"{product['title']}: €{product['offers'][0]['price']}")const response = await fetch(
"https://api.shoppingscraper.com/search/googleshopping/nl?" +
new URLSearchParams({ keyword: "airpods", page: "1", api_key: "YOUR_API_KEY" })
);
const { shoppingscraper } = await response.json();
console.log(`Found ${shoppingscraper.stats.results} results`);
shoppingscraper.results.forEach(p =>
console.log(`${p.title}: €${p.offers[0].price}`)
);$response = file_get_contents("https://api.shoppingscraper.com/search/googleshopping/nl?" . http_build_query([
"keyword" => "airpods", "page" => 1, "api_key" => "YOUR_API_KEY"
]));
$data = json_decode($response, true)["shoppingscraper"];
echo "Found " . $data["stats"]["results"] . " results\n";
foreach ($data["results"] as $p) {
echo $p["title"] . ": €" . $p["offers"][0]["price"] . "\n";
}Example Response
{
"shoppingscraper": {
"query": { "link": "...", "keyword": "airpods" },
"endpoint": { "type": "search", "app": "googleshopping" },
"geo": { "country": "nl", "language": "nl" },
"stats": { "results": 40, "timestamp": "2026-02-17 18:46:40", "pagespeed": 0.85 },
"results": [
{
"classification": "product",
"title": "Apple AirPods 4",
"sku": "12446402972531711851",
"link": "https://www.google.com/search?udm=28&q=airpods...",
"currency": "EUR",
"stats": { "offers": 1 },
"offers": [
{
"price": 149.0,
"shipment": "standard",
"shippingCosts": 0.0,
"totalPrice": 149.0,
"seller": "Coolblue",
"condition": "New"
}
]
}
]
}
}
Response Fields
How do I find the Google Shopping SKU for a product?
Match an EAN/GTIN to its Google Shopping product listing and get the SKU, title, and direct product URL.
/match?site={site}&ean={ean}
Match an EAN/GTIN to its corresponding product on Google Shopping. Returns the product SKU, title, and a direct URL to the product page. Use this to resolve a barcode into a trackable Google Shopping product identifier before using the /offers endpoint. Supports both GET (query params) and POST (JSON body) requests.
GET Parameters
shopping.google.nl, shopping.google.de, shopping.google.fr, etc.)8806094957013)true/false). Uses 4 credits instead of 1. Better results for products without exact EAN matches.POST JSON Body
Pass api_key as a query parameter. Send the rest in a JSON body with Content-Type: application/json.
shopping.google.nl, shopping.google.de, etc.)deepsearch=true as a query parameter to enable AI-powered matching. DeepSearch is especially useful when a product has no exact EAN match on Google Shopping. Combine with metadata.title and metadata.url in a POST request for the best results. Regular match uses 1 credit; DeepSearch uses 4 credits.
Supported Sites
shopping.google.nl, shopping.google.de, shopping.google.fr, shopping.google.be, shopping.google.co.uk, shopping.google.it, shopping.google.es, shopping.google.pl, shopping.google.se, shopping.google.dk, shopping.google.no, shopping.google.at, shopping.google.ch, shopping.google.com, shopping.google.com.au, shopping.google.co.nzExample Request (GET)
curl "https://api.shoppingscraper.com/match?site=shopping.google.nl&ean=8806094957013&api_key=YOUR_API_KEY"import httpx
response = httpx.get("https://api.shoppingscraper.com/match", params={
"site": "shopping.google.nl",
"ean": "8806094957013",
"api_key": "YOUR_API_KEY"
})
results = response.json()["results"]
if results:
product = results[0]
print(f"Matched: {product['title']} (SKU: {product['sku']})")
print(f"URL: {product['url']}")
else:
print("No match found")const response = await fetch(
"https://api.shoppingscraper.com/match?" +
new URLSearchParams({ site: "shopping.google.nl", ean: "8806094957013", api_key: "YOUR_API_KEY" })
);
const { results } = await response.json();
if (results.length) {
console.log(`Matched: ${results[0].title} (SKU: ${results[0].sku})`);
console.log(`URL: ${results[0].url}`);
} else {
console.log("No match found");
}$response = file_get_contents("https://api.shoppingscraper.com/match?" . http_build_query([
"site" => "shopping.google.nl",
"ean" => "8806094957013",
"api_key" => "YOUR_API_KEY"
]));
$data = json_decode($response, true);
if (!empty($data["results"])) {
$product = $data["results"][0];
echo "Matched: " . $product["title"] . " (SKU: " . $product["sku"] . ")\n";
echo "URL: " . $product["url"] . "\n";
} else {
echo "No match found\n";
}Example Request (POST with metadata)
curl -X POST "https://api.shoppingscraper.com/match?api_key=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"site": "shopping.google.nl",
"ean": "8004995636475",
"metadata": {
"title": "Paglieri 1876 Venetiae",
"match_url": "https://example.com/product/123"
}
}'import httpx
response = httpx.post(
"https://api.shoppingscraper.com/match",
params={"api_key": "YOUR_API_KEY"},
json={
"site": "shopping.google.nl",
"ean": "8004995636475",
"metadata": {
"title": "Paglieri 1876 Venetiae",
"match_url": "https://example.com/product/123"
}
}
)
results = response.json()["results"]
if results:
product = results[0]
print(f"Matched: {product['title']} (SKU: {product['sku']})")
else:
print("No match found")const response = await fetch(
"https://api.shoppingscraper.com/match?api_key=YOUR_API_KEY",
{
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
site: "shopping.google.nl",
ean: "8004995636475",
metadata: {
title: "Paglieri 1876 Venetiae",
match_url: "https://example.com/product/123"
}
})
}
);
const { results } = await response.json();
if (results.length) {
console.log(`Matched: ${results[0].title} (SKU: ${results[0].sku})`);
} else {
console.log("No match found");
}$ch = curl_init("https://api.shoppingscraper.com/match?api_key=YOUR_API_KEY");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
CURLOPT_POSTFIELDS => json_encode([
"site" => "shopping.google.nl",
"ean" => "8004995636475",
"metadata" => [
"title" => "Paglieri 1876 Venetiae",
"match_url" => "https://example.com/product/123"
]
])
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
if (!empty($data["results"])) {
$product = $data["results"][0];
echo "Matched: " . $product["title"] . " (SKU: " . $product["sku"] . ")\n";
} else {
echo "No match found\n";
}Example Request (DeepSearch with metadata)
curl -X POST "https://api.shoppingscraper.com/match?api_key=YOUR_API_KEY&deepsearch=true" \
-H "Content-Type: application/json" \
-d '{
"site": "shopping.google.nl",
"ean": "5702017416663",
"metadata": {
"title": "LEGO Minecraft The Crafting Box 4.0",
"url": "https://www.bol.com/nl/nl/p/lego-minecraft/123456/"
}
}'import httpx
response = httpx.post(
"https://api.shoppingscraper.com/match",
params={"api_key": "YOUR_API_KEY", "deepsearch": "true"},
json={
"site": "shopping.google.nl",
"ean": "5702017416663",
"metadata": {
"title": "LEGO Minecraft The Crafting Box 4.0",
"url": "https://www.bol.com/nl/nl/p/lego-minecraft/123456/"
}
}
)
results = response.json()["results"]
if results:
product = results[0]
print(f"DeepSearch matched: {product['title']} (SKU: {product['sku']})")
else:
print("No match found")const response = await fetch(
"https://api.shoppingscraper.com/match?api_key=YOUR_API_KEY&deepsearch=true",
{
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
site: "shopping.google.nl",
ean: "5702017416663",
metadata: {
title: "LEGO Minecraft The Crafting Box 4.0",
url: "https://www.bol.com/nl/nl/p/lego-minecraft/123456/"
}
})
}
);
const { results } = await response.json();
if (results.length) {
console.log(`DeepSearch matched: ${results[0].title} (SKU: ${results[0].sku})`);
}$ch = curl_init("https://api.shoppingscraper.com/match?api_key=YOUR_API_KEY&deepsearch=true");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
CURLOPT_POSTFIELDS => json_encode([
"site" => "shopping.google.nl",
"ean" => "5702017416663",
"metadata" => [
"title" => "LEGO Minecraft The Crafting Box 4.0",
"url" => "https://www.bol.com/nl/nl/p/lego-minecraft/123456/"
]
])
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
if (!empty($data["results"])) {
echo "DeepSearch matched: " . $data["results"][0]["title"] . "\n";
}Example Response
{
"results": [
{
"ean": "8806094957013",
"sku": "16006605473490309581",
"title": "Samsung Galaxy A34 5G",
"url": "https://www.google.com/search?udm=28&q=Samsung%20Galaxy%20A34%205G..."
}
]
}
Response Fields
/offers endpoint)/offers endpoint for detailed price and merchant data. This two-step workflow gives you the most accurate results. Enable deepsearch=true (4 credits) when the standard match (1 credit) doesn't find a result.
Can I scrape any e-commerce page for product data?
Utility endpoints for page scraping and favicon retrieval.
/page/?url={url}
Extract structured product data from any product detail page URL. Works with most e-commerce websites.
Parameters
Example Request
curl "https://api.shoppingscraper.com/page/?url=https%3A%2F%2Fwww.coolblue.nl%2Fproduct%2F123456&api_key=YOUR_API_KEY"import httpx
response = httpx.get("https://api.shoppingscraper.com/page/", params={
"url": "https://www.coolblue.nl/product/123456",
"api_key": "YOUR_API_KEY"
})
product = response.json()["results"][0]
print(f"{product['title']}: €{product['price']}")const response = await fetch(
"https://api.shoppingscraper.com/page/?" +
new URLSearchParams({ url: "https://www.coolblue.nl/product/123456", api_key: "YOUR_API_KEY" })
);
const { results } = await response.json();
console.log(`${results[0].title}: €${results[0].price}`);$response = file_get_contents("https://api.shoppingscraper.com/page/?" . http_build_query([
"url" => "https://www.coolblue.nl/product/123456", "api_key" => "YOUR_API_KEY"
]));
$product = json_decode($response, true)["results"][0];
echo $product["title"] . ": €" . $product["price"] . "\n";Example Response
{
"results": [
{
"title": "Product Title",
"price": "34.95",
"currency": "EUR",
"description": "Product description...",
"images": ["https://...image1.jpg"],
"brand": "Brand Name",
"ean": "8720246689310",
"availability": "InStock"
}
]
}
/tools/favicons?url={domain}&size={size}
Get the favicon image for any website. Returns the image directly (not JSON). Useful for displaying merchant logos.
Parameters
bol.com)32, 64, 128, 256, 512 (default: 32)Example Request
curl "https://api.shoppingscraper.com/tools/favicons?url=bol.com&size=128&api_key=YOUR_API_KEY" -o favicon.pngimport httpx
response = httpx.get("https://api.shoppingscraper.com/tools/favicons", params={
"url": "bol.com", "size": 128, "api_key": "YOUR_API_KEY"
})
with open("favicon.png", "wb") as f:
f.write(response.content)const response = await fetch(
"https://api.shoppingscraper.com/tools/favicons?" +
new URLSearchParams({ url: "bol.com", size: "128", api_key: "YOUR_API_KEY" })
);
const buffer = await response.arrayBuffer();
// Use in <img> tag or save to file$url = "https://api.shoppingscraper.com/tools/favicons?" . http_build_query([
"url" => "bol.com", "size" => 128, "api_key" => "YOUR_API_KEY"
]);
// Use directly in HTML: <img src="$url">
file_put_contents("favicon.png", file_get_contents($url));<img> tags.
How do I check my remaining credits?
Check your credit balance and usage history.
/subscription
Check your current credit balance, plan details, connection limit, and renewal date.
Parameters
Example Request
curl "https://api.shoppingscraper.com/subscription?api_key=YOUR_API_KEY"import httpx
response = httpx.get("https://api.shoppingscraper.com/subscription", params={
"api_key": "YOUR_API_KEY"
})
credits = response.json()["plan_credits"]
print(f"Remaining: {credits['remaining']} / {credits['initial']}")const response = await fetch(
"https://api.shoppingscraper.com/subscription?" +
new URLSearchParams({ api_key: "YOUR_API_KEY" })
);
const data = await response.json();
console.log(`Remaining: ${data.plan_credits.remaining} / ${data.plan_credits.initial}`);$response = file_get_contents("https://api.shoppingscraper.com/subscription?" . http_build_query([
"api_key" => "YOUR_API_KEY"
]));
$data = json_decode($response, true);
echo "Remaining: " . $data["plan_credits"]["remaining"] . " / " . $data["plan_credits"]["initial"] . "\n";Example Response
{
"api_key": "YOUR_API_KEY",
"is_admin": false,
"plan_credits": {
"initial": 5000,
"remaining": 4850
},
"connections": {
"max": 100,
"open": 0
},
"marketplaces": {
"total": 3,
"reserved": []
},
"credit_bundles": [],
"metadata": {},
"pending_deductions": "0"
}
Response Fields
/subscription/history
View your credit transaction history. See which endpoints consumed credits and when.
Parameters
Example Request
curl "https://api.shoppingscraper.com/subscription/history?api_key=YOUR_API_KEY"import httpx
response = httpx.get("https://api.shoppingscraper.com/subscription/history", params={
"api_key": "YOUR_API_KEY"
})
for entry in response.json():
print(f"{entry['endpoint']} ({entry['site']}): {entry['credits_used']} credit")const response = await fetch(
"https://api.shoppingscraper.com/subscription/history?" +
new URLSearchParams({ api_key: "YOUR_API_KEY" })
);
const history = await response.json();
history.forEach(e =>
console.log(`${e.endpoint} (${e.site}): ${e.credits_used} credit`)
);$response = file_get_contents("https://api.shoppingscraper.com/subscription/history?" . http_build_query([
"api_key" => "YOUR_API_KEY"
]));
foreach (json_decode($response, true) as $entry) {
echo $entry["endpoint"] . " (" . $entry["site"] . "): " . $entry["credits_used"] . " credit\n";
}Example Response
[
{
"id": 12345,
"api_key": "YOUR_API_KEY",
"credits_used": 1,
"endpoint": "/offers",
"site": "shopping.google.nl",
"ean": "8720246689310",
"timestamp": "2026-02-17T18:46:40Z"
},
{
"id": 12344,
"credits_used": 1,
"endpoint": "/search",
"site": "googleshopping/nl",
"timestamp": "2026-02-17T18:40:12Z"
}
]
Response Fields
Scheduler APIs
Manage price monitoring schedulers, trigger runs, download reports, and control dynamic pricing — all via API.
https://app.shoppingscraper.com (not api.shoppingscraper.com). Authenticate with your api_key query parameter.
/api/schedule/{task_uuid}?api_key={api_key}
Get detailed schedule information including configuration, run history, EAN list, and report download URLs.
Parameters
true (default) or false — include the EAN list in the responseExample Request
curl "https://app.shoppingscraper.com/api/schedule/8b1df5b4-a699-499b-92b2-aa1d4127496d?api_key=YOUR_API_KEY"import httpx
response = httpx.get("https://app.shoppingscraper.com/api/schedule/8b1df5b4-a699-499b-92b2-aa1d4127496d", params={
"api_key": "YOUR_API_KEY"
})
task = response.json()
print(f"Title: {task['task']['title']}")
print(f"Total runs: {task['total_runs']}")const response = await fetch(
"https://app.shoppingscraper.com/api/schedule/8b1df5b4-a699-499b-92b2-aa1d4127496d?" +
new URLSearchParams({ api_key: "YOUR_API_KEY" })
);
const data = await response.json();
console.log(`Title: ${data.task.title}`);
console.log(`Total runs: ${data.total_runs}`);$response = file_get_contents(
"https://app.shoppingscraper.com/api/schedule/8b1df5b4-a699-499b-92b2-aa1d4127496d?" . http_build_query([
"api_key" => "YOUR_API_KEY"
])
);
$data = json_decode($response, true);
echo "Title: " . $data["task"]["title"] . "\n";
echo "Total runs: " . $data["total_runs"] . "\n";Example Response
{
"task": {
"uuid": "8b1df5b4-a699-499b-92b2-aa1d4127496d",
"title": "My Price Monitor",
"site": "shopping.google.nl",
"frequency": "daily",
"is_active": true,
"ean_count": 150,
"created_at": "2026-01-15T10:00:00Z",
"last_run_at": "2026-03-31T06:00:00Z",
"next_run_at": "2026-04-01T06:00:00Z",
"current_run_status": "completed",
"eans": ["8720246689310", "8710103818458"]
},
"run_history": [
{
"run_id": 42,
"timestamp": "2026-03-31T06:00:00Z",
"status": "completed",
"eans_processed": 150,
"eans_matched": 142,
"offers_found": 1284,
"duration_seconds": 45.2,
"reports": {
"full_csv": { "url": "/schedule/.../report_42.csv", "exists": true },
"full_xlsx": { "url": "/schedule/.../report_42.xlsx", "exists": true }
}
}
],
"total_runs": 42
}
Response Fields
/schedule/{task_uuid}/run
Trigger an immediate run of a scheduler. The task executes in the background. If all slots are busy, the task is queued.
Parameters
Example Request
curl -X POST "https://app.shoppingscraper.com/schedule/8b1df5b4-a699-499b-92b2-aa1d4127496d/run"import httpx
response = httpx.post("https://app.shoppingscraper.com/schedule/8b1df5b4-a699-499b-92b2-aa1d4127496d/run")
print(response.json())const response = await fetch(
"https://app.shoppingscraper.com/schedule/8b1df5b4-a699-499b-92b2-aa1d4127496d/run",
{ method: "POST" }
);
console.log(await response.json());$ch = curl_init("https://app.shoppingscraper.com/schedule/8b1df5b4-a699-499b-92b2-aa1d4127496d/run");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
echo curl_exec($ch);
curl_close($ch);Example Response
{
"message": "Task execution started in background.",
"task_uuid": "8b1df5b4-a699-499b-92b2-aa1d4127496d"
}
Response Fields
/api/schedule/{task_uuid}/reports?api_key={api_key}
List all available reports for a scheduler with file sizes, download URLs, and run statistics.
Parameters
Example Request
curl "https://app.shoppingscraper.com/api/schedule/8b1df5b4-a699-499b-92b2-aa1d4127496d/reports?api_key=YOUR_API_KEY"import httpx
response = httpx.get("https://app.shoppingscraper.com/api/schedule/8b1df5b4-a699-499b-92b2-aa1d4127496d/reports", params={
"api_key": "YOUR_API_KEY"
})
for report in response.json()["reports"]:
print(f"Run #{report['run_id']}: {report['eans_matched']} matched, {report['offers_found']} offers")const response = await fetch(
"https://app.shoppingscraper.com/api/schedule/8b1df5b4-a699-499b-92b2-aa1d4127496d/reports?" +
new URLSearchParams({ api_key: "YOUR_API_KEY" })
);
const data = await response.json();
data.reports.forEach(r =>
console.log(`Run #${r.run_id}: ${r.eans_matched} matched, ${r.offers_found} offers`)
);$response = file_get_contents(
"https://app.shoppingscraper.com/api/schedule/8b1df5b4-a699-499b-92b2-aa1d4127496d/reports?" . http_build_query([
"api_key" => "YOUR_API_KEY"
])
);
$data = json_decode($response, true);
foreach ($data["reports"] as $report) {
echo "Run #{$report['run_id']}: {$report['eans_matched']} matched\n";
}Example Response
{
"task_uuid": "8b1df5b4-a699-499b-92b2-aa1d4127496d",
"task_title": "My Price Monitor",
"reports": [
{
"run_id": 42,
"timestamp": "2026-03-31T06:00:00Z",
"status": "completed",
"eans_processed": 150,
"eans_matched": 142,
"offers_found": 1284,
"duration_seconds": 45.2,
"full_reports": {
"csv": { "url": "/schedule/.../report_42.csv", "exists": true, "size_human": "245 KB" },
"xlsx": { "url": "/schedule/.../report_42.xlsx", "exists": true, "size_human": "312 KB" }
},
"cheapest_reports": {
"csv": { "url": "/schedule/.../cheapest_42.csv", "exists": true, "size_human": "18 KB" },
"xlsx": { "url": "/schedule/.../cheapest_42.xlsx", "exists": true, "size_human": "24 KB" }
}
}
],
"total_reports": 42,
"total_size_human": "12.4 MB"
}
Response Fields
/schedule/{task_uuid}/latest?format={format}&report_type={type}
Download the latest generated report as CSV or XLSX. Public endpoint — no API key required. Rate limited to 60 requests per hour.
Parameters
csv (default) or xlsxstandard (default, all offers) or cheapest (cheapest per product)Example Request
curl -o report.csv "https://app.shoppingscraper.com/schedule/8b1df5b4-a699-499b-92b2-aa1d4127496d/latest?format=csv&report_type=cheapest"import httpx
response = httpx.get("https://app.shoppingscraper.com/schedule/8b1df5b4-a699-499b-92b2-aa1d4127496d/latest", params={
"format": "csv",
"report_type": "cheapest"
})
with open("report.csv", "wb") as f:
f.write(response.content)
print(f"Downloaded {len(response.content)} bytes")const response = await fetch(
"https://app.shoppingscraper.com/schedule/8b1df5b4-a699-499b-92b2-aa1d4127496d/latest?" +
new URLSearchParams({ format: "csv", report_type: "cheapest" })
);
const blob = await response.blob();
// Save to file using fs or serve to client$csv = file_get_contents(
"https://app.shoppingscraper.com/schedule/8b1df5b4-a699-499b-92b2-aa1d4127496d/latest?" . http_build_query([
"format" => "csv",
"report_type" => "cheapest"
])
);
file_put_contents("report.csv", $csv);
echo "Downloaded " . strlen($csv) . " bytes\n";Response
/schedule/{task_uuid}/edit
Update a scheduler's title, frequency, EANs/URLs, and active status.
Parameters
hourly, daily, weeklyExample Request
curl -X POST "https://app.shoppingscraper.com/schedule/8b1df5b4-a699-499b-92b2-aa1d4127496d/edit" \
-H "Content-Type: application/json" \
-d '{"api_key":"YOUR_API_KEY","title":"Updated Monitor","frequency":"daily","is_active":true,"eans":["8720246689310","8710103818458"]}'import httpx
response = httpx.post("https://app.shoppingscraper.com/schedule/8b1df5b4-a699-499b-92b2-aa1d4127496d/edit", json={
"api_key": "YOUR_API_KEY",
"title": "Updated Monitor",
"frequency": "daily",
"is_active": True,
"eans": ["8720246689310", "8710103818458"]
})
print(response.json())const response = await fetch(
"https://app.shoppingscraper.com/schedule/8b1df5b4-a699-499b-92b2-aa1d4127496d/edit",
{
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
api_key: "YOUR_API_KEY",
title: "Updated Monitor",
frequency: "daily",
is_active: true,
eans: ["8720246689310", "8710103818458"]
})
}
);
console.log(await response.json());$ch = curl_init("https://app.shoppingscraper.com/schedule/8b1df5b4-a699-499b-92b2-aa1d4127496d/edit");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
CURLOPT_POSTFIELDS => json_encode([
"api_key" => "YOUR_API_KEY",
"title" => "Updated Monitor",
"frequency" => "daily",
"is_active" => true,
"eans" => ["8720246689310", "8710103818458"]
])
]);
echo curl_exec($ch);
curl_close($ch);Example Response
{
"message": "Task updated successfully.",
"task_uuid": "8b1df5b4-a699-499b-92b2-aa1d4127496d",
"title": "Updated Monitor",
"frequency": "daily",
"ean_count": 2,
"is_active": true,
"next_run_at": "2026-04-01T06:00:00Z"
}
/schedule/{task_uuid}?api_key={api_key}
Permanently delete a scheduler and all its reports, alerts, and linked data.
Parameters
X-API-Key header)Example Request
curl -X DELETE "https://app.shoppingscraper.com/schedule/8b1df5b4-a699-499b-92b2-aa1d4127496d?api_key=YOUR_API_KEY"import httpx
response = httpx.delete("https://app.shoppingscraper.com/schedule/8b1df5b4-a699-499b-92b2-aa1d4127496d", params={
"api_key": "YOUR_API_KEY"
})
print(response.json())const response = await fetch(
"https://app.shoppingscraper.com/schedule/8b1df5b4-a699-499b-92b2-aa1d4127496d?" +
new URLSearchParams({ api_key: "YOUR_API_KEY" }),
{ method: "DELETE" }
);
console.log(await response.json());$ch = curl_init("https://app.shoppingscraper.com/schedule/8b1df5b4-a699-499b-92b2-aa1d4127496d?api_key=YOUR_API_KEY");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
echo curl_exec($ch);
curl_close($ch);Example Response
{
"message": "Schedule deleted successfully",
"task_uuid": "8b1df5b4-a699-499b-92b2-aa1d4127496d",
"deleted_count": 1
}
/api/dynamic-pricing/reprice
Trigger a manual repricing run. Applies all active pricing rules to generate new price recommendations.
Parameters
manualExample Request
curl -X POST "https://app.shoppingscraper.com/api/dynamic-pricing/reprice?api_key=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"task_uuid":"8b1df5b4-a699-499b-92b2-aa1d4127496d","feed_uuid":"YOUR_FEED_UUID"}'import httpx
response = httpx.post("https://app.shoppingscraper.com/api/dynamic-pricing/reprice", params={
"api_key": "YOUR_API_KEY"
}, json={
"task_uuid": "8b1df5b4-a699-499b-92b2-aa1d4127496d",
"feed_uuid": "YOUR_FEED_UUID"
})
stats = response.json()
print(f"Processed: {stats['processed']}, Changes: {stats['changes']}")const response = await fetch(
"https://app.shoppingscraper.com/api/dynamic-pricing/reprice?" +
new URLSearchParams({ api_key: "YOUR_API_KEY" }),
{
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
task_uuid: "8b1df5b4-a699-499b-92b2-aa1d4127496d",
feed_uuid: "YOUR_FEED_UUID"
})
}
);
console.log(await response.json());$ch = curl_init("https://app.shoppingscraper.com/api/dynamic-pricing/reprice?api_key=YOUR_API_KEY");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
CURLOPT_POSTFIELDS => json_encode([
"task_uuid" => "8b1df5b4-a699-499b-92b2-aa1d4127496d",
"feed_uuid" => "YOUR_FEED_UUID"
])
]);
echo curl_exec($ch);
curl_close($ch);Example Response
{
"processed": 150,
"changes": 23,
"increases": 8,
"decreases": 15,
"timestamp": "2026-03-31T12:34:56Z"
}
Response Fields
/api/dynamic-pricing/rules?api_key={api_key}
List all pricing rules. Optionally scope to a specific scheduler with task_uuid.
Parameters
Example Request
curl "https://app.shoppingscraper.com/api/dynamic-pricing/rules?api_key=YOUR_API_KEY&task_uuid=8b1df5b4-a699-499b-92b2-aa1d4127496d"import httpx
response = httpx.get("https://app.shoppingscraper.com/api/dynamic-pricing/rules", params={
"api_key": "YOUR_API_KEY",
"task_uuid": "8b1df5b4-a699-499b-92b2-aa1d4127496d"
})
for rule in response.json()["rules"]:
print(f"Rule #{rule['id']}: {rule['name']} ({rule['rule_type']}) - {'enabled' if rule['enabled'] else 'disabled'}")const response = await fetch(
"https://app.shoppingscraper.com/api/dynamic-pricing/rules?" +
new URLSearchParams({ api_key: "YOUR_API_KEY", task_uuid: "8b1df5b4-a699-499b-92b2-aa1d4127496d" })
);
const { rules } = await response.json();
rules.forEach(r => console.log(`Rule #${r.id}: ${r.name} (${r.rule_type})`));$response = file_get_contents(
"https://app.shoppingscraper.com/api/dynamic-pricing/rules?" . http_build_query([
"api_key" => "YOUR_API_KEY",
"task_uuid" => "8b1df5b4-a699-499b-92b2-aa1d4127496d"
])
);
$data = json_decode($response, true);
foreach ($data["rules"] as $rule) {
echo "Rule #{$rule['id']}: {$rule['name']} ({$rule['rule_type']})\n";
}Example Response
{
"rules": [
{
"id": 1,
"name": "Match cheapest competitor",
"rule_type": "match_lowest",
"category": "competitive",
"conditions": { "competitor_tier": "A" },
"constraints": { "min_margin_pct": 5.0 },
"enabled": true,
"priority": 1,
"rounding_override": "round_99"
}
]
}
Response Fields
/api/dynamic-pricing/rules?api_key={api_key}
Create a new pricing rule.
Parameters
Example Request
curl -X POST "https://app.shoppingscraper.com/api/dynamic-pricing/rules?api_key=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Match cheapest","rule_type":"match_lowest","category":"competitive","conditions":{"competitor_tier":"A"},"constraints":{"min_margin_pct":5.0}}'import httpx
response = httpx.post("https://app.shoppingscraper.com/api/dynamic-pricing/rules", params={
"api_key": "YOUR_API_KEY"
}, json={
"name": "Match cheapest",
"rule_type": "match_lowest",
"category": "competitive",
"conditions": {"competitor_tier": "A"},
"constraints": {"min_margin_pct": 5.0}
})
print(response.json()) # {"id": 1, "message": "Rule created"}Example Response
{
"id": 1,
"message": "Rule created"
}
/api/dynamic-pricing/rules/{rule_id}?api_key={api_key}
Update a pricing rule — toggle enabled/disabled, rename, or change priority and rounding.
Parameters
none, round_99, round_95, round_50, round_10, round_integer, round_downExample Response
{ "message": "Rule updated" }
/api/dynamic-pricing/rules/{rule_id}?api_key={api_key}
Delete a single pricing rule.
Example Response
{ "message": "Rule deleted" }
/api/dynamic-pricing/rules/batch?api_key={api_key}
Create multiple pricing rules in a single request.
Parameters
Example Request
curl -X POST "https://app.shoppingscraper.com/api/dynamic-pricing/rules/batch?api_key=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"rules":[{"name":"Rule 1","rule_type":"match_lowest","category":"competitive","conditions":{}},{"name":"Rule 2","rule_type":"undercut","category":"competitive","conditions":{}}]}'import httpx
response = httpx.post("https://app.shoppingscraper.com/api/dynamic-pricing/rules/batch", params={
"api_key": "YOUR_API_KEY"
}, json={
"rules": [
{"name": "Rule 1", "rule_type": "match_lowest", "category": "competitive", "conditions": {}},
{"name": "Rule 2", "rule_type": "undercut", "category": "competitive", "conditions": {}}
]
})
print(response.json()) # {"created": 2, "ids": [1, 2], "errors": []}Example Response
{
"created": 2,
"ids": [1, 2],
"errors": []
}
/api/dynamic-pricing/recommendations?api_key={api_key}
Get price recommendations generated by your pricing rules. Each recommendation includes the current price, suggested price, matched rule, and competitor context.
Parameters
Example Request
curl "https://app.shoppingscraper.com/api/dynamic-pricing/recommendations?api_key=YOUR_API_KEY&task_uuid=8b1df5b4-a699-499b-92b2-aa1d4127496d"import httpx
response = httpx.get("https://app.shoppingscraper.com/api/dynamic-pricing/recommendations", params={
"api_key": "YOUR_API_KEY",
"task_uuid": "8b1df5b4-a699-499b-92b2-aa1d4127496d"
})
for rec in response.json()["recommendations"]:
print(f"{rec['gtin']}: €{rec['current_price']} → €{rec['recommended_price']} ({rec['rule_name']})")const response = await fetch(
"https://app.shoppingscraper.com/api/dynamic-pricing/recommendations?" +
new URLSearchParams({ api_key: "YOUR_API_KEY", task_uuid: "8b1df5b4-a699-499b-92b2-aa1d4127496d" })
);
const { recommendations } = await response.json();
recommendations.forEach(r =>
console.log(`${r.gtin}: \u20ac${r.current_price} \u2192 \u20ac${r.recommended_price} (${r.rule_name})`)
);$response = file_get_contents(
"https://app.shoppingscraper.com/api/dynamic-pricing/recommendations?" . http_build_query([
"api_key" => "YOUR_API_KEY",
"task_uuid" => "8b1df5b4-a699-499b-92b2-aa1d4127496d"
])
);
$data = json_decode($response, true);
foreach ($data["recommendations"] as $rec) {
echo "{$rec['gtin']}: \u20ac{$rec['current_price']} \u2192 \u20ac{$rec['recommended_price']}\n";
}Example Response
{
"recommendations": [
{
"gtin": "8720246689310",
"customer_sku": "PRD-001",
"title": "Homra Koniq Prullenbak 30L",
"current_price": 79.95,
"recommended_price": 74.99,
"price_change_eur": -4.96,
"price_change_pct": -6.2,
"rule_name": "Match cheapest competitor",
"rule_type": "match_lowest",
"lowest_competitor_price": 72.90,
"lowest_competitor_name": "Prullenbakkie.nl",
"market_average_price": 82.50,
"competitor_count": 8,
"simulation_mode": false
}
],
"summary": {
"total_products": 150,
"products_with_changes": 23,
"avg_change_pct": -3.1
}
}
Response Fields
/api/dynamic-pricing/export?api_key={api_key}&format={format}
Export all price recommendations as CSV or JSON. Includes full detail: margins, velocity, stock, and rounding info.
Parameters
csv (default) or jsonExample Request
curl -o recommendations.csv "https://app.shoppingscraper.com/api/dynamic-pricing/export?api_key=YOUR_API_KEY&format=csv"import httpx
response = httpx.get("https://app.shoppingscraper.com/api/dynamic-pricing/export", params={
"api_key": "YOUR_API_KEY",
"format": "json"
})
data = response.json()
print(f"Exported {data['total_products']} products")CSV Columns
/api/dynamic-pricing/feed/{task_uuid}?api_key={api_key}
Permanent, stable feed URL for your repricing system to poll. Returns CSV by default, append .json for JSON. Use onlyChanges=true for delta mode (only products with price changes).
Parameters
true to return only products where the recommended price differs from currentExample Request
# CSV feed (default)
curl "https://app.shoppingscraper.com/api/dynamic-pricing/feed/8b1df5b4-a699-499b-92b2-aa1d4127496d?api_key=YOUR_API_KEY"
# JSON feed
curl "https://app.shoppingscraper.com/api/dynamic-pricing/feed/8b1df5b4-a699-499b-92b2-aa1d4127496d.json?api_key=YOUR_API_KEY"
# Delta mode (only changed prices)
curl "https://app.shoppingscraper.com/api/dynamic-pricing/feed/8b1df5b4-a699-499b-92b2-aa1d4127496d?api_key=YOUR_API_KEY&onlyChanges=true"import httpx
import csv
import io
# CSV feed
response = httpx.get("https://app.shoppingscraper.com/api/dynamic-pricing/feed/8b1df5b4-a699-499b-92b2-aa1d4127496d", params={
"api_key": "YOUR_API_KEY",
"onlyChanges": "true"
})
reader = csv.DictReader(io.StringIO(response.text))
for row in reader:
print(f"{row['gtin']}: €{row['current_price']} → €{row['recommended_price']}")
# JSON feed
response = httpx.get("https://app.shoppingscraper.com/api/dynamic-pricing/feed/8b1df5b4-a699-499b-92b2-aa1d4127496d.json", params={
"api_key": "YOUR_API_KEY"
})
data = response.json()
print(f"Feed generated at {data['generated_at']}, {data['total_products']} products")CSV Columns / JSON Fields
/api/dynamic-pricing/config?api_key={api_key}
Get or update your repricing configuration. Controls simulation mode, rounding rules, margin thresholds, and alert settings.
Parameters (GET)
Example Request
# Get config
curl "https://app.shoppingscraper.com/api/dynamic-pricing/config?api_key=YOUR_API_KEY"
# Update config
curl -X PATCH "https://app.shoppingscraper.com/api/dynamic-pricing/config?api_key=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"simulation_mode":false,"rounding_rule":"round_99","default_min_margin_pct":5.0}'import httpx
# Get config
response = httpx.get("https://app.shoppingscraper.com/api/dynamic-pricing/config", params={
"api_key": "YOUR_API_KEY"
})
config = response.json()
print(f"Simulation mode: {config['simulation_mode']}")
# Update config
response = httpx.patch("https://app.shoppingscraper.com/api/dynamic-pricing/config", params={
"api_key": "YOUR_API_KEY"
}, json={
"simulation_mode": False,
"rounding_rule": "round_99",
"default_min_margin_pct": 5.0
})
print(response.json())Example Response
{
"feed_refresh_minutes": 60,
"reprice_after_scrape": true,
"reprice_after_feed": true,
"simulation_mode": true,
"alerts_enabled": false,
"alert_email": "[email protected]",
"alert_margin_threshold": 3.0,
"alert_swing_threshold": 10.0,
"default_shipping_cost": 0.0,
"rule_resolution_strategy": "highest_priority",
"rounding_rule": "round_99",
"default_min_margin_pct": 5.0,
"enforce_rrp_ceiling": false
}
Configuration Fields
/api/dynamic-pricing/competitor-tiers?api_key={api_key}
Get or set competitor tier classifications (A, B, C). Tier A competitors are used in pricing rules that target the "best" competitors.
Parameters (GET)
Example Request
# List tiers
curl "https://app.shoppingscraper.com/api/dynamic-pricing/competitor-tiers?api_key=YOUR_API_KEY"
# Set a competitor's tier
curl -X POST "https://app.shoppingscraper.com/api/dynamic-pricing/competitor-tiers?api_key=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"merchant_name":"bol.com","tier":"A","notes":"Major marketplace competitor"}'import httpx
# List tiers
response = httpx.get("https://app.shoppingscraper.com/api/dynamic-pricing/competitor-tiers", params={
"api_key": "YOUR_API_KEY"
})
tiers = response.json()["tiers"]
for name, info in tiers.items():
print(f"{name}: Tier {info['tier']}")
# Set a competitor's tier
httpx.post("https://app.shoppingscraper.com/api/dynamic-pricing/competitor-tiers", params={
"api_key": "YOUR_API_KEY"
}, json={
"merchant_name": "bol.com",
"tier": "A",
"notes": "Major marketplace competitor"
})Example Response (GET)
{
"tiers": {
"bol.com": { "tier": "A", "notes": "Major marketplace competitor" },
"coolblue.nl": { "tier": "A", "notes": "Premium electronics retailer" },
"amazon.nl": { "tier": "B", "notes": "Growing Dutch market presence" }
}
}
Response Fields
/api/dynamic-pricing/activity?api_key={api_key}
Get the repricing activity log — shows when repricing ran, what changed, and how many products were affected.
Parameters
Example Request
curl "https://app.shoppingscraper.com/api/dynamic-pricing/activity?api_key=YOUR_API_KEY&limit=5"import httpx
response = httpx.get("https://app.shoppingscraper.com/api/dynamic-pricing/activity", params={
"api_key": "YOUR_API_KEY",
"limit": 5
})
for entry in response.json()["activity"]:
print(f"[{entry['timestamp']}] {entry['action']}: {entry['description']} ({entry['affected_count']} products)")Example Response
{
"activity": [
{
"timestamp": "2026-03-31T12:34:56Z",
"action": "reprice_completed",
"description": "Manual repricing completed",
"affected_count": 23
},
{
"timestamp": "2026-03-31T06:00:00Z",
"action": "scrape_completed",
"description": "Scheduled scrape completed, auto-reprice triggered",
"affected_count": 150
}
]
}
/api/dynamic-pricing/product-detail?api_key={api_key}&task_uuid={uuid}>in={gtin}
Get the full pricing detail for a single product — your price, recommendation, competitor breakdown with tiers, margin analysis, rule trace, and price trend history.
Parameters
Example Request
curl "https://app.shoppingscraper.com/api/dynamic-pricing/product-detail?api_key=YOUR_API_KEY&task_uuid=8b1df5b4-a699-499b-92b2-aa1d4127496d>in=8720246689310"import httpx
response = httpx.get("https://app.shoppingscraper.com/api/dynamic-pricing/product-detail", params={
"api_key": "YOUR_API_KEY",
"task_uuid": "8b1df5b4-a699-499b-92b2-aa1d4127496d",
"gtin": "8720246689310"
})
data = response.json()
print(f"Product: {data['product']['title']}")
print(f"Price: €{data['recommendation']['current_price']} → €{data['recommendation']['recommended_price']}")
for comp in data["competitors"]:
print(f" {comp['merchant_name']} (Tier {comp['tier']}): €{comp['total_price']}")const response = await fetch(
"https://app.shoppingscraper.com/api/dynamic-pricing/product-detail?" +
new URLSearchParams({
api_key: "YOUR_API_KEY",
task_uuid: "8b1df5b4-a699-499b-92b2-aa1d4127496d",
gtin: "8720246689310"
})
);
const data = await response.json();
console.log(`${data.product.title}: \u20ac${data.recommendation.recommended_price}`);
data.competitors.forEach(c => console.log(` ${c.merchant_name}: \u20ac${c.total_price}`));$response = file_get_contents(
"https://app.shoppingscraper.com/api/dynamic-pricing/product-detail?" . http_build_query([
"api_key" => "YOUR_API_KEY",
"task_uuid" => "8b1df5b4-a699-499b-92b2-aa1d4127496d",
"gtin" => "8720246689310"
])
);
$data = json_decode($response, true);
echo "Product: " . $data["product"]["title"] . "\n";
foreach ($data["competitors"] as $comp) {
echo " {$comp['merchant_name']} (Tier {$comp['tier']}): \u20ac{$comp['total_price']}\n";
}Example Response
{
"product": {
"gtin": "8720246689310",
"title": "Homra Koniq Prullenbak 30L",
"brand": "Homra",
"image_link": "https://...",
"price": 79.95,
"purchase_price": 42.00
},
"recommendation": {
"current_price": 79.95,
"recommended_price": 74.99,
"price_change_eur": -4.96,
"price_change_pct": -6.2,
"rule_name": "Match cheapest competitor",
"rule_type": "match_lowest",
"simulation_mode": false
},
"margin": {
"current": { "margin_eur": 37.95, "margin_pct": 47.5 },
"recommended": { "margin_eur": 32.99, "margin_pct": 44.0 }
},
"competitors": [
{
"merchant_name": "Prullenbakkie.nl",
"total_price": 75.90,
"base_price": 69.95,
"shipping_price": 5.95,
"availability": "InStock",
"tier": "A"
},
{
"merchant_name": "Bol.com",
"total_price": 79.00,
"base_price": 79.00,
"shipping_price": 0.00,
"availability": "InStock",
"tier": "A"
}
],
"tier_a_merchants": [
{ "name": "Prullenbakkie.nl", "domain": "prullenbakkie.nl" },
{ "name": "Bol.com", "domain": "bol.com" }
],
"price_trend": [
{ "date": "2026-03-25", "avg_price": 82.50, "min_price": 72.90, "merchant_count": 8 },
{ "date": "2026-03-31", "avg_price": 80.10, "min_price": 69.95, "merchant_count": 9 }
]
}
Response Fields
How do I handle errors and rate limits?
HTTP status codes, error responses, and rate limiting details.
HTTP Status Codes
| Code | Meaning | Description |
|---|---|---|
200 | OK | Request successful, data returned |
400 | Bad Request | Missing or invalid parameters |
401 | Unauthorized | Invalid or missing API key |
404 | Not Found | Product not found on the marketplace |
429 | Rate Limited | Too many concurrent requests |
500 | Server Error | Internal error — retry after a moment |
Error Response Examples
{
"error": "Unauthorized",
"message": "Invalid API key. Check your key on the Settings page.",
"status": 401
}
{
"error": "Bad Request",
"message": "Missing required parameter: ean. Provide a 13-digit EAN/GTIN.",
"status": 400
}
{
"error": "Not Found",
"message": "No product found for EAN 0000000000000 on shopping.google.nl",
"status": 404
}
{
"error": "Rate Limited",
"message": "Too many concurrent connections. Your limit is 100. Retry after reducing active requests.",
"status": 429
}
AI Images API
Generate, retrieve, and refine AI product images. All AI Images endpoints use https://app.shoppingscraper.com and authenticate with api_key in the request body or as a query parameter.
enriched_main_image • studio • lifestyle • flat_lay • size_scale • multi_angle • infographic • product_ad • comparison • flat_character
/api/aiimages/nanobanana-background-generate
Generate one or more AI product images in the background. Images are saved to your gallery automatically — you can poll the job status or simply check your gallery later. Accepts an EAN, ASIN, or product URL as the product source.
Request Body
ean, asin, or url is required.ean, asin, or url is required.ean, asin, or url is required.["lifestyle","infographic"]1. Total generated = number × len(types)."en". Also accepts: nl, de, fr, etc.0.5K (512px), 1K (1024px, default), 2K (2048px), 4K (4096px)"1:1". Also accepts: 4:3, 16:9, 3:4, 9:16"https://coolblue.nl"). Extracted style is applied to all generated images.style_url.Example Request
curl -X POST "https://app.shoppingscraper.com/api/aiimages/nanobanana-background-generate" \
-H "Content-Type: application/json" \
-d '{
"api_key": "YOUR_API_KEY",
"ean": "5010394004183",
"types": ["lifestyle", "infographic"],
"number": 1,
"language": "en",
"resolution": "1K",
"aspect_ratio": "1:1"
}'import httpx
response = httpx.post(
"https://app.shoppingscraper.com/api/aiimages/nanobanana-background-generate",
json={
"api_key": "YOUR_API_KEY",
"ean": "5010394004183",
"types": ["lifestyle", "infographic"],
"number": 1,
"language": "en",
"resolution": "1K",
"aspect_ratio": "1:1",
}
)
job = response.json()
print(f"Job ID: {job['job_id']}") # poll /nanobanana-background-status/{job_id}
print(f"Credits used: {job['credits_used']}")const response = await fetch(
"https://app.shoppingscraper.com/api/aiimages/nanobanana-background-generate",
{
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
api_key: "YOUR_API_KEY",
ean: "5010394004183",
types: ["lifestyle", "infographic"],
number: 1,
language: "en",
resolution: "1K",
aspect_ratio: "1:1",
}),
}
);
const job = await response.json();
console.log(`Job ID: ${job.job_id}`);Example Response
{
"success": true,
"job_id": "c9b594e0-9805",
"total_images": 2,
"credits_used": 300,
"message": "Background generation started. 2 images will be saved to your gallery automatically."
}
Response Fields
/api/aiimages/nanobanana-background-status/{job_id}?api_key={api_key}
Poll the status of a background generation job. Once status is completed, the saved_images array contains the image IDs you can fetch from the gallery.
Parameters
Example Request
curl "https://app.shoppingscraper.com/api/aiimages/nanobanana-background-status/c9b594e0-9805?api_key=YOUR_API_KEY"import httpx, time
job_id = "c9b594e0-9805"
api_key = "YOUR_API_KEY"
while True:
r = httpx.get(
f"https://app.shoppingscraper.com/api/aiimages/nanobanana-background-status/{job_id}",
params={"api_key": api_key}
)
data = r.json()
if data["status"] in ("completed", "failed"):
break
time.sleep(5)
for img in data.get("saved_images", []):
print(f"Image ID: {img['image_id']}")Example Response
{
"job_id": "c9b594e0-9805",
"status": "completed",
"total": 2,
"completed": 2,
"product_ean": "5010394004183",
"product_title": "12x Pedigree Markies Original Hondensnacks Vlees",
"image_type": "lifestyle",
"saved_images": [
{ "image_id": "6a014e28-5c9", "task_id": "ce53ce7d-53d0" },
{ "image_id": "7b125f39-6da", "task_id": "df64de8e-64e1" }
],
"errors": [],
"started_at": "2026-04-09T20:20:49.390385",
"completed_at": "2026-04-09T20:22:14.771203"
}
Response Fields
processing • completed • failed/api/aiimages/gallery/{image_id}?api_key={api_key}
Download a generated image by ID as a PNG file. Also supports optional format conversion and resizing.
Parameters
png (default), webp, jpeg85. Applies to webp and jpeg.Example Request
# Download original PNG
curl -L "https://app.shoppingscraper.com/api/aiimages/gallery/6a014e28-5c9?api_key=YOUR_API_KEY" \
-o product_image.png
# Download as WebP at 800px wide
curl -L "https://app.shoppingscraper.com/api/aiimages/gallery/6a014e28-5c9?api_key=YOUR_API_KEY&format=webp&width=800" \
-o product_image.webpimport httpx
r = httpx.get(
"https://app.shoppingscraper.com/api/aiimages/gallery/6a014e28-5c9",
params={"api_key": "YOUR_API_KEY", "format": "webp", "width": 800},
follow_redirects=True
)
with open("product_image.webp", "wb") as f:
f.write(r.content)GET /api/aiimages/gallery?api_key=YOUR_KEY&limit=50&offset=0 — returns a paginated list of your images with metadata (product title, style, EAN, creation date, reference images used, and AI prompt details). No image binary; use the individual /gallery/{image_id} endpoint to download.
DELETE /api/aiimages/gallery/{image_id}?api_key=YOUR_KEY
/api/aiimages/refine
Generate a refined variation of an existing gallery image using natural-language feedback. The original source images are reused. Costs 300 credits.
Request Body
"Make the background darker" or "Remove the text overlay"Example Request
curl -X POST "https://app.shoppingscraper.com/api/aiimages/refine" \
-H "Content-Type: application/json" \
-d '{
"api_key": "YOUR_API_KEY",
"image_id": "6a014e28-5c9",
"feedback": "Use a wooden table background and warmer lighting"
}'import httpx
response = httpx.post(
"https://app.shoppingscraper.com/api/aiimages/refine",
json={
"api_key": "YOUR_API_KEY",
"image_id": "6a014e28-5c9",
"feedback": "Use a wooden table background and warmer lighting",
}
)
result = response.json()
print(f"New image ID: {result.get('image_id')}")Example Response
{
"success": true,
"image_id": "9b245a31-7ef",
"credits_used": 300
}
/api/aiimages/credits?api_key={api_key}
Get your current AI Images credit balance and cost breakdown.
Parameters
Example Request
curl "https://app.shoppingscraper.com/api/aiimages/credits?api_key=YOUR_API_KEY"Example Response
{
"remaining": 14200,
"costs": {
"image_generation": 300,
"style_extraction": 25,
"style_extraction_with_preview": 50,
"refine": 300
}
}
Response Fields
Product & Pricing API
Manage products, get competitive pricing reports, and control dynamic pricing via API.
/api/products/<gtin>?feed_uuid=xxx&api_key=xxx
Get a single product by GTIN from a specific feed.
/api/products?feed_uuid=xxx&api_key=xxx
Create a product. Body: {"gtin": "...", "title": "...", "brand": "...", "price": 19.99, ...}
/api/products/<gtin>?feed_uuid=xxx&api_key=xxx
Update a product's fields. Body: {"title": "New Title", "price": 24.99}
/api/products/<gtin>?feed_uuid=xxx&api_key=xxx
Delete a product from a feed.
/api/products/bulk/add?feed_uuid=xxx&api_key=xxx
Insert up to 10,000 products at once. Body: array of product objects (each needs gtin + title).
/api/products/bulk/update?feed_uuid=xxx&api_key=xxx
Update up to 10,000 products at once. Each item needs gtin to identify the product.
/api/products/lookup?api_key=xxx
Look up multiple products by GTINs across all your feeds. Body: {"identifiers": ["123...", "456..."]}. Optionally add feed_uuid to scope to one feed.
Reports
/api/reports/price-index?task_uuid=xxx&api_key=xxx
Price index for all products. Index = (your price / market avg) × 100. Below 100 = cheaper than average. Supports page_number and page_size.
/api/reports/brand-index?api_key=xxx
Average price index per brand. Body: {"task_uuid": "...", "feed_uuid": "...", "brand": "optional filter"}
/api/reports/product-pricing?task_uuid=xxx&api_key=xxx
Latest prices across all competitors for all products. Flat list of (EAN, merchant, price, availability). Paginated.
/api/reports/price-changes?task_uuid=xxx&api_key=xxx
Historical price changes with filters. Params: start_date, end_date (YYYY-MM-DD), merchant, ean. Defaults to last 2 weeks.
/api/products/<gtin>/price-index?task_uuid=xxx&api_key=xxx
Price index for a single product, including market average, lowest competitor, and competitor count.
Dynamic Pricing
/api/dynamic-pricing/notify-price-updates?api_key=xxx
Notify that you've applied price changes in your store. Body: [{"gtin": "...", "new_price": 33.99}]. After notification, onlyChanges=true will no longer return these products.
/api/dynamic-pricing/feed/<task_uuid>?api_key=xxx&onlyChanges=true
Add onlyChanges=true to the CSV or JSON feed to return only products where the recommended price differs from the current price (delta mode).
Frequently Asked Questions
/offers?site=shopping.google.nl&ean=YOUR_EAN. The response includes every seller's price, shipping cost, and total price. Set up a scheduled job (e.g. daily cron) to track price changes over time. For cross-marketplace comparison, use site=global to get prices from various sources found across the web in a single call.
/offers?site=global&ean=YOUR_EAN. This returns offers from various sources found across the web in a single response, sorted by price. Add &gl=nl to filter by country. The response includes totalPrice (price + shipping) for accurate comparison.
/buybox?site=amazon.nl&ean=YOUR_EAN. This returns the current Buy Box winner, their price, and shipping details. Poll this endpoint at regular intervals (e.g. every hour) and compare the sellerName and totalPrice fields to detect changes. The same endpoint works for Bol.com with site=bol.com.
/info?site=amazon.nl&ean=YOUR_EAN. The response includes title, description, thumbnail (main image URL), brand, and specs (key-value specifications). For the richest product data, try Amazon or Bol.com. For any arbitrary product page URL, use the /page/ endpoint.
401 error with a message about insufficient credits. Use the /subscription endpoint to check your remaining balance before making bulk requests. Credits reset on your plan's renewal date. You can purchase additional credit bundles from the Usage page in the app.
429 response. To handle this: use a semaphore or connection pool (e.g. asyncio.Semaphore(25) in Python) to limit concurrent requests. Implement exponential backoff: wait 1s, then 2s, then 4s on retries. Check your active connections with /subscription — the connections.open field shows current usage.
/search/googleshopping/nl?keyword=airpods. This returns product listings with prices, SKUs, and offer data. The search endpoint supports pagination with the page parameter. Note: the /offers, /info, and /buybox endpoints require an EAN — use Search first to find the right product, then use its EAN for detailed data.
/page/?url=https%3A%2F%2Fwww.coolblue.nl%2Fproduct%2F123456. This works with most e-commerce websites. The extraction uses AI to identify product data from the page's structured markup and visible content.