eBay Product Details Scraper With Sold Price & Deal Analytics
Pricing
Pay per usage
eBay Product Details Scraper With Sold Price & Deal Analytics
๐๏ธ eBay Product Details Scraper captures rich listing data in one click โ title, price, images, item specifics, seller ratings, shipping, variations, stock & condition. โก Export to CSV/JSON or API. ๐ Perfect for market research, repricing, SEO, and catalog enrichment.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
SimpleAPI
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
eBay Product Scraper โ Prices, Discounts and Deal Scores
Paste any eBay item page URL and get back the full listing record โ title, images, condition, seller, shipping, item specifics, description โ plus a pricing layer the plain listing view hides: a numeric priceValue and currency, the strike-through wasPrice and discountPercent, sold units and quantityAvailable, and a 0โ100 dealScore computed from discount depth, sold-through demand and seller feedback. Built for resellers, repricers, deal hunters and market-research teams who need eBay listing data, not a screenshot. One optional batch_summary row rolls up min/max/average/median price and average deal score across the whole run. Every field ships in the same run, from the same single page read.
What is the eBay Product Details Scraper With Sold Price & Deal Analytics?
It is an Apify Actor that reads eBay item pages you supply and returns one structured record per listing โ no eBay account, login, or API key required. Each page is fetched exactly once; the pricing, discount, and deal-score fields are all derived from that same read, so nothing gets a second request.
Key features:
- URL-based, not search-based โ feed it exact
ebay.com/itm/...links; it does not crawl eBay's search results (for that, see the related Search Scraper below) - Numeric pricing you can actually sort โ
priceValue+ ISOcurrency, instead of a display string like "US $58.99" - Was-price and discount detection โ a genuine strike-through original price, cross-checked against the buy-box so a sponsored tile's price can never leak in
- Sold-through and stock signals โ
soldunits andquantityAvailable, read straight off the listing page - A configurable 0โ100 deal score โ four weighting profiles let you decide whether discount, demand, or seller trust matters most
- One batch roll-up row per run โ cheapest, dearest, average, median price and average deal score across every listing scraped
- Filters that skip low-value rows before they're saved โ minimum deal score and "discounted only" thresholds
- Standard Apify dataset export โ JSON, CSV, Excel, XML, or an HTML table, plus the Apify API
What data can I extract with the eBay Product Details Scraper?
Every key below is written by the Actor's own row-building code (src/main.py, src/extract_ebay_from_response.py, src/deal_analytics.py) โ not just the dataset's default view, which only surfaces 24 of the fields the row actually carries.
| Field | Example value | Use case |
|---|---|---|
product_title | "UGG Slippers Australian Sheepskin Wool Warm House Slip On Scuff" | Catalog matching |
item_number | "385963123229" | Cross-reference against your own SKU list |
product_price | "R$ 177.99" | The raw display string as shown on the page |
priceValue | 177.99 | Sortable, chartable numeric price |
currency | "BRL" | Currency of priceValue on this specific row |
priceWithCurrency | "BRL 177.99" | Normalized display price |
wasPrice / wasPriceValue | "BRL 210.03" / 210.03 | Original price before discount, text + number |
discountAmount / discountPercent | 32.04 / 15.25 | How much and what % is off |
hasDiscount | true | Quick filter flag for a genuine price cut |
sold | 597 | Units sold shown on the listing |
quantityAvailable / availabilityText | 10 / "More than 10 available" | Stock left, numeric + eBay's own wording |
dealScore / dealRating | 65 / "Good deal" | 0โ100 blended score and its label |
dealScoreBreakdown | { "profile": "balanced", "discountPoints": 11.4, โฆ } | Exact points and weights behind the score |
sellerFeedbackPercent | 99.3 | Seller's positive-feedback rating as a number |
pricePercentileRank | 66.7 | Where this row's price sits among rows saved so far |
product_condition | "Pre-owned" | Condition filter for resale sourcing |
product_image | ["https://i.ebayimg.com/images/g/.../s-l1600.jpg"] | Full-size image URLs |
seller_name | "electronics_outlet_2024" | Seller identity for sourcing decisions |
seller_items_sold | "12.5K" | Seller-level lifetime sold count |
shipping_info / delivery_info | "$4.99 USPS Ground Advantage" / "Est. delivery Aug 4-8" | Landed-cost and timing checks |
return_policy | "30 days returns. Buyer pays for return shipping" | Resale-risk assessment |
item_specifics | { "Brand": "UGG", "Size": "9", "Color": "Chestnut" } | Structured spec table, key/value pairs |
item_description | "Genuine UGG slippers, gently used..." | Full listing description text |
detail_url | "https://www.ebay.com/itm/385963123229" | Canonical listing URL |
source_url | the URL you supplied | Traceback to your original input row |
success / proxyMode / scrapedAt | true / "residential" / "2026-07-30T12:00:00Z" | Run diagnostics and timestamp |
Pricing and deal-score data
Every listing row carries the full pricing block above โ priceValue, wasPriceValue, discountPercent, sold, quantityAvailable, dealScore โ computed entirely from that one page load, with the arithmetic exposed in dealScoreBreakdown so nothing is a black box. A discount is only reported when the page shows a genuine strike-through was-price above the live price in the same currency; if eBay renders the strike-through in the seller's original currency while showing a converted live price, the mismatch is detected and the discount is left null rather than computed wrong.
Filtering and scoring inputs
dealScoreProfile, minDealScore, and discountedListingsOnly are the fields you filter on before the run even finishes: a listing that doesn't clear the deal-score or discount bar is read (so the log still reports it) but never written to the output table, keeping the dataset limited to rows worth reviewing.
Why not build this yourself?
Reading eBay listing pages reliably at any volume means solving problems most one-off scripts never survive: eBay renders several Product structured-data blocks per page (related and sponsored tiles), so naively taking "the first one" returns another item's price; a cold connection gets an error page indistinguishable from a genuinely deleted listing, so the request has to be "warmed" with a prior homepage visit before a 404 can be trusted; and blocked or challenged requests need automatic escalation across proxy tiers, not a single retry.
This Actor already does that work: it selects the structured-data block that matches the page's own item number (never falls back to guessing), warms each pinned connection before treating a 404 as final, and escalates direct โ datacenter โ residential proxy automatically when a request is refused, locking onto whichever tier succeeds for the rest of the run. None of that requires you to write or maintain scraping code โ you supply URLs and get rows back.
Building and maintaining that stack yourself means owning HTML-selector churn every time eBay's DOM changes, proxy rotation and IP reputation, and CAPTCHA/challenge handling โ ongoing engineering cost that this Actor absorbs instead.
How to use data extracted from eBay?
Resellers and dropshippers
Paste your sourcing watch-list of eBay item URLs, set dealScoreProfile to discountFocus if margin is what matters, and filter with minDealScore. The output table gives you priceValue, discountPercent, sold, and quantityAvailable per listing โ enough to decide what to source without opening a single tab.
Repricing and competitor-price monitoring agencies
Run the same URL list on a schedule (Apify Schedules) and diff priceValue / wasPriceValue across runs to catch a competitor's price change or a new discount the moment it appears, across as many client watch-lists as you maintain.
Market research and pricing intelligence
Turn on appendPriceSummaryRow to get one batch_summary row per run with batchMinPrice, batchMaxPrice, batchAvgPrice, batchMedianPrice, batchAvgDiscountPercent, and batchAvgDealScore โ a category price snapshot from a single batch of URLs, with batchPriceRanking giving every listing's rank and percentile.
AI agents and automated pipelines
Because the Actor runs as a standard Apify Actor with structured JSON output, an agent framework can call it as a tool โ pass a batch of item URLs, get back typed pricing and deal-score fields to reason over, with no HTML parsing on the agent's side.
๐ผ Input sample
| Parameter | Required | Type | Description | Example value |
|---|---|---|---|---|
productPageUrls | No | array of strings | One eBay item page per line, copied straight from the address bar. Mix currencies and marketplaces freely โ each row keeps its own currency code. | ["https://www.ebay.com/itm/136689000538"] |
urls | No | array of strings | Legacy field kept so input built for the original eBay Product Details Scraper keeps running unchanged. Used only when productPageUrls is empty. | [] |
dealScoreProfile | No | string (enum) | balanced (45% discount / 30% sold-through / 25% seller rating, default), discountFocus (70% discount), demandFocus (60% sold-through), sellerTrustFocus (60% seller rating). | "discountFocus" |
minDealScore | No | integer, 0โ100, default 0 | Listings scoring below this are read but not saved. 0 keeps every listing. | 60 |
discountedListingsOnly | No | boolean, default false | Save only listings with a genuine strike-through was-price above the current price. | true |
appendPriceSummaryRow | No | boolean, default true | Adds one final batch_summary row comparing every listing scraped this run. | true |
proxyConfiguration | No | object (proxy editor) | Controls how the run connects to eBay. Keep Apify Proxy enabled so the run can recover automatically if a listing page refuses the first attempt. | { "useApifyProxy": true } |
No parameter is required โ the Actor exits with an error only if the resulting URL list is empty.
{"productPageUrls": ["https://www.ebay.com/itm/145073869705","https://www.ebay.com/itm/385963123229"],"dealScoreProfile": "discountFocus","minDealScore": 40,"discountedListingsOnly": true,"appendPriceSummaryRow": true,"proxyConfiguration": { "useApifyProxy": true }}
Common pitfall: discountedListingsOnly and a high minDealScore can silently zero out your output if you set both aggressively on a batch of mostly full-price listings โ the run still succeeds, it just filters everything out. Start with minDealScore at 0 to see the real spread of scores before raising the bar. Also note proxyConfiguration โ if Apify Proxy is switched off entirely and eBay refuses a direct request, the run logs a warning and does not retry through a proxy tier at all, so leaving it enabled is what makes the automatic direct โ datacenter โ residential escalation possible.
๐ฝ Output sample
Output is typed, normalized JSON with a consistent schema across every run โ export straight to JSON, CSV, Excel, XML, or an HTML table, or pull it via the Apify API. A full listing row (all fields the row-building code writes, not just the 24-field default view):
{"seller_name": "electronics_outlet_2024","seller_items_sold": "12.5K","positive_feedback": "99.3% positive","product_title": "UGG Slippers Australian Sheepskin Wool Warm House Slip On Scuff Women Men","product_image": ["https://i.ebayimg.com/images/g/abcAAOSw~~~/s-l1600.jpg"],"product_price": "R$ 177.99","product_condition": "Pre-owned","shipping_info": "$4.99 USPS Ground Advantage; Located in: San Jose, CA","delivery_info": "Estimated delivery Aug 4-8","return_policy": "30 days returns. Buyer pays for return shipping","item_number": "385963123229","item_description": "Genuine UGG slippers, gently used, no stains or odors...","item_specifics": { "Brand": "UGG", "Size": "9", "Color": "Chestnut", "Style": "Scuff" },"detail_url": "https://www.ebay.com/itm/385963123229","priceValue": 177.99,"currency": "BRL","priceWithCurrency": "BRL 177.99","wasPrice": "BRL 210.03","wasPriceValue": 210.03,"discountAmount": 32.04,"discountPercent": 15.25,"hasDiscount": true,"sold": 597,"quantityAvailable": null,"availabilityText": null,"dealScore": 65,"dealRating": "Good deal","dealScoreBreakdown": {"profile": "balanced","discountPoints": 11.4,"discountWeight": 45.0,"demandPoints": 30.0,"demandWeight": 30.0,"sellerTrustPoints": 23.8,"sellerTrustWeight": 25.0,"sellerFeedbackPercent": 99.3},"sellerFeedbackPercent": 99.3,"pricePercentileRank": 66.7,"source_url": "https://www.ebay.com/itm/385963123229","success": true,"proxyMode": "residential","type": "listing","isSummaryRow": false,"scrapedAt": "2026-07-30T12:00:00Z"}
The optional batch_summary row (isSummaryRow: true), when appendPriceSummaryRow is on:
{"type": "batch_summary","isSummaryRow": true,"success": true,"dealScoreProfile": "balanced","batchListingCount": 6,"batchPricedListingCount": 6,"batchCurrency": "BRL","batchMinPrice": 114.5,"batchMaxPrice": 224.13,"batchAvgPrice": 165.87,"batchMedianPrice": 168.0,"batchDiscountedListingCount": 5,"batchAvgDiscountPercent": 15.39,"batchAvgDealScore": 61.5,"batchBestDeal": {"itemNumber": "145073869705","productTitle": "Example Listing Title","dealScore": 74,"priceValue": 114.5,"detailUrl": "https://www.ebay.com/itm/145073869705"},"batchPriceRanking": [{ "itemNumber": "145073869705", "productTitle": "Example Listing Title", "priceValue": 114.5, "currency": "BRL", "priceRank": 1, "pricePercentileRank": 8.3, "dealScore": 74 }],"scrapedAt": "2026-07-30T12:00:00Z"}
A listing that failed to fetch or parse is pushed too, but with success: false โ for example { "source_url": "...", "success": false, "error": "Listing not found โ it has ended or never existed", "errorReason": "not_found", "type": "listing", "isSummaryRow": false, "scrapedAt": "..." }.
Charging note: only listing rows that pass your filters and are actually saved are charged (row_result event). Error rows (success: false) and the batch_summary row are pushed to the dataset uncharged. To see only the charged rows in the dataset, filter on success == true AND isSummaryRow == false.
How do you filter and target specific listings?
This Actor's targeting is deliberately narrow and precise rather than broad: you supply exact item URLs, and three fields control which of those listings actually reach your output table.
- URL-based scope, not category or query. There is no keyword or category search here โ every listing has to be an exact
ebay.com/itm/...page you already have. This trades discovery for accuracy: no ranking algorithm decides what you see, and mixed currencies/marketplaces in one batch each keep their owncurrencycode correctly. - Quality thresholds via
minDealScore. Rather than filtering on a single raw field,minDealScorefilters on the blended 0โ100 score, which you tune withdealScoreProfilefirst. Set the profile to match what "good" means for your use case, then raiseminDealScoreuntil only the listings worth reviewing remain. - A binary discount gate via
discountedListingsOnly. This keeps only listings with a real strike-through was-price above the live price โ a much stricter filter than "cheap," since a listing can be cheap without ever having been marked down. - Volume control is simply the URL list length โ there is no
maxItemscap; every URL you paste is processed, in order, and pagination does not apply since the input is a list of pages, not a search result.
{ "productPageUrls": ["https://www.ebay.com/itm/145073869705"], "dealScoreProfile": "demandFocus", "minDealScore": 50 }
{ "productPageUrls": ["https://www.ebay.com/itm/385963123229"], "discountedListingsOnly": true, "dealScoreProfile": "discountFocus" }
{ "productPageUrls": ["https://www.ebay.com/itm/172675216344"], "dealScoreProfile": "sellerTrustFocus", "minDealScore": 70, "appendPriceSummaryRow": false }
Want to try other eBay and marketplace scrapers?
| Scraper | What it extracts |
|---|---|
| Ebay Search Scraper With Buyer Reviews & Ratings | Searches eBay by keyword and returns listing rows plus each seller's buyer-feedback reviews (rating, comment, verified-purchase flag) fetched per listing |
| Etsy Reviews Scraper | Scrapes Etsy shop reviews at scale โ buyer, rating, text, date, and product details per review |
| Shein Search Products Scraper By Category, Store & Product URL | Extracts Shein product search results by keyword, category, store, or direct product URL |
How to extract eBay data programmatically
This Actor runs as a standard Apify Actor: one Console run or one API call, structured JSON back โ no separate signup or credentials beyond your Apify account.
Python example
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("<YOUR_USERNAME>/ebay-product-details-scraper-with-sold-price-and-deal-analytics").call(run_input={"productPageUrls": ["https://www.ebay.com/itm/385963123229"],"dealScoreProfile": "discountFocus","minDealScore": 40,})for row in client.dataset(run["defaultDatasetId"]).iterate_items():if row.get("success") and not row.get("isSummaryRow"):print(row["product_title"], row["priceValue"], row["dealScore"])
Export to spreadsheets or CRM
Every run's dataset can be exported directly to CSV or Excel from the Apify Console, or pulled via the Apify API as JSON. Map product_title โ Product Name, priceValue + currency โ Price/Currency columns, dealScore โ a priority column, and source_url โ a link-back column in your spreadsheet or CRM import.
There is no dedicated MCP server verified for this Actor; call it as a standard HTTP-based Apify Actor from any agent framework that can make an authenticated API call.
Is it legal to scrape eBay?
Scraping publicly visible eBay listing pages for product and pricing data is generally legal โ these are public product listings, not access-gated personal profiles. This Actor collects business and product data (price, discount, stock, item specifics) rather than personal data about individuals, so GDPR's personal-data rules do not attach to the core output; seller_name identifies a store/seller account, not a private individual. eBay's own Terms of Service and any applicable database-rights law still govern how scraped listing data may be stored, reused, or redistributed. Consult legal counsel for commercial applications involving bulk storage of this data.
โ FAQ
How does the Actor know a listing has ended versus failed to load?
It checks for eBay's own "listing gone" page shape โ confirmed live on 2026-07-30 against two nonexistent item numbers as an HTTP 404 with the title "Discover error | eBay" โ and reports it distinctly as success: false, errorReason: "not_found", rather than lumping it in with a generic fetch failure.
Can I get seller feedback and sold-count data along with the listing?
Yes โ sellerFeedbackPercent and sold are read from the same page load as everything else, with no extra request. If a listing simply doesn't display a sold count or a strike-through price, the field comes back null, not a guessed value.
How accurate is the price and discount data?
The Actor returns exactly what the listing page displays at request time โ priceValue, wasPriceValue, and discountPercent are computed from that page's own price string and structured data, cross-checked against the buy-box so a related item's price can't leak in. Accuracy depends on eBay's own page content staying current; re-run the URL if you need a fresh read.
How many listings can I scrape per run?
There is no maxItems cap in the input schema โ every URL you paste in productPageUrls (or the legacy urls field) is processed, in the order supplied. minDealScore and discountedListingsOnly can reduce how many of those end up saved, but do not limit how many are read.
How does the deal score actually work, and can I change what it weighs?
dealScoreProfile picks one of four weight sets across discount depth, sold-through demand, and seller feedback (balanced 45/30/25, discountFocus 70/15/15, demandFocus 20/60/20, sellerTrustFocus 20/20/60). The exact points computed for each signal are exposed per row in dealScoreBreakdown, so the score is never a black box โ the same listing can score differently under a different profile.
Does this scraper work with Claude, ChatGPT, and AI agent frameworks?
There is no MCP server verified for this Actor. It is callable as a standard HTTP endpoint via the Apify API by any agent framework or script that can make an authenticated API call, returning structured JSON an agent can reason over directly.
Can I use this without an eBay developer account or API key?
Yes. You supply eBay item page URLs and, optionally, Apify Proxy settings โ no eBay account, login, or API key of any kind is required to run it.
What happens if I turn off Apify Proxy?
The run tries a direct connection only. If eBay refuses that request, the run logs a warning and does not escalate to a proxy tier โ leaving Apify Proxy enabled is what allows the automatic direct โ datacenter โ residential escalation built into the Actor.
Conclusion
The eBay Product Details Scraper With Sold Price & Deal Analytics turns a plain list of eBay item URLs into a sortable pricing and deal-analytics dataset โ full listing details plus numeric price, discount, sold-through, and a transparent 0โ100 deal score, with an optional batch summary row for the whole run. It's built for resellers, repricers, and market-research teams who need structured eBay pricing data without writing or maintaining scraping code. Paste your URLs into the input and start a run on the Apify platform to get your first dataset.