The eBay sold items API.
Sold comps and completed listings for everything that sold on eBay, searched by keyword, condition, price and sold date and answered as typed JSON in one GET. The findCompletedItems alternative.
- 400M+
- sold listings, with more arriving minutes after each sale
- US · UK
- ebay.com and ebay.co.uk, picked per request
- 2,000
- results in one response, newest first
- 90+ days
- of sales history, kept past the window where eBay's own ends
Three endpoints. That is the whole API.
Every call is one GET with your key in a header and JSON back. The playground below runs the same three, on a free allowance, without a key.
- GET/ebay/v1/sold
Sold listings
Sold listings matching a query, newest first — or every sale in a category, with no query at all. Filters for marketplace, category, condition, price range, sold dates, item specifics and excluded words; up to 2,000 results in one response, and a cursor to continue past them.
ReturnsUp to 2,000 sold listings a call, newest firstCosts1 credit per page of 100 results; nothing found is freeIn the playgroundThe search boxeBay Sold Listings API - GET/ebay/v1/item
Listing detail
One sold listing in full: final price, Best Offer flags, shipping, seller, every item specific, every image, the description and its recorded sales.
ReturnsOne listing in full: specifics, images, seller, its recorded salesCosts1 credit; a listing eBay has removed is freeIn the playgroundA click on any listingeBay Sold Item Details API - GET/ebay/v1/categories
Categories
eBay's categories by name or id, each with its parent path, on either marketplace: the ids /sold filters on.
ReturnseBay's leaf categories by name, busiest first, or one by its idCosts1 creditIn the playgroundThe category picker in FilterseBay Category IDs API
Sold listings
Type what you would search eBay for (or pick a category in Filters and leave the box empty for every sale in it), or try one of these:
1 credit per page of up to 100 results · same JSON your app gets
Raw response appears here
Every field, typed.
What a /sold answer carries: the envelope first, then each listing under results. Item specifics come with details=1, or from /item, as eBay's seller-entered key and value pairs: grade, set and card number for cards, size and colorway for shoes.
Full field reference{
"site": "EBAY_US",
"currency": "USD",
"query": [
"iphone",
"13",
"pro"
],
"filters": {
"condition": [
"used"
]
},
"max_pages": 5,
"next_cursor": null,
"count": 385,
"credits_charged": 4,
"took_ms": 41,
"results": [
{
"title": "Apple iPhone 13 Pro 256GB Graphite Unlocked",
"sale_price": 525,
"shipping_price": 0,
"currency": "$",
"condition": "used",
"condition_raw": "Pre-Owned",
"date_sold": "2026-07-18T00:00:00.000Z",
"buying_format": "Buy It Now",
"bids": null,
"best_offer_available": true,
"location": "United States",
"item_id": "256637082114",
"epid": "13051890211",
"categoryId": "9355",
"item_link": "https://www.ebay.com/itm/256637082114",
"image_url": "https://i.ebayimg.com/images/g/abc/s-l500.webp"
}
]
}| field | type |
|---|---|
| site | string |
| currency | string, ISO 4217 |
| query | string[], the query as tokens |
| filters | object, the filters that applied |
| max_pages | integer |
| next_cursor | string | null, a cursor to continue the search when the response is full (count = max_pages × 100); null when it reached the end |
| count | integer, results returned |
| credits_charged | integer |
| took_ms | integer |
| results | object[], newest first |
| results[] | object, one sold listing |
| results[].title | string |
| results[].sale_price | number, the final price |
| results[].shipping_price | number | null |
| results[].currency | string, the symbol |
| results[].condition | string: new, used, parts or other |
| results[].condition_raw | string | null, eBay's own wording; null when the slot held no condition. Trading cards read "Pre-Owned" here: their card condition and grade are in details |
| results[].date_sold | string, ISO 8601 |
| results[].buying_format | string | null |
| results[].bids | integer | null |
| results[].best_offer_available | boolean |
| results[].location | string | null |
| results[].item_id | string |
| results[].epid | string | null |
| results[].categoryId | string |
| results[].item_link | string, URL |
| results[].image_url | string | null, URL |
| results[].details | object | null, the /item answer (details=1): {"site", "item_id", "listing_state": "removed"} when eBay has taken the listing down; null when the details are not readable yet |
The eBay UK sold listings API.
The same call with site=EBAY_GB. Every result is a sale on ebay.co.uk, and every price is the eBay sold price UK buyers paid, in pounds. Nothing else in the request or the answer changes.
curl "https://api.trawl.dev/ebay/v1/sold?query=iphone+13+pro&site=EBAY_GB" \
-H "x-api-key: $TRAWL_API_KEY"- site=EBAY_GBSearches ebay.co.uk. The default, EBAY_US, is ebay.com. Each marketplace is searched separately.
- currency: GBPEvery price in the answer is in pounds: sale_price, shipping_price, and the min_price and max_price you send. Nothing is converted.
- sale_priceThe price a UK buyer saw and paid. For a private seller it includes eBay's Buyer Protection fee.
- categoryCategory ids are specific to a marketplace. Look them up on GET /ebay/v1/categories with site=EBAY_GB.
- date_soldThe sale date on UK time, the marketplace's own calendar.
Guides and comparisons.
Working scripts with real output for the questions that bring people here: the findCompletedItems alternative, scraping eBay sold listings in Python, sold listings history beyond 90 days, and how Trawl compares to eBay's own APIs, Terapeak and scrapers.
- eBay findCompletedItems alternative
eBay retired findCompletedItems in February 2025. One short Python script sends the same request to GET /sold and answers in the old field names. Real output.
- Scrape eBay sold listings in Python
You do not need a scraper to get eBay sold prices in Python. One short script calls the sold listings API and prints 100 real sales, the median and one listing.
- eBay sold listings history beyond the 90-day window
eBay shows sold listings for 90 days. Read a year of eBay sold listings history with date_from, date_to and max_pages in a 30-line Python script. Real output.
- Does eBay API return sold listings?
The eBay Browse API returns live listings, not sold items. eBay retired the Finding API in February 2025. One script runs the same search over completed sales.
- The eBay sold comps API: comps for one item in one call
Pull sold comps for any item from the eBay sold comps API: the last 100 sales, the median, the middle half and the latest five, in one script with real output.
- eBay UK sold listings API
The eBay UK sold listings API is GET /sold with site=EBAY_GB: every sale on ebay.co.uk in pounds, the price UK buyers paid. Python and Node script, real output.
- Trawl vs the eBay Marketplace Insights API
The eBay Marketplace Insights API gives approved partners 90 days of sold items. Trawl answers the same search for any account, with sales older than 90 days.
- Trawl vs an Apify eBay sold listings scraper
An Apify eBay sold listings scraper is a community actor that reads eBay's sold pages, priced per result, within 90 days. Trawl is one call over recorded sales.
- Trawl vs Terapeak: the Terapeak API alternative
Terapeak, now Product Research, shows three years of eBay sales in Seller Hub at no cost. There is no Terapeak API. Trawl answers the same search as JSON.
- Trawl vs the SoldComps API
SoldComps reads eBay's sold search per request: up to 240 results, eight eBay sites, 90 days. Trawl answers from recorded sales, with history past 90 days.
The first 250 credits each month are on us.
$ curl "https://api.trawl.dev/ebay/v1/sold?query=iphone+13+pro" \
-H "x-api-key: $TRAWL_KEY"