eBay Sold Listings Search
Pricing
from $2.50 / 1,000 results
eBay Sold Listings Search
Get confirmed eBay sold prices. Search by keyword across 8 marketplaces, filter by date range, and export clean structured data for comps, resale pricing, and market research.
Pricing
from $2.50 / 1,000 results
Rating
4.4
(14)
Developer
Caffein Dev
Maintained by CommunityActor stats
52
Bookmarked
4.6K
Total users
923
Monthly active users
3.3 days
Issues response
4 days ago
Last modified
Categories
Security
Limited permissionsShare
eBay Sold Listings API (Real Sold Items Only)
Fetch real sold listings from eBay — actual completed sales with final prices. This Actor returns sold items only, not active listings and not completed-but-unsold items.
Built for price analysis, resale tools, market research, and pricing intelligence.
🔎 What This API Provides
This Apify Actor extracts eBay sold listings and returns structured, machine-readable data for each sale:
- Final sold price
- Currency
- Sale end date
- Listing title
- Item URL
- Item ID
✅ Every result represents an item that actually sold ❌ No active listings ❌ No unsold “completed” listings ❌ No estimated or AI-generated prices
⚙️ Input
{"keywords": ["rtx 4080", "rtx 4090"],"categoryId": "58058", // any eBay category ID; "0" = All Categories"subcategoryId": "", // any eBay subcategory ID; overrides categoryId when set"daysToScrape": 30,"count": 100,"ebaySite": "ebay.com","sortOrder": "endedRecently","minPrice": 100,"maxPrice": 500,"itemLocation": "default","itemCondition": "any"}
| Field | Type | Default | Description |
|---|---|---|---|
keywords | string[] | required | 1–6 search terms. Each runs as a separate search with the same filters. Results are tagged with keyword for easy filtering. |
keyword | string | — | Deprecated. Use keywords array instead. Accepted for backward compatibility. |
search | string | — | Deprecated. Alias for keyword. Use keywords array instead. Accepted for backward compatibility with callers that send search. Backslash-escaped quotes (\") in the value are unescaped before the search runs. |
daysToScrape | number | 30 | Days back to scrape (1–90) |
count | number | 100 | Max results per keyword |
categoryId | string | "0" | Main category filter — accepts any eBay category ID as free text (maps to _sacat). Use "0" for All Categories. Look up IDs at sold-comps.com/ebay-categories. |
subcategoryId | string | "" | Optional subcategory filter — accepts any eBay subcategory ID as free text (maps to _sacat). If set, overrides categoryId. Look up IDs at sold-comps.com/ebay-categories. |
ebaySite | string | ebay.com | eBay marketplace (see supported sites) |
sortOrder | string | endedRecently | endedRecently · timeNewlyListed · pricePlusPostageLowest · pricePlusPostageHighest · distanceNearest |
minPrice | integer | — | Minimum sold price filter (whole number, in the site's currency) |
maxPrice | integer | — | Maximum sold price filter (whole number, in the site's currency) |
itemLocation | string | default | default · domestic · worldwide. Ignored when sellerCountry is set. |
sellerCountry | string | — | Only return listings from sellers located in this country. Two-letter ISO code (e.g. JP, GB; UK also works), case-insensitive. When set, itemLocation is ignored. An unknown code is ignored (results are unfiltered). If no listing matches, eBay can return listings from other countries — check itemLocation on each item. Code list |
postalCode | string | — | Delivery postal code for more accurate shipping prices, in the selected site's format: 10001 (ebay.com), SW1A 1AA (ebay.co.uk), 10115 (ebay.de/.fr/.it/.es), M5V 3L9 (ebay.ca), 2000 (ebay.com.au). Only changes calculated shipping, not the delivery country. Blank = a central postcode for the site. A wrong-format value is ignored with a warning. |
itemCondition | string | any | any · new · used |
conditionId | integer | — | Numeric eBay condition ID (e.g. 1000 New, 3000 Used, 7000 For parts). Overrides itemCondition when set. |
buyingFormat | string | all | all · auction · buyItNow · acceptsOffers |
sellerType | string | any | any · private · business. EU sites only — works on ebay.de, ebay.fr, ebay.it, ebay.es. Ignored on all other sites (results are unfiltered). |
aspectFilter | object | — | eBay item-aspect facet filters as a JSON object, using the facet names shown on eBay, e.g. {"Brand": "Nike"} |
includeCompletedListings | boolean | true | Include eBay's Completed Listings filter. Enables accurate Best Offer Accepted detection (listingType, isBestOfferAccepted). Set to false for strictly sold-only results — BOA items will show as buy_it_now. See Completed Listings & Best Offer Accepted Detection. |
exactMatch | boolean | true | When true, eBay's loosened "results matching fewer words" items are removed. Set to false to include them. |
Supported eBay Sites
ebay.com · ebay.co.uk · ebay.de · ebay.fr · ebay.it · ebay.es · ebay.ca · ebay.com.au
📤 Output
{"itemId": "306671421088","url": "https://www.ebay.com/itm/306671421088?nordt=true","epid": "3049291546","title": "Apple iPhone 13 Pro Max - 128GB - Unlocked - Cracked Back","condition": "Pre-Owned","conditionId": 3000,"endedAt": "2025-12-22","soldPrice": "215","soldPriceMax": null,"buyItNowPrice": null,"soldCurrency": "USD","listingType": "buy_it_now","isBestOfferAccepted": false,"buyingFormat": "buyItNow","bidCount": null,"shippingPrice": "6.20","shippingCurrency": "USD","shippingType": "paid","totalPrice": "221.20","thumbnailUrl": "https://i.ebayimg.com/thumbs/images/g/abc123/s-l500.jpg","fullResThumbnailUrl": "https://i.ebayimg.com/images/g/abc123/s-l1600.jpg","sellerUsername": "example_seller","sellerPositivePercent": 99.2,"sellerFeedbackScore": 1842,"sellerType": null,"itemLocation": "United States","scrapedAt": "2026-01-19T21:53:17.613Z"}
| Field | Description |
|---|---|
itemId | eBay item ID |
url | Full listing URL. Carries ?nordt=true so it opens the listing itself rather than redirecting to a catalog page |
epid | eBay catalog product ID — stable across sellers for the same product variant. null when the listing has no catalog match. |
title | Listing title |
condition | Localized eBay condition label as shown on the search card (e.g. "Pre-Owned" on ebay.com, "Gebraucht" on ebay.de, "Neuf" on ebay.fr, "Nuovo" on ebay.it, "Usado" on ebay.es). null when eBay didn't display one. This is the authoritative field — what the buyer actually saw. |
conditionId | Best-effort numeric eBay condition ID resolved from condition via a static lookup table. null when condition is null or the label isn't in the lookup table (eBay can introduce new or locale-specific labels at any time — always check condition first). Common IDs: 1000 New · 1500 Open box / New Other · 1750 New with defects · 2000–2030 Refurbished tiers (Certified / Excellent / Very Good / Good) · 2500 Seller Refurbished · 2750 Like New · 3000 Used / Pre-Owned · 7000 For parts. Full reference |
categoryId | Category id used for the search (_sacat) |
category | Selected category label from the search page dropdown |
endedAt | Sale date as YYYY-MM-DD (date only — eBay does not expose a time of day) |
soldPrice | Final transaction price. Note: when isBestOfferAccepted is true, this is the asking price — the actual accepted offer is not disclosed by eBay. |
soldPriceMax | High end of the price range eBay shows for a listing with variations. soldPrice is the low end. null for one price. |
buyItNowPrice | On an auction that also had a Buy It Now option (buyingFormat = "auctionWithBIN"), the Buy It Now price. null for other listings. |
soldCurrency | Currency code (e.g. USD, GBP) |
listingType | How the item sold: "best_offer_accepted" · "buy_it_now" · "auction" · null (undetermined) |
isBestOfferAccepted | true if sold via an accepted Best Offer. soldPrice is the asking price, not the actual transaction price. |
buyingFormat | Richer buying-format enum: "auction" (bids only) · "buyItNow" (fixed price or best-offer) · "auctionWithBIN" (auction with a Buy It Now option) · null (undetermined) |
bidCount | Number of bids received. null for fixed-price listings or when not shown. |
shippingPrice | Shipping cost (null if not disclosed) |
shippingCurrency | Currency of shipping price |
shippingType | free · paid · pickup · unknown |
totalPrice | soldPrice + shippingPrice when currencies match, otherwise equals soldPrice |
thumbnailUrl | 500px product image URL from i.ebayimg.com. null when only a promo or logo image is available on the search card. |
fullResThumbnailUrl | High-res (1600px) product image URL, derived from thumbnailUrl. null when no product image is available. Best-effort — may 404 for listings where eBay only hosts a low-res image. |
sellerUsername | Seller username (best-effort) |
sellerPositivePercent | Positive feedback % (best-effort) |
sellerFeedbackScore | Feedback count (best-effort) |
sellerType | "private" or "business" on EU sites (ebay.de, .fr, .it, .es). null on non-EU sites or when the label is unrecognised. |
itemLocation | Seller's country as shown on the search results page. Written in the site's language (e.g. "Stati Uniti" on ebay.it). On ebay.com every listing has it; on the other sites it is normally only set for sellers abroad and null for domestic ones. (Not the same as the itemLocation input filter.) |
scrapedAt | Scrape timestamp (ISO 8601) |
🏷️ Completed Listings & Best Offer Accepted Detection
The includeCompletedListings input (default true) controls whether eBay's Completed Listings filter (LH_Complete=1) is sent alongside the always-present Sold filter (LH_Sold=1).
All results are genuinely sold items regardless of this setting — the LH_Sold=1 filter is always applied, so the actor never returns active or completed-but-unsold listings. This flag does not affect the sold/unsold guarantee; it only affects how accurately the actor can classify how an item sold.
Why the flag exists — an eBay HTML limitation
This is a limitation of eBay's own HTML, not a choice the actor makes. eBay only renders the signals needed to identify a Best Offer Accepted sale when the Completed Listings filter is active:
| Signal on the search card | includeCompletedListings: true (LH_Complete=1) | includeCompletedListings: false (LH_Complete=0) |
|---|---|---|
| Best-offer text | "Best offer accepted" | "or Best Offer" (or nothing) |
| Price CSS class | strikethrough | bold |
| BOA detectable? | ✅ Yes | ❌ No |
When LH_Complete=0, eBay strips the "Best offer accepted" text and the strikethrough price styling from the cards. Without those signals, a Best Offer Accepted sale is indistinguishable in the HTML from an ordinary Buy It Now sale — the actor cannot accurately detect Best Offer Accepted status for each listing.
What this means for the output
includeCompletedListings: true(default): Best Offer Accepted sales are detected.listingTypecan be"best_offer_accepted"andisBestOfferAcceptedcan betrue. (Note: even here, eBay does not disclose the actual accepted offer amount —soldPricereflects the asking price for BOA items.)includeCompletedListings: false: BOA sales are reported aslistingType: "buy_it_now"withisBestOfferAccepted: false. You still get every sold item and its sold price — you just lose the ability to know whether a given sale went through as an accepted Best Offer.
Set includeCompletedListings: false only if you want the search filter to match eBay's plain "Sold" view and don't rely on Best Offer Accepted classification.
👥 Who This API Is For
- Developers building pricing APIs or resale tools
- Data analysts and researchers
- Professional resellers and flippers
- SaaS founders validating secondary market prices
📞 Support & Feedback
For issues, questions, or feature requests, please contact the Actor author via Apify.
Category IDs & Subcategory IDs
Both categoryId and subcategoryId are free-text fields — you can pass any eBay category or subcategory ID, not just ones from a preset list. The ID is passed straight through to eBay's _sacat search parameter, so any ID eBay recognizes will work. When subcategoryId is set it overrides categoryId — the output always reflects the effective category used.
Not sure which ID to use? We maintain a full, searchable list of every eBay category and subcategory ID:
🔍 Browse & search all category IDs and subcategory IDs →