# Poshmark Scraper (`fanndev/poshmark-scraper`) Actor

Browse Poshmark listings by brand or category, extract full listing details, and pull seller/closet profiles -- no account or API key needed.

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

## Pricing

from $0.29 / 1,000 results

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?

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 Scraper

Browse Poshmark listings by brand or category, extract full listing details, and pull seller/closet profiles — no account or API key needed.

### Why use this actor

- Browse any brand or category with sorting (newest, price, most liked) and automatic pagination
- Full listing detail includes the seller's basic profile embedded — no second request needed
- Seller/closet profiles include real aggregate stats: followers, following, total posts, items sold, 5-star rating counts
- No account, login, or API key required
- Respects Poshmark's own `robots.txt` — built entirely on paths it doesn't disallow (see Known limits for what that means in practice)

### How it works

Pick a `mode`:

1. **`browse`** — list items for a brand or category, sorted and paginated.
2. **`listing`** — fetch full detail for one or more specific listing IDs/URLs.
3. **`seller`** — fetch a seller's closet profile and stats by username.

### Input

**Browse by brand:**

```json
{
  "mode": "browse",
  "browseBy": "brand",
  "value": "Nike",
  "sortBy": "price_asc",
  "maxItems": 100
}
```

**Browse by category:**

```json
{
  "mode": "browse",
  "browseBy": "category",
  "value": "Women-Dresses",
  "maxItems": 100
}
```

**Listing detail:**

```json
{
  "mode": "listing",
  "listingIds": ["6a8e29a7571a7e204b947d4f"]
}
```

**Seller profile:**

```json
{
  "mode": "seller",
  "username": "shophopeful"
}
```

| Field | Type | Description |
|---|---|---|
| `mode` | string | `"browse"` (default), `"listing"`, or `"seller"`. |
| `browseBy` | string | `browse` mode — `"brand"` or `"category"`. |
| `value` | string | `browse` mode — a brand name (e.g. `"Nike"`, `"lululemon athletica"`) or a `Department-Category` slug (e.g. `"Women-Dresses"`, `"Men-Shoes"`). |
| `sortBy` | string | `browse` mode — `added_desc` (default), `price_asc`, `price_desc`, `like_count`, or `relevance`. |
| `maxItems` | integer | `browse` mode — max listings to return, pagination followed automatically. Default 100. |
| `listingId` / `listingIds` | string / array | `listing` mode — a listing's 24-character ID or full URL. |
| `username` / `usernames` | string / array | `seller` mode. |
| `maxConcurrency` | integer | `listing`/`seller` mode — how many to fetch in parallel. Default 4. |
| `proxyConfiguration` | object | Apify Proxy settings. Residential is on by default. |

### Output

**Browse / listing mode** — one record per listing (truncated for readability):

```json
{
  "_input": "brand:Nike",
  "_source": "S1-html",
  "id": "6a8e29a7571a7e204b947d4f",
  "title": "Nike Mens Jacket",
  "price": 25,
  "original_price": 150,
  "brand": "Nike",
  "size": "XXL",
  "condition": "...",
  "creator_username": "clarissajohn606",
  "like_count": 3,
  "pictures": [ { "url": "https://...jpg" } ]
}
```

**Seller mode:**

```json
{
  "_input": "clarissajohn606",
  "_source": "S1-html",
  "username": "clarissajohn606",
  "full_name": "Clarissa Johnson",
  "profile_v2": { "description": "Always Open to offers!!", "city": "Charleston", "state": "IL" },
  "aggregates": {
    "followers": 2198,
    "following": 63,
    "posts": 328,
    "items_sold_display": "100+",
    "seller_5_star_rating_comment_count": 12
  }
}
```

A record with `_error` instead means that lookup couldn't complete (e.g. `"_error": "listing_not_found"` or `"_error": "seller_not_found"`).

### Known limits

- **Keyword search is not available.** Poshmark's `robots.txt` disallows `/search` for every crawler, with no exceptions — this actor honors that and does not implement keyword search. Use `browse` mode's brand/category filters instead, which are not disallowed and were confirmed to filter correctly (unlike several query-string filters tried on `/search`, which silently returned unfiltered results).
- **`seller` mode returns profile + stats, not a paginated feed of that seller's current listings.** The closet page's own listings grid loads via a client-side call whose exact endpoint wasn't found during development — this is a documented scope boundary, not a bug.
- **Total match counts for very broad brands/categories are capped around 5,000** by Poshmark itself — not an exact inventory count.

# Actor input Schema

## `mode` (type: `string`):

"browse" lists listings for a brand or category. "listing" fetches full detail for specific listing ID(s)/URL(s). "seller" fetches a closet/seller profile by username.

## `browseBy` (type: `string`):

"browse" mode -- whether "value" below is a brand name or a category slug.

## `value` (type: `string`):

"browse" mode -- a brand name exactly as shown on Poshmark (e.g. "Nike", "lululemon athletica") when browseBy is "brand", or a "Department-Category" slug (e.g. "Women-Dresses", "Men-Shoes") when browseBy is "category".

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

"browse" mode -- order to return listings in.

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

"browse" mode -- maximum number of listings to return. Pagination is followed automatically (48 items/page) until this cap or the end of the result set (Poshmark itself caps total matches around 5,000 per brand/category).

## `listingId` (type: `string`):

"listing" mode -- a single listing's 24-character ID (found in any poshmark.com/listing/... URL) or the full URL itself.

## `listingIds` (type: `array`):

"listing" mode only -- multiple listing IDs/URLs to fetch full detail for in one run.

## `username` (type: `string`):

"seller" mode -- a single Poshmark username (the part after poshmark.com/closet/ in their profile URL).

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

"seller" mode only -- multiple usernames to fetch in one run.

## `maxConcurrency` (type: `integer`):

"listing"/"seller" mode -- how many IDs/usernames to fetch in parallel.

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

Apify Proxy configuration. Residential is on by default.

## Actor input object example

```json
{
  "mode": "browse",
  "browseBy": "brand",
  "value": "Nike",
  "sortBy": "added_desc",
  "maxItems": 100,
  "listingId": "https://poshmark.com/listing/Nike-Mens-Jacket-6a8e29a7571a7e204b947d4f",
  "username": "shophopeful",
  "maxConcurrency": 4,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

All scraped browse / listing / seller records produced by this run.

# 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 = {
    "mode": "browse",
    "browseBy": "brand",
    "value": "Nike",
    "sortBy": "added_desc",
    "maxItems": 100,
    "listingId": "https://poshmark.com/listing/Nike-Mens-Jacket-6a8e29a7571a7e204b947d4f",
    "username": "shophopeful",
    "maxConcurrency": 4,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("fanndev/poshmark-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 = {
    "mode": "browse",
    "browseBy": "brand",
    "value": "Nike",
    "sortBy": "added_desc",
    "maxItems": 100,
    "listingId": "https://poshmark.com/listing/Nike-Mens-Jacket-6a8e29a7571a7e204b947d4f",
    "username": "shophopeful",
    "maxConcurrency": 4,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("fanndev/poshmark-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 '{
  "mode": "browse",
  "browseBy": "brand",
  "value": "Nike",
  "sortBy": "added_desc",
  "maxItems": 100,
  "listingId": "https://poshmark.com/listing/Nike-Mens-Jacket-6a8e29a7571a7e204b947d4f",
  "username": "shophopeful",
  "maxConcurrency": 4,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call fanndev/poshmark-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fanndev/poshmark-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/n3nm0hYGs6CGaM8py/builds/iKzuJ7aVaY4908EaQ/openapi.json
