eBay Sold Comps Scraper avatar

eBay Sold Comps Scraper

Under maintenance

Pricing

from $2.99 / 1,000 sold comps

Go to Apify Store
eBay Sold Comps Scraper

eBay Sold Comps Scraper

Under maintenance

Collect publicly visible completed eBay listing comparables.

Pricing

from $2.99 / 1,000 sold comps

Rating

0.0

(0)

Developer

w3crawler

w3crawler

Maintained by Community

Actor stats

0

Bookmarked

4

Total users

2

Monthly active users

6 days ago

Last modified

Categories

Security

Limited permissions

Share

Collect publicly visible sold and ended eBay listings as pricing comparables. Supply completed-search URLs or known ended item URLs; the Actor normalizes each result into one record with the item number, title, final price and display text, currency, condition, sold or ended date, sale type, seller, and image. Search URLs are always forced to LH_Sold=1 and LH_Complete=1, requests are bounded by timeout, response size, retry count, and page count, and a sign-in wall or challenge is reported as an access boundary instead of being bypassed.

Get started

  1. Open the Actor Store page and select Try for free or open the Input tab.
  2. Paste one or more https://.../itm/... item URLs into startUrls, or leave startUrls empty and rely on searchUrl for a completed-search crawl.
  3. Keep maxItems and maxPages small for the first run. The saved run used seven item URLs with maxItems: 5 and maxPages: 2.
  4. Start the Actor, open the dataset, and export the comparables as JSON, CSV, or Excel. Open Run summary (OUTPUT_SUMMARY) to check counts, retries, and access-boundary state.

Input

All fields are optional, so an empty input still runs the default iPhone completed search. Unsupported field names and out-of-range values are rejected before requests start.

FieldTypeRequired?DefaultMeaning
startUrlsobject arrayOptionalNot suppliedUp to 20 { "url": "..." } entries. Each must be an HTTPS eBay item (/itm/) or search (/sch/, /s/) URL; search entries get LH_Sold=1 and LH_Complete=1 added. When empty, searchUrl is used.
searchUrlstringOptionalhttps://www.ebay.com/sch/i.html?_nkw=iphone&_sacat=0&LH_Sold=1&LH_Complete=1Completed-search URL used when no startUrls are supplied. The sold and completed filters are always forced on, up to 2,000 characters.
maxItemsintegerOptional25Maximum comparable records saved across all sources, 1–100.
maxPagesintegerOptional3Maximum search pages followed per source, 1–5; item URLs use one page.
timeoutSecsintegerOptional20Timeout per bounded request or browser navigation, 5–120 seconds.
maxBytesintegerOptional5000000Largest response body accepted, 100,000–10,000,000 bytes.
maxRetriesintegerOptional1Extra attempts for timeouts and retryable responses (408, 425, 429, 5xx), 0–3. Challenges and access denials are never retried as transient errors.
browserFallbackbooleanOptionaltrueRender the same public URL in an anonymous browser only after a successful, unchallenged HTTP response contained no comparable evidence.
browserWaitMsintegerOptional2000Wait after DOMContentLoaded before reading rendered evidence, 0–10,000 ms.
userAgentstringOptionalBuilt-in desktop Chrome stringUser-Agent sent with direct requests, up to 300 characters.
proxyConfigurationobjectOptionalNot suppliedStandard Apify Proxy configuration. With a proxy configured, a challenged page is retried on fresh sessions, with at most two attempts for a sign-in wall, after which the boundary is reported.

Example input, matching the sample stored in .actor/input.json:

{
"startUrls": [
{
"url": "https://www.ebay.co.uk/itm/377440218011"
}
],
"maxItems": 5,
"maxPages": 1,
"timeoutSecs": 30,
"browserFallback": false
}

Omitted fields fall back to the schema defaults in the table, so this sample deliberately narrows the run to five comparables on one page and turns the browser fallback off. Item URLs are read as ended listings; only the URLs you supply are visited, and maxItems also caps how many seeded URLs are visited. The saved run added maxRetries: 1 and a proxy configuration, and set maxPages: 2.

