CompSniper Docs

3-Year eBay Sold History API

Search up to 3 years of eBay sold history by keyword with GET /v1/research/sold, on every CompSniper plan including free.

GET /v1/research/sold returns eBay sold history going back up to 3 years, across all eight eBay sites, with the same API key you already use for /v1/scrape. It is available on every plan, including free.

Use it when 90 days is not enough: slow-moving items, seasonal trends, price changes after a release, or a sale you remember from last year. For the most recent individual sales with full listing fields and AI cleanup, keep using /v1/scrape.

How far back it goes

Up to 3 years before today. That is eBay's own limit for sold research data: in our October 2026 tests, asking for 4 or 6 years returned exactly the same 3-year window, and eBay's own date picker stops at 3 years. Any startDate from 3 years ago up to today works.

Make a request

curl --fail-with-body \
  -H "Authorization: Bearer cs_live_REPLACEWITHYOURKEY" \
  "https://api.compsniper.com/v1/research/sold?keyword=nintendo+switch+oled&startDate=2023-10-11&endDate=2026-10-10&sort=lastSoldDescending&limit=50"
Python
import requests

response = requests.get(
    "https://api.compsniper.com/v1/research/sold",
    headers={"Authorization": "Bearer cs_live_REPLACEWITHYOURKEY"},
    params={
        "keyword": "nintendo switch oled",
        "startDate": "2023-10-11",
        "endDate": "2026-10-10",
        "sort": "lastSoldDescending",
        "limit": 50,
    },
    timeout=60,
)
response.raise_for_status()
data = response.json()
for row in data["results"]:
    print(row["lastSoldDate"], row["soldUnits"], row["averageSoldPrice"]["amount"], row["title"])

Parameters

ParameterValuesDefault
keyword1 to 200 charactersRequired
startDateYYYY-MM-DD, no earlier than 3 years before todayRequired
endDateYYYY-MM-DD, on or after startDate, no later than today (UTC)Required
ebaySiteebay.com, ebay.co.uk, ebay.com.au, ebay.ca, ebay.de, ebay.fr, ebay.it, ebay.esebay.com
sortlastSoldDescending (newest sale first) or quantityAscending (eBay's units-sold order)quantityAscending
limit10, 20, or 50 rows per page50
page1 to 2001
singleUnitOnlytrue returns only listings that sold exactly one unitfalse

Unknown or repeated parameters are rejected with 400 invalid_params, so a typo never silently changes your results.

Response

Response (shortened)
{
  "source": "ebay_product_research",
  "ebaySite": "ebay.com",
  "displayCurrency": "USD",
  "startDate": "2023-10-11",
  "endDate": "2026-10-10",
  "page": 1,
  "limit": 50,
  "sourceResultCount": 50,
  "resultCount": 50,
  "hasNextPage": true,
  "nextPage": 2,
  "relevanceApplied": false,
  "warnings": [
    "Listing-level records, not a transaction feed. Multi-unit rows contain averages.",
    "USD is the research display currency, not necessarily the listing's original currency.",
    "Older listing titles, links, images and conditions may be unavailable."
  ],
  "results": [
    {
      "itemId": "267809186741",
      "title": "Nintendo Switch OLED Console White Joy-Con Dock AC Adapter + 2 Games Included!",
      "itemUrl": "https://www.ebay.com/itm/267809186741",
      "imageUrl": "https://i.ebayimg.com/images/g/L3IAAeSwLcZqyUSi/s-l1200.png",
      "recordType": "single_unit_listing",
      "soldUnits": 1,
      "averageSoldPrice": { "amount": "184.00", "currency": "USD", "display": "$ 184.00" },
      "totalSales": { "amount": "184.00", "currency": "USD", "display": "$ 184.00" },
      "averageShipping": { "amount": "10.00", "currency": "USD", "display": "$ 10.00" },
      "soldPrice": { "amount": "184.00", "currency": "USD", "display": "$ 184.00" },
      "soldDate": "2026-10-09",
      "lastSoldDate": "2026-10-09",
      "listingFormat": "Fixed price",
      "condition": null
    }
  ],
  "requestId": "20fca48c-c1d6-4096-8f39-73a65d1cb9af"
}

Rows are listings, not single transactions

Each row is one eBay listing and everything it sold inside your date range:

  • recordType: "single_unit_listing": the listing sold one unit. soldPrice and soldDate are that sale.
  • recordType: "listing_aggregate": the listing sold several units (common for multi-quantity fixed-price listings). soldUnits is how many, averageSoldPrice and totalSales describe them, lastSoldDate is the most recent one, and soldPrice and soldDate are null.

Use singleUnitOnly=true when you want one-off sales only, for example graded cards or used electronics.

Other things to know

  • Prices are always USD, on every eBay site, because that is how eBay's research data is reported.
  • No AI cleanup. relevanceApplied is always false: rows are eBay's results for your keyword, so accessories and lots can appear. Filter by title on your side, or use precise keywords.
  • Condition is not available in this data (condition is null). Older listings can also be missing a title, link, or image.

Pagination

Each page holds up to 50 rows. Follow nextPage while hasNextPage is true, up to page 200 (10,000 rows for one search). Each page is a separate request.

Billing and limits

  • One page = one request from your normal monthly allowance (or purchased credits). There is no separate plan.
  • Failed requests are free. A timeout, upstream error, or cancelled request is never charged.
  • History has its own per-minute cap: 20 searches per minute per account, in addition to your plan's normal per-minute limit. Every response carries X-History-RateLimit-Limit and X-History-RateLimit-Remaining. Need more? Contact support.

Errors

StatusCodeMeaningWhat to do
400invalid_paramsMissing keyword, bad date, date older than 3 years, unknown parameterFix the request; do not retry as is
429history_rate_limitedMore than your history searches per minuteWait for Retry-After, then retry
429rate_limitedYour plan's per-minute limitWait for Retry-After, then retry
429quota_exceededMonthly allowance and credits used upUpgrade, buy credits, or wait for reset
502, 503historical_unavailableeBay's research source did not answer this timeRetry after a few seconds, with a bound

All error bodies include code, error, and requestId. See Errors and Rate limits for the shared rules.

On this page