Poshmark Sold Comps Scraper | Sold Price & Days to Sell. · Apify
Poshmark Sold Comps & Resale Price Scraper avatar

Poshmark Sold Comps & Resale Price Scraper

Pricing

from $1.50 / 1,000 results

Go to Apify Store
Poshmark Sold Comps & Resale Price Scraper

Poshmark Sold Comps & Resale Price Scraper

Scrape SOLD Poshmark listings from the US or Canada into resale price comps: sold price, days-to-sell, condition and size. Each search opens with a Pricing summary: recommended price, p25 to p75 range and days to sell, overall and by condition, counted once per seller and shown only with 5+ sellers.

Pricing

from $1.50 / 1,000 results

Rating

0.0

(0)

Developer

KULQIZ

KULQIZ

Maintained by Community

Actor stats

0

Bookmarked

8

Total users

0

Monthly active users

5.6 hours

Issues response

4 days ago

Last modified

Categories

Features

Limited permissions

Share

Poshmark Sold Comps and Resale Price Scraper

Search one or many items on Poshmark (US or Canada) and the first thing you see is the pricing decision: a Pricing summary with the recommended list price, the price range, how many sold comps back it, their sizes and conditions, how old those sales are, and links to the comps so you can check the price yourself. When there are too few comps, the row says "Not enough data" instead of guessing. Below it you get every sold comp: real sold price, days-to-sell, condition, size, and seller.

Made for resellers, flippers, and sourcing sellers who price from real data. If you have asked "what does this actually sell for on Poshmark, and how fast?", this answers it.

Pay-per-result: you pay for the listing records you get, and maxItems caps the spend. A maximum cost per run caps it too; the summary then uses only the comps the budget paid for. Not affiliated with or endorsed by Poshmark.

Why this one

The Store has several Poshmark sold-listing scrapers, free and paid, and most of them return one row per listing. This one also does the pricing math:

  • The Pricing summary opens first in the Output tab. Put several items in one run and compare them side by side, then export the table as CSV or JSON. Every recommendation links to the comps behind it, so it can be checked rather than trusted.
  • Each search is also split by condition, because a Like New and a Good bag do not sell for the same price. A comp-confidence score reflects sample size and how recent the sales are.
  • Each seller counts once, at the median of their sales, so a seller with many units of the same bag cannot set the price for everyone.
  • Price stats are outlier-trimmed (IQR fence) once the sample is big enough, so one mispriced bundle does not move your median.
  • It covers poshmark.com (USD) and poshmark.ca (CAD). Set country to choose.
  • It is built for Poshmark's 403 blocking: proxy rotation, session retirement on a block, challenge-page detection with backoff, and a per-run DATA_QUALITY record so you see the real block rate and completeness of your own run.
  • It is fast: it reads Poshmark's search response directly, about 48 comps per request, with no headless browser and no per-listing page fetch. A 60-comp test run in September 2026 took 43 seconds.
  • Fields Poshmark does not show come back null, never guessed. Records are schema-validated before they are written.

Every figure in the tables and real example rows comes from a measured run of this Actor's code, locally or on the platform. The AGGREGATE example only shows the record's shape.

Pricing summary

The Output tab opens on the Pricing summary. Each search gets one row for all conditions, then one row per condition when it found more than one:

ColumnWhat it means
Status"Ready", or "Not enough data" when the row has fewer than 5 different sellers. No price is shown then.
RecommendedEach seller counts once, at the median of their sales; this is the median of those seller prices, with outliers trimmed once there are 8 or more.
Price warningShown right under the price when the estimate is sensitive to the sample (rule below). The price itself is not changed.
Range (p25 to p75)The middle half of the seller prices (one per seller). The low end prices to sell fast, the high end is for a patient seller.
Sold compsHow many sold listings the row is based on.
SellersHow many different sellers those sales came from. The price and the status use this count.
SizesThe sizes in those comps, most common first.
Comp confidencehigh, medium or low, from the number of sellers and how recent the sales are (rule below).
Days to sellMedian days from listing to sale, one value per seller. Units sold from multi-quantity listings are left out, because their listing dates are reset at the sale.
Sample ageHow long ago the newest and oldest comps sold, and the median.
SourcesThe Poshmark sold search, plus the 3 comps nearest the recommended price.

