eBay Product Listing Scraper : Item Specifics Condition Photos
Pricing
from $3.99 / 1,000 results
eBay Product Listing Scraper : Item Specifics Condition Photos
eBay Product Listing Scraper — Scrape eBay product listings with item specifics, condition, photos, prices, seller details, shipping information, availability, and listing URLs. Extract structured product data for catalog research, competitor analysis, pricing insights, and marketplace monitoring.
Pricing
from $3.99 / 1,000 results
Rating
0.0
(0)
Developer
Scrapio
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
eBay Listing Scraper — Extract Specifics, Condition and Photos
Scrape eBay search, category, and listing pages into structured JSON — one row per listing, with an optional per-listing detail fetch that adds item specifics (brand, size, color, model…), full condition text, a full-resolution photo gallery, and shipping/return/delivery policy text. Unlike scraping frameworks that hand you raw HTML, eBay Listing Scraper returns typed JSON — ready for your model, your database, or your pipeline without any parsing. No eBay account, login, or API key needed. This guide covers every input and output field and how teams actually run it: real-time enrichment, scheduled price/condition monitoring, and bulk dataset builds.
🧭 What Does eBay Listing Scraper Do?
eBay Listing Scraper reads eBay search-results, category, and item-listing pages and turns each product card into a structured dataset row: title, price, condition, image, and buying/shipping attributes. Turn on fetchItemSpecifics and it also visits each listing's own item page to pull the full item-specifics table, complete condition text, a full-resolution image gallery, and shipping/return/delivery policy text. No eBay account or login is required — every request is an anonymous HTTP fetch of a public page.
- 📦 Bulk search, category, and listing-page input — paste as many URLs as you need in one run
- 🔍 Optional item-specifics table (Brand, Size, Color, Model, and whatever else the seller filled in)
- 🩺 Full condition text from the item page, not just the short search-card label
- 🖼️ Every image URL upgraded to eBay's real maximum resolution (
s-l1600) - 🖼️ Full photo gallery per listing when detail fetch is on
- 🚚 Shipping, return, and delivery policy text pulled straight from the item page
- 🆔 eBay's own item ID and a same-run dedup pass, so duplicate cards across overlapping search pages are saved once
⚡ Features & Capabilities
eBay Listing Scraper's capabilities split into the always-on search-card extraction and the optional item-detail enrichment.
Core features
- Search-card fields on every row:
product_title,condition,price,original_price,image_url,card_attribute - Structured attributes parsed out of the search card's free-text chips:
shippingCost,itemLocation,buyingFormat,returnsAccepted itemIdparsed from the listing URL andscrapedAttimestamp added to every row, for downstream dedupe/join- Optional detail-page fields (only populated when
fetchItemSpecificsis on):itemSpecifics,conditionDetail,imageGallery,shippingInfo,returnPolicy,deliveryInfo - Image URLs are rewritten from whatever thumbnail size eBay serves to
s-l1600— eBay's real maximum resolution — on both the search card and the detail-page gallery - Content is validated before a fetch is accepted — a
200 OKresponse carrying an empty/shell page (a real failure mode on cold connections) is rejected and retried, not saved as an empty result - Automatic connection fallback: no-proxy → Apify datacenter proxy → Apify residential proxy (up to 3 attempts), sticky once a route proves itself, re-validated per page
- Same-run duplicate protection keyed on
itemIdacross all input URLs in one run
eBay Listing Scraper within the Scrapio data stack
This is currently the only eBay-focused scraper in the Scrapio catalogue, covering both the search/category surface and the item-detail surface (specifics, condition, photos, policies) in a single run — there is no second Scrapio eBay Actor to split entity coverage with. For product data on other marketplaces, see the Related Scrapers table below.
💼 Why do developers and data teams scrape eBay?
🏢 Resellers and arbitrage sellers
Paste a saved search or category URL and get every listing's price, condition, and shippingCost in one dataset — compare sourcing options across dozens of listings without opening each one. Turn on fetchItemSpecifics to pull itemSpecifics (Brand, Size, Color, Model) so cross-listing comparison doesn't depend on reading free-text titles.
📊 AI training data and RAG indexing
itemSpecifics is the highest-information field for this platform — a structured key-value table (Brand, Size, Color, Model, and whatever else the seller filled in) that needs no free-text parsing before indexing. Two uses: (1) RAG enrichment — index product_title, conditionDetail, and itemSpecifics so a retrieval layer can answer "what condition/spec is this listing" without re-fetching eBay; (2) training data — card_attribute and itemSpecifics give consistently-shaped structured records across thousands of listings, more reliable for a training set than parsing raw listing HTML.
📱 Competitive and market intelligence
Track price, original_price, and returnsAccepted across a competitor's listings over repeated scheduled runs to see pricing and policy changes as they happen, without manually re-checking listings.
🔬 Research and academic use
Public eBay listing data — pricing, condition distribution, item specifics — supports market-structure and pricing research. Scope is limited to what's publicly visible on the page; no account-gated or private data is accessed.
🎥 Product and SaaS development
Build a price-comparison tool, inventory-enrichment API, or condition-monitoring dashboard on top of the structured rows this Actor returns — no HTML parsing layer to build or maintain.
🍚 Input Parameters
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
listingUrls | No | array | Paste one or more eBay search, category, or listing page URLs. Example: search results for "Nike shoes", a category page, or a saved search. | ["https://www.ebay.com/sch/260010/i.html?_nkw=shoe&Brand=Nike"] |
urls | No | array | Legacy alias of listingUrls, kept for backward compatibility with older input JSON. Leave empty and use listingUrls above instead. | [] |
fetchItemSpecifics | No | boolean | When ON, the Actor also visits each listing's own detail page (one extra fetch per listing, capped below) and adds itemSpecifics, conditionDetail, imageGallery, shippingInfo, returnPolicy and deliveryInfo to that row. Default OFF (search-card fields only, fastest run). | true |
maxDetailFetchesPerRun | No | integer | Upper limit on how many listing detail pages are visited in one run when the toggle above is ON. Listings beyond this cap still get their normal search-card fields, just no detail fields. Default 20, minimum 0. | 20 |
proxyConfiguration | No | object | Optional. Leave default for most runs — the Actor automatically retries through alternate connection routes on its own. Set your own proxy selection here to use it as this run's primary route. | {"useApifyProxy": false} |
Nothing is required by the schema itself, but the Actor needs at least one URL from listingUrls or urls to do anything — without one, it logs an error and exits with no dataset rows.
JSON input example:
{"listingUrls": ["https://www.ebay.com/sch/260010/i.html?_nkw=shoe&Brand=Nike"],"fetchItemSpecifics": true,"maxDetailFetchesPerRun": 20,"proxyConfiguration": { "useApifyProxy": false }}
Supported URL types and input formats
listingUrls (and its legacy alias urls) each accept either a plain string beginning with http, or an object with a url key — anything else in the array is silently skipped. Three real input shapes:
- Search results:
https://www.ebay.com/sch/i.html?_nkw=nike+air+max - Category page:
https://www.ebay.com/sch/260010/i.html?_nkw=shoe&Brand=Nike(category260010+ brand filter) - Object form:
{"url": "https://www.ebay.com/sch/i.html?_nkw=vintage+camera"}
If both listingUrls and urls are supplied, listingUrls wins — urls is only read when listingUrls is empty.
📦 Output Format
Every run pushes typed, normalized JSON rows to the Apify dataset — one row per listing, same field set on every row regardless of input URL. The dataset's own default view already shows the complete row: all 20 fields the Actor writes, not a trimmed subset. Export as JSON, CSV, Excel, or any format the Apify dataset export supports.
Output for a listing — fetchItemSpecifics off (default)
{"itemId": "356789012345","product_title": "Nike Air Max 270 Men's Running Shoes - White/Black Size 10","condition": "Pre-Owned","conditionDetail": null,"price": "$54.99","original_price": "$89.99","image_url": "https://i.ebayimg.com/images/g/abc123AAOSw/s-l1600.jpg","imageGallery": null,"card_attribute": ["Buy It Now", "+$7.99 delivery", "Located in United States", "Free returns"],"shippingCost": "+$7.99 delivery","itemLocation": "Located in United States","buyingFormat": "Buy It Now","returnsAccepted": "Free returns","shippingInfo": null,"returnPolicy": null,"deliveryInfo": null,"itemSpecifics": null,"product_url": "https://www.ebay.com/itm/356789012345","input_url": "https://www.ebay.com/sch/260010/i.html?_nkw=shoe&Brand=Nike","scrapedAt": "2026-08-15T09:41:12.048213Z"}
Output for a listing — fetchItemSpecifics on
{"itemId": "356789012345","product_title": "Nike Air Max 270 Men's Running Shoes - White/Black Size 10","condition": "Pre-Owned","conditionDetail": "Pre-owned: A shoe that has been worn previously. See the seller's listing for full details and description of any imperfections.","price": "$54.99","original_price": "$89.99","image_url": "https://i.ebayimg.com/images/g/abc123AAOSw/s-l1600.jpg","imageGallery": ["https://i.ebayimg.com/images/g/abc123AAOSw/s-l1600.jpg","https://i.ebayimg.com/images/g/def456AAOSw/s-l1600.jpg","https://i.ebayimg.com/images/g/ghi789AAOSw/s-l1600.jpg"],"card_attribute": ["Buy It Now", "+$7.99 delivery", "Located in United States", "Free returns"],"shippingCost": "+$7.99 delivery","itemLocation": "Located in United States","buyingFormat": "Buy It Now","returnsAccepted": "Free returns","shippingInfo": "Located in: Columbus, Ohio, United States; $7.99 USPS Ground Advantage","returnPolicy": "30 days returns. Buyer pays for return shipping.","deliveryInfo": "Estimated between Wed, Aug 20 and Mon, Aug 25","itemSpecifics": {"Brand": "Nike","Size": "10","Color": "White/Black","Style": "Running, Cross Training","Department": "Men"},"product_url": "https://www.ebay.com/itm/356789012345","input_url": "https://www.ebay.com/sch/260010/i.html?_nkw=shoe&Brand=Nike","scrapedAt": "2026-08-15T09:41:12.048213Z"}
Schema stability and export options
Field names stay the same across runs — when eBay changes its front-end markup, the Actor's parsing selectors are updated internally, not the output schema, so downstream integrations don't break. Detail-only fields (conditionDetail, imageGallery, shippingInfo, returnPolicy, deliveryInfo, itemSpecifics) are null — never a faked empty value — whenever fetchItemSpecifics is off, a listing falls past maxDetailFetchesPerRun, or the detail page couldn't be validated as real content. Export from the Apify Console as JSON, CSV, Excel, XML, or RSS, or pull rows programmatically with the Apify API or apify_client.
💡 eBay Listing Scraper Strategy Guide
🎯 Strategy 1: Real-time enrichment pipeline
Trigger a run from your inventory or order system whenever you need current eBay data for a batch of listings: pass their URLs in listingUrls with fetchItemSpecifics on, then read back itemSpecifics, conditionDetail, shippingInfo, and returnPolicy and append them to your own product record. Because detail-only fields are null (not faked) when a fetch fails, your write-back logic can safely skip nulls instead of overwriting good data.
🎯 Strategy 2: Scheduled monitoring and alerting
Set up an Apify schedule that reruns the same listingUrls (a saved search or a watched category) on a recurring cadence, with fetchItemSpecifics off to keep runs cheap. Diff each run's price, original_price, condition, and returnsAccepted against the previous run's dataset, keyed on itemId, and alert on the delta that matters — a price drop, a condition change, a returns policy that disappeared.
🎯 Strategy 3: Bulk dataset build
Feed a long list of search or category URLs into listingUrls for a research or training dataset, or split the list across several parallel Apify runs via the API. The Actor doesn't impose its own concurrency cap — any ceiling comes from your Apify plan's concurrent-run limit, not from this code. Aggregate the resulting datasets and export to CSV or load into a database.
Strategy comparison at a glance
| Strategy | Best for | Run pattern | Output format |
|---|---|---|---|
| Real-time enrichment | Appending live eBay fields to inbound records | On-demand run per record/batch | JSON rows via API/apify_client |
| Scheduled monitoring | Price, condition, and policy change alerts | Apify schedule, recurring run | Dataset diffed run-over-run |
| Bulk dataset build | Research or training datasets | One large run, or several run in parallel | CSV/JSON dataset export |
🌴 Related eBay Scrapers & Tools
| Scraper Name | What it extracts |
|---|---|
| Amazon Product Details & Variant ASINs Scraper | Amazon product pages: details, pricing, and variant ASINs |
| Amazon Search Scraper: Full Depth & ASIN Position | Amazon search-results pages with ASIN ranking position |
| Shopify Products Scraper — Descriptions, Specs & Tags | Shopify storefront product catalogues |
| Amazon Price Tracker: Deals, Coupons & Lowest Recorded Price | Price-history and deal tracking for Amazon products |
| Walmart Reviews Scraper: Photos & Text Review Filtering | Customer review text and photos from Walmart product pages |
🔌 How to integrate eBay Listing Scraper with your stack
eBay Listing Scraper works with any language or tool that can make an HTTP request to the Apify API.
Python
from apify_client import ApifyClientimport csvclient = ApifyClient("<YOUR_APIFY_TOKEN>")run_input = {"listingUrls": ["https://www.ebay.com/sch/260010/i.html?_nkw=shoe&Brand=Nike"],"fetchItemSpecifics": True,"maxDetailFetchesPerRun": 20,}run = client.actor("ebay-product-listing-scraper-item-specifics-condition-photos").call(run_input=run_input)rows = list(client.dataset(run["defaultDatasetId"]).iterate_items())with open("ebay_listings.csv", "w", newline="", encoding="utf-8") as f:writer = csv.DictWriter(f, fieldnames=rows[0].keys())writer.writeheader()writer.writerows(rows)print(f"Saved {len(rows)} listings to ebay_listings.csv")
Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('ebay-product-listing-scraper-item-specifics-condition-photos').call({listingUrls: ['https://www.ebay.com/sch/260010/i.html?_nkw=shoe&Brand=Nike'],fetchItemSpecifics: true,maxDetailFetchesPerRun: 20,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(`Collected ${items.length} listings`);console.log(items[0]);
Async and scheduled pipelines
For large or recurring jobs, start the run through the Apify API and poll for completion instead of waiting synchronously, or set up an Apify Schedule to rerun the same input on a cron cadence. Apify Webhooks can notify your endpoint when a run finishes (e.g. on ACTOR.RUN.SUCCEEDED), so you don't have to poll — useful for fire-and-forget large listingUrls batches.
🎯 Who Needs eBay Listing Scraper? (Use Cases & Industries)
🏢 Resellers and arbitrage sellers
Source across many listings at once — compare price, condition, and shippingCost before committing to a purchase, without opening each listing by hand.
📊 AI/RAG and data teams
Index itemSpecifics and conditionDetail as structured context for a retrieval layer, or use them as consistently-shaped fields in a training dataset — no HTML parsing step required.
📱 Competitive and market-intelligence teams
Watch a competitor's or a category's listings on a schedule, tracking price, original_price, and returnsAccepted over time to catch pricing and policy changes as they happen.
🔬 Researchers
Build public-data datasets on eBay pricing, condition distribution, and item specifics for market-structure or pricing research — scope limited to what's visible on public pages.
🎥 Product and SaaS builders
Use the structured rows as the data layer for a price-comparison tool, inventory-enrichment API, or condition/policy monitoring product, without building or maintaining an eBay HTML parser.
⚖️ Is it legal to scrape eBay?
Scraping publicly accessible eBay pages is generally lawful in the United States — courts have held that accessing data that doesn't require bypassing an authentication wall is not a computer-crime violation (hiQ Labs, Inc. v. LinkedIn Corp., 938 F.3d 985, 9th Cir. 2019). Separately, eBay's own terms of service restrict automated access to its site; violating that is a contract/civil-law question, not a criminal one, and courts have found high-volume automated querying that measurably burdens eBay's servers can support a trespass-to-chattels claim (eBay, Inc. v. Bidder's Edge, Inc., 100 F. Supp. 2d 1058, N.D. Cal. 2000) — a reason to scrape at a reasonable pace rather than hammer the site. eBay Listing Scraper returns product and business data — listing titles, prices, condition, and item specifics — not personal data about buyers or sellers, so data-protection frameworks like GDPR don't attach; the relevant question is contractual (ToS) and, in the EU, potentially database-rights, not privacy law. eBay Listing Scraper returns only publicly accessible data. What you do with that data is your responsibility — consult legal counsel for commercial applications.
❓ Frequently asked questions
Does eBay Listing Scraper work without an eBay account?
Yes. Every request is an anonymous HTTP fetch of a public page — no eBay login, account, cookies, or API key are used or required.
How does eBay Listing Scraper handle eBay's anti-scraping measures?
It walks a connection ladder — no proxy, then Apify datacenter proxy, then Apify residential proxy (up to 3 attempts) — sticking with whichever route works and re-validating it on every page. Item-detail fetches, which eBay guards more tightly than search pages, additionally use Chrome TLS impersonation (via the impit client) when available. Every fetch is content-validated (real listing-card or item-page markup, not just an HTTP 200) before it's accepted; a shell/empty page is retried down the ladder instead of saved.
Can I run eBay Listing Scraper at scale without getting blocked?
The Actor retries automatically through the connection ladder described above and re-validates content per page, rather than trusting a single HTTP status code. There's no publicly documented uptime or success-rate figure for this behavior. Core search-card scraping has no built-in volume cap; the optional item-detail fetch is capped by maxDetailFetchesPerRun (default 20) to bound cost and runtime.
How fresh is the data eBay Listing Scraper returns?
Live. Every run fetches pages directly over HTTP at run time — there is no caching layer — and every row carries its own scrapedAt timestamp.
Is it legal to automate requests against eBay's listing pages?
Accessing public eBay pages isn't itself a computer-crime violation under U.S. case law (hiQ Labs, Inc. v. LinkedIn Corp., 9th Cir. 2019), but eBay's terms of service restrict automated access, and courts have previously found that high-volume automated querying straining eBay's servers can support a trespass-to-chattels claim (eBay, Inc. v. Bidder's Edge, Inc., N.D. Cal. 2000). Scrape at a reasonable pace and treat ToS compliance as your own responsibility.
Which eBay fields work best for AI training and RAG indexing?
itemSpecifics — a structured Brand/Size/Color/Model key-value table — is the highest-information field once fetchItemSpecifics is on. For RAG, combine it with product_title and conditionDetail for retrieval-ready listing context. For training data, card_attribute and itemSpecifics give consistently-shaped structured records across listings. All fields return as typed JSON — strings, arrays, and key-value objects — with no HTML parsing required before use.
Does eBay Listing Scraper work with Claude, ChatGPT, and other AI agent tools?
Yes, as an HTTP endpoint callable by any agent framework through the Apify API — every response is typed JSON, so an agent can consume it directly without a parsing step before passing it into a context window.
What's the difference between listingUrls and urls?
listingUrls is the current input field; urls is a legacy alias kept only for backward compatibility with older input JSON. If both are set, listingUrls wins — urls is read only when listingUrls is empty.
Why are some fields null even with fetchItemSpecifics on?
Detail fields are set to null rather than a faked value whenever the underlying data genuinely isn't present on the page (e.g. conditionDetail when eBay's own condition-text block isn't rendered for that listing) or when the item-detail page couldn't be fetched and content-validated at all — the row still keeps its search-card fields either way.
ℹ️ Disclaimer
eBay Listing Scraper extracts only publicly available data from eBay. This tool is intended for lawful use cases only. Users are responsible for complying with eBay's terms of service and applicable data protection laws in their jurisdiction.