# Grailed Scraper (`unfenced-group/grailed-scraper`) Actor

Scrape Grailed designer and streetwear listings with full price-drop history, size, condition, designer and seller reputation. Search, browse by designer or category, filter by price and condition. Sold-archive mode adds sold price and date for market-value research. No start fee.

- **URL**: https://apify.com/unfenced-group/grailed-scraper.md
- **Developed by:** [Unfenced Group](https://apify.com/unfenced-group) (community)
- **Categories:** E-commerce
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.99 / 1,000 listing 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/platform/actors/running/actors-in-store#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

## Grailed Scraper

![Banner](https://api.apify.com/v2/key-value-stores/lJlifu6C8YQfZMPKE/records/grailed-scraper)

Scrape Grailed designer and streetwear listings at scale, including the sold archive for market-value research. Search by keyword, browse by designer or category, and filter by price, condition and department. No API key required.

***

### Why this scraper?

#### 🏷️ Complete listing data

Price, full price-drop history, designer, size, color, condition, category, shipping, and engagement metrics on every result.

#### 📉 Sold-comp data

Switch to the sold archive to get sold price and sold date for any search — the data resellers use to value inventory and price listings. Each sold run also reports an outlier-trimmed median sold price and median markdown percentage in the run summary.

#### 🔍 Powerful filtering

Filter by price range, condition, department, and on-sale status. Sort by relevance, newest, popularity, or price.

#### ⭐ Seller reputation

Seller rating, review count, total sales, and trusted-seller status — without exposing any individual's personal details.

#### 💸 Low flat pricing, no start fee

Flat per-result pricing with no separate actor-start fee and no charge for retries — you pay only for listings actually returned.

***

### Input parameters

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `search` | `search`, `byDesigner`, or `byCategory`. |
| `searchQuery` | string | `nike` | Free-text query (mode = search). |
| `designer` | string | — | Designer name to filter by, e.g. `Nike`, `Supreme`, `Rick Owens`. |
| `category` | string | — | Category to filter by, e.g. `footwear`, `tops`, `outerwear`, `bottoms`, `accessories`. |
| `department` | string | ``| `menswear`, `womenswear`, or any. |
| `condition` | string |`` | `is_new`, `is_gently_used`, `is_used`, `is_worn`, or any. |
| `soldOnly` | boolean | `false` | Scrape the sold archive instead of active listings. |
| `sortBy` | string | `relevance` | `relevance`, `newest`, `most_popular`, `price_low_to_high`, `price_high_to_low`. |
| `minPrice` | integer | — | Only emit listings at or above this price. |
| `maxPrice` | integer | — | Only emit listings at or below this price. |
| `onSaleOnly` | boolean | `false` | Keep only price-dropped listings. |
| `maxResults` | integer | `5` | Cap on results. Set 0 for no cap (max 1000 per query). |
| `maxPages` | integer | `5` | Maximum pages to walk (48 per page, max 21). |

***

### Output schema

| Field | Type | Description |
|---|---|---|
| `id` | number | Grailed listing ID. |
| `title` | string | Listing title. |
| `url` | string | Full listing URL. |
| `designer` | string | Designer name(s) as shown. |
| `designers` | array | Individual designer names. |
| `department` | string | menswear or womenswear. |
| `category` | string | Top-level category. |
| `categoryPath` | string | Full category path. |
| `size` | string | Item size. |
| `color` | string | Primary color. |
| `condition` | string | Item condition. |
| `strata` | string | Grailed tier (e.g. hype, grailed, basic). |
| `price` | number | Current price (USD). |
| `priceDrops` | array | Price-drop history. |
| `onSale` | boolean | Has had a price drop. |
| `makeOffer` | boolean | Accepts offers. |
| `buyNow` | boolean | Buy-now enabled. |
| `priceUpdatedAt` | string | When the price last changed. |
| `shippingUS` | number | US shipping cost. |
| `sold` | boolean | Whether the listing is sold. |
| `soldPrice` | number | Sold price (sold archive only). |
| `soldAt` | string | Sold date (sold archive only). |
| `heat` | number | Grailed heat / popularity score. |
| `followerCount` | number | Listing followers. |
| `photoCount` | number | Number of photos. |
| `measurementCount` | number | Number of measurements provided. |
| `coverPhotoUrl` | string | Cover photo URL. |
| `location` | string | Seller region. |
| `createdAt` | string | Listing creation date. |
| `sellerRating` | number | Seller average rating. |
| `sellerRatingCount` | number | Number of seller reviews. |
| `sellerTotalSold` | number | Seller's total bought and sold. |
| `sellerTrusted` | boolean | Trusted-seller flag. |
| `marketplace` | string | Source marketplace. |
| `source` | string | Always `Grailed`. |
| `scrapedAt` | string | ISO timestamp of extraction. |

***

#### Example record

```json
{
  "id": 99282234,
  "title": "Nike Thorpe United F.C. #2 L/S Jersey",
  "url": "https://www.grailed.com/listings/99282234",
  "designer": "Nike",
  "designers": [
    "Nike"
  ],
  "department": "menswear",
  "category": "tops",
  "categoryPath": "tops.jerseys",
  "size": "m",
  "color": "blue",
  "condition": "is_gently_used",
  "strata": "hype",
  "price": 72,
  "priceDrops": [],
  "onSale": false,
  "makeOffer": true,
  "buyNow": true,
  "priceUpdatedAt": "2026-06-24T16:25:08.766Z",
  "shippingUS": 15,
  "sold": false,
  "soldPrice": null,
  "soldAt": null,
  "heat": 4576.757581018518,
  "followerCount": 9,
  "photoCount": 9,
  "measurementCount": 4,
  "coverPhotoUrl": "https://media-assets.grailed.com/prd/listing/temp/3dbf27eb01e74bcbb8d00eeafb4f5cc1",
  "location": "Europe",
  "createdAt": "2026-06-24T16:25:08.766Z",
  "sellerRating": 4.926235741444866,
  "sellerRatingCount": 1315,
  "sellerTotalSold": 3495,
  "sellerTrusted": true,
  "marketplace": "grailed",
  "source": "Grailed",
  "scrapedAt": "2026-06-24T16:35:10.394Z"
}
```

### Examples

**Search menswear Nike under $200:**

```json
{
  "mode": "search",
  "searchQuery": "nike",
  "department": "menswear",
  "maxPrice": 200,
  "maxResults": 100
}
```

**Sold-comp research for a designer:**

```json
{
  "mode": "search",
  "searchQuery": "rick owens ramones",
  "soldOnly": true,
  "sortBy": "newest",
  "maxResults": 200
}
```

**On-sale outerwear, price high to low:**

```json
{
  "mode": "search",
  "searchQuery": "carhartt jacket",
  "category": "outerwear",
  "onSaleOnly": true,
  "sortBy": "price_high_to_low",
  "maxResults": 100
}
```

***

**Daily feed of new listings (run on a schedule):**

```json
{
  "searchQuery": "Acne Studios",
  "sortBy": "newest",
  "maxResults": 200
}
```

Schedule this input to run once a day in the Apify Scheduler to capture the newest listings as they appear.

### 💰 Pricing

**$0.99 per 1,000 listings** — you only pay for results returned. No start fees, no charges for retries.

| Results | Cost |
|---|---|
| 100 | ~$0.099 |
| 1,000 | ~$0.99 |
| 10,000 | ~$9.90 |
| 100,000 | ~$99 |

Use the **Max results** cap to control your spend exactly.

> Flat-rate alternatives typically charge a monthly fee regardless of usage.

Use **Max results** to control spend exactly.

***

### Performance

| Run size | Typical time |
|---|---|
| 100 results | under 30 seconds |
| 1,000 results | 1–2 minutes |

***

### Known limitations

- Each query returns at most 1,000 results. Use price ranges, categories, or more specific queries to segment large catalogues.
- Sold data is available only in sold mode (`soldOnly: true`).
- Prices are in USD as provided by Grailed.

### Run summary

Every run writes an `OUTPUT` key with the result count and dataset URL. In sold mode it also includes `soldComps` — the number of sold items, an outlier-trimmed `medianSoldPrice`, and `medianMarkdownPct` (median discount from original list price to final sale).

***

### Technical details

- **Source:** grailed.com — designer and streetwear resale marketplace
- **Memory:** 512 MB
- **Retry:** Automatic retry with backoff on transient errors
- **Output:** Dataset records plus `OUTPUT` and `HEALTH` keys

### Related scrapers

Other scrapers in our **Fashion & Sneaker Resale** collection:

- [StockX Scraper](https://apify.com/unfenced-group/stockx-scraper)
- [Vestiaire Collective Scraper](https://apify.com/unfenced-group/vestiaire-collective-scraper)
- [Vinted Demand & Sell-Through Scraper](https://apify.com/unfenced-group/vinted-arbitrage-scanner)
- [Zalando Scraper](https://apify.com/unfenced-group/zalando-scraper)

***

### Run it on a schedule

This actor is built for repeat use. Set it to run daily, weekly, or hourly, and the data keeps flowing without you touching it.

- **Schedule runs** — open the actor, go to Schedules, and pick a cadence. Each run only charges you for the results it returns.
- **Connect it to your stack** — push results straight to Google Sheets, Slack, a webhook, or your database using Apify Integrations. No glue code needed.
- **Pull results via API** — every run writes a clean dataset you can fetch with one API call, ready for whatever you build on top of it.

Set it once and it runs on its own.

***

### Need a custom scraper?

**[Unfenced Group](https://www.unfencedgroup.nl)** builds Apify actors for any website — for free.

If the site you need isn't in our portfolio yet, just ask. We scope, build, and publish it at no cost to you. You only pay for results — we absorb the compute and proxy costs ourselves. Same pay-per-result pricing, same quality, same standards as every actor in this portfolio.

**Get in touch:** [www.unfencedgroup.nl](https://www.unfencedgroup.nl)

# Actor input Schema

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

What to scrape.

## `searchQuery` (type: `string`):

Free-text query (mode = search). E.g. 'nike air max', 'rick owens', 'carhartt jacket'.

## `designer` (type: `string`):

Designer name to filter by (mode = byDesigner, or as a filter). Must match Grailed's spelling, e.g. 'Nike', 'Supreme', 'Rick Owens', 'Carhartt'.

## `category` (type: `string`):

Top-level category to filter by, e.g. 'footwear', 'tops', 'outerwear', 'bottoms', 'accessories', 'tailoring'.

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

Department filter.

## `condition` (type: `string`):

Filter by item condition.

## `soldOnly` (type: `boolean`):

Scrape the sold archive instead of active listings — for sold-comp and market-value research. Adds soldPrice and soldAt to every record.

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

How to sort results.

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

Only emit listings priced at or above this value.

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

Only emit listings priced at or below this value.

## `onSaleOnly` (type: `boolean`):

Keep only listings that have had a price drop.

## `maxResults` (type: `integer`):

Hard cap on results emitted. Set 0 for no cap (Grailed's search index returns at most 1000 per query).

## `maxPages` (type: `integer`):

Maximum pages to walk (48 listings per page, max 21).

## Actor input object example

```json
{
  "mode": "search",
  "searchQuery": "nike",
  "department": "",
  "condition": "",
  "soldOnly": false,
  "sortBy": "relevance",
  "onSaleOnly": false,
  "maxResults": 100,
  "maxPages": 5
}
```

# Actor output Schema

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

No description

# 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": "search",
    "searchQuery": "nike",
    "department": "",
    "condition": "",
    "sortBy": "relevance",
    "maxResults": 100,
    "maxPages": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("unfenced-group/grailed-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": "search",
    "searchQuery": "nike",
    "department": "",
    "condition": "",
    "sortBy": "relevance",
    "maxResults": 100,
    "maxPages": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("unfenced-group/grailed-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": "search",
  "searchQuery": "nike",
  "department": "",
  "condition": "",
  "sortBy": "relevance",
  "maxResults": 100,
  "maxPages": 5
}' |
apify call unfenced-group/grailed-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=unfenced-group/grailed-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/QYKRz78f3yFWcP9OZ/builds/wSO5buzW5zfv5jhJ7/openapi.json