Output

The dataset contains one row per unique comparable, de-duplicated by canonical item URL. A row is saved only when the page or card provides an item number, a title, and a parseable final price; pages that expose nothing usable produce a diagnostic in the run summary, not a dataset row.

FieldTypeAvailabilityMeaning
recordTypestringAlwaysRecord label; always sold-comparable.
recordIdstringAlwaysStable identifier, ebay-sold-comparable-<itemId>, or a short hash when no item number is available.
sourceUrlstringAlwaysExact page that produced the row: the item URL or the completed-search page.
httpStatusintegerAlwaysHTTP status of the successful response, normally 200.
accessStatusstringAlwaysAccess outcome; only AVAILABLE rows are saved.
okbooleanAlwaysRequest-level success flag, always true for a saved row.
foundbooleanAlwaysWhether comparable evidence was found, always true for a saved row.
dataAvailablebooleanAlwaysWhether source-backed data was saved, always true.
usedProxybooleanAlwaysWhether the response came through a configured proxy.
sourceTransportstringAlwaysHow the page was read: direct, apify-proxy, or browser.
urlstringAlwaysCanonical https://<host>/itm/<itemId> listing URL.
itemIdstringAlwayseBay item number parsed from the listing URL.
titlestringAlwaysListing title as displayed on the item page or search card.
pricenumberWhen publishedFinal listing price as a number, with separators removed and decimals normalized.
priceTextstringWhen publishedPrice exactly as displayed, for example US $89.30, preserving the marketplace's currency notation.
currencystringWhen publishedThree-letter currency code taken from the price text, or inferred from the $, £, or € symbol.
conditionstringWhen publishedCondition label shown on the page, passed through as displayed.
soldDatestringWhen publishedSale or end date in eBay's short form, for example Wed, 16 Sep at 7:49 AM, without a year or time zone.
saleTypestringWhen publishedsold for a confirmed sale, ended for a listing that closed without a recorded sale.
shippingTextstringWhen publishedShipping or returns wording from a search card; item pages do not publish it in this position.
sellerNamestringWhen publishedSeller display name when the item page or card exposes it.
imageUrlstringWhen publishedPrimary image URL on an ebayimg.com or ebaystatic.com host.
scrapedAtstringAlwaysTime the row was saved, in ISO UTC.

The example below is a real saved row from the 2026-10-25 run, complete as stored.

{
"recordType": "sold-comparable",
"recordId": "ebay-sold-comparable-820007572989",
"sourceUrl": "https://www.ebay.co.uk/itm/820007572989",
"httpStatus": 200,
"accessStatus": "AVAILABLE",
"ok": true,
"found": true,
"dataAvailable": true,
"usedProxy": true,
"sourceTransport": "apify-proxy",
"url": "https://www.ebay.co.uk/itm/820007572989",
"itemId": "820007572989",
"title": "8.8 Differential Cover Rear End Girdle System for Ford Mustang F-150",
"price": 89.3,
"priceText": "US $89.30",
"currency": "USD",
"condition": "New",
"soldDate": "Wed, 16 Sep at 7:49 AM",
"saleType": "sold",
"sellerName": "Trendsphereny",
"imageUrl": "https://i.ebayimg.com/images/g/3VsAAeSwW4tqgQX-/s-l400.jpg",
"scrapedAt": "2026-10-25T20:43:12.190Z"
}

Notes from the other four rows of the same run: the first row (227421081900, GBP 21.25) has no sellerName or shippingText; 377440218011 is a GBP 7,000.00 vehicle recorded as saleType: "ended" with the seller rebre4680; and 407137704260 retains condition: "--" because that is the text eBay displayed for the condition slot. shippingText appears in the schema but no saved item page exposed it, so comparables taken from item URLs may never carry shipping details. soldDate is a display string rather than an ISO timestamp, so parse it with the marketplace locale in mind.

Run summary

Run summary is stored separately from the dataset in the run's key-value store under OUTPUT_SUMMARY.

