Poshmark Scraper: New Listing & Price Drop Alerts avatar

Poshmark Scraper: New Listing & Price Drop Alerts

Pricing

from $1.50 / 1,000 listing returneds

Go to Apify Store
Poshmark Scraper: New Listing & Price Drop Alerts

Poshmark Scraper: New Listing & Price Drop Alerts

Poshmark scraper for new listings, price drops, poshmark sold comps by brand, sell-through rate and days to sell, on poshmark.com and poshmark.ca. Price, euro price, size, condition, link. No login. Pay per listing.

Pricing

from $1.50 / 1,000 listing returneds

Rating

0.0

(0)

Developer

Adrian Voss

Adrian Voss

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Watch a search, get only what's new. New listings and price drops since your last run, charged per new row, free on quiet days. Schedule it hourly and send it to Discord, Slack, Google Sheets or n8n.

This actor reads Poshmark the way you browse it: name a brand ("Coach"), a brand plus keywords ("Louis Vuitton: neverfull"), or paste a brand or category page with your own filters, pick poshmark.com and/or poshmark.ca, and get one clean row per listing with the title, price, a euro conversion, the seller's stated retail price, the price it was first listed at, brand, size, condition, category, likes, the main photo and the link. Switch to sold listings for price comps, or turn on monitoring and each run returns only the listings that appeared, or got cheaper, since the previous run. No login.

Who it's for

  • Resellers and luxury flippers sourcing Coach, Louis Vuitton, Gucci or Lululemon before anyone else messages the seller. A watchlist on "Coach: tabby" under $150, run every hour, puts new listings in your Discord or Telegram without keeping the app open.
  • Sourcing agents and personal shoppers watching a list of brands for clients in one run, in the US and Canada, with prices converted to euros for comparison.
  • Pricing a flip or a buy. Sold listings (listingType: sold) show what a bag actually sold for and when, next to what it was first listed at: the comps you need before you bid or relist.
  • Alert-bot and n8n builders who want a stable JSON row per listing instead of maintaining their own Poshmark parser.

Why this one

  • Monitoring built in, not bolted on. deltaMode remembers what each watchlist has seen per country. New listings and price drops (with your own minimum drop %) come back; everything else is removed before billing. A quiet run returns one summary row and costs only the start fee.
  • Poshmark's own price history in every row. firstListedPrice is the price the listing was published at and priceCutPct the cut since then, so a one-off run already shows which sellers are dropping, even before monitoring has history.
  • US and Canada in one run. One brand line runs on poshmark.com and poshmark.ca. Rows carry the country, the local currency and priceEur at the European Central Bank's daily reference rate.
  • Sold comps and live listings from one actor. Available, sold or both, with soldAt on sold rows.
  • Seller privacy by default. An anonymous seller hash lets you group listings by seller. No usernames, no names, no profile links, no contact details; descriptions have emails, phone numbers, @handles and chat links redacted.

Countries

Brand lines run once per country you list in countries. A pasted Poshmark link always runs on its own site.

CodeSiteCurrency
usposhmark.comUSD
caposhmark.caCAD

Minimum and maximum price apply in each site's own currency. priceEur converts every row at the ECB rate of the day, so a cross-border comparison is one sort. poshmark.com.au is not offered yet: it did not serve listings in testing, so au is ignored with a warning.

What you get

By default each listing is its own row. Every row also repeats the search it came from.

