# Poshmark Sold Listings Scraper (`crawloop/poshmark-sold-listings-scraper`) Actor

Scrape Poshmark sold listings by keyword or closet. Export sold price, listed and sold dates, days to sell, brand, size, condition, and seller as JSON for reseller comps.

- **URL**: https://apify.com/crawloop/poshmark-sold-listings-scraper.md
- **Developed by:** [Andrej Kiva](https://apify.com/crawloop) (community)
- **Categories:** E-commerce, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.99 / 1,000 sold listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Poshmark Sold Listings Scraper

> **Disclaimer:** Unofficial tool — not affiliated with, sponsored by, or endorsed by Poshmark. Data is read from publicly accessible sold-listing cards. No login. You are responsible for complying with applicable law and the site’s terms. No warranty on accuracy or availability. Provided for informational and research use.

Scrape **Poshmark sold listings** by keyword or closet and export **sold price**, **listed date**, **sold date**, **days to sell**, **brand**, **size**, **condition**, and **seller** as JSON. Built for reseller comps, pricing research, and scheduled sold watches.

**Best for:** resale operators and data teams who want sold comps in a dataset, spreadsheet, or API — a Poshmark scraper and API alternative that runs from Python, Node.js, or MCP.

### Resale suite

Pair Poshmark sold comps with eBay completed sales and Vinted monitors. This Actor is the Poshmark sold step.

| eBay sold comps | eBay pricing | Poshmark sold | Vinted monitor |
| :--- | :--- | :--- | :--- |
| [eBay Sold Listings Scraper](https://apify.com/crawloop/ebay-sold-listings-scraper) | [eBay Sold Price Intelligence](https://apify.com/crawloop/ebay-sold-price-intelligence) | **Poshmark Sold Listings Scraper** ◄── you are here | [Vinted Monitor](https://apify.com/crawloop/vinted-monitor) |
| Completed eBay sales and sold dates | Recommended price from eBay sold data | Poshmark sold price, dates, seller | New Vinted listings |

| Depop new listings | Mercari Japan | StockX ask / bid |
| :--- | :--- | :--- |
| [Depop Monitor](https://apify.com/crawloop/depop-monitor) | [Mercari Japan Scraper](https://apify.com/crawloop/mercari-japan-scraper) | [StockX Listings Scraper](https://apify.com/crawloop/stockx-listings-scraper) |
| New Depop search cards | Japan on-sale and sold prices | Lowest ask, highest bid, last sale |

### When to use this Actor

- **Poshmark sold comps** — sold price, sold date, and days to sell for a keyword
- **Closet sold history** — sold cards from one or more usernames
- **Brand and price filters** — department, brand, and USD sold-price band
- **Scheduled refresh** — run the same keyword on an Apify Schedule and append new rows
- **Cross-marketplace pricing** — then run eBay sold comps for the same product

### When this Actor is a poor fit

- **Active Poshmark listings** — this Actor saves `sold_out` cards only
- **Offer and comment threads** — likes and comment counts are on the card; full threads are not
- **Pricing recommendations** — use [eBay Sold Price Intelligence](https://apify.com/crawloop/ebay-sold-price-intelligence) after you have eBay sold rows

### Key features

- **Sold cards only** — available inventory is dropped and is not charged
- **Comps on the search card** — sold price, listed timestamp, sold timestamp, days to sell, seller, brand, size, condition
- **Keyword and closet** — up to 8 targets per run
- **Pagination** — 48 cards per page, up to 480 listings per target
- **HTTP only** — `curl_cffi` Chrome impersonation, 256 MB, no browser
- **Proxy off by default** — enable Apify Proxy in the input only if a run is blocked
- **Deduped listing IDs** — the same listing found twice in one run is saved once

### Input

| Parameter | Type | Default | Description |
| :--- | :--- | :--- | :--- |
| `searchTerms` | Array | `lululemon align` | Sold-search keywords |
| `usernames` | Array | — | Closet usernames, sold cards only |
| `brand` | String | — | Brand filter on every target |
| `department` | String | `All` | `All`, `Women`, `Men`, `Kids`, `Home`, `Pets`, `Electronics` |
| `minPrice` / `maxPrice` | Number | — | Sold price band in USD |
| `sortBy` | String | `added_desc` | `added_desc`, `price_asc`, `price_desc`, `relevance` |
| `maxItems` | Integer | `48` | Max sold rows per keyword or closet (1–480) |
| `proxyConfiguration` | Object | Off | Leave off unless a run is blocked |

#### Input example

```json
{
    "searchTerms": ["lululemon align"],
    "department": "Women",
    "maxItems": 48,
    "sortBy": "added_desc",
    "proxyConfiguration": { "useApifyProxy": false }
}
```

#### Closet example

```json
{
    "usernames": ["closet_username"],
    "maxItems": 48
}
```

### Output

Each dataset row is one sold listing.

| Field | Description |
| :--- | :--- |
| `listingId` | Listing id |
| `title` | Listing title |
| `url` | Public listing URL |
| `soldPrice` | Sold price on the card |
| `originalPrice` | Compare-at price when the seller set one |
| `currency` | Currency code |
| `brand` / `size` / `condition` | Card attributes |
| `department` / `category` / `color` | Catalog labels |
| `likeCount` / `commentCount` / `shareCount` | Engagement on the card |
| `sellerUsername` / `sellerUrl` | Closet |
| `listedAt` / `soldAt` | Listed and sold timestamps |
| `daysToSell` | Days between those timestamps |
| `quantitySold` | Units sold on the card |
| `source` | Keyword or `closet:{username}` |
| `scrapedAt` | UTC time the row was parsed |

#### Output example

```json
{
    "listingId": "6ab2b71bcf8005b79104fada",
    "title": "Lululemon Align Tank",
    "soldPrice": 36.0,
    "originalPrice": 88.0,
    "currency": "USD",
    "brand": "lululemon athletica",
    "size": "4",
    "condition": "nwt",
    "department": "Women",
    "sellerUsername": "seller_name",
    "listedAt": "2026-09-19T12:49:45-07:00",
    "soldAt": "2026-09-22T09:42:45-07:00",
    "daysToSell": 2.87,
    "quantitySold": 1,
    "source": "lululemon align",
    "url": "https://poshmark.com/listing/Lululemon-Align-Tank-6ab2b71bcf8005b79104fada"
}
```

`originalPrice` is null when the card has no compare-at price. Search results are capped by the site at about 5,000 cards per query.

### Use cases

| Job | What you get |
| :--- | :--- |
| Reseller comps | Sold price, sold date, and days to sell for a keyword |
| Brand watch | Sold cards for one brand and department |
| Closet research | Sold history for specific usernames |
| Scheduled dataset | Same input on an Apify Schedule, new rows each run |
| Cross-market check | Poshmark sold price next to eBay sold comps |

### Integration examples

Replace `APIFY_TOKEN` with your Apify API token. Actor name: `crawloop/poshmark-sold-listings-scraper`.

#### Node.js

```javascript
import { ApifyClient } from "apify-client";

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor("crawloop/poshmark-sold-listings-scraper").call({
    searchTerms: ["lululemon align"],
    maxItems: 48,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient(token="APIFY_TOKEN")
run = client.actor("crawloop/poshmark-sold-listings-scraper").call(
    run_input={"searchTerms": ["lululemon align"], "maxItems": 48}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["soldPrice"], item["daysToSell"], item["sellerUsername"])
```

#### cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/crawloop~poshmark-sold-listings-scraper/runs?token=APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d "{\"searchTerms\":[\"lululemon align\"],\"maxItems\":48}"
```

### MCP and AI assistants

Use this Actor from AI tools via [Apify MCP](https://docs.apify.com/platform/integrations/mcp). Connect your Apify account, then call `crawloop/poshmark-sold-listings-scraper`.

Example prompts:

- "Run Poshmark Sold Listings Scraper for 'lululemon align', max 20 rows, and return sold price, days to sell, and seller as JSON."
- "Scrape sold listings from closet username example\_seller and summarize the median sold price."
- "Run Poshmark Sold Listings Scraper for 'nike dunk', then run eBay Sold Listings Scraper for the same keyword and compare sold prices."

### Suite next step

After Poshmark sold comps, run [eBay Sold Listings Scraper](https://apify.com/crawloop/ebay-sold-listings-scraper) for the same keyword, then [eBay Sold Price Intelligence](https://apify.com/crawloop/ebay-sold-price-intelligence) if you want a recommended price from the eBay side. For live fashion asks, use [Depop Monitor](https://apify.com/crawloop/depop-monitor) or [Vinted Monitor](https://apify.com/crawloop/vinted-monitor). For Japan sold prices, use [Mercari Japan Scraper](https://apify.com/crawloop/mercari-japan-scraper). For StockX ask, bid, and last sale, use [StockX Listings Scraper](https://apify.com/crawloop/stockx-listings-scraper).

### FAQ

#### Does this include active listings?

No. Every saved row is a sold card. Available inventory is skipped.

#### How many listings can one run return?

Up to `maxItems` per keyword or closet (480). The site itself stops a broad search around 5,000 cards.

#### Do I need a proxy?

Leave proxy off. If a run fails because the search was blocked, enable Apify Proxy in the input and run again.

#### What is days to sell?

The number of days between `listedAt` and `soldAt` on the card. Both timestamps are kept so you can check the raw values.

#### Can I monitor new sales?

Put the Actor on an Apify Schedule with the same keyword. Each run appends the current sold cards. Dedupe `listingId` in your warehouse if you merge runs.

# Actor input Schema

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

Sold-listing keywords. Each keyword is paginated until Max listings.

## `usernames` (type: `array`):

Poshmark closet usernames. Sold listings only.

## `brand` (type: `string`):

Optional brand filter applied to every keyword and closet.

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

Optional department filter.

## `minPrice` (type: `number`):

Optional lower bound on the sold price.

## `maxPrice` (type: `number`):

Optional upper bound on the sold price.

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

Sort order for sold search.

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

Maximum sold listings saved per keyword or closet. Pages are 48 cards.

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

Leave proxy off. Enable Apify Proxy only when a run is blocked.

## Actor input object example

```json
{
  "searchTerms": [
    "lululemon align"
  ],
  "department": "All",
  "sortBy": "added_desc",
  "maxItems": 48,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Default dataset items.

# 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": [
        "lululemon align"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawloop/poshmark-sold-listings-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": ["lululemon align"] }

# Run the Actor and wait for it to finish
run = client.actor("crawloop/poshmark-sold-listings-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": [
    "lululemon align"
  ]
}' |
apify call crawloop/poshmark-sold-listings-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawloop/poshmark-sold-listings-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/3wpN9h5MOvOhxGhIe/builds/PxCRBk40Vn2ECVQ0u/openapi.json
