API Reference Back to Guide

API Reference

Complete documentation for the ShoppingScraper API. Monitor prices, track competitors, and extract product data across Google Shopping, Amazon, Bol.com, and Coolblue.

34 Endpoints REST API JSON Responses

Your first API call in 30 seconds

1 Get your API key from the Settings page
2 Make a request to any endpoint with api_key=YOUR_KEY
3 Parse the JSON response — prices, sellers, and product data are ready to use
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.

All requests require the 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

https://api.shoppingscraper.com
Credits: Each API call costs 1 credit (offers, search, info, buybox, page scraping). Check your balance with the /subscription endpoint.

Common Parameters

api_key stringrequired Your API key (required on all requests)
site stringrequired Target marketplace (e.g. shopping.google.nl, amazon.de, bol.com, global)
ean stringrequired 13-digit EAN/GTIN barcode
sku stringoptional Product SKU (alternative to EAN on some endpoints)
url stringoptional Product page URL (for page scraping)
gl stringoptional Country code filter (e.g. nl, de, be, fr, uk)
hl stringoptional Language code (e.g. nl, fr, de)
metadata booleanoptional Include extra metadata in response

How do I get competitor prices from Google Shopping?

Search and compare prices across Google Shopping in 30+ countries.

GET /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

api_key stringrequired Your API key
site stringrequired Google Shopping domain (e.g. shopping.google.nl, shopping.google.de)
ean stringrequired 13-digit EAN/GTIN barcode
availability booleanoptional Filter offers by stock status. 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

JSON
{
  "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

resultsarrayList of matched products
eanstringThe EAN/GTIN barcode
skustringGoogle Shopping product ID
titlestringProduct title
brandstringProduct brand name
availabilitystringStock status: InStock, OutOfStock
offers[]arrayList of seller offers
sellerNamestringMerchant name
totalPricestringPrice + shipping combined
conditionstringNew, Refurbished, or Used
offers[].availabilitystring|nullPer-offer stock status: InStock, OutOfStock, or null
GET /offers?site=amazon.{cc}&ean={ean}

Get all seller offers for a product on Amazon. Returns prices, seller names, conditions, and Prime eligibility.

Parameters

api_keystringrequiredYour API key
sitestringrequiredAmazon domain (amazon.nl, amazon.de, amazon.co.uk, amazon.fr)
eanstringrequired13-digit EAN/GTIN

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

JSON
{
  "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"
        }
      ]
    }
  ]
}
GET /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

api_keystringrequiredYour API key
sitestringrequiredMust be bol.com
eanstringrequired13-digit EAN/GTIN
glstringoptionalCountry: nl or be
hlstringoptionalLanguage: nl or fr

Example 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

JSON
{
  "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"
        }
      ]
    }
  ]
}
GET /offers?site=coolblue.{cc}&ean={ean}

Get Coolblue offers for a product. Supports NL, BE, and DE storefronts.

Parameters

api_keystringrequiredYour API key
sitestringrequiredCoolblue domain (coolblue.nl, coolblue.be, coolblue.de)
eanstringrequired13-digit EAN/GTIN

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

JSON
{
  "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.

GET /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

api_keystringrequiredYour API key
sitestringrequiredMust be global
eanstringrequired13-digit EAN/GTIN
glstringoptionalCountry filter (nl, 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

JSON
{
  "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

resultsobjectSingle result object (not array for global)
offers[]arrayOffers from various sources found on the web
sellerImagestringSeller logo URL (when available)

How do I get product images and descriptions?

Retrieve product details, images, specifications, and descriptions from any marketplace.

GET /info?site=shopping.google.{cc}&ean={ean}

Get product information from Google Shopping including title, description, images, and specifications.

Parameters

api_keystringrequiredYour API key
sitestringrequiredGoogle Shopping domain
eanstringrequired13-digit EAN/GTIN

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

JSON
{
  "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

descriptionstringProduct description text
specsobjectKey-value product specifications
thumbnailstringProduct image URL
GET /info?site=amazon.{cc}&ean={ean}

Get detailed product information from Amazon including title, ASIN, brand, images, ratings, and specifications.

Parameters

api_keystringrequiredYour API key
sitestringrequiredAmazon domain
eanstringrequired13-digit EAN/GTIN

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

JSON
{
  "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"
      }
    }
  ]
}
GET /info?site=bol.com&ean={ean}

Get product information from Bol.com including title, brand, images, ratings, and specifications.

Parameters

api_keystringrequiredYour API key
sitestringrequiredMust be bol.com
eanstringrequired13-digit EAN/GTIN

Example 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

JSON
{
  "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"
      }
    }
  ]
}
GET /info?site=coolblue.{cc}&ean={ean}

