eBay Sold Items Scraper
Under maintenancePricing
$1.20 / 1,000 sold listings
eBay Sold Items Scraper
Under maintenancePull eBay's own record of completed and sold listings for any keyword or search link: the real sold date and sale price, plus condition, format, delivery cost and item location. Filter by price, condition, category and date, choose the eBay site, and get results in that site's own currency.
Pricing
$1.20 / 1,000 sold listings
Rating
0.0
(0)
Developer
Hamza
Maintained by CommunityActor stats
0
Bookmarked
18
Total users
13
Monthly active users
2 days ago
Last modified
Categories
Share
Turn any list of keywords or eBay search links into a clean dataset of completed and sold listings — the sold date and the price each one actually changed hands for, straight from eBay's own record of finished sales. It is built for anyone who prices against real transactions instead of asking prices: resellers valuing stock, sellers setting a competitive price, analysts building comparables, and brands watching what their products really sell for.
eBay now gates sold history behind sign-in. Since around July 2026, eBay redirects logged-out sold/completed searches to a sign-in wall, so a logged-out read cannot return sold records. When the actor meets that wall it reports each affected query as failed with a clear message — never as an empty result — and a run where every query hits the wall fails loudly instead of returning zero rows.
What you can do with it
- Value inventory against real sold prices — see what identical items actually sold for, not just what sellers are asking today.
- Track a market over time by scheduling a run with a date cutoff, so each run picks up only the sales that closed since the last one.
- Build price comparables for a product from its recent completed sales, with the sold date, condition and buying format on every row.
- Compare sold prices across conditions — new, used and refurbished — with a single filter.
- Research demand by pulling the recent sold history behind a keyword or category and counting how many units moved.
- Feed realized-price data into your own pricing model, valuation tool or spreadsheet.
What you get
One row per sold listing. Abridged sample:
{"query": "iphone 15","marketplace": "US","itemId": "327313873278","title": "Apple iPhone 15 128GB Unlocked - Very Good Condition","soldDate": "2026-08-17","soldPrice": { "amount": 512.0, "currency": "USD" },"bestOfferAccepted": false,"priceIsListingPrice": false,"condition": "Used","buyingFormat": "BUY_IT_NOW","shippingCost": 0,"location": "United States","imageUrl": "https://i.ebayimg.com/images/g/1x8AAOSwabcDeFgh/s-l500.webp","url": "https://www.ebay.com/itm/327313873278","scrapedAt": "2026-08-18T12:00:00.000Z"}
Input reference
| Setting | Type | Default | What it does |
|---|---|---|---|
| Search queries | list of text | iphone 15 | The keywords to look up in eBay's sold and completed listings. Each entry can also be a full eBay search link — its keyword, site, category, price band and condition are picked up automatically. Required. |
| Maximum sold records per query | whole number | 200 | Stop after this many sold records for each query. Results come back newest first, so a small limit returns the most recent sales. Maximum 10,000. |
| Only sales on or after (YYYY-MM-DD) | text | — | A date such as 2026-08-01. Only sales on or after it are returned, and collection stops as soon as it reaches older sales — ideal for scheduled runs that pick up only what is new since the last one. Leave empty for no cutoff. |
| Item condition | choice | Any condition | Only return sales of items in this condition: any, new, used or refurbished. |
| Category | text | — | A numeric eBay category id (for example 9355 for cell phones) to scope every query to one category, applied together with the keyword. Leave empty for all categories. |
| Minimum sold price | whole number | — | Only return sales at or above this price, in the selected site's own currency. Leave empty for no minimum. |
| Maximum sold price | whole number | — | Only return sales at or below this price. Leave empty for no maximum. |
| eBay site | choice | United States (ebay.com) | Which country's eBay site to read. Sold history and prices differ between sites, and prices come back in that site's own currency. |
| Parallel queries | whole number | 4 | How many queries to work on at the same time. Higher is faster on runs with many queries. Maximum 10. |
Output fields
| Field | Type | Description |
|---|---|---|
query | text | The keyword or link this row was found by, so results are easy to join back. |
marketplace | text | The eBay site the row was read from. |
itemId | text | eBay's listing identifier for the sold item. |
title | text | Listing title as shown to shoppers. |
soldDate | text | The date the sale completed, as YYYY-MM-DD. |
soldPrice | object | The sale price and its currency: { amount, currency }. |
bestOfferAccepted | true/false | True when the sale closed as an accepted best offer. |
priceIsListingPrice | true/false | True when the shown amount is the original listing price rather than the amount actually paid. This is only ever true on accepted best-offer sales, where eBay keeps the accepted amount private. |
condition | text | Item condition, taken from eBay's own condition labels. |
buyingFormat | text | How it was bought: AUCTION, BUY_IT_NOW or BEST_OFFER. |
shippingCost | number | Delivery cost shown on the sold listing, when one is shown. |
location | text | Where the item was located. |
imageUrl | text | Thumbnail image link. |
url | text | Clean listing link. |
scrapedAt | text | When the row was collected. |
Pricing
You pay per result, with no monthly minimum.
| What you are charged for | Price |
|---|---|
| Sold listing — one sold record added to your dataset | $1.20 per 1,000 |
There is nothing else to pay. Every field above is included in that one charge.
Worked example. Five keywords, each collecting the 200 most recent sales, produce 1,000 rows: 1,000 × $0.0012 = $1.20 per run. Run daily for a month it is about $36. A one-off deep pull of 10,000 sold records costs $12. Queries that turn out to have no completed sales are reported in the run summary and are not charged.
Limits & what this actor cannot do
- eBay now requires sign-in to view sold/completed listings: a logged-out read is redirected to eBay's sign-in wall. The actor detects that wall and reports the query as failed — a run that returns zero rows with no failures means the queries genuinely have no completed sales behind them. Set
ESD_API_COOKIES(secret) to read signed-in. - Session cookies go stale: when signed-in runs start hitting the wall again, export a fresh cookie string. Using your own eBay session for automated reads may breach eBay's terms — that risk is yours to weigh.
- Sold results are eBay's own record of completed and sold listings. eBay shows a rolling recent window of finished sales, not the entire lifetime history of a product, so this returns recent sales rather than every sale ever made.
- On an accepted best-offer sale, eBay publishes the original listing price with a line through it and keeps the amount actually paid private. Those rows are flagged with
bestOfferAcceptedandpriceIsListingPriceset to true, and the price shown is the listing price — never the realized amount. Standard sales carry the true price paid. - Seller details are not part of a sold record — eBay does not publish the seller on completed-listing results, so no seller information is returned.
- eBay's own headline result total for a search is a rounded estimate and is not shown on sold pages at all; the actor returns the individual sold records eBay actually serves rather than a summary count.
- A multi-quantity listing can sell more than once, and each completed sale is returned as its own row.
- Sold history and prices differ between eBay sites; results reflect the site you choose, in that site's own currency.
- A sold record describes a completed sale; the live market keeps moving, so a past sale price is history, not a quote for what the same item would fetch today.
- A query with no completed sales behind it returns no rows for that query — a real answer, reported in the run summary, not an error.
- Speed depends on the size of the job and on eBay's own response times; no fixed throughput is promised.
- eBay's terms govern automated access. You are responsible for using the data lawfully and in line with the source site's terms, and for handling any personal data in line with applicable privacy law.
FAQ
Do I need an eBay account? eBay itself now requires a signed-in account to view sold/completed listings. The actor can read through that wall only if you give it your eBay session cookies (below) — without them, sold reads fail with a clear error instead of returning data.
Does it need my login or password?
Never your password. It optionally takes your eBay session cookies via the ESD_API_COOKIES environment variable (set as a secret): log in to eBay in your own browser, copy the ebay.com cookies as one name=value; ... string, and paste it there. The actor forwards them with every page read so eBay sees a signed-in session. Cookies expire and eBay may challenge unfamiliar exits, so refresh them when runs start hitting the wall again — and remember a session cookie is a live login: never paste it into a run input, a ticket, or chat.
How do I prove the cookies work before running the actor?
Send one cheap request in the Decodo dashboard playground (POST https://scraper-api.decodo.com/v2/scrape):
{"url": "https://www.ebay.com/sch/i.html?_nkw=iphone+15&LH_Sold=1&LH_Complete=1&_ipg=24","proxy_pool": "premium","geo": "United States","cookies": [{ "name": "PASTE_NAME_1", "value": "PASTE_VALUE_1" },{ "name": "PASTE_NAME_2", "value": "PASTE_VALUE_2" }],"force_cookies": true,"session_id": "ebaytest1"}
(Convert each name=value pair from your header string into one { "name", "value" } entry. force_cookies is load-bearing — without it the gateway silently drops your cookies.)
If the returned content holds sold cards (s-card, "listings":[{"itemId"), the session beats the wall and the actor will collect. If it holds the sign-in page instead, the cookies are expired or rejected — export a fresh set.
Are these the actual prices items sold for? For standard sales, yes — the realized sale price. For accepted best-offer sales eBay keeps the agreed amount private and shows the original listing price instead, so those rows are clearly flagged and their price is the listing price, not what the buyer paid.
How far back does the sold history go? eBay publishes a rolling recent window of completed listings, so this returns recent sales, not a product's entire lifetime history. Use the date cutoff to keep scheduled runs to only what has sold since the last one.
Can I schedule it? Yes. Schedule it hourly, daily or weekly from the Apify console, and pair it with the date cutoff so each run collects only new sales.
Is the data complete? It is complete for the recent completed sales eBay publishes to signed-in viewers. Where eBay withholds something — the accepted amount on a best-offer sale, sales older than its public window — the actor says so instead of guessing.