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 first
    Costs1 credit per page of 100 results; nothing found is free
    In the playgroundThe search box
    eBay 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 sales
    Costs1 credit; a listing eBay has removed is free
    In the playgroundA click on any listing
    eBay 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 id
    Costs1 credit
    In the playgroundThe category picker in Filters
    eBay Category IDs API
type what you want to know the sold price of, then press enterno key needed here
results

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
response — GET /ebay/v1/sold · Fig. 01 — one sold listing
{
  "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"
    }
  ]
}
fieldtype
sitestring
currencystring, ISO 4217
querystring[], the query as tokens
filtersobject, the filters that applied
max_pagesinteger
next_cursorstring | null, a cursor to continue the search when the response is full (count = max_pages × 100); null when it reached the end
countinteger, results returned
credits_chargedinteger
took_msinteger
resultsobject[], newest first
results[]object, one sold listing
results[].titlestring
results[].sale_pricenumber, the final price
results[].shipping_pricenumber | null
results[].currencystring, the symbol
results[].conditionstring: new, used, parts or other
results[].condition_rawstring | 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_soldstring, ISO 8601
results[].buying_formatstring | null
results[].bidsinteger | null
results[].best_offer_availableboolean
results[].locationstring | null
results[].item_idstring
results[].epidstring | null
results[].categoryIdstring
results[].item_linkstring, URL
results[].image_urlstring | null, URL
results[].detailsobject | 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.

eBay UK sold listings API
request — GET /ebay/v1/sold · the same call on ebay.co.uk
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.

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"
Get your API keyNo card. Your key in under a minute.