eBay Product Scraper API
Our eBay product scraper turns any eBay item URL into structured JSON: title, price, currency, brand, image, description, availability, condition, and identifiers like MPN and GTIN, from one request.
Why eBay Product data is hard to pull
An eBay item page is bot-gated and its DOM changes often, so hand-written selectors break, but every listing also ships a clean JSON-LD Product block that is the stable source of truth. Reaching it reliably still needs residential IPs, because eBay serves a challenge to datacenter ranges and localises the price to the request country.
Your first eBay Product Scraper API call
curl "https://api.ebayscraperapi.com/api/v1/ebay/product?url=https://www.ebay.com/itm/117247270687&api_key=$API_KEY" import requests
BASE = "https://api.ebayscraperapi.com"
API_KEY = "YOUR_API_KEY"
# Pass an eBay item URL (or the numeric id via the id param).
data = requests.get(
f"{BASE}/api/v1/ebay/product",
params={
"url": "https://www.ebay.com/itm/117247270687",
"api_key": API_KEY,
},
timeout=30,
).json()
print(data["title"])
print(data["price"], data["currency"], "| brand:", data["brand"])
print("in stock:", data["availability"])
for ident in data["ids"]:
print(ident) # e.g. {"mpn": "ENV155BAE"} Parameters
| Parameter | Required | Default | Notes |
|---|---|---|---|
url | required | - | The eBay item page URL, e.g. https://www.ebay.com/itm/117247270687. Required unless you pass id. |
id | optional | - | The numeric eBay item id as an alias for url. We build the canonical /itm/{id} URL from it. One of url or id is required. |
domain | optional | com | eBay marketplace TLD used when building the URL from an id, e.g. com, co.uk, de. |
country | optional | - | Optional two-letter country code for the proxy egress. eBay localises the item price to this region. |
api_key | required | - | Your API key, passed as a query parameter. Get one free at signup. |
The JSON the eBay Product Scraper API returns
{
"title": "Nespresso VertuoPlus Deluxe Coffee and Espresso Machine - Black (ENV155BAE)",
"price": 45,
"currency": "$",
"url": "https://www.ebay.com/itm/117247270687",
"image": "https://i.ebayimg.com/images/g/ze4AAeSwZVNqLbzb/s-l400.jpg",
"brand": "Nespresso",
"description": "Nespresso Vertuo Next Coffee & Espresso Machine by Breville - Matte Black. Nespresso Vertuo Next Coffee Machine. Brews both coffee and espresso drinks. Compact footprint. Modern matte black finish.",
"availability": true,
"old_price": null,
"ids": [
{ "mpn": "ENV155BAE" }
],
"additional_properties": [],
"item_id": "117247270687",
"condition": "Condition"
} | Field | Type | Description |
|---|---|---|
title | string | The item title, read from the listing's JSON-LD, with the visible H1 as a fallback. |
price | number | The current offer price. eBay localises this to the egress IP's country, so set country to control the region. |
currency | string | Currency symbol for the price, e.g. $, mapped from the JSON-LD currency code. |
url | string | Canonical /itm/{id} URL for the item, with query strings stripped. |
image | string | Primary product image URL, normalised to a stable s-l400 size. |
brand | string | Brand name from the listing's JSON-LD when present, else null. |
description | string | Item description text from the JSON-LD, whitespace-cleaned. |
availability | boolean | True when the offer is in stock, false when out of stock or sold out, mapped from the schema.org availability. |
old_price | number | The strikethrough list price from the offer's price specification when the item is discounted, else null. |
ids | array | Product identifiers present in the JSON-LD, each an object like { mpn: ... } or { gtin13: ... }. |
additional_properties | array | Item specifics as { name, value } pairs when the listing exposes them, from JSON-LD or the item-specifics rows. Empty when the seller published none. |
item_id | string | The numeric eBay item id parsed from the item URL. |
condition | string | Item condition from the page's condition block. Some listings expose only the field label rather than a value, in which case the label is returned as-is. |
What sellers and buyers build with eBay data
Price monitoring
Catalog enrichment
Identifier matching
Availability alerts
Competitor listing intelligence
Feed from search to detail
Why run on our eBay Product Scraper API
Pass an item URL or a numeric id and we read the listing's JSON-LD Product block, the stable source eBay ships on every item page, and fall back to the DOM only for fields it omits. Every request runs through residential proxies, anti-bot handling, and retries, returning validated JSON in about 2.6 seconds with no OAuth app to register.
URL or id input
JSON-LD first parsing
Residential proxies and anti-bot
Identifiers extracted
Geo-aware pricing
Validated JSON schema
eBay Product Scraper API versus the eBay Browse API
| Our API | DIY (requests / headless) | eBay Browse API | |
|---|---|---|---|
| Input | Item URL or numeric id | Manual fetch and parse per page | Item id, after OAuth app setup |
| Source of truth | JSON-LD, DOM fallback | You pick and maintain selectors | Catalog API, not the live listing |
| Setup | API key only | Residential proxies, headless, parsers | Developer account, app keys, OAuth token |
| Identifiers (MPN / GTIN) | Parsed into an ids array | You extract them yourself | Available for catalog products |
| Anti-bot and proxies | Residential, built in | You build and maintain it | Not applicable |
| Rate limits | By plan, no OAuth quota | Bound by your proxy pool | Per-app call quotas and throttling |
Start free, scale by usage
| Plan | Price | Best for |
|---|---|---|
| Free | 1,000 requests | Testing and small jobs |
| Pro | $0.60 / 1k | Production workloads |
| Pay-as-you-go | $0.90 / 1k | Spiky or one-off volume |
Median response 2.6s. You only pay for successful requests.
FAQ
An eBay product scraper is a tool that reads a single eBay item page and returns its data in a structured format. Our eBay product scraper API takes an item URL (or the numeric id) and returns title, price, currency, url, image, brand, description, availability, old_price, identifiers, item specifics, item_id, and condition as JSON from one request.
Send one GET request to our ebay/product endpoint with the item url and your API key. We fetch the page over residential proxies, handle eBay's anti-bot checks, retry on failure, and parse the listing's JSON-LD into clean JSON, so you do not maintain selectors against eBay's item-page DOM, which changes often.
Either works. Pass the full item URL to the url parameter, or pass the numeric item id to the id parameter and we build the canonical /itm/{id} URL for you. One of the two is required. Passing the URL from an eBay search result straight into this endpoint is the common pattern for going from a result card to full item detail.
Yes, price and currency come from the listing's JSON-LD offer, and a discounted item also returns old_price from the offer's price specification. One thing to know: eBay localises the offer price to the egress IP's country, so the same listing can render a different currency and amount from different regions. Use the country parameter to pin the region you want.
ids is an array of product identifiers found in the listing's structured data, each an object such as { mpn: ENV155BAE } or { gtin13: ... }, which lets you match an eBay item to your own catalog. additional_properties is an array of item specifics as { name, value } pairs when the seller published them; it comes back empty for listings that expose none, as in the sample above.
We read condition from the item page's condition block. On most listings that yields a value like Brand New or Pre-Owned, but some pages render only the field label (Condition) and load the value in a later state, in which case the field returns the label as-is rather than a fabricated value. When you need condition reliably across a set of items, the search endpoint also reports each card's condition in its results.
Median end-to-end response is about 2.6 seconds, including residential proxy routing, anti-bot handling, retries, and parsing. One call returns the full item payload, so you do not chain requests to assemble a single listing.