Poshmark Sold Listings Comps avatar

Poshmark Sold Listings Comps

Pricing

Pay per event

Go to Apify Store
Poshmark Sold Listings Comps

Poshmark Sold Listings Comps

Poshmark sold-listing price comps by keyword or UPC: median, percentiles and sell-through. This release supports Poshmark only; eBay, Mercari and Depop are not supported yet (planned).

Pricing

Pay per event

Rating

0.0

(0)

Developer

Biosick Johnny

Biosick Johnny

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Security

Limited permissions

Share

This release supports only Poshmark sold listings. eBay, Mercari and Depop are not supported yet (planned for a later release). Their adapters remain in the input as experimental, off-by-default options and may fail or be blocked; do not rely on them.

Pricing

Pay per event: $0.005 per run (actor start) + $0.002 per result item.

An Apify Actor for public sold-listing comparisons by keyword or UPC. It emits normalized items, statistics for each query/platform, and an aggregate all row. Uses Apify SDK v3, Crawlee, and Node 20.

Platform status

PlatformDefaultCollectionLimitations
eBayOff, experimental (not supported yet)Public sold/completed HTML, both li.s-item and .s-card, next-page linksRequires a sold date on each card. Blocks rotate anonymous sessions with bounded retries. Residential proxy by default.
PoshmarkOn, supportedPublic SSR JSON (__INITIAL_STATE__, __NEXT_DATA__), sold_out records, opaque max_id cursorsDates/conditions/shipping can be missing. Datacenter proxy supported with residential fallback.
MercariOff, experimental (not supported yet)Playwright public page, same-domain JSON responses and SSR, residential proxyCloudflare may prevent collection. Only explicit sold states qualify; API shape can change. Eight scrolls maximum.
DepopOff, experimental (not supported yet)Playwright public page and JSON responses, residential proxysold=true is not verified as a working public sold-search filter. Only explicit sold flags qualify. Zero results reports unavailable. Prices can be the last asking price.
GrailedUnsupportedStub throws unsupported; actor reports an unsupported summarySold data requires login; login is outside this Actor's scope.

Core means implemented and covered by offline fixtures, not live production certification.

Depop verification: a free anonymous read of the public search page with sold=true on 2026-11-02 returned ordinary listing cards without establishing sold-filter semantics. Depop's selling help describes the account's own Sold tab, not a documented public sold-search parameter. The adapter does not infer a sale from the URL parameter or a missing/removed listing. Enable it only for best-effort discovery of explicitly sold records exposed by the anonymous page.

Input

{
"queries": ["Sony WH-1000XM5", "0194253403933"],
"platforms": ["poshmark"],
"maxItemsPerPlatform": 100,
"soldWithinDays": 90,
"condition": "any",
"minPrice": 10,
"maxPrice": 500,
"includeSellThrough": true,
"outputMode": "both",
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"]
}
}
  • queries is required and must contain nonempty strings. UPCs go into the normal keyword parameter; retain them as strings to preserve leading zeroes. Duplicate queries and platforms are collapsed.
  • platforms defaults to ["poshmark"], the only supported platform in this release. eBay, Mercari and Depop are experimental and require explicit selection.
  • maxItemsPerPlatform is per query/platform, defaults to 100, and accepts 1–1000. Filtering/deduplication happen before the cap. HTML pagination has a 50-page safety limit.
  • soldWithinDays is an optional positive integer, using a rolling UTC window. Undated and future-dated records are excluded when this filter is set.
  • condition is any (default), new, or used. Unknown conditions are excluded by a specific condition filter. Refurbished/like-new map to used.
  • minPrice/maxPrice are inclusive item-price bounds excluding shipping, in the listing's original currency. They do not imply USD conversion.
  • includeSellThrough defaults to true. Public active counts are fetched for eBay/Poshmark. Poshmark condition/price filters cannot be reliably mirrored in active counts, so those combinations return null counts. Unsupported, approximate, blocked, or missing counts stay null.
  • outputMode accepts items, summary, or both (default); key-value OUTPUT always contains summaries.
  • proxyConfiguration defaults to Apify residential. eBay follows your proxy selection. Poshmark can use datacenter, then retry with residential on sold-search or active-count failure. Experimental platforms use residential for Apify-managed proxies. Explicit useApifyProxy:false and custom proxy URLs override proxy selection. No automatic fallback to a direct connection occurs on proxy setup failure.

Output

The dataset is a heterogeneous array of type:"item" and/or type:"summary" records. See SAMPLE_OUTPUT.json, generated entirely from the hand-made fixtures, and .actor/dataset_schema.json.

