The RealReal Scraper - Luxury Prices, Brands & Listings avatar

The RealReal Scraper - Luxury Prices, Brands & Listings

Pricing

from $1.50 / 1,000 item results

Go to Apify Store
The RealReal Scraper - Luxury Prices, Brands & Listings

The RealReal Scraper - Luxury Prices, Brands & Listings

Scrape luxury consignment listings from therealreal.com. Browse by designer, category or keyword and get designer, item class, condition grade, retail price versus current list price, measurements, materials and authentication notes. Built for price positioning per brand per category.

Pricing

from $1.50 / 1,000 item results

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

0

Bookmarked

4

Total users

3

Monthly active users

3 days ago

Last modified

Categories

Share

The RealReal Scraper: Consigned Luxury Items, Prices and Condition Grades

The RealReal Scraper turns The RealReal's live consignment catalogue into clean tabular data. Every row is one physical, one-of-a-kind item: the designer, the item class, the marketplace's own condition grade, what the piece originally retailed for and what it is consigned for today, with both discount percentages already computed. Browse by category or by designer, or paste category, designer or item links directly, then export to JSON, CSV or Excel, or read the dataset through the API.

Why This Scraper?

  • Two real browse axes. Category paths and designer names are both applied by the marketplace's own server, so a per-designer pull returns that brand's current catalogue with no further filtering needed. There is no keyword box and no sort option is offered, because both are accepted by this site and then silently ignored on the pages this Actor reads, so this Actor skips a pasted keyword link with an explanation instead of quietly answering it with the wrong data.
  • A price-positioning table, with no extra charge. Every row carries retailPrice, listPrice, originalPrice, discountPct and vsRetailPct, so a pull for one designer in one category is ready for a spreadsheet without any joining.
  • Built for a consignment marketplace, not a retail catalogue. Each row is a single physical item, not a restocked SKU. Sold items are returned by default because a sold item's final price is a real comparable, and the condition grade is returned exactly as the marketplace assigns it, with the inspector's own free-text note kept in a separate field.
  • Cheap by default. Designer, condition grade, all three prices, colour, primary material and the image gallery all come from the result pages at no extra cost. Reading each item's own page for measurements, full copy, materials and the authentication note is optional and billed only for items that actually get it.
  • Incremental mode for recurring monitoring. Schedule the same search and get back only new and updated items by default (NEW, UPDATED with the changed fields named, UNCHANGED suppressed); turn on Emit expired items too, once a run scans the whole scope end to end, to also get EXPIRED items (which on a consignment marketplace usually means sold) and, on a later run, REAPPEARED ones.
  • Resume for one interrupted run. Paste a run or dataset id and the walk skips everything that run already collected, without re-paying for it, and still advances past a page made entirely of already-known items instead of mistaking that for the site repeating itself.
  • A run that could read nothing fails instead of returning empty. If this run returned no items and at least one page was refused, it stops with an error instead of quietly reporting an empty catalogue, so "nothing matched" is never confused with "the connection could not read here"; a run that read at least something still succeeds even if part of it was refused.

Use Cases

  • Brand and merchandising teams: track how a designer's pieces are pricing on the resale market, category by category, against what they retailed for.
  • Resellers and consignors: benchmark current listing prices for a brand or item class before pricing their own inventory.
  • Appraisers and insurers: pull comparable list and sold prices for a specific designer, item class or condition grade.
  • Market researchers: schedule the same search with incremental mode on to build a time series of markdowns and sell-through.

Data You Get

Sample shape: values are entirely invented placeholders for illustration, not a real listing.

FieldExample
itemId"00000000"
sku"SAM000000"
name"Sample Leather Tote"
url"https://www.therealreal.com/products/women/handbags/totes/sample-item-000000"
designer"Example Maison"
designerId"0"
itemClass["Women", "Handbags", "Totes"]
category"Totes"
condition"Very Good"
conditionNote"Light scuffing at the base corners, noted by our inspection team."
color"Brown"
primaryMaterial"Leather"
retailPrice3800.0
listPrice990.0
originalPrice1600.0
discountPct38.1
vsRetailPct73.9
isOnSaletrue
availability"AVAILABLE"
isSoldfalse
images["https://product-images.therealreal.com/SAM000000_1_enlarged.jpg"]
detailFetchedtrue