When the price carries a warning. Some prices sit right next to a jump in what sellers charged, so a sample with a few different sellers could move the median across it. The row then says, next to the price: "Price estimate is sensitive to the sample. Check the price range and comparable listings. For a more specific estimate, search for the exact variant." The rule: take the seller prices the recommendation uses, let one seller in ten differ (at least one), and look at every position the median could move to. If the biggest step between neighbouring prices there is 12% of the price or more, the warning shows. The 12% comes from the stored November 2026 data: ordinary steps between round prices reached 11.1% ($34 to $38, $200 to $225), while the Coach Tabby 26 Like New gap that flipped its price from $187 to $220 between two runs was 12.7% to 15%. Rows under 5 sellers show Not enough data and no warning.

When the run's budget cuts results short. If you set a maximum cost per run that pays for fewer results than maxItems, the Actor stops at what the budget covers (for example 33 results for US$0.05) and does not fetch pages it cannot save. The Pricing summary, its CSV, JSON and the AGGREGATE records are then built only from the comps saved to the dataset, and the summary shows: "Results limited by the run's budget: this summary uses only the comps saved to the dataset." Comps, sellers, prices, ranges and the price warning all come from those saved comps; under 5 sellers the row says Not enough data. Each row and aggregate carries resultsLimitedByBudget (true or false).

The same table is in the Output tab as Pricing summary (CSV) for Excel or Google Sheets, and as Pricing summary (JSON) with the example comps for each row. These are Key-Value Store records (PRICING_SUMMARY, PRICING_SUMMARY.csv, PRICING_SUMMARY.html), so they are not billed as results. By API: GET https://api.apify.com/v2/key-value-stores/<defaultKeyValueStoreId>/records/PRICING_SUMMARY.

Benchmarks

Measured 2026-06-17, on the first version (detail pages, before search-only extraction).

What we measuredResult
Live sold listings parsed (coach tabby, lululemon align, nike dunk)17
Passed schema validation17 / 17 (100%)
Core field completeness on live data (price, sold date, days-to-sell, brand, size, condition)100%
Sold comps returned by one search fetch44 / 39 / 16
Block rate, 24 paced requests from a plain datacenter IP, no proxy0 / 24 (0%)

The block-rate number is a floor, not a production figure. It was one IP, a short session, at modest paced volume. Poshmark's anti-bot escalates under sustained load, which is why every run writes a DATA_QUALITY record and why residential proxy is available for heavy runs. We have not published a sustained-load block rate. Your run's DATA_QUALITY is the real number.

We did not measure competitor block rates, accuracy, or price. We cannot run another Actor in a controlled way, so there are no competitor numbers here.

What you get

One dataset record per listing:

{
"itemId": "69bac03e74cb47e2344a7847",
"url": "https://poshmark.com/listing/Coach-Tabby-26-Black-Leather-...",
"title": "Coach Tabby 26 Black Leather",
"brand": "Coach",
"department": "Women",
"category": "Bags",
"size": "OS",
"condition": "Like New",
"color": "Black",
"originalRetailPrice": 395.0,
"listingPrice": 240.0,
"soldPrice": 240.0,
"currency": "USD",
"isSold": true,
"soldDateObserved": "2026-03-22",
"daysToSell": 4,
"likesCount": 47,
"commentsCount": 6,
"sellerUsername": "luxuryhandba",
"imageUrls": ["https://di2ponv0v5otw.cloudfront.net/posts/..."],
"scrapedAt": "2026-06-17T03:00:00Z",
"sourceQuery": "coach tabby"
}

One Pricing summary row per search and condition (PRICING_SUMMARY). A real row from the November 2026 measurement below (example comps cut to one):

