TheRealReal Data | Luxury Resale & Thrift Comps
Pricing
from $1.50 / 1,000 results
TheRealReal Data | Luxury Resale & Thrift Comps
Find underpriced luxury fast. TheRealReal Real-Time Data gives you designer listing search, price and markdown history, condition grades, full product details, designer inventory and real sold comps — streamed live to your dataset with Slack webhooks. Free trial: 2 results.
Pricing
from $1.50 / 1,000 results
Rating
0.0
(0)
Developer
Emmanuel
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
TheRealReal Real-Time Data
Live luxury resale market intelligence, authenticated designer comps, and vintage deal finder. Every row is one item on TheRealReal — what it is listed at today, what it retailed for, its condition grade, its cost in a markdown, and the full image gallery — streamed to your dataset as it is collected.
Free trial: runs on a free Apify plan export the first 2 records. Upgrade to a paid Apify plan for unlimited exports. Details in Pricing, free tier & limits.
Who it is for
- Resale & consignment sellers sourcing designer inventory and setting prices against real marketplace data.
- Vintage and thrift flippers cross-listing to Poshmark, eBay, Depop, Mercari, Grailed and Vinted who need trustworthy luxury comps.
- Consignment owners and buying teams sizing how much of a designer is on the market and at what price.
- Fashion researchers, brand pricing teams and appraisers building sell-through and condition-mix tables.
- AI agents and pricing bots that need a clean, machine-readable feed of authenticated luxury listings.
What you can collect
| Checkbox | What it returns | featureType |
|---|---|---|
| Listing Search (on by default) | Live keyword search across authenticated designer inventory, with prices, markdowns, estimated retail, condition grade, size, category and gallery. | listing_search |
| Listing Details | The complete record for specific listings you name (URL, product id or SKU), including the description, condition report and measurements. | listing_details |
| Designer Inventory | A designer's full live inventory, so you can track stock depth and price positioning brand by brand. | closet_listings |
| Designer Profile | Designer-level supply table: how many items are live today, and how many have sold in the archive. | seller_profile |
| Sold Comps | Completed sales for comps, margins and sell-through — scoped by keyword, by designer, or both. | sold_history |
| Scrape By URL | Any TheRealReal URL — search results, a category or shop page, a designer page, or one listing. The page type is detected for you. | scrape_by_url |
Every row also carries scrapedAt, a stable item_id, the sku, and the item URL, so nothing is ambiguous later.
Why it is fast and stays cheap
- Streaming output. Each record is written the moment it is collected, so a 10-record demo run feels instant and a 10,000-record run stays light on memory (512 MB default).
- Fast search cards first. Search results land with the fields you actually filter on — price, markdown, estimated retail, condition, designer, size, category, gallery. Enrichment is opt-in and never delays the card.
- Enrichment never duplicates. Turn on Enrich with full listing details and the same
listing_searchrow gains description, condition report, measurements and the complete gallery withdetailsFetched: true. One discovered listing is always exactly one row.
Quick start
- Click Start — Listing Search is enabled and prefilled with high-intent luxury demo queries (
gucci marmont,chanel flap bag,hermes scarf), 10 records each. - Get results in seconds, streamed straight into your dataset.
- Add keywords, a designer filter or a category filter, raise Records per keyword, and enable the other features you need.
Recommended for real work: keep Residential proxy on (default) and the proxy country on United States — TheRealReal is a US storefront.
Use cases that pay for themselves
- Find undervalued inventory — pull new arrivals per designer, filter on condition and markdown, and compare listed price against estimated retail.
- Price a piece before you buy or consign — sold comps per designer or per keyword give you a real sale price, not a guess.
- Build sell-through and demand tables — Designer Profile stacks live inventory against sold-archive depth, per designer.
- Watch a designer's price moves — rerun Designer Inventory or Listing Search on a schedule and diff
current_priceperitem_id. - Feed deal alerts — send every row to Slack, Discord or your own pricing bot the second it is collected.
- Keep multi-platform pricing in sync — the output field names match the rest of the thrift/resale actor family, so TheRealReal rows union cleanly with Poshmark, Depop, Grailed, Mercari and ShopGoodwill datasets.
Input reference
| Field | Type | Default | Notes |
|---|---|---|---|
| Listing Search | |||
enableListingSearch | boolean | true | Live keyword search. |
searchKeywords | string[] | ["gucci marmont", "chanel flap bag", "hermes scarf"] | Each keyword contributes its own rows. |
searchMaxResults | number | 10 | Records per keyword (1–200). Multiplied by keyword count, bounded by the run limit. |
searchFetchFullDetails | boolean | false | Merges full product details into the same search row (detailsFetched: true). |
searchSort | select | relevance | relevance, newest, price_low_to_high, price_high_to_low. |
searchBrand | string | – | Designer filter by name or slug (Gucci, gucci, louis-vuitton). Optional; narrows the pool. |
searchCategory | string | – | Category filter as the marketplace names it (women/handbags, men/shoes, jewelry/rings, watches/bracelet). Optional; narrows the pool. |
| Listing Details | |||
enableListingDetails | boolean | false | Full records for specific listings. |
listingIds | string[] | [] | Product ids (54592052) or SKUs (GUC2147434). |
listingUrls | string[] | [] | Full product URLs. |
| Designer Inventory | |||
enableClosetListings | boolean | false | Live inventory per designer. |
sellerUsernames | string[] | [] | Designer names or slugs (gucci, chanel, hermes). Shared with Designer Profile and Sold Comps. |
sellerMaxListings | number | 30 | Live listings per designer (1–200). |
| Designer Profile | |||
enableSellerProfile | boolean | false | Live inventory depth + sold-archive depth per designer. Uses sellerUsernames. |
| Sold Comps | |||
enableSoldHistory | boolean | false | Completed sales for comps. Scope with searchKeywords, sellerUsernames, or both. |
soldMaxItems | number | 30 | Sold items per scope (1–500). |
| Scrape By URL | |||
enableScrapeByUrl | boolean | false | Direct URL processing with page-type detection. |
scrapeUrls | string[] | [] | Any TheRealReal URL. Other sites are rejected. Uses Records per keyword as the per-URL cap. |
| Run limits & delivery | |||
maxItems | number | 0 | Total rows for the whole run. 0 = no run limit. |
webhookUrl | string | – | Optional extra real-time push of every record. |
webhookFormat | select | json | json or slack. |
| Connection | |||
proxyConfiguration | object | Residential, US | Residential proxy delivers the most reliable results at scale. |
Practical search examples
| Goal | Input |
|---|---|
| Price a designer's handbags by keyword | searchKeywords: ["chanel classic flap"], searchCategory: "women/handbags" |
| Only one designer's inventory, cheapest first | searchBrand: "hermes", searchSort: "price_low_to_high" |
| Fresh arrivals to hunt underpriced pieces | searchSort: "newest", searchMaxResults: 50 |
| One specific listing, fully detailed | enableListingDetails, listingIds: ["GUC2147434"] |
| Comps for a model, not a seller | enableSoldHistory, searchKeywords: ["gucci marmont"] |
Output reference
One row per item (or per designer for seller_profile). Full datasets are also available as pre-built views in the run's Output tab: Overview, Listing Search results, Listing Details, Designer Inventory, Designer Profiles, Sold Comps, Scrape By URL.
Core fields on listing-like rows
| Field | Meaning |
|---|---|
featureType | Which feature produced the row. |
scrapedAt / scraped_at | ISO-8601 timestamp. |
url / item_url | Source page and direct item page. |
item_id | Stable product id — use it to diff prices between runs. |
sku | Consignor item number, unique per physical item. |
title, description | Name and (on details/enriched rows) the full condition-and-features description. |
main_image_url, additional_image_urls | Full gallery, enlarged variants. |
status, is_sold | available, sold, reserved, not_for_sale. |
current_price | Listed today, after any markdown. |
original_price | Price before the current markdown (null when not discounted). |
msrp_price | The marketplace's estimated original retail price. |
currency | e.g. USD. |
discount_percentage, price_drop_amount | Markdown size, as % and as an amount. |
brand, brand_id | Designer name and id. |
size | Displayed size(s), e.g. 9.5 / IT 39.5. |
condition | The marketplace's own condition grade, e.g. Excellent. |
category, department, subcategory | Category path, e.g. handbags / women / clutches. |
color, colors, style_tags | Color and secondary style/pattern descriptors. |
item_specifics | Label → detail pairs, including the condition report. |
seller_username | Designer slug on designer-scoped rows (closet_listings, sold_history), otherwise null. |
detailsFetched | true when full product details were merged into this search row. |
Per-feature notes
listing_search— the fast card plus, when enrichment is on, the full detail set on the same row.listing_details— includesbrand_id,colors,item_specifics,quantity_available.closet_listings—seller_usernamecarries the designer slug;positionis the rank within that designer's inventory.seller_profile—total_listingsis live inventory depth,total_salesis sold-archive depth.sold_history—current_priceis the price the item sold at;seller_usernameis set only for designer-scoped comps.scrape_by_url—pageTypeislisting,search,designerorcategory.
Fields the marketplace does not publish — engagement counts, listing and sale timestamps, shipping quotes, seller bios — are returned as null rather than guessed.
| A whole category, no keyword | enableScrapeByUrl, scrapeUrls: ["https://www.therealreal.com/shop/women/handbags"] |
Webhook alerts
Every record is always saved to the dataset. A webhook is an additional push, fired per record as it is collected, and it never blocks collection: a failing webhook cannot stop or slow a run.
Slack (webhookFormat: "slack") — post to an incoming webhook URL and every new row renders as a ready-to-read message:
:shopping_bags: *GG Marmont Small**Type:* listing_search • *Price:* USD 1395 • *Brand:* Gucci • *Condition:* Excellent • *Seller:* n/a<https://www.therealreal.com/products/women/handbags/…|Open on TheRealReal>
JSON (webhookFormat: "json") — the complete row is posted as-is, so Zapier, Make, n8n, Airtable or your own pricing service can act on it directly.
Use it from AI agents (MCP)
Connect the Apify MCP server and ask in plain language:
- "What is the average sold price for a Gucci Marmont bag on TheRealReal?"
- "List Chanel handbags in Excellent condition and rank them by discount."
- "How many Gucci items are live today versus sold in the archive?"
- "Watch the Hermès scarf market and alert me on Slack when a new listing appears under $400."
The agent calls this Actor, reads the dataset, and answers from real listing rows — then keeps the same shape for Poshmark, Depop, Grailed or eBay when you add them.
Pricing, free tier & limits
- Free Apify plan: the first 2 records are exported, then the run stops cleanly with a note in the log. No errors, no partial rows.
- Paid plans: full output, bounded only by your inputs and by any spending limit you set on the Actor.
- Pay-per-event: each exported record is charged as one
resultevent. The run stops gracefully when your spending limit is reached, and the run summary is still written. - Run limit (
maxItems): cap total rows for the whole run — handy for a bounded price sweep. - Cost control: records per keyword × keywords is the row count. Search-only runs are the cheapest; enrichment adds a little time per listing.
FAQ
Do I need a residential proxy? Yes — keep the default Residential proxy on, country United States. Datacenter routing is more likely to be turned away, which shows up as missing rows rather than wrong data.
Why did I get fewer rows than I asked for? Usually because a designer or category filter narrowed the pool, or the designer genuinely has fewer items than your cap. The log reports the real available count per keyword before collecting, and the run summary shows what was saved.
Are prices and availability current? Every row is collected during the run. Availability reflects the moment of collection, so a piece can sell between your run and your purchase — rerun before you commit.
How fresh is the data if I schedule it? As fresh as your schedule: a run every 15 minutes is a live deal feed; a daily run is a price-tracking table.
Are timestamps available? The marketplace does not publish listing or sale timestamps, so those fields are null. Use scrapedAt for your own change tracking — diff item_id + current_price between runs to build price history.
Can I get sold prices for a specific model? Yes — Sold Comps accepts keywords, so "gucci marmont" returns completed sales for that model, not just that seller.
Will it be rate limited? Collection is deliberately paced, with retries that start a fresh connection when the marketplace pushes back, so long runs complete without you tuning anything. If you see gaps, raise the run limit and rerun — nothing collected is lost.
Does it work without keywords? Yes: use Scrape By URL with a category, shop or designer URL, or enable Designer Inventory with a designer list.
Where do I report a problem? Open an issue on the Actor's Issues tab with the run id and the input you used — never paste proxy credentials.