Every row also carries variantId, gender, artist (for art and collectibles), currency, attributes (the marketplace's own attribute list), quantity, obsessionCount, isEditorsPick, badge, imageCount, sourceUrl and scrapedAt. Turning on Read each item's page adds measurements, materials, description and authenticationNote, plus sustainability (carbon and water figures); returnPolicy and disclaimers are also part of every row's shape but currently come back null regardless of this toggle, since the item page carries them in a different shape than this actor reads. Turning on Incremental changes for scheduled runs adds changeType, changedFields, firstSeenAt and lastSeenAt to every row.

How to Use

  1. Pick a mode: search to browse by category or designer, or url to scrape pasted The RealReal links.
  2. In search mode, fill in Category paths and/or Designers (optionally narrowed with Category for the designers above), plus any of the filters below. In url mode, paste category, designer or item links.
  3. Turn on Read each item's page only when you need measurements, the full item copy or the authentication note; leave it off for the cheap mode, which still returns designer, condition, both prices and both discount percentages.
  4. Set Max items to control run size and cost, then click Start.

Pull one designer's handbags for price positioning:

{
"mode": "search",
"designers": ["Chanel"],
"designerCategory": "women/handbags",
"maxItems": 200
}

Browse a category with condition and price filters:

{
"mode": "search",
"categories": ["women/handbags"],
"condition": "Excellent",
"minPrice": 500,
"maxPrice": 2000,
"maxItems": 100
}

Paste links directly, with full item detail:

{
"mode": "url",
"urls": [
"https://www.therealreal.com/shop/women/handbags",
"https://www.therealreal.com/designers/chanel/women/handbags"
],
"fetchDetails": true
}

Recurring monitoring of one designer's category (narrowed to stay under the 2000-item depth limit):

{
"mode": "search",
"designers": ["Hermes"],
"designerCategory": "women/handbags",
"incrementalMode": true,
"emitExpired": true,
"maxItems": 0
}

Run it from your code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/therealreal-scraper").call(
run_input={"mode": "search", "designers": ["Chanel"], "maxItems": 50})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["designer"], item["name"], item["listPrice"], item["vsRetailPct"])

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/therealreal-scraper').call({
mode: 'search', designers: ['Chanel'], maxItems: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.

Why there is no keyword box

This marketplace does not apply a keyword to the pages this Actor reads: a keyword is accepted and then ignored, and the page comes back with the entire catalogue, about 3 million items, whose results have nothing to do with what was asked for. This Actor skips a pasted keyword link with an explanation rather than answering it with the wrong data. Browse by category or designer instead, and narrow with the filters above.

The marketplace's own depth limit

This site serves at most 2000 items per search, however many actually match, and the run's log says so when a search hits that limit. To collect more than 2000 items on one topic, split the search: browse one designer at a time, narrow to a single category, or walk the catalogue in price bands with Minimum list price and Maximum list price. Each of those is a separate search with its own 2000-item window.

Resume and recurring updates

  • Resume (resumeFromRunId) continues one interrupted run: paste its run or dataset id and the walk skips everything already collected there. It still advances correctly past a page made entirely of already-known items, rather than mistaking a page of only-old items for the site repeating itself.
  • Incremental mode (incrementalMode) is for running the same search again and again, for example daily. Every item is classified NEW, UPDATED (with changedFields), UNCHANGED (suppressed and not billed unless Emit unchanged items is on), or EXPIRED (only returned with Emit expired items on). EXPIRED is only ever produced after a run whose scan of the tracked search was complete: not capped by Max items, not resumed, not stopped at the marketplace's 2000-item depth limit. REAPPEARED can only ever follow an item that a previous run already tombstoned as EXPIRED that way; it never fires on a run's first sight of an item. With incremental mode off, output is exactly as it always was.

Send results into your apps (MCP connectors)

Optionally pipe results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape; the Apify dataset is never changed.

What gets written to the connector: a condensed, human-readable summary of each item, not the full record. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.

  1. Authorize a connector once under Apify, Settings, API & Integrations (Notion, Linear, Airtable, or Apify).
  2. Select it in Pipe results into your apps. If the picker is empty, no connector has been authorized yet.
  3. For Notion, also set Notion parent page to the page under which item pages should be created.