{
"query": "coach tabby 26",
"condition": "Like New",
"status": "OK",
"statusText": "Ready",
"currency": "USD",
"recommendedPrice": 187.0, "priceLow": 162.5, "priceHigh": 260.0,
"expectedDaysToSell": 4,
"soldComps": 56,
"sellers": 40,
"resultsLimitedByBudget": false,
"priceWarning": { "code": "SENSITIVE_TO_SAMPLE", "message": "Price estimate is sensitive to the sample. Check the price range and comparable listings. For a more specific estimate, search for the exact variant.",
"gapFrom": 187.0, "gapTo": 215.0, "gapShare": 0.15, "threshold": 0.12, "sellersVaried": 4 },
"compConfidence": "high",
"sizes": "OS (54), One size (1), 10” W x 5.5” H x 2.5” D (1)",
"newestSale": "2026-11-08", "oldestSale": "2026-03-22", "medianSaleAgeDays": 14,
"searchUrl": "https://poshmark.com/search?query=coach+tabby+26&availability=sold_out",
"exampleComps": [
{ "url": "https://poshmark.com/listing/Coach-Tabby-Shoulder-Bag-26-In-Signature-Canvas-6ad0126eb9dd70d01233b9f7",
"soldPrice": 187.0, "soldDate": "2026-10-15", "condition": "Like New", "size": "OS" }
]
}

When computeAggregates is on (the default), one detailed record per search term (AGGREGATE-<slug>) as well. Example shape (the values only illustrate the fields):

{
"query": "coach tabby",
"count": 44, "soldCount": 41, "sellerCount": 33,
"currency": "USD",
"medianSoldPrice": 196.0, "p25SoldPrice": 160.0, "p75SoldPrice": 230.0,
"outliersRemoved": 2,
"avgDaysToSell": 12.2, "medianDaysToSell": 4,
"sellThroughRate": null,
"windowDays": 140, "pctSoldWithin30Days": 0.67, "pctSoldWithin90Days": 0.83,
"compConfidence": "medium",
"priceByCondition": { "Like New": 220.0, "New With Tags": 245.0, "Used": 150.0 },
"priceBySize": { "OS": 196.0 },
"pricingRecommendation": {
"listAt": 196.0, "fastSaleListAt": 160.0, "topDollarListAt": 230.0,
"expectedDaysToSell": 4, "confidence": "medium"
},
"priceWarning": null,
"resultsLimitedByBudget": false
}

compConfidence is transparent: high needs at least 30 different sellers and at least 60% sold within 60 days, medium needs at least 10 sellers, otherwise low. No price is suggested below 5 different sellers, in the Pricing summary or the aggregate. Prices count each seller once, at the median of their sales; counts like soldCount include every sale. Price stats are outlier-trimmed (IQR fence) once the sample is large enough, so one mispriced bundle does not skew your median. sellThroughRate is null in the default sold-only mode, because a sold-only sample is 100% sold. Set soldOnly to false to sample sold and active and get a real rate.

Measured 2026-11-09 on poshmark.com, 96 sold comps per search, with the Actor's own parser and Pricing summary code.

SearchComps that are the modelOldest saleRecommendedRange (p25 to p75)Spread
coach tabby (plain keyword)32% say 26, 6% say 20Dec 2022$222$150 to $3000.68
coach tabby 26100%Mar 2026$188$161 to $2870.67
coach tabby 20100%Oct 2021$240$180 to $2920.47

Spread is (p75 minus p25) divided by the recommended price; lower means the comps agree more.

What the plain keyword search gets wrong: only 38% of its comps name a size at all (32% say 26, 6% say 20); the rest are other Tabby models or do not say. Its $222 answer is $34 above the Tabby 26 price and $18 below the Tabby 20 price. The specific searches are on-model. The Tabby 20 comps also agree more (spread 0.47); Tabby 26 prices vary about as widely as the plain search (0.67 against 0.68), so its condition rows below are the better guide.

