eBay Product Listing Scraper : Item Specifics Condition Photos avatar

eBay Product Listing Scraper : Item Specifics Condition Photos

Pricing

from $3.99 / 1,000 results

Go to Apify Store
eBay Product Listing Scraper : Item Specifics Condition Photos

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

Scrapio

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

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
  • itemId parsed from the listing URL and scrapedAt timestamp added to every row, for downstream dedupe/join
  • Optional detail-page fields (only populated when fetchItemSpecifics is 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 OK response 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 itemId across 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

ParameterRequiredTypeDescriptionExample Value
listingUrlsNoarrayPaste 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"]
urlsNoarrayLegacy alias of listingUrls, kept for backward compatibility with older input JSON. Leave empty and use listingUrls above instead.[]
fetchItemSpecificsNobooleanWhen 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
maxDetailFetchesPerRunNointegerUpper 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
proxyConfigurationNoobjectOptional. 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 (category 260010 + 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

StrategyBest forRun patternOutput format
Real-time enrichmentAppending live eBay fields to inbound recordsOn-demand run per record/batchJSON rows via API/apify_client
Scheduled monitoringPrice, condition, and policy change alertsApify schedule, recurring runDataset diffed run-over-run
Bulk dataset buildResearch or training datasetsOne large run, or several run in parallelCSV/JSON dataset export
Scraper NameWhat it extracts
Amazon Product Details & Variant ASINs ScraperAmazon product pages: details, pricing, and variant ASINs
Amazon Search Scraper: Full Depth & ASIN PositionAmazon search-results pages with ASIN ranking position
Shopify Products Scraper — Descriptions, Specs & TagsShopify storefront product catalogues
Amazon Price Tracker: Deals, Coupons & Lowest Recorded PricePrice-history and deal tracking for Amazon products
Walmart Reviews Scraper: Photos & Text Review FilteringCustomer 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 ApifyClient
import csv
client = 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.

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.

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.