The connection is mediated by Apify's own MCP proxy, so this Actor never sees your third-party credentials. Leave the field empty to skip.

Input Parameters

ParameterTypeDefaultDescription
modestringsearchsearch to browse by category or designer, or url to scrape pasted links.
categoriesarray(none; prefill ["women/handbags"])Category paths, search mode only, for example women/handbags or men/shoes.
designersarray(none)Designer names, search mode only, for example Chanel or Bottega Veneta.
designerCategorystring(none)Optional, narrows every designer above to one category path.
urlsarray(none; prefill sample links)The RealReal links, url mode only: item, category or designer links.
designerstring(none)Optional filter: keep only this designer's items.
conditionstring"" (Any)Optional filter: keep only one condition grade.
colorstring(none)Optional filter: keep only items in this colour.
minPriceinteger(none)Optional. Keep only items whose current list price is at or above this amount, in USD.
maxPriceinteger(none)Optional. Keep only items whose current list price is at or below this amount, in USD.
availableOnlybooleanfalseKeep only items that can be bought right now; off by default, so sold items are included.
onSaleOnlybooleanfalseKeep only items whose list price is below their earlier consignment price.
vintageOnlybooleanfalseKeep only items the marketplace flags as vintage.
editorsPickOnlybooleanfalseKeep only items the marketplace's own editors have highlighted.
withTagsOnlybooleanfalseKeep only items still carrying their original retail tags.
fetchDetailsbooleanfalseRead each item's own page for measurements, full copy, materials and the authentication note. Billed per item that actually gets it; off by default.
maxItemsinteger20Stop after this many items across the whole run. 0 = unlimited.
maxPagesinteger0Stop after this many result pages per search. 0 = unlimited (bounded instead by Max items, the marketplace's own depth limit, or a natural end of results).
resumeFromRunIdstring(none)Continue one interrupted run: paste its run or dataset id.
incrementalModebooleanfalseTurn on for recurring monitoring of the same search.
stateKeystring(none)Name or share an incremental-mode monitoring campaign.
emitUnchangedbooleanfalseAlso return, and bill, items unchanged since the last run (incremental mode only).
emitExpiredbooleanfalseAlso return, and bill, items no longer listed since the last run (incremental mode only).
proxyobject{"useApifyProxy": true}Connection settings. The run escalates to a more expensive connection automatically, once, whenever the marketplace refuses pages on the default connection (in practice mostly item pages), and stays on it for the rest of that run.
mcpConnectorsarray(none)Optional: send a summary of each item to apps authorized under Integrations.
notionParentPageUrlstring(none)Notion connector only: page under which item pages are created.
maxNotifyListingsinteger50Cap on items written to each connector per run. Does not affect the dataset.

Output Example

Sample shape: values are placeholders, not a real listing.

{
"itemId": "00000000",
"sku": "SAM000000",
"variantId": null,
"name": "Sample Leather Tote",
"url": "https://www.therealreal.com/products/women/handbags/totes/sample-item-000000",
"designer": "Example Maison",
"designerId": "0",
"itemClass": ["Women", "Handbags", "Totes"],
"category": "Totes",
"condition": "Very Good",
"conditionNote": "Light scuffing at the base corners, noted by our inspection team.",
"color": "Brown",
"gender": "Women",
"primaryMaterial": "Leather",
"attributes": { "Color": ["Brown"], "Primary Material": ["Leather"], "Gender": ["Women"], "Condition": ["Light scuffing at the base corners, noted by our inspection team."] },
"retailPrice": 3800.0,
"listPrice": 990.0,
"originalPrice": 1600.0,
"currency": "USD",
"discountPct": 38.1,
"vsRetailPct": 73.9,
"isOnSale": true,
"availability": "AVAILABLE",
"isSold": false,
"quantity": "1",
"obsessionCount": 3,
"isEditorsPick": false,
"badge": null,
"images": ["https://product-images.therealreal.com/SAM000000_1_enlarged.jpg"],
"imageCount": 1,
"sourceUrl": "https://www.therealreal.com/shop/women/handbags",
"detailFetched": true,
"measurements": { "Height": "10\"", "Width": "14\"", "Handle Drop": "9\"" },
"materials": ["Sample Leather Tote", "Brown Leather", "Silver-Tone Hardware", "Double Top Handles", "Magnetic Closure"],
"description": "Sample Leather Tote. Brown Leather. Silver-Tone Hardware. Double Top Handles. Magnetic Closure.",
"authenticationNote": "Authenticated by our in-house specialists prior to listing.",
"sustainability": { "kilogramsOfCarbon": "2.4", "litersOfWater": "410.0" },
"returnPolicy": "Final Sale",
"disclaimers": ["Vintage items are sold as-is and may show signs of age consistent with the condition grade."],
"scrapedAt": "2026-09-11T00:00:00Z"
}

Plan Requirement

The default connection setting works for every catalogue, category and designer page out of the box. This marketplace's individual item pages sometimes need a more expensive connection; the run switches to it automatically, once, whenever the marketplace refuses pages on the default connection (in practice mostly item pages, which the detail toggle and pasted item links both read), and stays on it for the rest of that run, billed on your own Apify plan. Picking a connection group yourself adds cost without adding results, so leave the group list empty unless you have a specific reason to set one.

FAQ

How much does it cost?

Three charge events. Actor start is charged when the run starts, scaled by the run's memory. Item result is charged once per item returned in the dataset, and is the main cost. Item page detail is charged once per item that both reached the dataset and had its own page actually read: an item whose page could not be read is still returned with its result-page fields and is NOT charged this event, and an item suppressed as unchanged by incremental mode is never charged any event. This surcharge only applies when Read each item's page is switched on (it is off by default), with one exception: a pasted item link always reads the item's own page, because there is no result card behind it to fall back to, so whenever it reaches the dataset it is billed this event whatever the toggle says. The Pricing tab shows current rates; use Max items to cap any run's cost.

This Actor collects only publicly available consignment listing data. You are responsible for how you use it: follow The RealReal's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Prices, condition grades and item details are generally facts, but item photography may be subject to third-party rights.

Can I get only new, changed or sold items on a schedule?

Yes. Schedule the Actor from the Schedules tab and turn on Incremental changes for scheduled runs. Each run then returns only new and updated items by default, and unchanged items are not returned or billed unless you ask for them; turn on Emit expired items too, once a run scans the whole scope end to end, to also get expired items and, on a later run, reappeared ones.

Why did my run fail instead of returning an empty dataset?

If this run returned no items and at least one page was refused, it stops with an error so "nothing matched" is never confused with "the connection could not read here". Run it again in a few minutes, or check the Connection section. If some pages could not be read but items were still returned, the run still succeeds with a note on the run explaining the shortfall.

Why did my search stop at 2000 items even though the site reports far more matches?

This marketplace clamps every single search at 2000 items, however many it reports matching. Split a large category into one designer at a time, a single category, or price bands, and run each as its own search.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push item summaries into Notion, Linear or Airtable.

๐Ÿ”— Want more e-commerce data?

Pair this actor with these related scrapers from the same team:

๐Ÿ‘— SSENSE Scraper
Scrape SSENSE by keyword, category, designer or URL. Every row carries the selling price...
๐Ÿงฉ Grailed Scraper
Scrape Grailed by keyword, category, designer, condition, size or URL. Extract prices and...
๐Ÿท๏ธ ThredUp Scraper
Scrape ThredUp resale listings by keyword, department, brand, size, condition, price or...
๐Ÿ‘— StockX Scraper
Scrape StockX market data by keyword, category or URL. Every row carries lowest ask...
๐Ÿ‘— GOAT Scraper
Scrape GOAT (goat.com), the sneaker and streetwear resale marketplace. Search or paste...
๐Ÿท๏ธ Chrono24 Scraper
Scrape Chrono24 luxury watch listings by keyword, filters or URL. Extract 50+ fields...

๐Ÿ‘‰ Browse all abotapi scrapers

๐Ÿ’ฌ Support & custom scrapers

  • ๐Ÿž Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
  • ๐Ÿ› ๏ธ Need another site, extra fields or a private build? Email abotapi@proton.me or message Telegram @abotapi.
  • โญ Enjoying it? A quick review on the actor page helps other users find it.