Counting each seller once matters where repeat sellers are common. In the Tabby 26 search, 13 sellers made 41 of the 96 sales. Weighted by sale, the price was $180; with one vote per seller it is $188. It can move either way: Tabby 20 went from $250 to $240, and the plain search from $200 to $222.

The Tabby 26 Like New price below carries the price warning. Its seller prices step from $187 to $215 right at the median, and a platform run minutes later, with 43 sellers instead of 40, gave $220 instead of $187.

Splitting by condition matters as much as the model:

SearchConditionStatusRecommendedRangeSold compsSellers
coach tabby 26Like NewReady$187$162 to $2605640
coach tabby 26New With TagsReady$188$164 to $3682316
coach tabby 26GoodReady$188$162 to $308117
coach tabby 20New With TagsReady$300$270 to $3383225
coach tabby 20Like NewReady$232$180 to $2802926
coach tabby 20UsedNot enough data22

A new-with-tags Tabby 20 sells for about $68 more than a like-new one, which an all-conditions median hides. The two Used comps, from two sellers, get no price at all. A specific search does not fix sample age on its own: the Tabby 20 comps reach back to October 2021, which the Sample age column shows.

Input

FieldTypeDefaultDescription
searchQueriesarray of stringrequiredSearch terms. Each gets its own Pricing summary rows. Specific terms ("coach tabby 26") give tighter comps than broad ones.
countryenumUSUS searches poshmark.com (prices in USD). CA searches poshmark.ca (prices in CAD).
brandstring(none)Keep only listings whose brand contains this text (case-insensitive). Applied after scraping.
departmentenum(none)Women, Men, Kids, Home, Electronics, Pets, or Other.
categorystring(none)Keep only listings whose category contains this text (e.g. Bags).
sizesarray of string(none)Keep only these sizes (e.g. ["M","L","OS","34"]).
conditionsarray of string(none)Keep only matching conditions (e.g. ["New With Tags"]).
soldOnlybooleantrueOnly collect SOLD listings. Set false for sell-through.
maxItemsinteger200Hard cap on total records, split evenly across queries (200 with 2 queries means up to 100 each). Caps cost. A lower maximum cost per run lowers it further.
includeSellerStatsbooleanfalseNot active yet. Seller rating, sales and followers come back null even when on. Seller username is always included.
computeAggregatesbooleantrueAlso write the detailed AGGREGATE-<slug> record per query. The Pricing summary is always written.
maxConcurrencyinteger3Parallel requests. Keep low to stay polite and avoid blocks.
proxyConfigurationproxydatacenterDatacenter by default, which works at modest volume. Switch to RESIDENTIAL for heavy or blocked runs.

Example input. This is the ready-to-run example the input form opens with: it prices two Coach Tabby sizes side by side.

{
"searchQueries": ["coach tabby 26", "coach tabby 20"],
"proxyConfiguration": { "useApifyProxy": true }
}

The Output tab shows the Pricing summary first, then the sold comps, then the summary as CSV and JSON. Export the comps as JSON, CSV, Excel, or HTML from the dataset. The detailed aggregate per query is in the Key-Value Store (AGGREGATE-<query-slug>), and the per-run reliability record is at DATA_QUALITY.

Reliability and the 403 question

Poshmark blocks scraping with HTTP 403. This is the real risk for any Poshmark Actor, so here is the honest version instead of a slogan:

  • Datacenter proxy by default, which works for Poshmark at modest volume. Switch to residential for heavy or blocked runs.
  • The session pool retires IPs on 403, 429, or 503 and rotates to a fresh session.
  • A block or challenge page (including PerimeterX-style pages) triggers jittered backoff, a session rotation, then a retry. If a page stays blocked it is skipped and the run finishes with partial data instead of crashing.
  • Every run writes a DATA_QUALITY record: block rate, items returned versus requested, rows saved and dataset-item events charged (counted separately), whether the budget cut results short, and per-field completeness. You measure reliability on your own run.
  • Measured on the platform with datacenter proxy: 150 comps across 4 paginated requests, 0 blocks, about 96% core completeness (compConfidence reaches "high" at this sample). Your DATA_QUALITY record is the number for your run.