FieldWhat it is
listingId, url, titlePoshmark's listing ID, the listing link and its title
price, currencyThe current price in the site's currency
priceEurprice in euros at the ECB daily reference rate
originalPriceThe retail price the seller entered (empty when they left it blank, on about 60% of listings)
firstListedPrice, priceCutPctThe price when the listing was first published, and the cut since then in %
brand, size, condition, category, colorsAs shown on Poshmark; condition is New With Tags, Boutique, Like New, Good or Fair, and empty when the seller left it blank
likeCountLikes so far
availability, isSold, soldAtavailable, sold_out and so on; soldAt on sold rows
soldPrice, daysToSellSold rows only. The last asking price at the moment it sold (Poshmark never reveals a negotiated final price), and days from postedAt to soldAt
postedAt, publishedAtWhen the listing was created, and when it was published (Poshmark's "Just In" order)
sellerHashAn anonymous 16-character seller hash
imageUrlLink to the main photo (links only, nothing is downloaded)
descriptionThe seller's description, contacts redacted (turn off with includeDescription: false)
countryWhich Poshmark site the listing is on
isNew, changeType, firstSeenAtMonitoring: new, price-drop or seen, and when this watchlist first saw it
previousPrice, priceDropPctMonitoring: the price last seen and the drop in %, on price-drop rows
searchQuery, searchCountries, listingCount, totalAvailable, truncatedThe search summary
newCount, priceDropCount, monitorStatusMonitoring summary: NEW_ROWS, NO_NEW_ROWS or SEEDED
activeCount, soldCount, sellThroughRate, compsWindowDaysSold comps only. How many active/sold listings this run fetched, the sell-through rate, and the day span the sold comps cover
activeMedianPrice, soldMedianPrice, activeMedianPriceEur, soldMedianPriceEur, askVsSoldGapPctSold comps only. Median asking/sold price, in the site's own currency and in EUR, and the gap between them
medianDaysToSellSold comps only. Median daysToSell across the sold comps fetched

Three dataset views are ready in the Console: Overview, Monitoring (change type, previous price and drop % next to each listing) and Sold comps (extended with the sell-through summary columns and soldPrice/daysToSell — see below).

Sold comps and sell-through

Turn on "Include sold comps and sell-through stats" and every search also fetches Poshmark's own sold_out listings for the same brand/keywords and filters — up to "Max sold comps to fetch" (50 by default, 200 max), per country. This runs regardless of what "Listings to include" is set to, so you can keep searching "For sale" and still get comps alongside it. Each sold comp comes back as an ordinary row: isSold: true, soldAt, soldPrice, and daysToSell (days from postedAt to soldAt, when both are present). Sold comps are listings too — they're billed as ordinary listing rows, at the same per-listing price as an available listing, not a separate event.

Every row of a search with sold comps on also carries sell-through summary columns, computed from everything the run actually fetched (not just what's returned after any monitoring filter): activeCount and soldCount, sellThroughRate (soldCount / (soldCount + activeCount), 0-1, over the window described by compsWindowDays — the span between the oldest and newest sold comp's soldAt), activeMedianPrice/soldMedianPrice (the site's own currency) plus activeMedianPriceEur/soldMedianPriceEur, the gap between the EUR pair as askVsSoldGapPct, and medianDaysToSell. All ten are null when sold comps are off.

Honesty notes.

  • Poshmark shows the last asking price, not a negotiated final price. soldPrice is whatever the listing's price was at the moment its status changed to sold_out — Poshmark's own data has no separate "amount actually paid" field, so a private offer accepted below (or a bundle discount applied at) checkout isn't reflected here.
  • Currency mix on a two-country search. If "Poshmark countries to search" includes both us and ca, activeMedianPrice/soldMedianPrice mix USD and CAD amounts — use the activeMedianPriceEur/soldMedianPriceEur columns (and askVsSoldGapPct, which is always computed off the EUR pair) for a currency-safe comparison across countries.
  • Poshmark has no "recently sold" sort. Unlike a dedicated sold-price index, the sold comps fetch uses whatever sort your search already uses (Just In / newest by default). Poshmark sellers commonly relist an item shortly before or after it sells, so some sold comps can show a daysToSell of 0 or close to it — that's a relisting artifact, not evidence every sale happens instantly. For a cleaner sample, run a broader brand/keyword search so more genuinely distinct sold items are captured.

Example: {"searches": ["Coach"], "countries": ["us"], "includeSoldComps": true, "maxSoldComps": 100} returns available Coach listings plus up to 100 recent sold comps in the same run, with sell-through and median-price-gap columns on every row.

Related actors. grailed-listing-lookup has the same sold-comps shape for Grailed, reading a real sold-price index (sold_at desc) rather than a status filter on a keyword browse, so its comps window is not subject to Poshmark's relisting caveat above.

Monitoring: new listings and price drops

The recipe most buyers use:

  1. Put your searches in searches ("Coach: tabby", "Louis Vuitton: speedy", or a pasted brand page with your size and condition filters), pick countries, and turn on Only return listings that are new, or cheaper, since the last run (deltaMode).
  2. Optionally turn on Seed silently so the first run remembers today's listings without sending them all to your webhook.
  3. Save it as a Task and add an hourly Schedule in Apify.
  4. Add a webhook or integration on the Task for Run succeeded: Discord or Slack webhook, Telegram bot via n8n or Make, a Google Sheets append, or an HTTP call to your own bot. Each run's dataset holds only the new and price-drop rows.
{
"searches": ["Coach: tabby", "Louis Vuitton: neverfull"],
"countries": ["us", "ca"],
"category": "Women-Bags",
"maxPrice": 400,
"deltaMode": true,
"skipFirstRun": true,
"alertOnNew": true,
"alertOnPriceDrop": true,
"minPriceDropPct": 10
}

How it decides:

  • New means this watchlist has never returned that listing ID before, on that country site.
  • Price drop means the price is at least minPriceDropPct below the price last seen, on a listing that is still available. The remembered price updates every run, so a second cut is measured from the latest price.
  • Unchanged listings are removed before you are billed. A run with nothing new returns one summary row with monitorStatus: NO_NEW_ROWS, listingCount: 0, and costs only the start fee.
  • Each watchlist remembers up to 5,000 listings per country and search, oldest forgotten first.
  • The watchlist name is derived from your price, category, condition and keyword filters, so two schedules with different filters never share a memory. Set deltaName to choose your own.

The window limitation. A run only sees the newest maxListingsPerSearch listings (48 by default, one Poshmark page). A listing that drops in price after it has slid out of that window is not seen again, so its price drop is missed. For price-drop alerts keep searches narrow (brand plus model, a category, a price cap) or raise maxListingsPerSearch. For a busy brand on an hourly schedule, 96 or more keeps new-listing alerts complete.

Searches you can write

  • Coach: every Coach listing, newest first.
  • Coach: tabby shoulder bag: Coach listings matching those words (Poshmark's own keyword filter on the brand page).
  • Louis Vuitton: neverfull with category: Women-Bags: narrowed to women's bags.
  • A pasted link such as https://poshmark.com/brand/Coach-Women-Bags?sort_by=added_desc&size[]=OS or a /category/... page: every filter in the link is kept.

Write brands the way Poshmark does ("Louis Vuitton", "Michael Kors", "Tory Burch"). Poshmark asks crawlers not to use its /search pages, so this actor reads brand and category pages only; a pasted /search link that names exactly one brand is rewritten to that brand's page, and any other /search link is reported as a free BAD_FORMAT row with this explanation.

Price

  • Listing returned: $3 per 1,000 listings

Plus a $0.00005 start fee per run. Each event above is billed independently, only when it actually returns data — misses (found:false) are never charged.

  • Listings: $3 per 1,000 listings returned, plus a $0.00005 start fee per run.
  • A monitoring run with nothing new costs the start fee only. A search that returns nothing, or a country that fails, is never billed.

An hourly watchlist on one search that finds 5 new listings an hour costs about 5 x 24 x 30 = 3,600 listings, about $11 a month.

How to use

  1. In the Apify Console. Open the actor page and click Start — the searches field is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found.
  2. Via the API. Call it directly with a POST request — no Console needed once you have an API token:
    curl "https://api.apify.com/v2/acts/accountable_eel~poshmark-listing-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
    -X POST \
    -H "Content-Type: application/json" \
    -d '{"searches":["Coach: tabby"]}'
  3. On a schedule. Save this actor as an Apify Task with the input you want, then add a Schedule (hourly, daily, weekly) so it runs on its own — no server of your own required.

Tips:

  • Paste a link from Poshmark when you need filters the input doesn't list (size, colour, a sub-category, shipping discounts). Everything in the link is kept; monitoring only forces the Just In order.
  • conditions keeps only the codes you list (nwt, ret, uln, ug, uf), applied while paging, so the actor reads further pages until it has enough matches.
  • includeKeywords and excludeKeywords match the title, brand, size, category and description before billing, so "replica" or "dust bag only" in excludeKeywords never costs you a row.

Input

{
"searches": [
"Coach: tabby"
]
}

One search per line: a brand such as "Coach", a brand plus keywords such as "Louis Vuitton: neverfull", or a brand or category page link copied from poshmark.com or poshmark.ca (its own filters such as size, condition and price are kept). Brand lines run once in every country you pick below; a pasted link runs on its own site. No login required. Accepted formats: Coach: tabby, Louis Vuitton: neverfull, https://poshmark.com/brand/Coach-Women-Bags?sort_by=added_desc.

Sample output

queryfoundstatussearchQuerysearchCountrieslistingCounttotalAvailabletruncatednewCountpriceDropCountmonitorStatusactiveCountsoldCountsellThroughRatecompsWindowDaysactiveMedianPricesoldMedianPriceactiveMedianPriceEursoldMedianPriceEuraskVsSoldGapPctmedianDaysToSelllistingslistingIdtitlepricecurrencypriceEuroriginalPricefirstListedPricepriceCutPctbrandsizeconditioncategorycolorslikeCountavailabilityisSoldcountrypostedAtpublishedAtsellerHashimageUrlurlisNewchangeTypefirstSeenAtdescriptionscrapedAt
Coach: tabbytrueOK<matching on poshmark (5000 = 5,000 or more per country)><more listings were available (or a country failed)><active listings fetched this run (sold comps only)><sold comps fetched this run (sold comps only)><sell-through rate: sold / (sold + active) (sold comps only)><span of the fetched sold comps, oldest to newest sale (sold comps only)><median asking price, local currency (sold comps only)><median sold price, local currency (sold comps only)><median asking price, eur (sold comps only)><median sold price, eur (sold comps only)><asking vs. sold median price gap %, computed in eur (sold comps only)><median days from posted to sold (sold comps only)><all listings found (full list)> <price (local currency)><price in eur (ecb daily rate)><original retail price (as the seller states it)><cut since first listed (%)><availability (available / sold_out / ...)><published at (just in order)><is this listing new?><change (new / price-drop / seen)><description (contacts redacted)>1970-01-01T00:00:00.000Z

A real row from a Coach brand page on poshmark.com (2026-09-22), trimmed:

{
"searchQuery": "Coach",
"searchCountries": "us",
"listingId": "6ab28124d48e7e00053f7924",
"url": "https://poshmark.com/listing/Vintage-Coach-Slim-Legacy-Duffle-Leather-03-Bag-In-Blue-9328-6ab28124d48e7e00053f7924",
"title": "Vintage Coach Slim Legacy Duffle Leather 03 Bag In Blue #9328",
"price": 180,
"currency": "USD",
"priceEur": 156.66,
"originalPrice": 212,
"firstListedPrice": 180,
"brand": "Coach",
"size": "OS",
"category": "Women > Bags > Shoulder Bags",
"availability": "available",
"isSold": false,
"publishedAt": "2026-09-22T13:22:52.000Z",
"sellerHash": "7aa4f97c321985cb",
"country": "us"
}

Use it from Clay, n8n, Make, or an AI agent

This actor runs synchronously over plain HTTP — call it directly from a script, a workflow tool, or an AI agent, no Apify Console needed once you have an API token.

curl "https://api.apify.com/v2/acts/accountable_eel~poshmark-listing-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
-X POST \
-H "Content-Type: application/json" \
-d '{"searches":["Coach: tabby"]}'

n8n. Add an HTTP Request node: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~poshmark-listing-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body Content Type JSON, JSON Body {"searches":["Coach: tabby"]} (swap in an expression from an earlier node for a real value).

Clay. Add an "HTTP API" column: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~poshmark-listing-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body {"searches":["{{search}}"]}, mapping the row's search into the searches array.

MCP. In Claude, Cursor, or any MCP client with the Apify MCP server, ask for "Poshmark Scraper: New Listing and Price Drop Alerts" — the agent will find and run this actor.

Discord or Slack alerts without code. Schedule the monitoring Task hourly, then add an integration on the Task: in n8n or Make, trigger on "Apify: run succeeded", read the run's dataset, skip rows where listingCount is 0, and post title, price, currency, size and url to a Discord or Slack webhook (or a Telegram bot node). Google Sheets users can append the same rows to a sheet for a running price log.

vs. alternatives

What it costsWhat you getTrade-off
This actor$3 per 1,000 listings, quiet monitoring runs freeUS and Canada in one run, euro prices, first-listed price and cut %, sold comps, built-in new-listing and price-drop monitoringBrand and category pages only (Poshmark's robots.txt excludes /search)
Other Poshmark scrapers on the Apify StorePay per resultSearch results or sold listings, usually one site per runThe most used has 14 users a month; none combines monitoring with sold comps and two countries, so you rebuild "what's new" yourself
Poshmark's own saved searchesFreePush notifications in the appOnly on your phone, no export, no Sheets, no bot, no price history

Store figures as of September 2026.

Data & privacy

Data & privacy. This actor reads public search results that anyone can see without logging in. It doesn't log in, solve CAPTCHAs or reveal hidden contact details. Seller identity is off by default: you get an anonymous seller hash so you can group listings by seller without names. Turning on seller info makes you responsible for having a lawful reason to process it. Not affiliated with Poshmark.

Poshmark shows every seller's username and name on each listing; this actor never reads either. Descriptions have emails, phone numbers, @handles and chat links replaced with [redacted], and only the main photo link is returned. Nothing is downloaded.

FAQ

Is this allowed? It collects the same public listing data your browser shows, for the searches you choose. It's built for monitoring a search, not for copying the marketplace. Check that your use fits Poshmark's terms and your local law.

Why did my monitoring run return nothing? Nothing new or cheaper appeared since the last run. You get one row with

monitorStatus: NO_NEW_ROWS
and are charged only the start fee. On the very first run with "Seed silently" on, the status is SEEDED.

Why can't I type free keywords without a brand? Poshmark's robots.txt asks crawlers not to use its /search pages, and this actor respects that. Its brand and category pages carry the same listings and accept keywords, so start the line with a brand ("Coach: tabby"), or paste a category page link.

What does totalAvailable mean? Poshmark's own count for the page. It reads 5,000 on broad pages, meaning 5,000 or more.

Why is truncated true? More listings were available than maxListingsPerSearch, or a country site refused the run partway (the listings collected up to then are delivered and billed; nothing else is).

Can I get the seller's username? No. Usernames and names are deliberately never returned. Turn on "Include the raw Poshmark seller ID" only if you have a lawful reason to process it.

What do I need to set up? Nothing. No Poshmark account, no cookies, no proxy settings.

Can an AI agent call this? Yes, through the Apify MCP server or the API call shown above. Ask for "Poshmark Scraper: New Listing and Price Drop Alerts".

Is soldPrice the actual amount the buyer paid? No — see "Sold comps and sell-through" above. Poshmark only exposes the listing's last asking price at the moment it sold, never a negotiated final amount.