Grailed Scraper — Live Resale & Sold Comps Data
Pricing
from $1.00 / 1,000 results
Grailed Scraper — Live Resale & Sold Comps Data
Live Grailed resale intelligence for thrift and vintage resellers: keyword search with full-details enrichment, sold comps for pricing, closet inventory tracking, seller stats, and instant Slack/Discord deal alerts. Clean structured JSON, streamed in real time.
Pricing
from $1.00 / 1,000 results
Rating
0.0
(0)
Developer
Emmanuel
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Grailed Real-Time Data
Live resale market intelligence from Grailed — thrift price comps, closet inventory, seller stats, and a vintage deal finder — as clean structured JSON.
Built for vintage & thrift resellers (Poshmark, eBay, Depop, Mercari cross-listers), consignment shop owners, resale arbitrageurs, fashion market researchers, pricing intelligence teams, and AI agents. Enable only the features you need, click Start, and stream results to your dataset, webhook, or LLM pipeline.
⚠️ Free-tier notice: Free Apify accounts get a 2-result trial per run. Upgrade to any paid Apify plan for unlimited exports. See Free tier limits.
Why teams use this Actor
| Grailed Real-Time Data | Typical browser scraper | |
|---|---|---|
| Speed | Fast per-item collection | Often seconds per page |
| Memory | 512 MB default, streams row-by-row | 2–4 GB+ |
| Setup | Checkbox UI, prefilled test input | Fragile & high-maintenance |
| Cost | Low compute | High |
| Output | Structured JSON, LLM-ready | Often messy HTML |
| Scale | 10,000+ item runs without ballooning RAM | Memory-heavy buffers |
| Delivery | Dataset + optional real-time webhook | Export-only |
Feature matrix
| Feature | Default | What it does |
|---|---|---|
| 🔍 Listing Search | ON | Live keyword search for thrift brands, streetwear, and vintage finds with brand, size, condition, and min/max price filters |
| ✨ Enrich with full listing details | off | Adds description, fabric/material tags, style tags, full image gallery, and seller shipping discounts to the same search row |
| 📦 Listing Details | off | Full records for specific listing IDs or Grailed URLs |
| 👚 Closet Listings | off | Full active inventory of any reseller/thrift closet — track competitor stock |
| 👤 Seller Profile | off | Reseller stats: love notes, items sold, closet size, verification, bio |
| 🧾 Sold Item Comps / History | off | Completed and sold listings to calculate real market comps, resale margins, and sell-through rates |
| 🔗 Scrape By URL | off | Paste any Grailed URL — listings, search URLs, closets, category pages, brand feeds |
All defaults are set to 10 results so your first run finishes in seconds. Raise the caps once you've confirmed the output shape.
Use cases
- Finding undervalued thrift & vintage inventory — hunt vintage single-stitch tees, designer denim, gorpcore, and Y2K with price ceilings (e.g.
vintage 90s levis 501under $40). - Pricing comps & sell-through analysis — pull completed and sold listings for any keyword or seller to compute real market comps, average sold prices, and resale margins before you buy.
- Closet inventory monitoring — watch top competitors' and consignment sellers' active stock; get alerted the moment something new drops.
- Instant Slack/Discord deal alerts — pipe every new row through a webhook to Slack, Discord, Zapier, Make, n8n, or your own pricing bot for newly listed steals.
- Multi-platform pricing sync & inventory feeds — one JSON schema feeds your cross-listing, repricing, or catalog pipelines.
- AI & agent workflows — structured JSON ready for Claude, ChatGPT, LangChain, LlamaIndex, RAG, scoring, and alerts.
What you get
Every record includes featureType, url, and scrapedAt so you can filter, join, and pipe into any workflow.
Listing Search (featureType: "listing_search") — one product = one row
| Field | Description |
|---|---|
listingId, title, url | Identity and listing link |
price, originalPrice, discountPercent, priceDropped | Pricing and markdown signals |
currency, shippingCost, freeShipping | Cost context |
brand, designers[], size, condition, color | Attributes |
category, subCategory, department, marketTier | Catalog placement (grails / hype / sartorial / basic) |
likes, views, numberOfOffers | Demand signals |
sellerUsername, sellerLocation, sellerVerified | Seller context |
imageUrl, imageUrls[] | Cover photo and gallery |
postedAt, timeSinceListed, isNewlyListed | Freshness — critical for deal sniping |
position, keyword | Search context |
detailsFetched | false = search card; true = full fields merged into this same row |
With "Enrich with full listing details" on, the Actor does not create a second row and never drops partial items. It enriches the search row in place with:
Extra fields when detailsFetched: true | |
|---|---|
description | Full listing text |
materialTags, material | Fabric / material tags |
styleTags, hashtags, tags | Style taxonomy |
imageUrls[] | Full image gallery |
sellerShippingDiscounts | Seller shipping-discount signals |
measurements[], itemSpecifics[] | Garment measurements and specifics |
Example: searchMaxResults: 10 + enrichment on → 10 dataset rows, not 20, and nothing filtered out.
Listing Details (featureType: "listing_details")
Full product rows only when you enable the Listing Details feature and pass listing IDs / URLs. Search enrichment merges into listing_search instead.
Closet Listings (featureType: "closet_listings")
One row per active listing in a seller's closet — price, brand, size, condition, photos, and freshness.
Seller Profile (featureType: "seller_profile")
Username, display name, bio, verification, rating, reviews, items sold, closet size, response rate, and recent love notes (feedback) when available.
Sold Item Comps (featureType: "sold_comps")
Completed and sold listings by seller or by keyword — sold price, sold date, brand, size — the raw material for market comps and margin math.
Scrape By URL (featureType: "scrape_by_url")
Paste any Grailed URL. The Actor auto-detects the page type (listing, search, seller, brand, category) and returns structured rows.
Full input reference
Enable only what you need. Listing Search is on by default with thrift-ready sample keywords.
There is no separate global cap — the run's total volume is simply the sum of the section caps you set (keywords × max per keyword, sellers × max per closet, etc.), so you control everything from the feature sections.
Free plan: a 2-result per-run trial cap applies on top of your section caps — see Free tier limits.
| Input | Type | Default | Description |
|---|---|---|---|
| Listing Search | |||
enableListingSearch | boolean | true | Live keyword search |
searchKeywords | string[] | carhartt / levis / patagonia samples | Search terms |
searchMaxResults | integer | 10 | Max per keyword (1–200) |
searchDepartment | enum | any | menswear, womenswear |
searchDesigner | string | — | Brand filter (e.g. Carhartt, Levi's, Patagonia, The North Face, Stussy) |
searchSize | string | — | e.g. M, L, XL, 32, 34 |
searchCondition | enum | any | new_with_tags, new_without_tags, gently_used, well_worn |
searchMinPrice / searchMaxPrice | integer | — | USD price bounds — set a max for deal hunting |
searchStrata | enum | any | grails, hype, sartorial, basic |
searchSort | enum | relevance | relevance, newest, price-low, price-high, heat |
searchSoldOnly | boolean | false | Search completed/sold items instead of live inventory |
searchFetchFullDetails | boolean | false | Enrich each search row in place (same row, detailsFetched: true) |
| Listing Details | |||
enableListingDetails | boolean | false | Full product rows |
listingUrls | string[] | — | Listing URLs or bare numeric IDs |
| Sellers | |||
enableClosetListings | boolean | false | Closet inventory |
enableSellerProfile | boolean | false | Profile + love notes |
enableSoldComps | boolean | false | Sold comps by seller and/or keyword |
sellerUsernames | string[] | — | Without @ |
sellerMaxListings | integer | 30 | Cap per closet (1–500) |
soldMaxItems | integer | 30 | Cap sold items per seller/keyword (1–200) |
soldKeywords | string[] | — | Direct sold-market comp searches (e.g. carhartt j97, stussy 8 ball) |
| URL | |||
enableScrapeByUrl | boolean | false | Any Grailed URL |
scrapeUrls | string[] | — | Listing, search, seller, category, or brand URLs |
scrapeMaxPages | integer | 3 | Depth for list-style URLs (1–20) |
| Options & delivery | |||
includeRaw | boolean | false | Extended structured block per row (larger output) |
webhookUrl | string | — | Optional real-time POST per row |
webhookFormat | enum | json | json (full record) or slack |
proxyConfiguration | object | Residential US | Recommended — see Proxy |
Practical thrift search examples
| Goal | Keywords + filters |
|---|---|
| Vintage denim flips | vintage 90s levis 501, levis 517 made in usa + searchMaxPrice: 60 |
| Workwear goldmines | carhartt detroit jacket, carhartt double knee + condition: gently_used |
| Gorpcore sourcing | patagonia fleece, arc'teryx gamma + searchSort: price-low |
| Streetwear steals | stussy 8 ball, supreme box logo + searchMaxPrice: 120 |
| Sold comps before you buy | Sold comps with soldKeywords: ["carhartt j97"] |
| Y2K restock alerts | vintage y2k + webhook to Discord + searchSort: newest |
Output & streaming
- Every row is written to the dataset the moment it is ready — long runs never hold the full result set in memory, so RAM stays flat even at 10,000+ items.
- Parallel workers process multiple keywords, sellers, details, and URLs concurrently with randomized pacing between chunks.
- Spending limits — set a max cost per run in the Console and the Actor stops gracefully with a summary when the limit is reached. No crashed runs, no overspend.
- Filter the dataset by
featureType. - Dataset views: overview, search, listing_details, closet_listings, seller_profile, sold_comps, scrape_by_url.
- Each run writes a summary object (counts per feature, paywall status) to the run's OUTPUT.
Row counts to expect
| What you enable | Dataset rows |
|---|---|
| Listing Search, 10 results, enrichment off | 10 × listing_search (detailsFetched: false) |
| Listing Search, 10 results, enrichment on | 10 × listing_search (detailsFetched: true, richer fields on the same row) |
| Listing Details with 5 URLs | 5 × listing_details |
| Closet Listings, max 30 | Up to 30 × closet_listings per seller |
| Sold comps, max 30 per keyword | Up to 30 × sold_comps per keyword |
Sample search row (enriched)
{"featureType": "listing_search","listingId": "5123456","title": "Vintage Carhartt Detroit Jacket Brown Duck Canvas","price": 85,"originalPrice": 120,"discountPercent": 29,"currency": "USD","brand": "Carhartt","size": "L","condition": "Gently Used","marketTier": "basic","likes": 34,"sellerUsername": "vintagevault","detailsFetched": true,"description": "90s Carhartt J97 Detroit jacket…","materialTags": ["cotton duck", "blanket lining"],"styleTags": ["workwear", "vintage"],"imageUrl": "https://…/cover.jpg","imageUrls": ["https://…/1.jpg", "https://…/2.jpg"],"postedAt": "2026-09-20T14:03:00.000Z","timeSinceListed": "6d 2h","url": "https://www.grailed.com/listings/5123456","scrapedAt": "2026-09-26T12:00:00.000Z"}
Webhook integration
Every record is always saved to the dataset. Optionally, each new row is also POSTed in real time to webhookUrl — perfect for instant deal alerts on rare thrift finds or low-priced comps.
JSON format
Full record object, identical to the dataset row. Point it at Discord, Zapier, Make, n8n, or your own pricing bot.
Slack format
A formatted message:
:shirt: *Vintage Carhartt Detroit Jacket Brown Duck Canvas**Type:* listing_search • *Price:* USD 85 • *Brand:* Carhartt • *Size:* L*Condition:* Gently Used • *Likes:* 34 • *Seller:* vintagevault<https://www.grailed.com/listings/5123456|Open on Grailed>
Setup: paste a Slack Incoming Webhook URL (or a Discord webhook using the /slack style URL) into Webhook URL and pick Slack message as the format. Webhook failures never interrupt the run or dataset writes.
MCP / AI Agent usage
Output is structured JSON — ready for Claude Desktop, Cursor, LangChain, LlamaIndex, and custom agents via the Apify MCP server:
- Add the Apify MCP server to Claude Desktop / Cursor.
- Expose this Actor to the MCP server.
- Ask questions in natural language.
User: "What is the average sold price for a 90s Carhartt J97 jacket on Grailed?"→ Agent runs the Actor with enableSoldComps=true, soldKeywords=["carhartt j97"], soldMaxItems=50→ Agent reads the dataset→ Agent answers: "Average sold price is $142 across 50 comps; median $120; sell-through concentrated in sizes L–XL."
Other agent-friendly prompts:
- "Find 10 Patagonia fleece listings under $30 and rank by likes per dollar."
- "Monitor @thriftgod's closet daily and alert me on new Stussy items."
- "Compare sold comps for vintage 501s across the last 50 sales."
API quick start
curl -X POST "https://api.apify.com/v2/acts/YOUR_ACTOR_ID/runs?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"enableListingSearch": true,"searchKeywords": ["carhartt detroit jacket"],"searchMaxResults": 10}'
Dataset items: GET https://api.apify.com/v2/datasets/{datasetId}/items?format=json
Proxy
Residential proxies recommended. The Actor defaults to Apify Residential with a US exit, which you can change in the Proxy settings input (US, CA, GB, DE, AU, …). Match the country to where you want the marketplace to place you.
- Free-tier runs and paid runs use the same proxy configuration.
- Rotating residential sessions are used automatically for reliability at scale.
- Long runs (the Actor supports runs up to ~2h 46m of configured timeout) benefit from leaving the default settings untouched.
Free tier limits
Apify injects plan signals into every run; this Actor uses them to keep the free funnel alive while reserving unlimited exports for paid plans:
| Plan | Behavior |
|---|---|
| Any paid plan (Bronze → Diamond) | Normal run, full output, no caps — logged as Paying user — full output. |
| Free plan | Results capped at 2 items per run (default), with a clear upgrade message. |
| Free plan (block mode) | Owners can set FREE_TIER_MODE=block so the Actor exports 0 items with a friendly message instead. |
Notes:
- The cap is transparent — it is stated here, in the input schema, and in the run logs; it is never presented as an error.
- Runs always exit gracefully; a capped run is a successful run.
- Owner-configurable via Console environment variables:
FREE_TIER_MODE(limitdefault |block) andFREE_TIER_MAX_ITEMS(default2).
FAQ
Do I need code? No — use the Console UI. Developers can use the Apify API, schedules, and webhooks.
Which proxy should I use? Residential, matching your target region. The default (Apify Residential, US) works for most thrift hunting.
How fresh is the data? Records are collected live at run time — schedule runs as often as your plan allows for monitoring and alerts.
How do I avoid rate limiting? Keep per-keyword caps reasonable, let the built-in randomized pacing do its job, and use residential proxies. For very large inventories, split runs by seller or keyword.
What happens when I hit my spending limit? The Actor stops collecting, writes the summary, and exits cleanly — no partial or corrupted exports.
Multiple features in one run?
Yes — every row is tagged with featureType, so one run can search, enrich, pull closets, profiles, and sold comps together.
Large runs? Rows stream continuously and work runs in parallel; memory stays flat even on 10,000+ item runs.
Is the 2-item free cap really all I get? Yes — upgrade to any paid Apify plan to lift it. The cap is enforced transparently and never appears as an error.
LLM / agents? Yes — structured JSON + Apify MCP for agent-driven runs. See the MCP section above.
Contact / custom projects
Need something tailored? I build custom scrapers, data pipelines, and web apps of any kind — marketplaces, lead gen, internal tools, dashboards, and full-stack products.
- Email: dubem115@gmail.com
- GitHub: https://github.com/DrunkCodes
Open to project work, integrations, and ongoing data infrastructure.