# Poshmark Listings & Sold Comps Scraper (`cirkit/poshmark-search-scraper`) Actor

Search Poshmark by keyword for active listings or sold comps in one actor. Sold results carry the final sale price and the sold date, the resale comps Poshmark does not expose anywhere else. Returns price, original price, condition, brand, size, colors, category, seller and engagement counts.

- **URL**: https://apify.com/cirkit/poshmark-search-scraper.md
- **Developed by:** [Crikit](https://apify.com/cirkit) (community)
- **Categories:** E-commerce, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.70 / 1,000 listing extracteds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Poshmark Listings & Sold Comps Scraper

**Scrape Poshmark listings and sold comps** in one Actor. Sold results carry the **final sale price and the sold date** — the resale comparables Poshmark does not expose anywhere else. This **Poshmark scraper** also returns price, original price, discount, condition, brand, size, colors, seller, and engagement counts.

No Poshmark API key, no login, and no headless browser. Results land in a structured dataset you can export to JSON, CSV, Excel, or XML, or pull straight from the Apify API.

### What is Poshmark Listings & Sold Comps Scraper?

Poshmark Listings & Sold Comps Scraper is an [Apify Actor](https://apify.com/actors) that extracts active listings and sold comparables from [Poshmark](https://poshmark.com) and returns them as clean, structured records. Sold comps are the entire value proposition in resale. Active listing prices tell you what sellers hope to get; sold prices tell you what buyers actually paid, and only one of those prices inventory correctly.

### What data can this Poshmark scraper extract?

Every run writes one row per listing. The full schema carries **38 fields**; the most-used ones are below.

| Field | Type | Description |
| --- | --- | --- |
| `id` | string | Poshmark's own listing id. Stable across runs and the join key back to Poshmark. |
| `title` | string | Listing title exactly as the seller wrote it. |
| `url` | string | Canonical poshmark.com listing URL. |
| `description` | string | Full seller-written item description. |
| `price` | number | Current asking price for an active listing, or the final sale price for a sold one. |
| `originalPrice` | number | Retail price the seller entered. Null when the seller left it blank, which is about two thirds of listings. Never 0. |
| `discountPercent` | number | Percent below the original price, rounded. Null unless a real original price above the asking price exists. |
| `currency` | string | ISO currency code for price and originalPrice, USD on the US site. |
| `condition` | string | Human readable condition: New with tags, Pre-owned, Like new, Good, Fair, or Retail. Null when the seller did not... |
| `conditionCode` | string | Poshmark's raw condition code (nwt, not\_nwt, uln, ug, uf, ret), kept so the mapping is auditable. not\_nwt is... |
| `size` | string | Size as displayed on the listing, for example 8, M, or 7Y. |
| `availableSizes` | array | Every size still in stock, for multi-size listings. |
| `brand` | string | Brand as tagged by the seller. |
| `department` | string | Top level Poshmark department, for example Women or Men. |
| `category` | string | Second level category, for example Shoes or Dresses. |
| `subCategories` | array | Third level category features, for example Athletic Shoes. |
| `colors` | array | Colour names tagged on the listing. |
| `colorHexCodes` | array | Poshmark's hex value for each tagged colour, in the same order as colors. |
| `styleTags` | array | Free-form style tags the seller added. |
| `inventoryStatus` | string | available for a live listing, sold\_out for a completed sale. |
| `isSold` | boolean | True when this row is a completed sale rather than a live listing. |
| `soldAt` | string | ISO timestamp the listing sold. Null on active listings, where the equivalent field is only the last edit time. |

See the **Output** tab in Apify Console for all 38 fields.

### How to scrape Poshmark listings and sold comps

1. Open [Poshmark Listings & Sold Comps Scraper](https://apify.com/cirkit/poshmark-search-scraper) and click **Try for free**.
2. Add `searchTerms` and set `inventoryStatus` to active listings or sold comps.
3. Filter with `brands`, `department`, `minPrice`, and `maxPrice`.
4. Choose a `sortBy` order.
5. Bound the run with `maxItems`.
6. Click **Start** and watch rows appear live in the **Output** tab.
7. Export the dataset as JSON, CSV, Excel, or XML — or fetch it from the [Apify API](https://docs.apify.com/api/v2) once the run finishes.

### Poshmark Listings & Sold Comps Scraper input options

| Input | Type | What it does | Default |
| --- | --- | --- | --- |
| `searchTerms` | array | Keywords to search Poshmark for, one search per entry. Use the same wording you would type into the Poshmark search... | **yes** |
| `inventoryStatus` | string | Choose "active" for listings currently for sale, or "sold" for completed sales. Sold results carry the final sale... | `"active"` |
| `maxItems` | integer | Hard cap on the number of listings written to the dataset, counted across all search terms. Must be 1 or more.... | `50` |
| `department` | string | Restrict the search to one Poshmark department. Applied by Poshmark itself, so it does not cost extra requests. | `"All"` |
| `sortBy` | string | Result ordering. Use "added\_desc" to watch new listings as they appear, or "price\_asc" to find the cheapest first.... | `"best_match"` |
| `brands` | array | Keep only listings whose brand exactly matches one of these, case insensitive. Poshmark has no brand filter on this... |  |
| `minPrice` | integer | Keep only listings at or above this price. Poshmark ignores price bounds on this endpoint, so the actor applies them... |  |
| `maxPrice` | integer | Keep only listings at or below this price. Applied by the actor after fetching, same as the minimum. |  |

Proxy is configured through the standard `proxyConfiguration` object; the defaults shipped with this Actor are already tuned for the target site.

### Example output

```json
{
  "searchTerms": ["nike air max 90"],
  "inventoryStatus": "sold",
  "department": "Women",
  "maxItems": 500
}
```

### How much does it cost to scrape Poshmark?

This Actor runs on **pay per result** pricing: **$0.0007 per listing** ($0.7 per 1,000).

| Results | Approximate cost |
| --- | --- |
| 1,000 | $0.70 |
| 10,000 | $7.00 |
| 100,000 | $70.00 |

You pay for rows you actually receive, so a search that returns nothing costs nothing beyond the start fee. Every Apify account includes free monthly usage credit, so you can trial Poshmark Listings & Sold Comps Scraper at no cost.

### What can you build with Poshmark data?

#### Price resale inventory from real sold data

`soldAt` plus the final price gives you defensible comps, which is the difference between pricing to sell and pricing to sit.

#### Source profitable resale inventory

Compare sold prices against thrift or retail cost to identify brands and categories with genuine margin.

#### Track brand demand in secondhand fashion

Sold volume by brand over time shows which labels are appreciating and which are cooling.

#### Analyse how condition affects price

`condition` alongside final sale price quantifies the discount the market applies to used versus new-with-tags.

#### Benchmark competitor sellers

Seller fields plus sold data reveal who is actually moving inventory in your category.

### Poshmark scraping tips and limits

- Sold comps are the reason to use this. Set `inventoryStatus` to sold before doing any pricing work.
- `originalPrice` against final price shows the real discount the market demanded to clear the item.
- Brand filters produce far cleaner comps than free-text search, which pulls in look-alikes and dupes.
- Engagement counts — likes, comments, shares — are a leading indicator of what will sell next.

### Integrations and automation

Run Poshmark Listings & Sold Comps Scraper on a [schedule](https://docs.apify.com/platform/schedules) to keep a Poshmark dataset fresh, or trigger it from your own stack through the [Apify API](https://docs.apify.com/api/v2) and the official [JavaScript](https://docs.apify.com/sdk/js) and [Python](https://docs.apify.com/sdk/python) clients. Native [integrations](https://docs.apify.com/platform/integrations) push results into Google Sheets, Slack, Airtable, Zapier, Make, GitHub, or any webhook endpoint. The Actor also works as an [MCP](https://docs.apify.com/platform/integrations/mcp) tool, so an AI agent can call it directly.

### Related scrapers

| Actor | What it does |
| --- | --- |
| [eBay Product & Sold Scraper](https://apify.com/cirkit/ebay-product-scraper) | eBay sold-listing history for broader categories. |
| [Etsy Scraper - Listings, Shops & Search Results](https://apify.com/cirkit/etsy-shop-product-scraper) | Handmade and vintage listings and shops. |
| [Craigslist Search Scraper](https://apify.com/cirkit/craigslist-search-scraper) | Local sourcing for resale inventory. |
| [Amazon Product Scraper](https://apify.com/cirkit/amazon-product-scraper) | Retail pricing to compare against resale. |

### Frequently asked questions

#### Can I get Poshmark sold prices?

Yes. Set `inventoryStatus` to sold and rows come back with the final sale price and `soldAt` date. This is data Poshmark surfaces nowhere else in a structured form.

#### How is this different from an eBay sold-listings scrape?

Poshmark's catalog skews heavily toward fashion, especially women's clothing and accessories, and its sold-price distribution differs from eBay's. Most serious resellers price against both.

#### Do I need a Poshmark API key?

No. Poshmark Listings & Sold Comps Scraper reads publicly available Poshmark pages and endpoints directly, so there is no key to obtain, no OAuth app to register, and no account to connect.

#### Can I export Poshmark data to CSV, Excel, or Google Sheets?

Yes. Every run stores results in an Apify dataset that exports to JSON, JSONL, CSV, Excel, XML, or HTML with one click, and the Google Sheets integration writes rows straight into a spreadsheet.

#### Can I run Poshmark Listings & Sold Comps Scraper on a schedule?

Yes. Apify schedules run the Actor hourly, daily, weekly, or on any cron expression, and webhooks can notify your systems the moment a run finishes.

#### Is it legal to scrape Poshmark?

Scraping publicly available data is broadly lawful in the US and EU, but the answer depends on what you collect and how you use it. This Actor is built to gather public listing and sale information Poshmark publishes publicly, including seller usernames. Personal data carries extra obligations under GDPR and CCPA. Read Apify's guide on [whether web scraping is legal](https://blog.apify.com/is-web-scraping-legal/) and take your own legal advice for your use case.

### Support and feedback

Found a bug, a missing field, or a Poshmark page shape this Actor does not handle yet? Open an issue from the **Issues** tab on the Actor page. Feature requests and custom-scraper enquiries are welcome there too.

# Actor input Schema

## `searchTerms` (type: `array`):

Keywords to search Poshmark for, one search per entry. Use the same wording you would type into the Poshmark search box, for example "nike air max 90" or "lululemon align leggings".

## `inventoryStatus` (type: `string`):

Choose "active" for listings currently for sale, or "sold" for completed sales. Sold results carry the final sale price and the date it sold, which is the comps data used to price an item before listing it.

## `maxItems` (type: `integer`):

Hard cap on the number of listings written to the dataset, counted across all search terms. Must be 1 or more. Poshmark caps any single search at 5,000 results.

## `department` (type: `string`):

Restrict the search to one Poshmark department. Applied by Poshmark itself, so it does not cost extra requests.

## `sortBy` (type: `string`):

Result ordering. Use "added\_desc" to watch new listings as they appear, or "price\_asc" to find the cheapest first. Poshmark's own index order is returned as-is, so "added\_desc" tracks the published date closely but is not a strict sort on it.

## `brands` (type: `array`):

Keep only listings whose brand exactly matches one of these, case insensitive. Poshmark has no brand filter on this endpoint, so the actor applies it after fetching. Leave empty for no brand filter.

## `minPrice` (type: `integer`):

Keep only listings at or above this price. Poshmark ignores price bounds on this endpoint, so the actor applies them after fetching. Very narrow ranges make a run fetch more pages for fewer results.

## `maxPrice` (type: `integer`):

Keep only listings at or below this price. Applied by the actor after fetching, same as the minimum.

## `proxyConfiguration` (type: `object`):

Apify Proxy settings. The default datacenter proxy is sufficient and is what the cost model assumes. Poshmark throttles a single IP after roughly a dozen requests, so the actor rotates sessions automatically. Residential proxies are not required.

## Actor input object example

```json
{
  "searchTerms": [
    "nike air max"
  ],
  "inventoryStatus": "active",
  "maxItems": 50,
  "department": "All",
  "sortBy": "best_match",
  "brands": [],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Every Poshmark listing matched by this run, one row each, with price, condition, brand, size, seller and engagement counts.

## `resultsCsv` (type: `string`):

The same results as a downloadable CSV file.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchTerms": [
        "nike air max"
    ],
    "inventoryStatus": "active",
    "maxItems": 50,
    "department": "All",
    "sortBy": "best_match",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("cirkit/poshmark-search-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchTerms": ["nike air max"],
    "inventoryStatus": "active",
    "maxItems": 50,
    "department": "All",
    "sortBy": "best_match",
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("cirkit/poshmark-search-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchTerms": [
    "nike air max"
  ],
  "inventoryStatus": "active",
  "maxItems": 50,
  "department": "All",
  "sortBy": "best_match",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call cirkit/poshmark-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cirkit/poshmark-search-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/V4qiKg2OhYhU2WR8X/builds/X6hTWbMhaEJs7eXW7/openapi.json
