Poshmark Sold Comps & Resale Price Scraper
Pricing
from $1.50 / 1,000 results
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
Maintained by CommunityActor stats
0
Bookmarked
8
Total users
0
Monthly active users
5.6 hours
Issues response
4 days ago
Last modified
Categories
Features
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
countryto 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_QUALITYrecord 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:
| Column | What it means |
|---|---|
| Status | "Ready", or "Not enough data" when the row has fewer than 5 different sellers. No price is shown then. |
| Recommended | Each 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 warning | Shown 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 comps | How many sold listings the row is based on. |
| Sellers | How many different sellers those sales came from. The price and the status use this count. |
| Sizes | The sizes in those comps, most common first. |
| Comp confidence | high, medium or low, from the number of sellers and how recent the sales are (rule below). |
| Days to sell | Median 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 age | How long ago the newest and oldest comps sold, and the median. |
| Sources | The 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 measured | Result |
|---|---|
| Live sold listings parsed (coach tabby, lululemon align, nike dunk) | 17 |
| Passed schema validation | 17 / 17 (100%) |
| Core field completeness on live data (price, sold date, days-to-sell, brand, size, condition) | 100% |
| Sold comps returned by one search fetch | 44 / 39 / 16 |
| Block rate, 24 paced requests from a plain datacenter IP, no proxy | 0 / 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.
A real example: Coach Tabby, specific versus plain search
Measured 2026-11-09 on poshmark.com, 96 sold comps per search, with the Actor's own parser and Pricing summary code.
| Search | Comps that are the model | Oldest sale | Recommended | Range (p25 to p75) | Spread |
|---|---|---|---|---|---|
| coach tabby (plain keyword) | 32% say 26, 6% say 20 | Dec 2022 | $222 | $150 to $300 | 0.68 |
| coach tabby 26 | 100% | Mar 2026 | $188 | $161 to $287 | 0.67 |
| coach tabby 20 | 100% | Oct 2021 | $240 | $180 to $292 | 0.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:
| Search | Condition | Status | Recommended | Range | Sold comps | Sellers |
|---|---|---|---|---|---|---|
| coach tabby 26 | Like New | Ready | $187 | $162 to $260 | 56 | 40 |
| coach tabby 26 | New With Tags | Ready | $188 | $164 to $368 | 23 | 16 |
| coach tabby 26 | Good | Ready | $188 | $162 to $308 | 11 | 7 |
| coach tabby 20 | New With Tags | Ready | $300 | $270 to $338 | 32 | 25 |
| coach tabby 20 | Like New | Ready | $232 | $180 to $280 | 29 | 26 |
| coach tabby 20 | Used | Not enough data | 2 | 2 |
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
| Field | Type | Default | Description |
|---|---|---|---|
searchQueries | array of string | required | Search terms. Each gets its own Pricing summary rows. Specific terms ("coach tabby 26") give tighter comps than broad ones. |
country | enum | US | US searches poshmark.com (prices in USD). CA searches poshmark.ca (prices in CAD). |
brand | string | (none) | Keep only listings whose brand contains this text (case-insensitive). Applied after scraping. |
department | enum | (none) | Women, Men, Kids, Home, Electronics, Pets, or Other. |
category | string | (none) | Keep only listings whose category contains this text (e.g. Bags). |
sizes | array of string | (none) | Keep only these sizes (e.g. ["M","L","OS","34"]). |
conditions | array of string | (none) | Keep only matching conditions (e.g. ["New With Tags"]). |
soldOnly | boolean | true | Only collect SOLD listings. Set false for sell-through. |
maxItems | integer | 200 | Hard 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. |
includeSellerStats | boolean | false | Not active yet. Seller rating, sales and followers come back null even when on. Seller username is always included. |
computeAggregates | boolean | true | Also write the detailed AGGREGATE-<slug> record per query. The Pricing summary is always written. |
maxConcurrency | integer | 3 | Parallel requests. Keep low to stay polite and avoid blocks. |
proxyConfiguration | proxy | datacenter | Datacenter 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_QUALITYrecord: 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_QUALITYrecord 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.
Responsible use, legal, and ToS
- 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
priceByBrandis 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
conditionisnullfor them. originalRetailPriceis 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 asnullinstead of a fake retail price.daysToSellisnullfor 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 shows0.daysToSellcan 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.