Get product information from Coolblue including title, brand, images, rating, and specifications.

Parameters

api_keystringrequiredYour API key
sitestringrequiredCoolblue domain
eanstringrequired13-digit EAN/GTIN

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

JSON
{
  "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.

GET /buybox?site=amazon.{cc}&ean={ean}

Get the current Amazon Buy Box holder, price, and details. Essential for competitive pricing strategies.

Parameters

api_keystringrequiredYour API key
sitestringrequiredAmazon domain
eanstringrequired13-digit EAN/GTIN

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

JSON
{
  "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

offersobjectThe Buy Box winner (single offer, not array)
sellerNamestringBuy Box holder name
totalPricestringBuy Box price including shipping
GET /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

api_keystringrequiredYour API key
sitestringrequiredMust be bol.com
eanstringrequired13-digit EAN/GTIN
glstringoptionalCountry: nl or be
hlstringoptionalLanguage: nl or fr

Example 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

JSON
{
  "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.

GET /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

api_keystringrequiredYour API key
sitestringrequiredGoogle Shopping domain (e.g. shopping.google.nl)
skustringrequiredGoogle Shopping catalog ID (SKU)

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

JSON
{
  "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

dimensions[]arrayVariant dimensions (color, size, capacity, etc.)
dimensions[].namestringDimension name (e.g. "Kleur", "Maat", "Opslagcapaciteit")
dimensions[].options[]arrayAvailable options within this dimension
options[].labelstringDisplay label (e.g. "Zwart", "128 GB")
options[].catalogidstringGoogle Shopping catalog ID for this variant — use as SKU in other endpoints
options[].selectedbooleanWhether this is the currently selected variant
credits_chargednumberAPI credits consumed (6 per request)

How do I get product reviews from Google Shopping?

Retrieve review summaries, ratings breakdown, and individual user reviews for any Google Shopping product.

GET /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

api_keystringrequiredYour API key
sitestringrequiredGoogle Shopping domain (e.g. shopping.google.nl)
skustringrequiredGoogle Shopping catalog ID (SKU)

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

JSON
{
  "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

review_summaryobjectAggregated review statistics
review_summary.average_ratingnumberAverage star rating (1.0 - 5.0)
review_summary.total_reviewsnumberTotal number of reviews across all sources
user_reviews[]arrayIndividual user reviews (paginated, 10 per page)
user_reviews[].ratingnumberStar rating (1-5)
user_reviews[].textstringReview text content
has_next_pagebooleanWhether more reviews are available

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.

GET POST /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

api_keystringrequiredYour API key
sitestringrequiredGoogle Shopping domain (shopping.google.nl, shopping.google.de, shopping.google.fr, etc.)
eanstringrequiredEAN/GTIN barcode (e.g. 8806094957013)
deepsearchbooleanoptionalEnable AI-powered deep matching (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.

sitestringrequiredGoogle Shopping domain (shopping.google.nl, shopping.google.de, etc.)
eanstringrequiredEAN/GTIN barcode
metadata.titlestringoptionalProduct title hint to improve matching accuracy
metadata.match_urlstringoptionalSource product URL for reference
DeepSearch (4 credits): Add 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.*16 countriesshopping.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.nz

Example 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

JSON
{
  "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

resultsarrayArray of matched products (empty if no match found)
results[].eanstringThe EAN/GTIN that was matched
results[].skustringGoogle Shopping product SKU (use this with the /offers endpoint)
results[].titlestringProduct title as shown on the marketplace
results[].urlstringDirect URL to the product listing on the marketplace
Tip: Use the Match endpoint first to resolve an EAN to a Google Shopping SKU, then pass that SKU to the /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.

GET /page/?url={url}

Extract structured product data from any product detail page URL. Works with most e-commerce websites.

Parameters

api_keystringrequiredYour API key
urlstringrequiredURL-encoded product page URL

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

JSON
{
  "results": [
    {
      "title": "Product Title",
      "price": "34.95",
      "currency": "EUR",
      "description": "Product description...",
      "images": ["https://...image1.jpg"],
      "brand": "Brand Name",
      "ean": "8720246689310",
      "availability": "InStock"
    }
  ]
}
GET /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

api_keystringrequiredYour API key
urlstringrequiredWebsite domain (e.g. bol.com)
sizeintegeroptionalIcon size: 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.png
import 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));
Note: This endpoint returns the favicon image directly (PNG/ICO), not a JSON response. Use the URL directly in <img> tags.

How do I check my remaining credits?

Check your credit balance and usage history.

GET /subscription

Check your current credit balance, plan details, connection limit, and renewal date.

Parameters

api_keystringrequiredYour API key

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

JSON
{
  "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

plan_credits.initialintegerTotal credits in your plan
plan_credits.remainingintegerCredits still available
connections.maxintegerMaximum concurrent connections
connections.openintegerCurrently active connections
pending_deductionsstringCredits being processed
GET /subscription/history

View your credit transaction history. See which endpoints consumed credits and when.

Parameters

api_keystringrequiredYour API key

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

JSON
[
  {
    "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

credits_usedintegerCredits consumed by this call
endpointstringAPI endpoint called
sitestringTarget marketplace
timestampstringISO 8601 timestamp

Scheduler APIs

Manage price monitoring schedulers, trigger runs, download reports, and control dynamic pricing — all via API.

Base URL: All scheduler endpoints use https://app.shoppingscraper.com (not api.shoppingscraper.com). Authenticate with your api_key query parameter.
GET /api/schedule/{task_uuid}?api_key={api_key}

Get detailed schedule information including configuration, run history, EAN list, and report download URLs.

Parameters

task_uuidstringrequiredSchedule UUID (path parameter)
api_keystringrequiredYour API key
showeanstringoptionaltrue (default) or false — include the EAN list in the response

Example 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

JSON
{
  "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

taskobjectSchedule configuration and current state
task.uuidstringUnique schedule identifier
task.sitestringTarget marketplace (e.g. shopping.google.nl, amazon.nl)
task.frequencystringRun frequency: hourly, daily, weekly
task.eansarrayList of tracked EANs (when showean=true)
run_historyarrayRecent runs with status, counts, and report URLs
total_runsintegerTotal number of completed runs
POST /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

task_uuidstringrequiredSchedule UUID (path parameter)

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

JSON — 202 Accepted
{
  "message": "Task execution started in background.",
  "task_uuid": "8b1df5b4-a699-499b-92b2-aa1d4127496d"
}

Response Fields

messagestringStatus message (started or queued)
task_uuidstringSchedule identifier
queue_positionintegerPosition in queue (only when queued)
GET /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

task_uuidstringrequiredSchedule UUID (path parameter)
api_keystringrequiredYour API key

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

JSON
{
  "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

reports[]arrayList of reports with download URLs and metadata
full_reportsobjectAll offers report (CSV & XLSX)
cheapest_reportsobjectCheapest-per-product report (CSV & XLSX)
total_size_humanstringTotal storage used by all reports
GET /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

task_uuidstringrequiredSchedule UUID (path parameter)
formatstringoptionalcsv (default) or xlsx
report_typestringoptionalstandard (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

FilebinaryCSV or XLSX file download with Content-Disposition header
POST /schedule/{task_uuid}/edit

Update a scheduler's title, frequency, EANs/URLs, and active status.

Parameters

task_uuidstringrequiredSchedule UUID (path parameter)
api_keystringrequiredYour API key (JSON body)
titlestringrequiredSchedule title
frequencystringrequiredRun frequency: hourly, daily, weekly
is_activebooleanrequiredEnable or disable the scheduler
eansarray|stringoptionalEANs as array or newline-separated string
urlsarray|stringoptionalURLs as array or newline-separated string (for URL schedulers)

Example 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

JSON
{
  "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"
}
DELETE /schedule/{task_uuid}?api_key={api_key}

Permanently delete a scheduler and all its reports, alerts, and linked data.

Parameters

task_uuidstringrequiredSchedule UUID (path parameter)
api_keystringrequiredYour API key (query param, JSON body, or 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

JSON — 200 OK
{
  "message": "Schedule deleted successfully",
  "task_uuid": "8b1df5b4-a699-499b-92b2-aa1d4127496d",
  "deleted_count": 1
}
POST /api/dynamic-pricing/reprice

Trigger a manual repricing run. Applies all active pricing rules to generate new price recommendations.

Parameters

api_keystringrequiredYour API key (query parameter)
task_uuidstringrequiredSchedule UUID (JSON body)
feed_uuidstringrequiredProduct feed UUID (JSON body)
triggerstringoptionalTrigger source, default: manual

Example 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

JSON
{
  "processed": 150,
  "changes": 23,
  "increases": 8,
  "decreases": 15,
  "timestamp": "2026-03-31T12:34:56Z"
}

Response Fields

processedintegerTotal products evaluated
changesintegerProducts with price recommendations different from current price
increasesintegerRecommended price increases
decreasesintegerRecommended price decreases
GET /api/dynamic-pricing/rules?api_key={api_key}

List all pricing rules. Optionally scope to a specific scheduler with task_uuid.

Parameters

api_keystringrequiredYour API key
task_uuidstringoptionalFilter rules to a specific scheduler

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

JSON
{
  "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

rules[]arrayList of pricing rules
rule_typestringRule type (match_lowest, undercut, margin_target, etc.)
conditionsobjectWhen the rule applies (competitor tier, brand, category, etc.)
constraintsobjectGuardrails (min margin, max discount, price floor/ceiling)
priorityintegerExecution order (lower = higher priority)
POST /api/dynamic-pricing/rules?api_key={api_key}

Create a new pricing rule.

Parameters

api_keystringrequiredYour API key (query parameter)
namestringrequiredRule name
rule_typestringrequiredRule type
categorystringrequiredRule category
conditionsobjectrequiredWhen the rule applies
constraintsobjectoptionalGuardrails (min margin, max discount)

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

JSON — 201 Created
{
  "id": 1,
  "message": "Rule created"
}
PATCH /api/dynamic-pricing/rules/{rule_id}?api_key={api_key}

Update a pricing rule — toggle enabled/disabled, rename, or change priority and rounding.

Parameters

rule_idintegerrequiredRule ID (path parameter)
enabledbooleanoptionalEnable or disable the rule
namestringoptionalNew rule name
priorityintegeroptionalExecution order
rounding_overridestringoptionalRounding: none, round_99, round_95, round_50, round_10, round_integer, round_down

Example Response

JSON
{ "message": "Rule updated" }
DELETE /api/dynamic-pricing/rules/{rule_id}?api_key={api_key}

Delete a single pricing rule.

Example Response

JSON
{ "message": "Rule deleted" }
POST /api/dynamic-pricing/rules/batch?api_key={api_key}

Create multiple pricing rules in a single request.

Parameters

api_keystringrequiredYour API key (query parameter)
rulesarrayrequiredArray of rule objects (same format as single create)

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

JSON — 201 Created
{
  "created": 2,
  "ids": [1, 2],
  "errors": []
}
GET /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

api_keystringrequiredYour API key
task_uuidstringoptionalFilter to a specific scheduler
limitintegeroptionalMax results (default: 100)
offsetintegeroptionalPagination offset (default: 0)

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

JSON
{
  "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

recommendations[]arrayPrice recommendations per product
current_pricefloatYour current selling price
recommended_pricefloatSuggested price based on rules
price_change_pctfloatPercentage change (negative = decrease)
rule_namestringName of the pricing rule that produced the recommendation
simulation_modebooleanWhether this is a simulation-only recommendation
GET /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

api_keystringrequiredYour API key
task_uuidstringoptionalFilter to a specific scheduler
formatstringoptionalcsv (default) or json

Example 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

gtin, customer_sku, titlestringProduct identifiers
current_price, recommended_pricefloatPrice data
price_change_eur, price_change_pctfloatChange amount and percentage
current_margin_pct, recommended_margin_pctfloatMargin analysis
velocity_status, days_of_stockstring, integerInventory context
GET /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

task_uuidstringrequiredSchedule UUID (path parameter)
api_keystringrequiredYour API key
onlyChangesbooleanoptionaltrue to return only products where the recommended price differs from current

Example 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

gtin, customer_skustringProduct identifiers
current_price, recommended_pricefloatCurrent and recommended selling price
lowest_competitor_pricefloatCheapest competitor price
lowest_competitor_namestringName of the cheapest competitor
rule_name, rule_typestringRule that produced the recommendation
GET /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)

api_keystringrequiredYour API key

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

JSON
{
  "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

simulation_modebooleanWhen true, recommendations are generated but not applied
rounding_rulestringPrice rounding: none, round_99, round_95, round_50, round_10, round_integer, round_down
default_min_margin_pctfloatMinimum margin percentage guardrail
reprice_after_scrapebooleanAuto-reprice when new competitor data arrives
enforce_rrp_ceilingbooleanNever recommend a price above RRP
GET /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)

api_keystringrequiredYour API key

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)

JSON
{
  "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

tiersobjectMap of merchant name to tier classification
tierstringCompetitor tier: A (top), B (mid), or C (low priority)
notesstringOptional notes about the competitor
GET /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

api_keystringrequiredYour API key
task_uuidstringoptionalFilter to a specific scheduler
limitintegeroptionalMax entries (default: 10)

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

JSON
{
  "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
    }
  ]
}
GET /api/dynamic-pricing/product-detail?api_key={api_key}&task_uuid={uuid}&gtin={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

api_keystringrequiredYour API key
task_uuidstringrequiredSchedule UUID
gtinstringrequired13-digit EAN/GTIN
feed_uuidstringoptionalProduct feed UUID for margin data

Example Request

curl "https://app.shoppingscraper.com/api/dynamic-pricing/product-detail?api_key=YOUR_API_KEY&task_uuid=8b1df5b4-a699-499b-92b2-aa1d4127496d&gtin=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

JSON
{
  "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

productobjectYour product details from the feed
recommendationobjectPrice recommendation with rule info
marginobjectCurrent and recommended margin analysis
competitors[]arrayAll competitor offers with prices, shipping, and tier
tier_a_merchantsarrayList of Tier A competitors
price_trend[]arrayHistorical daily price trends (avg, min, merchant count)

How do I handle errors and rate limits?

HTTP status codes, error responses, and rate limiting details.

Rate limit: Maximum 100 concurrent connections per API key. Requests exceeding this limit will receive a 429 response. There is no per-minute or per-hour limit — only concurrent connections are throttled.

HTTP Status Codes

CodeMeaningDescription
200OKRequest successful, data returned
400Bad RequestMissing or invalid parameters
401UnauthorizedInvalid or missing API key
404Not FoundProduct not found on the marketplace
429Rate LimitedToo many concurrent requests
500Server ErrorInternal error — retry after a moment

Error Response Examples

401 Unauthorized — Invalid or missing API key
{
  "error": "Unauthorized",
  "message": "Invalid API key. Check your key on the Settings page.",
  "status": 401
}
400 Bad Request — Missing required parameter
{
  "error": "Bad Request",
  "message": "Missing required parameter: ean. Provide a 13-digit EAN/GTIN.",
  "status": 400
}
404 Not Found — Product not found on marketplace
{
  "error": "Not Found",
  "message": "No product found for EAN 0000000000000 on shopping.google.nl",
  "status": 404
}
429 Rate Limited — Too many concurrent requests
{
  "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.

Credits: Each image generation costs 300 credits (includes prompt generation + one image). Style extraction costs 25–50 credits and is reusable. Refine costs 300 credits per refined image.
Image types: enriched_main_imagestudiolifestyleflat_laysize_scalemulti_angleinfographicproduct_adcomparisonflat_character
POST /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

api_keystringrequiredYour API key
eanstringoptional*EAN/GTIN product code. One of ean, asin, or url is required.
asinstringoptional*Amazon ASIN. One of ean, asin, or url is required.
urlstringoptional*Product page URL. One of ean, asin, or url is required.
typesarrayrequiredArray of image type strings. Up to all 10 types in a single call. E.g. ["lifestyle","infographic"]
numberintegeroptionalImages per type. Range 1–10. Default: 1. Total generated = number × len(types).
languagestringoptionalLanguage for text in generated images. Default: "en". Also accepts: nl, de, fr, etc.
resolutionstringoptionalOutput resolution: 0.5K (512px), 1K (1024px, default), 2K (2048px), 4K (4096px)
aspect_ratiostringoptionalOutput aspect ratio. Default: "1:1". Also accepts: 4:3, 16:9, 3:4, 9:16
style_urlstringoptionalWebsite URL to extract brand style from (e.g. "https://coolblue.nl"). Extracted style is applied to all generated images.
style_idstringoptionalID of a previously saved style to apply. Takes priority over 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

JSON
{
  "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

job_idstringUse this to poll /nanobanana-background-status/{job_id}
total_imagesintegerNumber of images being generated (number × len(types))
credits_usedintegerCredits deducted from your balance immediately
GET /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

job_idstringrequiredJob ID returned by the generate endpoint (path parameter)
api_keystringrequiredYour API key

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

JSON
{
  "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

statusstringprocessingcompletedfailed
completedintegerNumber of images saved so far
saved_imagesarrayImage IDs to fetch via GET /api/aiimages/gallery/{image_id}
errorsarrayError messages for any failed images (credits are refunded for failures)
POST /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

api_keystringrequiredYour API key
image_idstringrequiredID of the gallery image to refine
feedbackstringrequiredNatural-language refinement instruction, e.g. "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

JSON
{
  "success": true,
  "image_id": "9b245a31-7ef",
  "credits_used": 300
}
GET /api/aiimages/credits?api_key={api_key}

Get your current AI Images credit balance and cost breakdown.

Parameters

api_keystringrequiredYour API key

Example Request

curl "https://app.shoppingscraper.com/api/aiimages/credits?api_key=YOUR_API_KEY"

Example Response

JSON
{
  "remaining": 14200,
  "costs": {
    "image_generation": 300,
    "style_extraction": 25,
    "style_extraction_with_preview": 50,
    "refine": 300
  }
}

Response Fields

remainingintegerCredits available for AI image generation
costs.image_generationintegerCost per generated image (300)
costs.style_extractionintegerCost to extract a brand style from a URL (25). Saved styles are reusable at no cost.

Product & Pricing API

Manage products, get competitive pricing reports, and control dynamic pricing via API.

GET /api/products/<gtin>?feed_uuid=xxx&api_key=xxx

Get a single product by GTIN from a specific feed.

POST /api/products?feed_uuid=xxx&api_key=xxx

Create a product. Body: {"gtin": "...", "title": "...", "brand": "...", "price": 19.99, ...}

PUT /api/products/<gtin>?feed_uuid=xxx&api_key=xxx

Update a product's fields. Body: {"title": "New Title", "price": 24.99}

DELETE /api/products/<gtin>?feed_uuid=xxx&api_key=xxx

Delete a product from a feed.

POST /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).

PUT /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.

POST /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

GET /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.

POST /api/reports/brand-index?api_key=xxx

Average price index per brand. Body: {"task_uuid": "...", "feed_uuid": "...", "brand": "optional filter"}

GET /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.

GET /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.

GET /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

POST /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.

GET /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

Use the /offers endpoint with the marketplace where your competitors sell. For example, to monitor prices on Google Shopping Netherlands, call /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.
Use the Global Price Comparison endpoint: /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.
Use the /buybox endpoint: /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.
Use the /info endpoint for any marketplace: /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.
When your credit balance reaches zero, API requests will return a 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.
The API allows up to 100 concurrent connections. If you exceed this, you'll get a 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.
Yes! Use the Google Shopping Search endpoint: /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.
Yes! The /page/ endpoint accepts any product URL and extracts structured data (title, price, description, images, brand, EAN). URL-encode the target URL: /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.