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 it is hard
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.
Quickstart
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"} Params
| 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. |
Response
{
"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. |
Use it for
Price monitoring
Catalog enrichment
Identifier matching
Availability alerts
How it compares
| 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 |
Pricing
| 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
What is an eBay product scraper?
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.
How do I scrape an eBay listing without writing a parser?
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.
Can I pass an item URL or only an id?
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.
Does it return the exact price and currency?
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.
What are the ids and additional_properties fields?
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.
Why does condition sometimes come back as a label?
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.