eBay Sold Comps Scraper
Under maintenancePricing
from $2.99 / 1,000 sold comps
eBay Sold Comps Scraper
Under maintenanceCollect publicly visible completed eBay listing comparables.
Pricing
from $2.99 / 1,000 sold comps
Rating
0.0
(0)
Developer
w3crawler
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
2
Monthly active users
6 days ago
Last modified
Categories
Security
Limited permissionsShare
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
- Open the Actor Store page and select Try for free or open the Input tab.
- Paste one or more
https://.../itm/...item URLs intostartUrls, or leavestartUrlsempty and rely onsearchUrlfor a completed-search crawl. - Keep
maxItemsandmaxPagessmall for the first run. The saved run used seven item URLs withmaxItems: 5andmaxPages: 2. - 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.
| Field | Type | Required? | Default | Meaning |
|---|---|---|---|---|
startUrls | object array | Optional | Not supplied | Up 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. |
searchUrl | string | Optional | https://www.ebay.com/sch/i.html?_nkw=iphone&_sacat=0&LH_Sold=1&LH_Complete=1 | Completed-search URL used when no startUrls are supplied. The sold and completed filters are always forced on, up to 2,000 characters. |
maxItems | integer | Optional | 25 | Maximum comparable records saved across all sources, 1–100. |
maxPages | integer | Optional | 3 | Maximum search pages followed per source, 1–5; item URLs use one page. |
timeoutSecs | integer | Optional | 20 | Timeout per bounded request or browser navigation, 5–120 seconds. |
maxBytes | integer | Optional | 5000000 | Largest response body accepted, 100,000–10,000,000 bytes. |
maxRetries | integer | Optional | 1 | Extra attempts for timeouts and retryable responses (408, 425, 429, 5xx), 0–3. Challenges and access denials are never retried as transient errors. |
browserFallback | boolean | Optional | true | Render the same public URL in an anonymous browser only after a successful, unchallenged HTTP response contained no comparable evidence. |
browserWaitMs | integer | Optional | 2000 | Wait after DOMContentLoaded before reading rendered evidence, 0–10,000 ms. |
userAgent | string | Optional | Built-in desktop Chrome string | User-Agent sent with direct requests, up to 300 characters. |
proxyConfiguration | object | Optional | Not supplied | Standard 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.
| Field | Type | Availability | Meaning |
|---|---|---|---|
recordType | string | Always | Record label; always sold-comparable. |
recordId | string | Always | Stable identifier, ebay-sold-comparable-<itemId>, or a short hash when no item number is available. |
sourceUrl | string | Always | Exact page that produced the row: the item URL or the completed-search page. |
httpStatus | integer | Always | HTTP status of the successful response, normally 200. |
accessStatus | string | Always | Access outcome; only AVAILABLE rows are saved. |
ok | boolean | Always | Request-level success flag, always true for a saved row. |
found | boolean | Always | Whether comparable evidence was found, always true for a saved row. |
dataAvailable | boolean | Always | Whether source-backed data was saved, always true. |
usedProxy | boolean | Always | Whether the response came through a configured proxy. |
sourceTransport | string | Always | How the page was read: direct, apify-proxy, or browser. |
url | string | Always | Canonical https://<host>/itm/<itemId> listing URL. |
itemId | string | Always | eBay item number parsed from the listing URL. |
title | string | Always | Listing title as displayed on the item page or search card. |
price | number | When published | Final listing price as a number, with separators removed and decimals normalized. |
priceText | string | When published | Price exactly as displayed, for example US $89.30, preserving the marketplace's currency notation. |
currency | string | When published | Three-letter currency code taken from the price text, or inferred from the $, £, or € symbol. |
condition | string | When published | Condition label shown on the page, passed through as displayed. |
soldDate | string | When published | Sale or end date in eBay's short form, for example Wed, 16 Sep at 7:49 AM, without a year or time zone. |
saleType | string | When published | sold for a confirmed sale, ended for a listing that closed without a recorded sale. |
shippingText | string | When published | Shipping or returns wording from a search card; item pages do not publish it in this position. |
sellerName | string | When published | Seller display name when the item page or card exposes it. |
imageUrl | string | When published | Primary image URL on an ebayimg.com or ebaystatic.com host. |
scrapedAt | string | Always | Time 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.
| Field | Meaning |
|---|---|
status | Actor process outcome: SUCCEEDED or FAILED. |
runStatus | Canonical run status; matches status. |
dataStatus | Completeness of saved rows: COMPLETE, PARTIAL, NO_RESULTS, or FAILED. |
datasetItems | Rows actually saved. |
diagnosticItems | Diagnostic dataset rows; always 0. |
diagnosticCount | Number of operational issues recorded. |
errorCount | Same count expressed as errors; equals diagnosticCount. |
diagnostics | Array of { url, error, errorCode, scrapedAt } entries kept outside the comparable dataset. |
uniqueItems | Distinct recordId values among saved rows. |
sourceCount | Number of seeds used, meaning startUrls entries or 1 when only searchUrl was used. |
requestCount | Requests attempted, including retries and browser navigations. |
successfulRequests | Requests that returned a usable 2xx response without an access boundary. |
failedRequests | Failed attempts, including retries that later succeeded. |
proxyUsed | Whether a proxy configuration was active for the run. |
accessBoundaryDetected | Whether a login wall, CAPTCHA, rate limit, geofence, or unsafe redirect was seen. |
pagesVisited | Pages processed, including pages that later failed. |
completedAt | Time the summary was written, in ISO UTC. |
| Status | Data status | Meaning |
|---|---|---|
SUCCEEDED | COMPLETE | Comparables were saved and no diagnostic was recorded. |
SUCCEEDED | PARTIAL | At least one comparable was saved, but another page or record failed. Saved rows remain available. |
SUCCEEDED | NO_RESULTS | Every source was read cleanly but produced no sold or ended comparable. |
FAILED | FAILED | A 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.