Grailed Scraper — Live Resale & Sold Comps Data avatar

Grailed Scraper — Live Resale & Sold Comps Data

Pricing

from $1.00 / 1,000 results

Go to Apify Store
Grailed Scraper — Live Resale & Sold Comps Data

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

Emmanuel

Maintained by Community

Actor 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 DataTypical browser scraper
SpeedFast per-item collectionOften seconds per page
Memory512 MB default, streams row-by-row2–4 GB+
SetupCheckbox UI, prefilled test inputFragile & high-maintenance
CostLow computeHigh
OutputStructured JSON, LLM-readyOften messy HTML
Scale10,000+ item runs without ballooning RAMMemory-heavy buffers
DeliveryDataset + optional real-time webhookExport-only

Feature matrix

FeatureDefaultWhat it does
🔍 Listing SearchONLive keyword search for thrift brands, streetwear, and vintage finds with brand, size, condition, and min/max price filters
✨ Enrich with full listing detailsoffAdds description, fabric/material tags, style tags, full image gallery, and seller shipping discounts to the same search row
📦 Listing DetailsoffFull records for specific listing IDs or Grailed URLs
👚 Closet ListingsoffFull active inventory of any reseller/thrift closet — track competitor stock
👤 Seller ProfileoffReseller stats: love notes, items sold, closet size, verification, bio
🧾 Sold Item Comps / HistoryoffCompleted and sold listings to calculate real market comps, resale margins, and sell-through rates
🔗 Scrape By URLoffPaste 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 501 under $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

FieldDescription
listingId, title, urlIdentity and listing link
price, originalPrice, discountPercent, priceDroppedPricing and markdown signals
currency, shippingCost, freeShippingCost context
brand, designers[], size, condition, colorAttributes
category, subCategory, department, marketTierCatalog placement (grails / hype / sartorial / basic)
likes, views, numberOfOffersDemand signals
sellerUsername, sellerLocation, sellerVerifiedSeller context
imageUrl, imageUrls[]Cover photo and gallery
postedAt, timeSinceListed, isNewlyListedFreshness — critical for deal sniping
position, keywordSearch context
detailsFetchedfalse = 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
descriptionFull listing text
materialTags, materialFabric / material tags
styleTags, hashtags, tagsStyle taxonomy
imageUrls[]Full image gallery
sellerShippingDiscountsSeller 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.

InputTypeDefaultDescription
Listing Search
enableListingSearchbooleantrueLive keyword search
searchKeywordsstring[]carhartt / levis / patagonia samplesSearch terms
searchMaxResultsinteger10Max per keyword (1–200)
searchDepartmentenumanymenswear, womenswear
searchDesignerstring—Brand filter (e.g. Carhartt, Levi's, Patagonia, The North Face, Stussy)
searchSizestring—e.g. M, L, XL, 32, 34
searchConditionenumanynew_with_tags, new_without_tags, gently_used, well_worn
searchMinPrice / searchMaxPriceinteger—USD price bounds — set a max for deal hunting
searchStrataenumanygrails, hype, sartorial, basic
searchSortenumrelevancerelevance, newest, price-low, price-high, heat
searchSoldOnlybooleanfalseSearch completed/sold items instead of live inventory
searchFetchFullDetailsbooleanfalseEnrich each search row in place (same row, detailsFetched: true)
Listing Details
enableListingDetailsbooleanfalseFull product rows
listingUrlsstring[]—Listing URLs or bare numeric IDs
Sellers
enableClosetListingsbooleanfalseCloset inventory
enableSellerProfilebooleanfalseProfile + love notes
enableSoldCompsbooleanfalseSold comps by seller and/or keyword
sellerUsernamesstring[]—Without @
sellerMaxListingsinteger30Cap per closet (1–500)
soldMaxItemsinteger30Cap sold items per seller/keyword (1–200)
soldKeywordsstring[]—Direct sold-market comp searches (e.g. carhartt j97, stussy 8 ball)
URL
enableScrapeByUrlbooleanfalseAny Grailed URL
scrapeUrlsstring[]—Listing, search, seller, category, or brand URLs
scrapeMaxPagesinteger3Depth for list-style URLs (1–20)
Options & delivery
includeRawbooleanfalseExtended structured block per row (larger output)
webhookUrlstring—Optional real-time POST per row
webhookFormatenumjsonjson (full record) or slack
proxyConfigurationobjectResidential USRecommended — see Proxy

Practical thrift search examples

GoalKeywords + filters
Vintage denim flipsvintage 90s levis 501, levis 517 made in usa + searchMaxPrice: 60
Workwear goldminescarhartt detroit jacket, carhartt double knee + condition: gently_used
Gorpcore sourcingpatagonia fleece, arc'teryx gamma + searchSort: price-low
Streetwear stealsstussy 8 ball, supreme box logo + searchMaxPrice: 120
Sold comps before you buySold comps with soldKeywords: ["carhartt j97"]
Y2K restock alertsvintage 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 enableDataset rows
Listing Search, 10 results, enrichment off10 × listing_search (detailsFetched: false)
Listing Search, 10 results, enrichment on10 × listing_search (detailsFetched: true, richer fields on the same row)
Listing Details with 5 URLs5 × listing_details
Closet Listings, max 30Up to 30 × closet_listings per seller
Sold comps, max 30 per keywordUp 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:

  1. Add the Apify MCP server to Claude Desktop / Cursor.
  2. Expose this Actor to the MCP server.
  3. 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:

PlanBehavior
Any paid plan (Bronze → Diamond)Normal run, full output, no caps — logged as Paying user — full output.
Free planResults 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 (limit default | block) and FREE_TIER_MAX_ITEMS (default 2).

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.

Open to project work, integrations, and ongoing data infrastructure.