If yields drop, lower maxConcurrency, switch to residential proxy, and reduce maxItems.

How to run

In the Apify Console, open the Actor, paste the input, and click Start.

By API:

curl -X POST "https://api.apify.com/v2/acts/kulqiz~poshmark-sold-comps/run-sync-get-dataset-items?token=<APIFY_TOKEN>" \
-H "Content-Type: application/json" \
-d '{ "searchQueries": ["coach tabby"], "maxItems": 50 }'

FAQ

Will Poshmark's 403 blocking break my run? It is the main risk for any Poshmark scraper. This one rotates sessions on a block, backs off, and finishes with partial data plus a DATA_QUALITY record rather than dying. Datacenter proxy is the default; switch to residential for heavy or blocked runs.

Are these real sold prices? Yes, filtered to availability=sold_out. Poshmark exposes no separate final or offer amount, so soldPrice equals the listing price at the time of sale.

Does it support Poshmark Canada (poshmark.ca)? Yes. Set country to CA and the Actor searches poshmark.ca instead of poshmark.com. Prices come back in CAD, listing URLs point to poshmark.ca, and each aggregate record has a currency field so you know which currency the stats are in. The two sites have different listings, so run each country separately.

Why is sellThroughRate null? The default mode collects sold listings only, which is 100% sold by definition. Set soldOnly to false to sample sold and active and get a true rate.

Can I get eBay or Mercari comps? Not in this Actor. It covers Poshmark US and Canada. eBay sold prices are only available through an eBay API that needs eBay's approval, and eBay's terms do not allow scraping its pages, so eBay comps are not planned until that access exists.

  • Public data only. It reads publicly visible listing pages. No login, credentials, tokens, or paywall bypass.
  • No personal data beyond public seller usernames. No buyer data.
  • Respect Poshmark's Terms of Service and your local laws. Scraping public pages is widely considered permissible, but Poshmark's ToS restricts automated access, and you are responsible for how you use this Actor and the data. Use modest volumes and cache results.
  • Intended for analytics and pricing research by resellers. Not affiliated with or endorsed by Poshmark.

Limitations and known-brittle spots

  • Sold price equals the listing price at the time of sale. Poshmark exposes no separate final amount.
  • Seller rating, sales, and followers are not collected yet and are always null. The seller username is included on every record.
  • Brand is seller-entered and sometimes inconsistent (for example "Coach" versus "Coach Tabby"), so priceByBrand is most useful across multi-brand queries.
  • Condition labels are normalized from Poshmark's internal codes (New With Tags, Like New, Good, Fair, Used). Uncommon codes fall back to New or Used, or the raw code, rather than guessing a grade. Some older sales carry no condition code at all, so condition is null for them.
  • originalRetailPrice is the seller-entered original price. Sellers often type 0 or 1 when they do not know it (about 45% of comps in a November 2026 sample), so those come back as null instead of a fake retail price.
  • daysToSell is null for units sold from a multi-quantity listing. Poshmark records each unit sold as a new listing created at the moment of sale, so its own dates cannot say how long the item took to sell (about 12% of comps in the same sample). A real same-day sale still shows 0. daysToSell can also understate time on market when a seller relists.
  • Comps per query are bounded by how many sold results Poshmark has for the term; the Actor pages through them up to maxItems. Broad terms return thousands, narrow terms fewer.
  • Poshmark can change its page data at any time. Extraction reads the embedded app state first and falls back to JSON-LD, meta tags and the page text, and each change is checked against live Poshmark pages before release.

Found this useful

If it saved you time, a short review on the Store helps other people find it. Found a bug or a missing field? Open an issue and it gets fixed.

See CHANGELOG.md. Current version: 0.5.15.