API Reference · v1
SoldComps API
Real sold listings — price, condition, date, seller — from a single request. No scraping setup, no stale cache, no OAuth dance. eBay endpoints: /v1/scrape for one page at a time, async Max Mode for server-side pagination. Plus Poshmark sold listings with optional enrichment.
Machine-readable spec: openapi.json
New to eBay sold data? See how we compare →
Quickstart
curl -H "Authorization: Bearer sc_YOUR_KEY_HERE" \
"https://api.sold-comps.com/v1/scrape?keyword=iphone+15+pro&count=10"Authentication
All requests to the SoldComps API — /v1/scrape, /v1/scrape/category, and Max Mode — require a bearer token, with one exception (the RapidAPI channel, below):
Authorization: Bearer sc_YOUR_KEY_HERE
API keys start with sc_. Get one from the dashboard. The free plan includes 100 requests/month, no credit card required.
The /rapidapi/scrape-ebay endpoint authenticates through the RapidAPI marketplace headers instead — see the RapidAPI section.
Optional
Authenticated requests
Optionally forward your own eBay session cookies on /v1/scrape, /v1/scrape/category, /v1/scrape/max, /api/bulk-search, and /rapidapi/scrape-ebay via the X-eBay-Cookies header. With cookies, sold listings return up to 200 items per page instead of the default 40.
How to get your cookies
- Sign in to eBay in your browser, on the same marketplace you plan to query. A cookie from ebay.com will not work for an ebay.co.uk request.
- Open developer tools (
F12, orCmd + Option + Ion Mac) and switch to the Network tab. - Reload the page, then click the first document request to ebay.com in the list.
- Under Request Headers, find the
cookieheader and copy the entire value — a long string ofname=valuepairs separated by semicolons. - Send that string as the
X-eBay-Cookiesheader on your request. No encoding needed — paste it as-is.
Example
curl -H "Authorization: Bearer sc_YOUR_KEY" \
-H "X-eBay-Cookies: nonsession=BAQ...; ebaysid=p2...; dp1=bu1p/QEBf..." \
"https://api.sold-comps.com/v1/scrape?keyword=iphone"Cookies are forwarded per-request only and never stored. Omitting the header (or sending no cookies) is identical to today's behavior.
Note: Use cookies from the same eBay site you are scraping — e.g. an ebay.co.uk request needs cookies from a UK eBay account logged into ebay.co.uk.
Rate limits
Two independent limits apply, scoped per account (one shared budget across all API keys on the account). Both return 429, but the body's code field tells you which one was hit.
Per-minute rate limit (code: "rate_limited") — scales with your plan. Standard plans (free, starter, growth, scale) get 60 requests/minute; mid-tier custom plans (100k–500k) get 120 requests/minute; and high-volume custom plans (1M, 2M, 4M) get 240 requests/minute. A purchasable rate-limit add-on raises any key to 500 requests/minute.
Monthly quota (code: "quota_exceeded") — enforced separately from the per-minute bucket, reset at your billing cycle anchor (not calendar UTC). See current plan limits at /dashboard/subscription.
Every 429 carries a Retry-After header (seconds). Rate-limit responses also set X-RateLimit-* headers; quota responses set X-Usage-* headers — the same families present on a 200. X-RateLimit-Reset is a Unix epoch timestamp (seconds since 1970-01-01 UTC) marking when the current rate-limit window resets.
Handling 429s
if response.status == 429:
if body.code == "quota_exceeded":
stop retrying, alert ops, wait until body.reset_at
else:
wait body.retry_after seconds, then retryErrors
| Status | Meaning | What to do |
|---|---|---|
| 400 | Invalid params | Check the error body — usually a missing keyword or out-of-range number. |
| 401 | Missing or invalid API key | Verify the Authorization header. Keys start with sc_. |
| 429 (code: rate_limited) | Per-minute rate limit | Back off for the duration in Retry-After (seconds), then retry. Limits are 60/min on standard plans, 120/min on mid-tier custom (100k–500k), and 240/min on high-volume custom (1M/2M/4M); the rate-limit add-on raises any key to 500/min. |
| 429 (code: quota_exceeded) | Monthly quota exhausted | Stop retrying — Retry-After can be days long. Upgrade or wait until reset_at / your next billing cycle. Resets follow your subscription anchor, not calendar UTC. |
| 502 | Upstream blocked | eBay blocked the request. Retry; transient. |
| 503 | Server busy | Concurrency limit reached; retry shortly. |
| 500 | Server error | Unexpected internal error. Retry with exponential backoff. |
Pagination
Each /v1/scrape request returns one page of sold listings (up to 40 by default, or up to 200 with cookies). Increment the page parameter until hasNextPage is false.
Running the pagination loop client-side is fine for small sweeps. For larger jobs (50+ pages), use Max Mode instead — the server paginates, handles retries, and delivers results inline, via email, or as a signed CSV.
totalItems in the response is the count of items returned on the current page, not a grand total. It can also be lower than the count you requested — count is a ceiling, and items eBay renders without a parseable price or sold date are dropped.
totalResults is different — it's eBay's own reported total result count for your search query (e.g. "14,000+"), independent of pagination. It's a string because eBay's counts are approximate on broad searches. null when unavailable.
# Increment page until hasNextPage is false
curl -H "Authorization: Bearer sc_YOUR_KEY_HERE" \
"https://api.sold-comps.com/v1/scrape?keyword=iphone+15+pro&page=1"
# then page=2, page=3, ... while hasNextPage == true/v1/scrapeSearch sold listings
Query parameters
Note: the buyingFormat query parameter (below) filters which listings are returned by format. It shares a name with the buyingFormat field on each item in the response, which instead classifies how that listing was actually listed. The two use different enums and serve different purposes.
keywordstringrequired- Passed directly to eBay's search bar. Supports eBay's minus-sign syntax to exclude terms — e.g. "iphone 15 pro -case -screen -lot" drops listings containing case, screen, or lot from results.
pageintegeroptionaldefault:1- Page number of eBay results to fetch. Increment until hasNextPage is false.
countinteger (1–200)optionaldefault:40 (sold) / 200 (active)- Max items per page. Sold listings return up to 40 (or 200 with cookies); active listings (sold=false) return up to 200. Values above the cap are silently clamped. A ceiling, not a guarantee — the response may contain fewer items.
ebaySiteenumoptionaldefault:ebay.com- eBay domain to scrape.
ebay.comebay.co.ukebay.deebay.frebay.itebay.esebay.caebay.com.au categoryIdstringoptionaldefault:0- eBay category ID (_sacat). Browse all 17,000+ IDs at sold-comps.com/ebay-categories. Use "0" for all categories.
sortOrderenumoptionaldefault:endedRecently- Sort order for results.
endedRecentlytimeNewlyListedpricePlusPostageLowestpricePlusPostageHighestdistanceNearest minPricenumberoptional- Minimum price filter, in listing currency.
maxPricenumberoptional- Maximum price filter, in listing currency.
itemLocationenumoptionaldefault:default- Item location filter.
defaultdomesticworldwide itemConditionenumoptionaldefault:any- Item condition filter applied as a request filter on eBay.
anynewused conditionIdnumberoptional- eBay numeric condition ID filter. Common IDs: 3 (New), 4 (Used), 1000 (Brand New), 1500 (Open box), 2750 (Like New), 3000 (Used), 7000 (For parts). Valid IDs vary by eBay category. When set, overrides itemCondition. When omitted, no condition filter is applied.
buyingFormatenumoptionaldefault:all- Filter by listing format (request filter — distinct from the per-item buyingFormat response field, which classifies how a listing was actually listed and uses a different enum). "auction" = auction-only, "buyItNow" = fixed-price / Buy It Now, "acceptsOffers" = listings with Best Offer enabled. Default "all" (no format filter).
allauctionbuyItNowacceptsOffers sellerTypeenumoptional- Filter results by seller type. Only effective on EU sites (ebay.de, .fr, .it, .es). On non-EU sites the filter is silently ignored.
privatebusiness includeCompleteListingbooleanoptionaldefault:true- Include eBay completed-listing metadata (LH_Complete=1). This is what enables accurate bestOfferAccepted detection — without it, eBay does not render the "Best offer accepted" signal and bestOfferAccepted is false for nearly all items. Does not change which listings are returned: results stay sold-only (LH_Sold=1 takes precedence). Set to false only to match pre-July-2026 behavior.
soldbooleanoptionaldefault:true- When true (default), returns completed/sold listings. When false, returns ACTIVE (currently-listed) results instead. Active responses swap the sold-only fields (soldPrice, soldCurrency, endedAt, bestOfferAccepted) for active-only ones: listingType="active", the asking price in currentPrice/currentPriceMax/currentCurrency, plus watcherCount, unitsSold, acceptsOffers, and timeLeft.
soldAfterstring (YYYY-MM-DD)optional- Inclusive lower bound on endedAt. Applied after the page is scraped — sold-only, silently ignored when sold=false. See scrapedCount in the response for how to tell whether more pages will help.
soldBeforestring (YYYY-MM-DD)optional- Inclusive upper bound on endedAt. Applied after the page is scraped — sold-only, silently ignored when sold=false.
aspectFilterstring (JSON)optional- JSON object of eBay item-aspect facet filters. Keys and values are the human-readable facet names exactly as shown in eBay's sidebar refinements (e.g. "Brand", "Storage Capacity", "Network"). Multi-select values use pipe as separator: {"Network":"Unlocked|AT&T"}. Facet names are dynamic per eBay category and vary by site language. Invalid or unrecognized facets are silently ignored by eBay.
exactMatchbooleanoptionaldefault:true- When true (default), strips eBay's loosened-match results ("Results matching fewer words") so only items closely matching your keyword are returned. Set to false to include all results eBay returns — useful when you want maximum volume over keyword precision.
count items), then filters by endedAt using soldAfter/soldBefore. A page may return fewer items than count after filtering, and hasNextPage still reflects eBay's pagination, not the filtered set — a next page may exist but return 0 items after filtering. To pull every sold item in a date range, paginate until hasNextPage is false, or until scrapedCount is lower than count (you've reached the end of eBay's results).aspectFilter as a URL-encoded JSON object whose keys and values match the facet names in eBay's sidebar refinements. For example, to filter iPhones to Apple brand with 256 GB storage:aspectFilter=%7B%22Brand%22%3A%22Apple%22%2C%22Storage%20Capacity%22%3A%22256%20GB%22%7D
For trading cards, filter by grade and card manufacturer:
aspectFilter=%7B%22Professional%20Grader%22%3A%22PSA%22%2C%22Grade%22%3A%2210%22%2C%22Manufacturer%22%3A%22Topps%22%7D
Multi-select values use pipe: {"Grade":"9|10"}. Facet names are dynamic per category and vary by site language. Unrecognized facets are silently ignored by eBay.
Response fields (each item)
itemIdstringoptional- eBay listing item ID.
urlstringoptional- Canonical listing URL with ?nordt=true to bypass eBay's catalog redirect.
thumbnailUrlstring | nulloptional- Listing thumbnail (500px) from i.ebayimg.com. null when the listing has no product image.
fullResThumbnailUrlstring | nulloptional- Full-resolution version of thumbnailUrl (~1600px), derived by replacing the size suffix (s-l500, s-l140, etc.) with s-l1600. null when thumbnailUrl is null.
epidstring | nulloptional- eBay catalog product ID. Stable across sellers for the same variant. null when the listing has no catalog match.
titlestring | nulloptional- Listing title.
conditionstring | nulloptional- eBay's own localized condition label (e.g. "Pre-Owned", "Gebraucht"), when it resolves to a known value. null when the listing shows no condition, or when the label eBay displayed does not match a known value (rare — the field is dropped rather than surfaced verbatim).
conditionIdnumber | nulloptional- eBay numeric condition ID (best-effort lookup from the localized label). Common: 1000 New, 3000 Used, 7000 For parts.
sellerType"private" | "business" | nulloptional- EU sites only (ebay.de, .fr, .it, .es). null on all non-EU sites. May also be null on EU sites served via eBay's newer card layout, pending mapping.
buyingFormat"auction" | "buyItNow" | "auctionWithBIN" | nulloptional- How the item was listed. "auction" = competitive bidding, "buyItNow" = fixed price (includes Best Offer listings), "auctionWithBIN" = auction that also had a Buy It Now option. null when the listing type could not be determined. Distinct from the buyingFormat query parameter, which filters results by listing format (different enum, different concern).
bidCountnumber | nulloptional- Number of bids received. Present for auction listings, null for fixed-price (Buy It Now) listings.
categoryIdstringoptional- eBay category ID.
listingType"sold" | "active"optional- Whether this is a completed sale ("sold", the default) or a currently-listed item ("active", returned when sold=false).
shippingPricestring | nulloptional- Shipping cost; "0.00" when free, null when unknown.
shippingType"free" | "paid" | "pickup" | "unknown" | nulloptional- Shipping category.
totalPricestring | nulloptional- Listing price (soldPrice or currentPrice) + shippingPrice when both known.
sellerUsernamestring | nulloptional- eBay seller username.
sellerPositivePercentnumber | nulloptional- Seller positive feedback percentage.
sellerFeedbackScorenumber | nulloptional- Seller total feedback count.
itemLocationstring | nulloptional- Seller's country as shown on the eBay search results page. null when the seller is domestic (same country as the eBay domain) — eBay only displays a location label for international sellers. Use null to identify domestic listings and non-null for international ones. Localized per site language (e.g., "United States" on ebay.com, "Großbritannien" on ebay.de).
productRatingnumber | nulloptional- eBay product catalog star rating (0–5). Present when the listing is linked to an eBay product page (has an ePID). Omitted when no catalog linkage exists.
productReviewCountnumber | nulloptional- Number of eBay product catalog reviews backing productRating. Omitted when no catalog linkage exists.
scrapedAtstringoptional- ISO 8601 timestamp of when SoldComps fetched the listing.
Sold-listing fields (sold=true)
endedAtstring | nulloptional- Date the sale completed, as YYYY-MM-DD (date only — eBay never exposes a time of day). For active listings use timeLeft instead.
soldPricestring | nulloptional- The listing price at time of sale, as a decimal string. eBay does not disclose the accepted best-offer amount, so on Best Offer sales (bestOfferAccepted=true) this is an upper bound, not the realized price. For active listings the asking price is in currentPrice.
soldCurrencystring | nulloptional- ISO 4217 currency of soldPrice. Active listings use currentCurrency.
bestOfferAcceptedbooleanoptional- true when the seller accepted a best offer rather than the listing selling at the listed price. eBay never discloses the accepted offer amount — see soldPrice for what that field actually represents on a Best Offer sale. Requires includeCompleteListing=true (the default). For active listings, whether the listing accepts offers is in acceptsOffers.
Active-listing fields (sold=false)
currentPricestring | nulloptional- Current asking price — the from/low bound of a multi-variant range. The active-mode counterpart to soldPrice.
currentPriceMaxstring | nulloptional- The to/high bound when a listing spans a price range (e.g. "$899.99 to $1099.99"). null for single-price listings; currentPrice is always the low bound.
currentCurrencystring | nulloptional- ISO 4217 currency code for currentPrice/currentPriceMax (e.g. "USD", "GBP"). The active-mode counterpart to soldCurrency.
watcherCountnumber | nulloptional- Number of eBay users watching this listing — a live demand signal. When eBay shows an approximate count ("N+"), this is N as a floor (at least N). null when none shown.
unitsSoldnumber | nulloptional- Units already sold on this currently-listed multi-quantity listing — a live sales-velocity signal. When eBay shows an approximate count ("N+" / "Más de N"), this is N as a floor. null when none shown.
acceptsOffersbooleanoptional- true when the listing accepts Best Offers ("or Best Offer"). The active-mode analogue of bestOfferAccepted.
timeLeftstring | nulloptional- Auction time remaining as a raw, localized, relative string exactly as eBay renders it, including the locale suffix ("6d 4h left", "Noch 5 Std 47 Min", "1g 6h rimasti"). A snapshot at scrape time — not an absolute end timestamp. null for fixed-price / Buy It Now listings.
Example active response (sold=false)
With sold=false, items drop the sold-only fields and return the asking price plus live signals instead. The default (sold) response is shown at the top of this endpoint.
{
"keyword": "iphone 15 pro",
"page": 1,
"totalItems": 40,
"totalResults": "14,000+",
"hasNextPage": true,
"autoSelectedCategory": { "id": "9355", "name": "Cell Phones & Smartphones" },
"items": [
{
"itemId": "256987654321",
"url": "https://www.ebay.com/itm/256987654321?nordt=true",
"thumbnailUrl": "https://i.ebayimg.com/images/g/9QwAAeSwABCqGLiR/s-l500.webp",
"fullResThumbnailUrl": "https://i.ebayimg.com/images/g/9QwAAeSwABCqGLiR/s-l1600.webp",
"epid": "20049285656",
"title": "Apple iPhone 15 Pro 256GB Natural Titanium - Unlocked",
"condition": "Pre-Owned",
"conditionId": 3000,
"sellerType": null,
"buyingFormat": "buyItNow",
"bidCount": null,
"categoryId": "9355",
"listingType": "active",
"shippingPrice": "0.00",
"shippingCurrency": "USD",
"shippingType": "free",
"totalPrice": "849.99",
"sellerUsername": "top-deals-store",
"sellerPositivePercent": 99.8,
"sellerFeedbackScore": 14200,
"itemLocation": "United States",
"scrapedAt": "2026-03-14T21:00:00.000Z",
"currentPrice": "849.99",
"currentPriceMax": null,
"currentCurrency": "USD",
"watcherCount": 31,
"unitsSold": 12,
"acceptsOffers": true,
"timeLeft": null
}
]
}Request
curl -H "Authorization: Bearer sc_YOUR_KEY_HERE" \
"https://api.sold-comps.com/v1/scrape\
?keyword=iphone+15+pro\
&ebaySite=ebay.com\
&page=1\
&count=40\
&sortOrder=endedRecently"Response
{
"keyword": "iphone 15 pro",
"page": 1,
"totalItems": 40,
"totalResults": "14,000+",
"hasNextPage": true,
"autoSelectedCategory": { "id": "9355", "name": "Cell Phones & Smartphones" },
"items": [
{
"itemId": "256123456789",
"url": "https://www.ebay.com/itm/256123456789?nordt=true",
"thumbnailUrl": "https://i.ebayimg.com/images/g/3nkAAeSwCitqGLiR/s-l500.webp",
"fullResThumbnailUrl": "https://i.ebayimg.com/images/g/3nkAAeSwCitqGLiR/s-l1600.webp",
"epid": "20049285656",
"title": "Apple iPhone 15 Pro 256GB Natural Titanium - Unlocked",
"condition": "Pre-Owned",
"conditionId": 3000,
"sellerType": null,
"buyingFormat": "buyItNow",
"bestOfferAccepted": false,
"bidCount": null,
"categoryId": "9355",
"listingType": "sold",
"endedAt": "2026-03-10",
"soldPrice": "899.99",
"soldCurrency": "USD",
"shippingPrice": "0.00",
"shippingCurrency": "USD",
"shippingType": "free",
"totalPrice": "899.99",
"sellerUsername": "top-deals-store",
"sellerPositivePercent": 99.8,
"sellerFeedbackScore": 14200,
"itemLocation": "United States",
"productRating": 4.5,
"productReviewCount": 12,
"scrapedAt": "2026-03-14T21:00:00.000Z"
}
]
}/v1/scrape/categoryBrowse category sold listings
categoryId (eBay _sacat) and optionally filter by price, condition, or seller type. Same filters and response shape as /v1/scrape. Useful for catalogue-based sellers who want every recent sale in a category without specifying a search term. Browse all 17,000+ category IDs at /ebay-categories. EU sites (ebay.de, .fr, .it, .es) include sellerType on each item and support the sellerType filter.Query parameters
categoryIdstringrequired- eBay category ID (_sacat). Must not be "0". Browse all 17,000+ IDs at sold-comps.com/ebay-categories.
pageintegeroptionaldefault:1- Page number of eBay results to fetch. Increment until hasNextPage is false.
countintegeroptionaldefault:40 (or 200 with cookies)- Max items per page. Returns up to 40 by default, or up to 200 with cookies. Values above the cap are silently clamped. A ceiling, not a guarantee — the response may contain fewer items.
ebaySiteenumoptionaldefault:ebay.com- eBay domain to scrape.
ebay.comebay.co.ukebay.deebay.frebay.itebay.esebay.caebay.com.au sortOrderenumoptionaldefault:endedRecently- Sort order for results.
endedRecentlytimeNewlyListedpricePlusPostageLowestpricePlusPostageHighestdistanceNearest minPricenumberoptional- Minimum price filter, in listing currency.
maxPricenumberoptional- Maximum price filter, in listing currency.
itemLocationenumoptionaldefault:default- Item location filter.
defaultdomesticworldwide itemConditionenumoptionaldefault:any- Item condition filter.
anynewused conditionIdnumberoptional- eBay numeric condition ID filter. Common IDs: 3 (New), 4 (Used), 1000 (Brand New), 1500 (Open box), 2750 (Like New), 3000 (Used), 7000 (For parts). Valid IDs vary by eBay category. When set, overrides itemCondition.
buyingFormatenumoptionaldefault:all- Filter by listing format (request filter — distinct from the per-item buyingFormat response field, which classifies how a listing was actually listed and uses a different enum). "auction" = auction-only, "buyItNow" = fixed-price / Buy It Now, "acceptsOffers" = listings with Best Offer enabled. Default "all" (no format filter).
allauctionbuyItNowacceptsOffers sellerTypeenumoptional- Filter results by seller type. Only effective on EU sites (ebay.de, .fr, .it, .es). On non-EU sites the filter is silently ignored.
privatebusiness includeCompleteListingbooleanoptionaldefault:true- Include eBay completed-listing metadata (LH_Complete=1) so bestOfferAccepted is detected accurately. Does not change which listings are returned (results stay sold-only). Set to false only to match pre-July-2026 behavior.
soldAfterstring (YYYY-MM-DD)optional- Inclusive lower bound on endedAt. Applied after the page is scraped. Category scrape is always sold, so this always applies when set.
soldBeforestring (YYYY-MM-DD)optional- Inclusive upper bound on endedAt. Applied after the page is scraped.
aspectFilterstring (JSON)optional- JSON object of eBay item-aspect facet filters. Keys and values are the human-readable facet names exactly as shown in eBay's sidebar refinements. Multi-select values use pipe as separator: {"Network":"Unlocked|AT&T"}. Invalid or unrecognized facets are silently ignored by eBay.
exactMatchbooleanoptionaldefault:true- When true (default), strips eBay's loosened-match results ("Results matching fewer words") so only items closely matching your keyword are returned. Set to false to include all results eBay returns.
Response fields (each item)
itemIdstringoptional- eBay listing item ID.
urlstringoptional- Canonical listing URL with ?nordt=true to bypass eBay's catalog redirect.
thumbnailUrlstring | nulloptional- Listing thumbnail (500px) from i.ebayimg.com. null when the listing has no product image.
fullResThumbnailUrlstring | nulloptional- Full-resolution version of thumbnailUrl (~1600px), derived by replacing the size suffix (s-l500, s-l140, etc.) with s-l1600. null when thumbnailUrl is null.
epidstring | nulloptional- eBay catalog product ID. Stable across sellers for the same variant. null when the listing has no catalog match.
titlestring | nulloptional- Listing title.
conditionstring | nulloptional- eBay's own localized condition label (e.g. "Pre-Owned", "Gebraucht"), when it resolves to a known value. null when the listing shows no condition, or when the label eBay displayed does not match a known value (rare — the field is dropped rather than surfaced verbatim).
conditionIdnumber | nulloptional- eBay numeric condition ID (best-effort lookup from the localized label). Common: 1000 New, 3000 Used, 7000 For parts.
sellerType"private" | "business" | nulloptional- EU sites only (ebay.de, .fr, .it, .es). null on all non-EU sites. May also be null on EU sites served via eBay's newer card layout, pending mapping.
buyingFormat"auction" | "buyItNow" | "auctionWithBIN" | nulloptional- How the item was listed. "auction" = competitive bidding, "buyItNow" = fixed price (includes Best Offer listings), "auctionWithBIN" = auction that also had a Buy It Now option. null when the listing type could not be determined. Distinct from the buyingFormat query parameter, which filters results by listing format (different enum, different concern).
bidCountnumber | nulloptional- Number of bids received. Present for auction listings, null for fixed-price (Buy It Now) listings.
categoryIdstringoptional- eBay category ID.
listingType"sold" | "active"optional- Whether this is a completed sale ("sold", the default) or a currently-listed item ("active", returned when sold=false).
shippingPricestring | nulloptional- Shipping cost; "0.00" when free, null when unknown.
shippingType"free" | "paid" | "pickup" | "unknown" | nulloptional- Shipping category.
totalPricestring | nulloptional- Listing price (soldPrice or currentPrice) + shippingPrice when both known.
sellerUsernamestring | nulloptional- eBay seller username.
sellerPositivePercentnumber | nulloptional- Seller positive feedback percentage.
sellerFeedbackScorenumber | nulloptional- Seller total feedback count.
itemLocationstring | nulloptional- Seller's country as shown on the eBay search results page. null when the seller is domestic (same country as the eBay domain) — eBay only displays a location label for international sellers. Use null to identify domestic listings and non-null for international ones. Localized per site language (e.g., "United States" on ebay.com, "Großbritannien" on ebay.de).
productRatingnumber | nulloptional- eBay product catalog star rating (0–5). Present when the listing is linked to an eBay product page (has an ePID). Omitted when no catalog linkage exists.
productReviewCountnumber | nulloptional- Number of eBay product catalog reviews backing productRating. Omitted when no catalog linkage exists.
scrapedAtstringoptional- ISO 8601 timestamp of when SoldComps fetched the listing.
Sold-listing fields (sold=true)
endedAtstring | nulloptional- Date the sale completed, as YYYY-MM-DD (date only — eBay never exposes a time of day). For active listings use timeLeft instead.
soldPricestring | nulloptional- The listing price at time of sale, as a decimal string. eBay does not disclose the accepted best-offer amount, so on Best Offer sales (bestOfferAccepted=true) this is an upper bound, not the realized price. For active listings the asking price is in currentPrice.
soldCurrencystring | nulloptional- ISO 4217 currency of soldPrice. Active listings use currentCurrency.
bestOfferAcceptedbooleanoptional- true when the seller accepted a best offer rather than the listing selling at the listed price. eBay never discloses the accepted offer amount — see soldPrice for what that field actually represents on a Best Offer sale. Requires includeCompleteListing=true (the default). For active listings, whether the listing accepts offers is in acceptsOffers.
Request
curl -H "Authorization: Bearer sc_YOUR_KEY_HERE" \
"https://api.sold-comps.com/v1/scrape/category\
?categoryId=27386\
&ebaySite=ebay.de\
&page=1\
&count=40\
&sortOrder=endedRecently"Response
{
"categoryId": "27386",
"page": 1,
"totalItems": 60,
"totalResults": "89",
"hasNextPage": true,
"autoSelectedCategory": null,
"items": [
{
"itemId": "334987654321",
"url": "https://www.ebay.de/itm/334987654321?nordt=true",
"thumbnailUrl": "https://i.ebayimg.com/images/g/xyzAAeSwCitqGLiR/s-l500.webp",
"fullResThumbnailUrl": "https://i.ebayimg.com/images/g/xyzAAeSwCitqGLiR/s-l1600.webp",
"epid": null,
"title": "Bosch PSB 18 LI-2 Ergonomic Akkuschrauber",
"condition": "Gebraucht",
"conditionId": 3000,
"sellerType": "private",
"buyingFormat": "auction",
"bestOfferAccepted": false,
"bidCount": 7,
"categoryId": "27386",
"endedAt": "2026-06-14",
"soldPrice": "45.00",
"soldCurrency": "EUR",
"shippingPrice": "5.90",
"shippingCurrency": "EUR",
"shippingType": "paid",
"totalPrice": "50.90",
"sellerUsername": "werkzeug_verkauf",
"sellerPositivePercent": 98.7,
"sellerFeedbackScore": 312,
"itemLocation": "Deutschland",
"scrapedAt": "2026-06-15T08:00:00.000Z"
}
]
}/api/bulk-searchBulk keyword search (SSE)
error events with code quota_exceeded. This endpoint always searches sold listings — there is no sold parameter.Request body (JSON)
keywordsstring[]required- Array of 1–20 search keywords. Each keyword runs as a separate eBay search and consumes 1 quota request on success. Duplicates are removed, preserving order.
countintegeroptionaldefault:40- Max items per keyword (1–40). Same as the count param on /v1/scrape.
ebaySitestringoptionaldefault:ebay.com- eBay regional site. Applied to every keyword.
ebay.comebay.co.ukebay.deebay.frebay.itebay.esebay.caebay.com.au sortOrderstringoptionaldefault:endedRecently- Sort order. Applied to every keyword.
endedRecentlytimeNewlyListedpricePlusPostageLowestpricePlusPostageHighestdistanceNearest itemConditionstringoptionaldefault:any- Condition filter. Applied to every keyword.
anynewused conditionIdintegeroptional- Numeric eBay condition ID (e.g. 1000 = New, 3000 = Used). Overrides itemCondition when both set. Applied to every keyword.
buyingFormatstringoptionaldefault:all- Buying format filter. Applied to every keyword.
allauctionbuyItNowacceptsOffers minPricenumberoptional- Minimum price filter. Applied to every keyword.
maxPricenumberoptional- Maximum price filter. Applied to every keyword.
soldAfterstringoptional- Inclusive lower bound on endedAt (YYYY-MM-DD). Post-parse filter, applied to every keyword.
soldBeforestringoptional- Inclusive upper bound on endedAt (YYYY-MM-DD). Post-parse filter, applied to every keyword.
aspectFilterobjectoptional- eBay item-aspect facet filters as a JSON object. Same format as /v1/scrape. Applied to every keyword.
includeCompleteListingbooleanoptionaldefault:true- Include eBay completed-listing metadata (LH_Complete=1) for accurate bestOfferAccepted detection. Applied to every keyword.
exactMatchbooleanoptionaldefault:true- When true, only exact-match items are returned — eBay's loosened-match results are stripped. Applied to every keyword.
SSE event types:
progress— keyword started scrapingresult— keyword completed withtotalItems,totalResults,hasNextPage,autoSelectedCategory, optionalscrapedCount, anditemsarray (same item shape as/v1/scrape)error— keyword failed (quota not charged). Status is"busy"when load-shed,"failed"otherwisecomplete— all keywords done, includestotal,succeeded, andfailedcounts. Stream closes
Response fields (each item)
itemIdstringoptional- eBay listing item ID.
urlstringoptional- Canonical listing URL with ?nordt=true to bypass eBay's catalog redirect.
thumbnailUrlstring | nulloptional- Listing thumbnail (500px) from i.ebayimg.com. null when the listing has no product image.
fullResThumbnailUrlstring | nulloptional- Full-resolution version of thumbnailUrl (~1600px), derived by replacing the size suffix (s-l500, s-l140, etc.) with s-l1600. null when thumbnailUrl is null.
epidstring | nulloptional- eBay catalog product ID. Stable across sellers for the same variant. null when the listing has no catalog match.
titlestring | nulloptional- Listing title.
conditionstring | nulloptional- eBay's own localized condition label (e.g. "Pre-Owned", "Gebraucht"), when it resolves to a known value. null when the listing shows no condition, or when the label eBay displayed does not match a known value (rare — the field is dropped rather than surfaced verbatim).
conditionIdnumber | nulloptional- eBay numeric condition ID (best-effort lookup from the localized label). Common: 1000 New, 3000 Used, 7000 For parts.
sellerType"private" | "business" | nulloptional- EU sites only (ebay.de, .fr, .it, .es). null on all non-EU sites. May also be null on EU sites served via eBay's newer card layout, pending mapping.
buyingFormat"auction" | "buyItNow" | "auctionWithBIN" | nulloptional- How the item was listed. "auction" = competitive bidding, "buyItNow" = fixed price (includes Best Offer listings), "auctionWithBIN" = auction that also had a Buy It Now option. null when the listing type could not be determined. Distinct from the buyingFormat query parameter, which filters results by listing format (different enum, different concern).
bidCountnumber | nulloptional- Number of bids received. Present for auction listings, null for fixed-price (Buy It Now) listings.
categoryIdstringoptional- eBay category ID.
listingType"sold" | "active"optional- Whether this is a completed sale ("sold", the default) or a currently-listed item ("active", returned when sold=false).
shippingPricestring | nulloptional- Shipping cost; "0.00" when free, null when unknown.
shippingType"free" | "paid" | "pickup" | "unknown" | nulloptional- Shipping category.
totalPricestring | nulloptional- Listing price (soldPrice or currentPrice) + shippingPrice when both known.
sellerUsernamestring | nulloptional- eBay seller username.
sellerPositivePercentnumber | nulloptional- Seller positive feedback percentage.
sellerFeedbackScorenumber | nulloptional- Seller total feedback count.
itemLocationstring | nulloptional- Seller's country as shown on the eBay search results page. null when the seller is domestic (same country as the eBay domain) — eBay only displays a location label for international sellers. Use null to identify domestic listings and non-null for international ones. Localized per site language (e.g., "United States" on ebay.com, "Großbritannien" on ebay.de).
productRatingnumber | nulloptional- eBay product catalog star rating (0–5). Present when the listing is linked to an eBay product page (has an ePID). Omitted when no catalog linkage exists.
productReviewCountnumber | nulloptional- Number of eBay product catalog reviews backing productRating. Omitted when no catalog linkage exists.
scrapedAtstringoptional- ISO 8601 timestamp of when SoldComps fetched the listing.
Sold-listing fields (sold=true)
endedAtstring | nulloptional- Date the sale completed, as YYYY-MM-DD (date only — eBay never exposes a time of day). For active listings use timeLeft instead.
soldPricestring | nulloptional- The listing price at time of sale, as a decimal string. eBay does not disclose the accepted best-offer amount, so on Best Offer sales (bestOfferAccepted=true) this is an upper bound, not the realized price. For active listings the asking price is in currentPrice.
soldCurrencystring | nulloptional- ISO 4217 currency of soldPrice. Active listings use currentCurrency.
bestOfferAcceptedbooleanoptional- true when the seller accepted a best offer rather than the listing selling at the listed price. eBay never discloses the accepted offer amount — see soldPrice for what that field actually represents on a Best Offer sale. Requires includeCompleteListing=true (the default). For active listings, whether the listing accepts offers is in acceptsOffers.
Request
curl -X POST "https://api.sold-comps.com/api/bulk-search" \
-H "Authorization: Bearer sc_YOUR_KEY_HERE" \
-H "Content-Type: application/json" \
-d '{"keywords":["iphone 15 pro","macbook air m2","airpods pro"]}'Response
event: progress
data: {"keyword":"iphone 15 pro","status":"processing"}
event: result
data: {"keyword":"iphone 15 pro","status":"completed","totalItems":142,"totalResults":"14,000+","hasNextPage":true,"autoSelectedCategory":null,"scrapedCount":142,"items":[{"itemId":"123456789","title":"Apple iPhone 15 Pro 256GB","soldPrice":"899.99","soldCurrency":"USD","condition":"Pre-Owned","endedAt":"2026-08-15"}]}
event: progress
data: {"keyword":"macbook air m2","status":"processing"}
event: result
data: {"keyword":"macbook air m2","status":"completed","totalItems":98,"totalResults":"5,200+","hasNextPage":true,"autoSelectedCategory":null,"items":[...]}
event: complete
data: {"total":3,"succeeded":3,"failed":0}Async sweeps
Max Mode
Max Mode auto-paginates server-side. Submit once, then poll for progress, get the result by email, or stream a signed CSV. Unlike /v1/scrape, a Max Mode submission is not 1 credit — each successfully scraped page debits 1 request from your monthly quota. A 50-page sweep can cost up to 50 requests. Failed pages don't debit. maxPages caps blast radius (max 100).
One job per user can be active at a time. A second submit while one is running returns 409 with the existing jobId.
/v1/scrape/maxSubmit
jobId you can poll, cancel, or wait for the worker to deliver via email / signed download URL. Pass Idempotency-Key to dedupe re-submits over a 24h window.Request body
keywordstringrequired- eBay search term.
maxPagesinteger (1–100)optionaldefault:50- Upper bound on how many pages the worker will fetch. Each successful page debits 1 request from your monthly quota.
resultTypeenumoptionaldefault:inline- How to deliver the result: inline (poll the results endpoint), email (CSV attached or signed link), download (signed CSV stream URL).
inlineemaildownload emailTostringoptional- Recipient address when resultType=email. Falls back to the account email on file.
daysToScrapeinteger (1–365)optionaldefault:90- History window in days. Currently has no effect on the scrape — the value is accepted and stored with the job, but is not yet applied to the fetch.
ebaySiteenumoptionaldefault:ebay.com- eBay domain to scrape.
ebay.comebay.co.ukebay.deebay.frebay.itebay.esebay.caebay.com.au categoryIdstringoptionaldefault:0- eBay category ID (_sacat).
sortOrderenumoptionaldefault:endedRecently- Sort order.
endedRecentlytimeNewlyListedpricePlusPostageLowestpricePlusPostageHighestdistanceNearest minPricenumberoptional- Minimum price filter.
maxPricenumberoptional- Maximum price filter.
itemLocationenumoptionaldefault:default- Item location filter.
defaultdomesticworldwide itemConditionenumoptionaldefault:any- Item condition filter.
anynewused conditionIdnumberoptional- eBay numeric condition ID filter. Common IDs: 3 (New), 4 (Used), 1000 (Brand New), 1500 (Open box), 2750 (Like New), 3000 (Used), 7000 (For parts). Valid IDs vary by eBay category. When set, overrides itemCondition.
buyingFormatenumoptionaldefault:all- Filter by listing format (request filter — distinct from the per-item buyingFormat response field, which classifies how a listing was actually listed and uses a different enum). "auction" = auction-only, "buyItNow" = fixed-price / Buy It Now, "acceptsOffers" = listings with Best Offer enabled. Default "all" (no format filter).
allauctionbuyItNowacceptsOffers sellerTypeenumoptional- EU sites only.
privatebusiness includeCompleteListingbooleanoptionaldefault:true- Include eBay completed-listing metadata (LH_Complete=1) so bestOfferAccepted is detected accurately. Does not change which listings are returned. Set to false only to match pre-July-2026 behavior.
aspectFilterobjectoptional- eBay item-aspect facet filters. Keys and values are the human-readable facet names exactly as shown in eBay's sidebar refinements. Multi-select values use pipe as separator: {"Network":"Unlocked|AT&T"}. Invalid or unrecognized facets are silently ignored by eBay.
exactMatchbooleanoptionaldefault:true- When true (default), strips eBay's loosened-match results ("Results matching fewer words") so only items closely matching your keyword are returned. Set to false to include all results eBay returns.
Request
curl -X POST https://api.sold-comps.com/v1/scrape/max \
-H "Authorization: Bearer sc_YOUR_KEY_HERE" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: rtx-4090-march-sweep" \
-d '{
"keyword": "rtx 4090",
"maxPages": 50,
"resultType": "email",
"emailTo": "[email protected]",
"ebaySite": "ebay.com",
"daysToScrape": 90
}'Response
{
"jobId": "8c2f1a3e-3b54-4f6b-9c2a-1d6e2b9a0d31",
"status": "queued",
"resultsUrl": "/v1/scrape/max/results/8c2f1a3e-3b54-4f6b-9c2a-1d6e2b9a0d31",
"estimatedSeconds": 150
}/v1/scrape/max/results/:jobIdPoll
410 Gone.Terminal statuses: done, failed, cancelled, quota_exhausted, upstream_unhealthy.
terminationReason: natural_end (no more pages), maxPages_reached, quota_exhausted, upstream_unhealthy (5 consecutive page failures), cancelled, or terminal_error (page 1 failed).
Running response
{
"jobId": "8c2f1a3e-3b54-4f6b-9c2a-1d6e2b9a0d31",
"status": "running",
"keyword": "rtx 4090",
"ebaySite": "ebay.com",
"createdAt": "2026-06-13T20:01:14.000Z",
"startedAt": "2026-06-13T20:01:14.000Z",
"progress": {
"currentPage": 12,
"pagesAttempted": 12,
"pagesSucceeded": 12,
"pagesFailed": 0,
"failedPages": [],
"itemsCollected": 2880,
"consecutiveFailures": 0
}
}Request
curl -H "Authorization: Bearer sc_YOUR_KEY_HERE" \
https://api.sold-comps.com/v1/scrape/max/results/8c2f1a3e-3b54-4f6b-9c2a-1d6e2b9a0d31Response
{
"jobId": "8c2f1a3e-3b54-4f6b-9c2a-1d6e2b9a0d31",
"status": "done",
"keyword": "rtx 4090",
"ebaySite": "ebay.com",
"createdAt": "2026-06-13T20:01:13.000Z",
"startedAt": "2026-06-13T20:01:14.000Z",
"completedAt": "2026-06-13T20:04:09.000Z",
"expiresAt": "2026-07-13T20:04:09.000Z",
"summary": {
"pagesAttempted": 42,
"pagesSucceeded": 42,
"pagesFailed": 0,
"failedPages": [],
"totalItems": 9870,
"partial": false,
"terminationReason": "natural_end"
},
"error": null,
"delivery": {
"method": "email",
"status": "delivered",
"lastError": null
}
}/v1/scrape/max/:jobIdCancel
200. Pages already scraped are not refunded.Returns 200 with the updated job status. The final delivery for cancelled jobs is short-circuited — no email is sent and the CSV download returns the partial result so far.
Request
curl -X DELETE \
-H "Authorization: Bearer sc_YOUR_KEY_HERE" \
https://api.sold-comps.com/v1/scrape/max/8c2f1a3e-3b54-4f6b-9c2a-1d6e2b9a0d31/v1/scrape/max/:jobId/download.csvDownload CSV
?token= query parameter, not a Bearer header — the URL is safe to share in email. Tokens expire 24 hours after the job completes.The download URL is returned at the top level of the poll response as downloadUrl (when resultType=download) or attached directly to completion emails. Do not append your API key — the signed token is the auth.
CSV columns: every field on the per-item response, one row per listing.
Request
# The download URL is returned in the poll response when
# resultType=download. The token is in the URL — do NOT add a Bearer header.
curl -o results.csv \
"https://api.sold-comps.com/v1/scrape/max/8c2f1a3e.../download.csv?token=eyJhb..."/rapidapi/scrape-ebayRapidAPI - Scrape eBay
/v1/scrape, but callable only through the SoldComps RapidAPI listing. Auth is via RapidAPI's marketplace headers — X-RapidAPI-Key + X-RapidAPI-Host — not Bearer tokens. Quotas and billing run through your RapidAPI subscription.Query parameters
keywordstringrequired- Passed directly to eBay's search bar. Supports eBay's minus-sign syntax to exclude terms — e.g. "iphone 15 pro -case -screen -lot" drops listings containing case, screen, or lot from results.
pageintegeroptionaldefault:1- Page number of eBay results to fetch. Increment until hasNextPage is false.
countinteger (1–200)optionaldefault:40 (sold) / 200 (active)- Max items per page. Sold listings return up to 40 (or 200 with cookies); active listings (sold=false) return up to 200. Values above the cap are silently clamped. A ceiling, not a guarantee — the response may contain fewer items.
ebaySiteenumoptionaldefault:ebay.com- eBay domain to scrape.
ebay.comebay.co.ukebay.deebay.frebay.itebay.esebay.caebay.com.au categoryIdstringoptionaldefault:0- eBay category ID (_sacat). Browse all 17,000+ IDs at sold-comps.com/ebay-categories. Use "0" for all categories.
sortOrderenumoptionaldefault:endedRecently- Sort order for results.
endedRecentlytimeNewlyListedpricePlusPostageLowestpricePlusPostageHighestdistanceNearest minPricenumberoptional- Minimum price filter, in listing currency.
maxPricenumberoptional- Maximum price filter, in listing currency.
itemLocationenumoptionaldefault:default- Item location filter.
defaultdomesticworldwide itemConditionenumoptionaldefault:any- Item condition filter applied as a request filter on eBay.
anynewused conditionIdnumberoptional- eBay numeric condition ID filter. Common IDs: 3 (New), 4 (Used), 1000 (Brand New), 1500 (Open box), 2750 (Like New), 3000 (Used), 7000 (For parts). Valid IDs vary by eBay category. When set, overrides itemCondition. When omitted, no condition filter is applied.
buyingFormatenumoptionaldefault:all- Filter by listing format (request filter — distinct from the per-item buyingFormat response field, which classifies how a listing was actually listed and uses a different enum). "auction" = auction-only, "buyItNow" = fixed-price / Buy It Now, "acceptsOffers" = listings with Best Offer enabled. Default "all" (no format filter).
allauctionbuyItNowacceptsOffers sellerTypeenumoptional- Filter results by seller type. Only effective on EU sites (ebay.de, .fr, .it, .es). On non-EU sites the filter is silently ignored.
privatebusiness includeCompleteListingbooleanoptionaldefault:true- Include eBay completed-listing metadata (LH_Complete=1). This is what enables accurate bestOfferAccepted detection — without it, eBay does not render the "Best offer accepted" signal and bestOfferAccepted is false for nearly all items. Does not change which listings are returned: results stay sold-only (LH_Sold=1 takes precedence). Set to false only to match pre-July-2026 behavior.
soldbooleanoptionaldefault:true- When true (default), returns completed/sold listings. When false, returns ACTIVE (currently-listed) results instead. Active responses swap the sold-only fields (soldPrice, soldCurrency, endedAt, bestOfferAccepted) for active-only ones: listingType="active", the asking price in currentPrice/currentPriceMax/currentCurrency, plus watcherCount, unitsSold, acceptsOffers, and timeLeft.
soldAfterstring (YYYY-MM-DD)optional- Inclusive lower bound on endedAt. Applied after the page is scraped — sold-only, silently ignored when sold=false. See scrapedCount in the response for how to tell whether more pages will help.
soldBeforestring (YYYY-MM-DD)optional- Inclusive upper bound on endedAt. Applied after the page is scraped — sold-only, silently ignored when sold=false.
aspectFilterstring (JSON)optional- JSON object of eBay item-aspect facet filters. Keys and values are the human-readable facet names exactly as shown in eBay's sidebar refinements (e.g. "Brand", "Storage Capacity", "Network"). Multi-select values use pipe as separator: {"Network":"Unlocked|AT&T"}. Facet names are dynamic per eBay category and vary by site language. Invalid or unrecognized facets are silently ignored by eBay.
exactMatchbooleanoptionaldefault:true- When true (default), strips eBay's loosened-match results ("Results matching fewer words") so only items closely matching your keyword are returned. Set to false to include all results eBay returns — useful when you want maximum volume over keyword precision.
Response fields (each item)
itemIdstringoptional- eBay listing item ID.
urlstringoptional- Canonical listing URL with ?nordt=true to bypass eBay's catalog redirect.
thumbnailUrlstring | nulloptional- Listing thumbnail (500px) from i.ebayimg.com. null when the listing has no product image.
fullResThumbnailUrlstring | nulloptional- Full-resolution version of thumbnailUrl (~1600px), derived by replacing the size suffix (s-l500, s-l140, etc.) with s-l1600. null when thumbnailUrl is null.
epidstring | nulloptional- eBay catalog product ID. Stable across sellers for the same variant. null when the listing has no catalog match.
titlestring | nulloptional- Listing title.
conditionstring | nulloptional- eBay's own localized condition label (e.g. "Pre-Owned", "Gebraucht"), when it resolves to a known value. null when the listing shows no condition, or when the label eBay displayed does not match a known value (rare — the field is dropped rather than surfaced verbatim).
conditionIdnumber | nulloptional- eBay numeric condition ID (best-effort lookup from the localized label). Common: 1000 New, 3000 Used, 7000 For parts.
sellerType"private" | "business" | nulloptional- EU sites only (ebay.de, .fr, .it, .es). null on all non-EU sites. May also be null on EU sites served via eBay's newer card layout, pending mapping.
buyingFormat"auction" | "buyItNow" | "auctionWithBIN" | nulloptional- How the item was listed. "auction" = competitive bidding, "buyItNow" = fixed price (includes Best Offer listings), "auctionWithBIN" = auction that also had a Buy It Now option. null when the listing type could not be determined. Distinct from the buyingFormat query parameter, which filters results by listing format (different enum, different concern).
bidCountnumber | nulloptional- Number of bids received. Present for auction listings, null for fixed-price (Buy It Now) listings.
categoryIdstringoptional- eBay category ID.
listingType"sold" | "active"optional- Whether this is a completed sale ("sold", the default) or a currently-listed item ("active", returned when sold=false).
shippingPricestring | nulloptional- Shipping cost; "0.00" when free, null when unknown.
shippingType"free" | "paid" | "pickup" | "unknown" | nulloptional- Shipping category.
totalPricestring | nulloptional- Listing price (soldPrice or currentPrice) + shippingPrice when both known.
sellerUsernamestring | nulloptional- eBay seller username.
sellerPositivePercentnumber | nulloptional- Seller positive feedback percentage.
sellerFeedbackScorenumber | nulloptional- Seller total feedback count.
itemLocationstring | nulloptional- Seller's country as shown on the eBay search results page. null when the seller is domestic (same country as the eBay domain) — eBay only displays a location label for international sellers. Use null to identify domestic listings and non-null for international ones. Localized per site language (e.g., "United States" on ebay.com, "Großbritannien" on ebay.de).
productRatingnumber | nulloptional- eBay product catalog star rating (0–5). Present when the listing is linked to an eBay product page (has an ePID). Omitted when no catalog linkage exists.
productReviewCountnumber | nulloptional- Number of eBay product catalog reviews backing productRating. Omitted when no catalog linkage exists.
scrapedAtstringoptional- ISO 8601 timestamp of when SoldComps fetched the listing.
Sold-listing fields (sold=true)
endedAtstring | nulloptional- Date the sale completed, as YYYY-MM-DD (date only — eBay never exposes a time of day). For active listings use timeLeft instead.
soldPricestring | nulloptional- The listing price at time of sale, as a decimal string. eBay does not disclose the accepted best-offer amount, so on Best Offer sales (bestOfferAccepted=true) this is an upper bound, not the realized price. For active listings the asking price is in currentPrice.
soldCurrencystring | nulloptional- ISO 4217 currency of soldPrice. Active listings use currentCurrency.
bestOfferAcceptedbooleanoptional- true when the seller accepted a best offer rather than the listing selling at the listed price. eBay never discloses the accepted offer amount — see soldPrice for what that field actually represents on a Best Offer sale. Requires includeCompleteListing=true (the default). For active listings, whether the listing accepts offers is in acceptsOffers.
Request
curl --request GET \
--url 'https://sold-comps.p.rapidapi.com/rapidapi/scrape-ebay?keyword=iphone+15+pro&count=40' \
--header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY' \
--header 'X-RapidAPI-Host: sold-comps.p.rapidapi.com'Response
{
"keyword": "iphone 15 pro",
"page": 1,
"totalItems": 40,
"totalResults": "14,000+",
"hasNextPage": true,
"autoSelectedCategory": { "id": "9355", "name": "Cell Phones & Smartphones" },
"items": [
{
"itemId": "256123456789",
"url": "https://www.ebay.com/itm/256123456789?nordt=true",
"thumbnailUrl": "https://i.ebayimg.com/images/g/3nkAAeSwCitqGLiR/s-l500.webp",
"fullResThumbnailUrl": "https://i.ebayimg.com/images/g/3nkAAeSwCitqGLiR/s-l1600.webp",
"epid": "20049285656",
"title": "Apple iPhone 15 Pro 256GB Natural Titanium - Unlocked",
"condition": "Pre-Owned",
"conditionId": 3000,
"sellerType": null,
"buyingFormat": "buyItNow",
"bestOfferAccepted": false,
"bidCount": null,
"categoryId": "9355",
"listingType": "sold",
"endedAt": "2026-03-10",
"soldPrice": "899.99",
"soldCurrency": "USD",
"shippingPrice": "0.00",
"shippingCurrency": "USD",
"shippingType": "free",
"totalPrice": "899.99",
"sellerUsername": "top-deals-store",
"sellerPositivePercent": 99.8,
"sellerFeedbackScore": 14200,
"itemLocation": "United States",
"productRating": 4.5,
"productReviewCount": 12,
"scrapedAt": "2026-03-14T21:00:00.000Z"
}
]
}/v1/poshmark/soldSearch Poshmark sold listings
enrich=true, each request costs 2 quota slots — the extra slot covers the per-listing detail API call that adds sold date, days to sell, seller location, and other enrichment fields.Query parameters
keywordstringrequired- Poshmark search term.
pageintegeroptionaldefault:1- Page number. Each page returns up to 48 items (Poshmark's native page size). Increment until hasNextPage is false.
minPricenumberoptional- Minimum price filter (USD).
maxPricenumberoptional- Maximum price filter (USD).
departmentenumoptionaldefault:all- Poshmark department filter.
allwomenmenkidshomepetselectronics conditionenumoptionaldefault:all- Condition filter. "nwt" = New With Tags only.
allnwt brandstringoptional- Filter by brand name (e.g. "Louis Vuitton").
sortByenumoptionaldefault:sold_recently- Sort order for results.
sold_recentlyprice_ascprice_desclikes enrichbooleanoptionaldefault:false- When true, each listing is enriched via Poshmark's detail API, adding soldAt, listedAt, daysToSell, colors, description, category, condition, commentsCount, shareCount, shippingCost, sellerLocation, sellerSoldCount, and sellerAvgShipTime. Costs 2 quota slots instead of 1. When false (default), only search-page fields are returned (faster, 1 slot).
enrich=true, each request consumes 2 slots from your monthly quota instead of 1. The extra slot covers the per-listing detail API call that populates soldAt, listedAt, daysToSell, category, condition, colors, description, shippingCost, commentsCount, shareCount, sellerLocation, sellerSoldCount, and sellerAvgShipTime. When enrich=false (the default), those fields are null and only 1 slot is consumed.Response fields (each item)
listingIdstringoptional- Poshmark listing ID (24-char hex).
urlstringoptional- Canonical Poshmark listing URL.
titlestringoptional- Listing title.
soldPricenumber | nulloptional- Sale price in USD.
originalPricenumber | nulloptional- Original listing price in USD.
brandstring | nulloptional- Brand name.
sizestring | nulloptional- Size label (e.g. "OS", "M", "10").
nwtbooleanoptional- New With Tags flag.
likesCountnumber | nulloptional- Number of likes on the listing.
sellerUsernamestring | nulloptional- Poshmark seller username.
thumbnailUrlstring | nulloptional- Listing thumbnail URL.
scrapedAtstringoptional- ISO 8601 timestamp when the listing was scraped.
Enrichment fields (enrich=true only)
These fields are populated only when enrich=true. When enrichment is off or fails for a listing, they return null (or [] for colors).
soldAtstring | nulloptional- ISO timestamp when the item sold.
listedAtstring | nulloptional- ISO timestamp when the item was first published.
daysToSellnumber | nulloptional- Days between listedAt and soldAt.
categorystring | nulloptional- Department > Category path (e.g. "Women > Bags > Totes").
conditionstring | nulloptional- Item condition from Poshmark (e.g. "Pre-owned").
colorsstring[]optional- Color names. Empty array when not enriched.
descriptionstring | nulloptional- Full listing description text.
shippingCostnumber | nulloptional- Shipping cost in USD.
commentsCountnumber | nulloptional- Number of comments on the listing.
shareCountnumber | nulloptional- Number of shares.
sellerLocationstring | nulloptional- Seller city and state (e.g. "Los Angeles, CA").
sellerSoldCountnumber | nulloptional- Total listings the seller has sold.
sellerAvgShipTimenumber | nulloptional- Seller's average ship time in days.
Enriched response (enrich=true)
With enrich=true, each item includes the full set of enrichment fields. The default (enrich=false) response is shown at the top of this endpoint.
{
"keyword": "louis vuitton neverfull",
"page": 1,
"totalItems": 48,
"hasNextPage": true,
"items": [
{
"listingId": "6478a1b2c3d4e5f6a7b8c9d0",
"url": "https://poshmark.com/listing/Louis-Vuitton-Neverfull-6478a1b2c3d4e5f6a7b8c9d0",
"title": "Louis Vuitton Neverfull MM Damier Ebene",
"soldPrice": 1250,
"originalPrice": 1960,
"shippingCost": 7.97,
"brand": "Louis Vuitton",
"size": "OS",
"category": "Women > Bags > Totes",
"condition": "Pre-owned",
"nwt": false,
"colors": ["Brown"],
"description": "Authentic Louis Vuitton Neverfull MM in Damier Ebene...",
"soldAt": "2026-07-15T18:30:00.000Z",
"listedAt": "2026-06-01T12:00:00.000Z",
"daysToSell": 44.27,
"likesCount": 23,
"commentsCount": 4,
"shareCount": 12,
"sellerUsername": "luxurycloset",
"sellerLocation": "Los Angeles, CA",
"sellerSoldCount": 847,
"sellerAvgShipTime": 1.5,
"thumbnailUrl": "https://di2ponv0v5otw.cloudfront.net/posts/2026/07/15/...",
"scrapedAt": "2026-08-09T14:30:00.000Z"
}
]
}Request
curl -H "Authorization: Bearer sc_YOUR_KEY_HERE" \
"https://api.sold-comps.com/v1/poshmark/sold\
?keyword=louis+vuitton+neverfull\
&page=1\
&department=women\
&sortBy=sold_recently"Response
{
"keyword": "louis vuitton neverfull",
"page": 1,
"totalItems": 48,
"hasNextPage": true,
"items": [
{
"listingId": "6478a1b2c3d4e5f6a7b8c9d0",
"url": "https://poshmark.com/listing/Louis-Vuitton-Neverfull-6478a1b2c3d4e5f6a7b8c9d0",
"title": "Louis Vuitton Neverfull MM Damier Ebene",
"soldPrice": 1250,
"originalPrice": 1960,
"shippingCost": null,
"brand": "Louis Vuitton",
"size": "OS",
"category": null,
"condition": null,
"nwt": false,
"colors": [],
"description": null,
"soldAt": null,
"listedAt": null,
"daysToSell": null,
"likesCount": 23,
"commentsCount": null,
"shareCount": null,
"sellerUsername": "luxurycloset",
"sellerLocation": null,
"sellerSoldCount": null,
"sellerAvgShipTime": null,
"thumbnailUrl": "https://di2ponv0v5otw.cloudfront.net/posts/2026/07/15/...",
"scrapedAt": "2026-08-09T14:30:00.000Z"
}
]
}