# Poshmark Sold Listings Scraper - Mercari, Depop & Grailed (`kalilfagundes.w/resale-sold-comps-scraper`) Actor

\[Limited Launch Offer $1.50/1K] Poshmark sold listings plus Mercari US, Depop and Grailed in one schema: sold price comps, sold date, days to sell, brand, size, condition. Free resale comps stats.

- **URL**: https://apify.com/kalilfagundes.w/resale-sold-comps-scraper.md
- **Developed by:** [Scrape With Me](https://apify.com/kalilfagundes.w) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.28 / 1,000 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 - Mercari, Depop & Grailed Price Comps

Get **Poshmark sold listings** and **Mercari US**, **Depop** and **Grailed** listings - real **sold price comps** with sold date and days to sell - in one run. Type a search like `nike dunk low` or `lululemon align 25` and get sold listings and/or active listings from all four resale apps in the same format:

- **Sold price and sold date**, original price, and **days to sell** (listing date to sale).
- Title, **brand, size, condition**, new or used, category, shipping price when shown.
- Seller, likes, location, main photo, listing URL.
- A free **price summary per search and marketplace**: listing count, min / 25% / median / average / 75% / max price, median days to sell and the share of new items.

No login, no cookies, no browser - fast and cheap.

### Why this one

- **Four marketplaces, one schema.** Compare what the same item sells for on Poshmark, Mercari, Depop and Grailed without merging four different exports.
- **Real sold comps.** Sold listings with the price they sold at and when, so you can price inventory, find arbitrage between apps and see how fast things move.
- **Price statistics included.** Every search ends with a summary row (median, quartiles, average, days to sell) - no spreadsheet needed for a quick comp.
- **Filters that work on the marketplace side.** Price range and sort order are sent to each site, so you don't pay for listings you filter out.
- **Clean results.** Results that only match one word of your search (filler that some apps add) are dropped.

### Poshmark sold listings and Mercari US sold prices

Sold listings come straight from each marketplace's own search with the sold filter on: Poshmark "sold" items, Mercari US sold and in-transaction items, and Grailed sold items, each with the price it sold for. Depop lists only items for sale.

### Resale price comps summary (median, quartiles, days to sell)

With `includeSummary` on (default), every search and marketplace gets one extra row with the listing count, min / 25% / median / average / 75% / max price, the median days to sell and the share of new items - a ready-made comp.

### Use cases

- **Resellers and flippers:** price a pair, a bag or a jacket from recent sales before you list it.
- **Sourcing / arbitrage:** spot items selling for more on one app than another.
- **Brand and market research:** resale value, sell-through speed and the share of new-with-tags items for a brand or model.
- **Run it on a schedule:** weekly comps for a brand or model, sent to your repricing tool, sheet, BI tool or app through the API.

### Input example

```json
{
  "searchQueries": ["nike dunk low panda", "arcteryx beta ar"],
  "marketplaces": ["poshmark", "mercari", "depop", "grailed"],
  "listingStatus": "sold",
  "sortBy": "newest",
  "minPrice": 50,
  "maxPrice": 400,
  "maxResultsPerSearch": 100,
  "includeSummary": true
}
```

- `listingStatus`: `sold` (price comps), `active` (for sale now) or `both`.
- `sortBy`: `newest` (recently sold / listed), `relevance`, `priceLow`, `priceHigh`.
- `maxResultsPerSearch` applies to each keyword on each marketplace (and each status when `both`).

### Output example

A listing row (real data):

```json
{
  "type": "listing",
  "marketplace": "mercari",
  "status": "sold",
  "id": "m94060806073",
  "url": "https://www.mercari.com/us/item/m94060806073/",
  "title": "Arc’teryx Beta AR Jacket Mens 2XL",
  "brand": "Arc'teryx",
  "size": "XXL (50-52)",
  "condition": "New",
  "isNew": true,
  "category": "Jackets",
  "price": 400.0,
  "originalPrice": 450.0,
  "soldPrice": 400.0,
  "currency": "USD",
  "soldAt": "2025-11-25T21:44:11Z",
  "listedAt": "2025-06-27T23:40:05Z",
  "daysToSell": 150.9,
  "sellerId": "331703238",
  "imageUrl": "https://u-mercari-images.mercdn.net/photos/m94060806073_1.jpg?1751730594",
  "imageCount": 1,
  "searchQuery": "arcteryx beta ar",
  "scrapedAt": "2026-10-09T01:06:40Z"
}
```

A summary row (one per search and marketplace, free):

```json
{
  "type": "summary",
  "marketplace": "mercari",
  "status": "sold",
  "searchQuery": "arcteryx beta ar",
  "currency": "USD",
  "listingCount": 15,
  "minPrice": 200.0,
  "p25Price": 216.0,
  "medianPrice": 250.75,
  "averagePrice": 268.17,
  "p75Price": 300.0,
  "maxPrice": 400.0,
  "medianDaysToSell": 36.1,
  "newShare": 0.6
}
```

Every row has the same fields; a field a marketplace doesn't show is `null` (for example Mercari doesn't show seller usernames in search, Depop doesn't show listing dates). The dataset has two views: **Listings** and **Price summary**.

### Run it on a schedule and connect it to your tools

**Schedule:** in Apify Console open *Schedules → Create*, pick this actor and your input, and set it to run
every Monday at 07:00 (your time zone) for a fresh dataset on a fixed day. Each run returns the full, current result set as a new dataset.

**Integrations** (Actor → *Integrations* tab, no code):

- **Google Sheets** — append every run's rows to a sheet.
- **Make, Zapier, n8n** — start the actor from a scenario/zap/workflow and use the rows in the next steps.
- **Webhook** — get a POST to your endpoint when a run succeeds, then download the dataset.
- **Slack / email** — notify your team when a scheduled run finishes.

**AI agents (MCP)** — Claude, ChatGPT, Cursor, VS Code or any MCP client can run it as a tool: add the Apify MCP
server `https://mcp.apify.com?actors=kalilfagundes.w/resale-sold-comps-scraper` (sign in with your Apify account) and ask for the data in
plain language. The agent fills the input from the input schema and reads the dataset back.

**API** — call it from your code (`pip install apify-client` / `npm i apify-client`):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("kalilfagundes.w/resale-sold-comps-scraper").call(run_input={
    "searchQueries": [
        "nike dunk low",
        "lululemon align leggings"
    ],
    "listingStatus": "both",
    "sortBy": "newest",
    "maxResultsPerSearch": 60,
    "maxItems": 1000
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

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

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('kalilfagundes.w/resale-sold-comps-scraper').call({
  "searchQueries": [
    "nike dunk low",
    "lululemon align leggings"
  ],
  "listingStatus": "both",
  "sortBy": "newest",
  "maxResultsPerSearch": 60,
  "maxItems": 1000
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Pricing

Pay per event, platform usage included: one `listing` event per listing row. Summary rows are free. Higher Apify plans get lower prices (see the **Pricing** tab). Set a maximum cost per run in the run options; the actor stops cleanly when it is reached.

### Limits

- **Depop does not show sold items publicly**, so Depop only returns active listings (with `listingStatus` `active` or `both`).
- **Grailed** returns up to 1,000 listings per search (its search limit); split a broad search into narrower ones for more.
- **Sold date**: Poshmark and Mercari give the time the listing changed to sold; Grailed gives the sale time.
- Prices are in USD (US marketplaces). Mercari here is mercari.com (US), not Mercari Japan.

### Related actors

- [Walmart Product Search Scraper - Prices, Ratings, Sellers](https://apify.com/kalilfagundes.w/walmart-scraper)
- [Amazon Price Tracker & Product Scraper - ASIN, BSR, 23 Sites](https://apify.com/kalilfagundes.w/amazon-product-scraper)
- [TikTok Shop Product Data Scraper - Sales, Prices & Reviews](https://apify.com/kalilfagundes.w/tiktok-shop-scraper)

### Feedback

If this actor saves you time, a quick rating on its Store page helps other people find it. Something not working? Open an issue in the **Issues** tab and it gets fixed fast.

# Actor input Schema

## `searchQueries` (type: `array`):

One search per line, as you would type it on the marketplace (e.g. "nike dunk low panda", "lululemon align 25").

## `marketplaces` (type: `array`):

Leave empty for all four.

## `listingStatus` (type: `string`):

Sold = what items actually sold for. Depop has no public sold search, so it only returns active listings.

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

Order in which each marketplace returns results.

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

Skip listings cheaper than this.

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

Skip listings more expensive than this.

## `maxResultsPerSearch` (type: `integer`):

For each keyword x marketplace (x status when "both"). 0 = as many as the marketplace shows (Grailed stops at 1,000 per search).

## `includeSummary` (type: `boolean`):

Adds one free row per search and marketplace: listing count, min / 25% / median / average / 75% / max price, median days to sell, share of new items.

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

Stop after this many listings in the whole run. 0 = no limit.

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

US residential proxy by default; every search gets its own IP and a new one on each retry.

## Actor input object example

```json
{
  "searchQueries": [
    "nike dunk low"
  ],
  "marketplaces": [
    "poshmark",
    "mercari",
    "depop",
    "grailed"
  ],
  "listingStatus": "sold",
  "sortBy": "newest",
  "maxResultsPerSearch": 20,
  "includeSummary": true,
  "maxItems": 1000,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

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

No description

## `summary` (type: `string`):

OUTPUT record: per search, listings saved, pages read, errors.

# 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 = {
    "searchQueries": [
        "nike dunk low"
    ],
    "marketplaces": [
        "poshmark",
        "mercari",
        "depop",
        "grailed"
    ],
    "maxResultsPerSearch": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("kalilfagundes.w/resale-sold-comps-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 = {
    "searchQueries": ["nike dunk low"],
    "marketplaces": [
        "poshmark",
        "mercari",
        "depop",
        "grailed",
    ],
    "maxResultsPerSearch": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("kalilfagundes.w/resale-sold-comps-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 '{
  "searchQueries": [
    "nike dunk low"
  ],
  "marketplaces": [
    "poshmark",
    "mercari",
    "depop",
    "grailed"
  ],
  "maxResultsPerSearch": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call kalilfagundes.w/resale-sold-comps-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kalilfagundes.w/resale-sold-comps-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/DnrUUHrtqEpTYf85j/builds/B2ljDdeqBLrugt4YU/openapi.json