FieldMeaning
statusActor process outcome: SUCCEEDED or FAILED.
runStatusCanonical run status; matches status.
dataStatusCompleteness of saved rows: COMPLETE, PARTIAL, NO_RESULTS, or FAILED.
datasetItemsRows actually saved.
diagnosticItemsDiagnostic dataset rows; always 0.
diagnosticCountNumber of operational issues recorded.
errorCountSame count expressed as errors; equals diagnosticCount.
diagnosticsArray of { url, error, errorCode, scrapedAt } entries kept outside the comparable dataset.
uniqueItemsDistinct recordId values among saved rows.
sourceCountNumber of seeds used, meaning startUrls entries or 1 when only searchUrl was used.
requestCountRequests attempted, including retries and browser navigations.
successfulRequestsRequests that returned a usable 2xx response without an access boundary.
failedRequestsFailed attempts, including retries that later succeeded.
proxyUsedWhether a proxy configuration was active for the run.
accessBoundaryDetectedWhether a login wall, CAPTCHA, rate limit, geofence, or unsafe redirect was seen.
pagesVisitedPages processed, including pages that later failed.
completedAtTime the summary was written, in ISO UTC.
StatusData statusMeaning
SUCCEEDEDCOMPLETEComparables were saved and no diagnostic was recorded.
SUCCEEDEDPARTIALAt least one comparable was saved, but another page or record failed. Saved rows remain available.
SUCCEEDEDNO_RESULTSEvery source was read cleanly but produced no sold or ended comparable.
FAILEDFAILEDA fatal input error, or every source failed before a comparable was saved.

Example OUTPUT_SUMMARY from the 2026-10-25 run:

{
"status": "SUCCEEDED",
"runStatus": "SUCCEEDED",
"dataStatus": "COMPLETE",
"datasetItems": 5,
"diagnosticItems": 0,
"diagnosticCount": 0,
"errorCount": 0,
"diagnostics": [],
"uniqueItems": 5,
"sourceCount": 7,
"requestCount": 7,
"successfulRequests": 5,
"failedRequests": 2,
"proxyUsed": true,
"accessBoundaryDetected": false,
"pagesVisited": 5,
"completedAt": "2026-10-25T20:43:34.935Z"
}

In this run requestCount (7) exceeds pagesVisited (5) and failedRequests is 2, because two item requests needed a retry before returning a usable page. No diagnostic was recorded, so the run still reports COMPLETE: a retried request that eventually succeeds is not a data gap.

Coverage and limitations

The Actor reads only the item and completed-search pages you provide, up to maxPages search pages per seed and maxItems records overall. eBay's sold and completed filter is frequently answered with a sign-in wall for shared datacenter addresses; when that happens the Actor reports LOGIN_REQUIRED in diagnostics, sets accessBoundaryDetected, and stops that source. It does not sign in, solve CAPTCHAs, or invent a comparable.

saleType reflects the page wording: a confirmed sale is sold, while a listing that was withdrawn or closed without a sale is ended. Both are useful price evidence but they are not the same event, so filter on saleType before averaging. Search-card rows can include shippingText but no saleType; item-page rows can include saleType and sellerName but usually no shipping wording. soldDate is eBay's short display text without a year, and condition is whatever label the page shows, including placeholder dashes. The optional anonymous browser fallback runs only for a successful, unchallenged page that yielded no evidence, and its cost is much higher than a direct request.

Usage and support

Direct HTTP requests are the cheap path; enable browserFallback only when item pages render their comparable details with JavaScript. Cost grows with seeds, pages, retries, and any proxy or browser usage, so start with a handful of item URLs, inspect the dataset and OUTPUT_SUMMARY, then scale. See the Actor's Pricing tab for current account rates.

Use the Actor Issues page to report a problem. Include the run ID, the input used, and the OUTPUT_SUMMARY; do not include tokens, cookies, or private data. This Actor is not affiliated with, endorsed by, or sponsored by eBay. Use it only for public data and in accordance with eBay's terms, robots guidance, and applicable law. Sold listings can reveal seller and buyer activity; use the output only for lawful market-research purposes.