DuckDuckGo Shopping API: What Product Data It Returns
Search “iphone 15 case” on DuckDuckGo and the top of the results can include a grid of product cards — a photo, a title, a price, a merchant name, and sometimes a rating. These product-listing placements are the shopping SERP's equivalent of product listing ad (PLA) results, and for ecommerce research they are often more useful than organic links: each card is a concrete offer from a specific merchant at a specific price.
Nearly every Shopping API on the market is Google-only. DuckDuckGo product data is a separate source with its own merchants, prices, and listings — and very few providers expose it as structured data. The Serpent DuckDuckGo Shopping API turns those product cards into JSON through a single REST endpoint, with engine=ddg as the switch.
TL;DR: Calling /api/shopping?q=PRODUCT&engine=ddg returns DuckDuckGo product listings as JSON. Each result has position, title, price, merchant/store, url, thumbnail, rating, and reviews. Prices are returned where the source placement renders them — some placements omit a price, so price can be null.
What PLA-style product results look like
Product-listing placements — the cards you see at the top of a shopping SERP — are compact offers rather than organic blue links. Each one bundles the product's name, a thumbnail, the merchant selling it, and usually a price. Some also carry a rating and a review count. They are exactly the data a price-monitoring or competitive-research pipeline wants: a normalized set of offers for one product, ranked by position.
DuckDuckGo's product coverage is notably broad — it spans everyday consumer goods from a wide mix of merchants across countries. That breadth is what makes it a useful addition to a shopping data workflow, especially as a second or third source to compare against Google and Yahoo.
The endpoint: /api/shopping with engine=ddg
The Shopping endpoint is /api/shopping. DuckDuckGo is one of four engines — google, yahoo (the default), ddg, and brave. Pass engine=ddg to pull DuckDuckGo product listings through the same normalized shape as the other card-based engines.
| Parameter | What it does |
|---|---|
q | The product query (“iphone 15 case”) |
engine | ddg for DuckDuckGo, or google/yahoo/brave |
num | Number of products per call, up to 20 (default 10) |
country | Two-letter ISO code to localize product results |
language | Optional two-letter language code |
format | full (default) or simple |
A first request looks like this:
https://apiserpent.com/api/shopping?q=iphone+15+case&engine=ddg&num=10&country=us
A working Node.js example
Here is the whole thing in Node.js with fetch — query DuckDuckGo Shopping, then print each product's title, price, and merchant:
const res = await fetch(
'https://apiserpent.com/api/shopping?q=iphone+15+case&engine=ddg&num=10',
{ headers: { 'X-API-Key': 'YOUR_API_KEY' } }
);
const json = await res.json();
for (const p of json.results.shopping) {
console.log(p.position, p.title, p.price ?? 'no price', p.merchant);
}
Five lines. No parser to maintain, no HTML to clean — the product cards arrive as JSON objects ready to store in a database, compare, or feed into a price-alerting loop.
The response shape and the honest price field
Each product result carries the fields that make up the card: position, title, price, currency, merchant, store, url, thumbnail, rating, reviews, sponsored, and snippet. A typical item looks like this:
{
"position": 1,
"title": "Spigen Mag Armor MagFit for iPhone 15",
"price": "$49.99",
"currency": "USD",
"merchant": "spigen.com",
"store": "spigen.com",
"url": "https://spigen.com/products/...",
"thumbnail": "https://.../product.jpg",
"rating": 4.5,
"reviews": 342,
"sponsored": true,
"snippet": "Shockproof military-grade case with built-in MagSafe..."
}
One honest caveat: a price is not returned for every placement. Some product cards render without a visible price, so price (and rating/reviews) can be null on individual results. This is not a bug — the shopping source itself simply does not show a price for that placement. Build your pipeline to treat null prices as expected (use p.price ?? 'no price', or skip nulls when averaging) rather than assuming every result has one.
Price monitoring with DuckDuckGo Shopping
Because each result is a merchant offer at a specific price, DuckDuckGo Shopping data is a natural fit for price monitoring. Query a product on a schedule, normalize the price strings to a numeric value, and track the lowest offer per product over time. When the minimum drops below a threshold, you have a price-drop signal.
Our shopping price-monitoring playbook walks through the schedule-and-diff pattern in detail, and the price-drop alerts post shows how to turn a threshold breach into a notification.
Four independent indexes in one endpoint
Google, Yahoo, DuckDuckGo, and Brave are independent product sources. The same query can surface different merchants, different prices, and different product availability in each. All four flow through the same /api/shopping endpoint with the same normalized fields, so switching between them is a one-parameter change: engine=google vs. engine=yahoo vs. engine=ddg vs. engine=brave.
Querying more than one engine is the foundation of cross-engine price comparison — a broader view of the market and a way to cross-check a price change instead of trusting a single source. Start with the Shopping API hub to compare the field shapes, then read the Google, Yahoo, and Brave Shopping API pages for their engine-specific details.
Pricing
DuckDuckGo Shopping search costs $0.60 per 1,000 requests on the Default tier, $0.06 per 1,000 on Growth, and $0.03 per 1,000 on Scale. New accounts get 10 shared free calls on every endpoint, then pay-as-you-go — credits never expire and there is no monthly subscription. The flat per-call model keeps monitoring predictable: the bill scales with how many product queries you actually run, not with how many SKUs you track.
DuckDuckGo product cards, as JSON.
Serpent returns DuckDuckGo product listings — titles, prices, merchants, URLs, and thumbnails — through one endpoint, with Google, Yahoo, and Brave one parameter away. Pay-as-you-go, credits never expire, no subscription.
Get Your Free API KeyExplore: DuckDuckGo Shopping API · Shopping API · Docs · Playground · Pricing
FAQ
What DuckDuckGo Shopping data does the API return?
The DuckDuckGo Shopping API returns product listings as structured JSON with position, title, price (where available), merchant and store names, product URL, thumbnail, rating, and review count. Use num to request up to 20 products per call.
Is there an official DuckDuckGo Shopping API?
No. DuckDuckGo does not offer a public API that reads its product search listings. A shopping API that returns those product cards as JSON is the standard path, and Serpent exposes them through /api/shopping with engine=ddg.
Is a price always returned for every product?
No. Prices, ratings, and review counts are returned when the shopping source provides them. Some product placements render without a visible price, so the price field can be null. Always handle null prices in your pipeline rather than assuming every result has one.
How much does the DuckDuckGo Shopping API cost?
DuckDuckGo Shopping search costs $0.60 per 1,000 requests on the Default tier, $0.06 per 1,000 on Growth, and $0.03 per 1,000 on Scale. New accounts get 10 shared free calls on every endpoint, then pay-as-you-go. Credits never expire and there is no monthly subscription.