Item fields: query, platform, id, canonical url, title, price, currency, shipping, totalPrice, soldAt, condition, brand, size, imageUrl, scrapedAt.

  • Money is numeric. "$1,234.56" becomes 1234.56; a range such as "$20.00 to $30.00" becomes null with priceWarning, rather than guessing a transaction amount. Poshmark uses the displayed sold-listing price, not original_price_amount. Public prices may differ from negotiated final sale prices on all platforms.
  • Unknown prices/shipping remain null; explicitly free shipping is zero. totalPrice is available only when price and shipping are both known; taxes/fees are excluded.
  • Non-USD currency is preserved and flagged by currencyWarning. This version has no exchange-rate source and performs no conversions. Single-currency summaries use original units; mixed-currency summaries withhold all price statistics, list currencies, and include a warning. U.S. marketplace amounts without a currency code/symbol default to USD.
  • Dates are ISO UTC or null. Yearless eBay dates use the most recent matching calendar date. Missing values stay null. Items deduplicate by platform/id within a query.
  • Only listing fields are retained. No seller identity, contact details, raw JSON, account data, or account cookies are exported.

Each summary contains query, platform, count, currency, median, p10, p25, p75, p90, min, max, mean, soldCount, activeCount, sellThroughRate, and dateRange:{from,to}. status, warnings, and currencies explain completeness and currency limitations.

Price statistics use item price, exclude shipping and null prices, and use linear interpolation at index (n-1)*q on sorted prices. Empty price samples yield null statistics; singleton samples yield that amount for every quantile. count and soldCount include all accepted sampled sold records, including records with unknown prices. They are not claims about the marketplace's total historical sales.

sellThroughRate = soldCount / (soldCount + activeCount) when both counts are known and the denominator is positive; otherwise null. This is a sampled estimate, sensitive to the item cap, date/condition/price filters, and public search visibility. It is not a true inventory-cohort sell-through metric. The all active count/rate is withheld unless every selected platform has a known active count. Active counts describe current public inventory; a date filter applies only to sold records.

Statuses distinguish an explicit empty result (ok with zero count) from failed, unavailable, unsupported, partial (including capped/browser samples), or budget-stopped. Failures on one platform do not prevent others from running. Missing sold records without an explicit empty-result message are treated as a possible parser/block failure, not a verified zero-sales result.

The default key-value store's OUTPUT record contains:

{ "summaries": [], "warnings": [], "status": "ok", "generatedAt": "2026-11-02T12:00:00.000Z" }

Pay per event

.actor/pay_per_event.json describes actor-start (once per run), query (once per unique query/platform with at least one accepted result), and optional result-item. Prices are intentionally unset (TBD). This file is an unpriced event manifest, not a deployed pricing configuration. Configure event pricing separately before monetizing; this project does not publish pricing or deploy anything.

Events go through Actor.charge({eventName,count:1}). Runtime prices and remaining event capacity come from the SDK charging manager. The actor checks budget before scraping each query/platform and before each event, accounting for prior charged event counts. ACTOR_MAX_TOTAL_CHARGE_USD=0 stops immediately without charge calls; positive limits stop work when exhausted or the next event is unaffordable. No local price constants are used. A successful final charge's results are delivered, then subsequent scraping stops. Summary status rows explain skipped work.

Per-item charging is off unless RESALE_CHARGE_RESULT_ITEMS=true. If enabled, configure the result-item event in platform pricing; each accepted normalized item is charged even in summary-only mode. Records that cannot be charged are omitted from both emitted items and statistics. Non-PPE runs allow the SDK's no-op charge response. See Apify's PPE guide for platform setup.

Local development and packaging

npm ci
npm test
npm run sample
npm run check

Tests use node:test, hand-made HTML/JSON fixtures and mocked SDK/crawler interfaces. A real SDK entrypoint test runs with a zero budget, isolated temporary storage, no inherited Apify credentials, and networking disabled. Tests make no network calls and do not charge, use proxies, or start real browsers. npm run sample regenerates the sample deterministically; npm run check validates schemas, metadata paths, the lockfile, and reproducibility. Apify and Crawlee are pinned to compatible core versions; the entrypoint test guards against dependency-resolution drift.

Running npm start performs live public searches and may incur platform/proxy costs. Supply input through the Apify SDK's normal input mechanism (storage/key_value_stores/default/INPUT.json locally) and arrange proxy access yourself before running it. For experimental adapters locally, install the pinned browser with npx playwright install chromium. The Dockerfile uses the Node 20 Apify Playwright image and installs the Chromium revision required by the pinned Playwright dependency. A container build requires registry/browser downloads; it is separate from offline tests.

Public data and responsible use

Public data only. No login, account cookies, credential collection, or personal seller data. Anonymous crawler/browser sessions are isolated; no saved user browser profile is used. Respect each site's Terms of Service, robots/access policies, applicable law, and reasonable rate limits. Block/challenge responses have bounded retries; the actor does not solve CAPTCHAs or access account-only pages. You are responsible for permission to collect and use the data. Public sold listings and displayed asking prices are imperfect evidence of actual transaction values; use the completeness/currency warnings when evaluating comparisons.