Try it
Run a live shopping search
One free run per day without signing up — a free account adds 10 free calls shared across services.
Brave Shopping Data
Brave Shopping API: Product Results as JSON
Price monitoring, SKU matching and ecommerce research all start from the same thing: the products a search shows for a query, as data rather than pixels. Send a product query to /api/shopping with engine=brave and you get them back as a ranked JSON list, one row per product.
Each row carries the title, the price as the listing shows it plus a numeric price and a currency code, the store, a product link and an image, with rating and review count where the listing has them. yahoo, ddg and brave share one card-style shape (url, merchant, store, extractedPrice, rating, reviews), while engine=google answers in Google-style keys (link, source, extracted_price, product_rating).
# Brave Shopping: "4k monitor" curl "https://apiserpent.com/api/shopping?q=4k+monitor&engine=brave&num=10&country=us" \ -H "X-API-Key: YOUR_API_KEY"
import os
import requests
resp = requests.get(
"https://apiserpent.com/api/shopping",
params={"q": "4k monitor", "engine": "brave", "num": 10, "country": "us"},
headers={"X-API-Key": os.environ["SERPENT_API_KEY"]},
timeout=60,
)
data = resp.json()
if not data.get("success"):
raise SystemExit(data.get("message"))
for p in data["results"]["shopping"]:
# extractedPrice is the price as a number (None when the listing shows no price)
print(p["position"], p["title"], p["extractedPrice"], p["currency"], p["merchant"], p["url"])
// Node 18+ has fetch built in. Save as shopping.mjs and run: node shopping.mjs const params = new URLSearchParams({ q: "4k monitor", engine: "brave", num: "10", country: "us" }); const res = await fetch(`https://apiserpent.com/api/shopping?${params}`, { headers: { "X-API-Key": process.env.SERPENT_API_KEY }, }); const data = await res.json(); if (!data.success) throw new Error(data.message); // Cheapest priced product first; rows without a price are kept out of the sort. const priced = data.results.shopping.filter((p) => p.extractedPrice != null); priced.sort((a, b) => a.extractedPrice - b.extractedPrice); for (const p of priced) console.log(p.extractedPrice, p.currency, p.title, p.merchant);
{
"success": true,
"query": "4k monitor",
"type": "shopping",
"engine": "brave",
"country": "us",
"results": {
"shopping": [
{
"position": 1,
"title": "27-inch 4K UHD IPS Monitor",
"price": "$279.99",
"extractedPrice": 279.99,
"currency": "USD",
"merchant": "Example Store",
"store": "Example Store",
"url": "https://www.example-store.com/product/12345",
"thumbnail": "https://www.example-store.com/images/12345.jpg",
"rating": 4.6,
"reviews": 318,
"sponsored": false
}
],
"totalResults": 10
},
"meta": {
"totalShopping": 10,
"elapsed": "2900ms",
"timestamp": "2026-10-22T10:30:00.000Z"
}
}
Price, currency, rating and review count are filled when the product listing shows them and null otherwise. Use format=simple for a lighter row of position, title, price, store, link and image.
Shopping API vs. the Web SERP API
The Web SERP API (/api/search?engine=brave) returns organic search results and the other blocks of a results page. When you specifically want product rows — for price feeds, SKU matching or price-drop alerts — use /api/shopping?engine=brave: every row is shaped as a product, and a priced row carries its currency code in its own field.
Data Fields & Pricing
Structured Brave Shopping Product Data
Every product row carries the fields price monitoring, product matching and ecommerce research need, at one flat rate per call.
Product Fields
- shopping[].position
- shopping[].title
- shopping[].price
- shopping[].extractedPrice
- shopping[].currency
- shopping[].merchant, .store
- shopping[].url
- shopping[].thumbnail
- shopping[].rating
- shopping[].reviews
Request Parameters
- q (product query, required)
- engine=brave
- num (1–100; up to num)
- country (2-letter code)
- language (2-letter code)
- format (full | simple)
Use Cases
- Price monitoring
- Product & SKU matching
- Store coverage checks
- Ecommerce market research
- Price-drop alerting
Shopping pricing
- Default: $0.35/1K calls
- Growth: $0.32/1K calls
- Scale: $0.25/1K calls
- Enterprise: $0.21/1K calls
- Enterprise Plus: $0.18/1K calls
- Same rate on all four engines
- Credits never expire
FAQ
Brave Shopping API Questions
/api/shopping with engine=brave returns a ranked list of products as JSON: position, title, price as shown plus a numeric price and currency code, the store, the product link, an image, and rating and review count where the listing shows them. num sets how many rows you want, from 1 to 100 (20 when you leave it out). You get up to num and a short answer says so. format=simple trims each row to position, title, price, store, link and image.
price holds the listing’s own text, the numeric field holds the amount and currency the currency code. When a listing shows no price, those fields are null and the row is still returned; rating and review count follow the same rule. A query that is not about a buyable product can come back with few or no priced rows, so filter on the numeric price before you compare anything.
google (the default), yahoo, ddg and brave, all on the same /api/shopping endpoint and the same price. yahoo, ddg and brave share one card-style shape (url, merchant, store, extractedPrice, rating, reviews), while engine=google answers in Google-style keys (link, source, extracted_price, product_rating). Switching engine is a one-parameter change.
/api/shopping?engine=brave) is a dedicated product endpoint: every row is shaped as a product, with price, currency and store fields. The Web SERP API (/api/search?engine=brave) returns organic search results and the other blocks of a results page. Use the Shopping endpoint when you want product data specifically.
country code and an optional 2-letter language code to aim the product search at a market. Prices come back in local currency, with the currency code in its own field, so you do not have to parse a currency symbol.
Start using the Brave Shopping API
One free run per day without signing up — a free account adds 10 free calls shared across services. Brave Shopping product results from $0.18 per 1,000 calls, the same rate on every engine.
Get an API Key API Documentation


