Research luxury-fashion and watch resale listings, sold evidence, condition, and seller signals across specialist marketplaces. Use for sourcing or evidence comparison, not buying or appraisal.
Installs into .claude/skills of the current project.
Are you the author of luxury-resale-research?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/crawlora-org-luxury-resale-research)
---
name: luxury-resale-research
description: Research luxury-fashion and watch resale listings, sold evidence, condition, and seller signals across specialist marketplaces. Use for sourcing or evidence comparison, not buying or appraisal.
allowed-tools: Bash(scripts/crawlora.sh:*)
---
# Luxury resale research
Research public, read-only marketplace data for luxury fashion, handbags,
watches, sneakers, and streetwear. Use this skill when the user needs current
asks, sold comparables where the source exposes them, listing-level condition,
or seller/dealer context across luxury resale sources. It complements the broad
`resale-secondhand-research` skill; use this one when specialist luxury sources
or a disciplined evidence comparison matters.
## Tool scope and data flow
The optional shell helper is the only command this skill asks to run. It makes
GET requests only to the documented, allowlisted Crawlora routes. When invoked,
it reads `CRAWLORA_API_KEY` and sends it as an `x-api-key` header over HTTPS to
`api.crawlora.net`; it does not send the key to marketplace sites. It briefly
writes a mode-600 curl config under `TMPDIR` and removes it when the command
exits. It does not inspect other environment variables, enumerate files, install
software, or run with elevated privileges. Run it only when you want to make a
Crawlora API request; successful requests can consume credits.
Do not place orders, make offers, authenticate an item, estimate an appraisal,
claim a purchase total, or imply that a platform's condition label proves
authenticity. Do not infer fees, duties, shipping, or currency conversion when
the selected public response does not state them.
## Evidence workflow
1. Define the comparability key first: brand, model/reference or style ID,
material/color, size, condition, and region/currency where present. Search
active and sold datasets separately; an asking price is not sale evidence.
2. Discover opaque filters before searching. Use each platform's directory,
categories, conditions, brands, models, or facets endpoint rather than
guessing ids, slugs, or values.
3. Pull a compact active set, then fetch detail only for credible matches.
Keep source URL/path and the retrieval time for every record. Follow only
the source's cursor/page limit; narrow the query instead of deep paging.
4. Report separate fields for: **active asks**; **sold evidence** (sale price
and sale date only where the endpoint supplies both); **condition and
authentication signals** (source-stated, never independently verified);
**fees/shipping/duties** (stated amount or `not provided`); **currency**;
and **source timestamp** (listing/sale date if supplied, plus retrieval
time). Do not pool currencies or condition grades without labeling the
normalization assumption.
5. State evidence gaps plainly. Current inventory, recommendation rails,
seller reputation, and marketplace-wide counts are useful context, not a
transaction record or authenticity determination.
## Source map
Use the exact routes and parameter names below. All are `GET` public-data
reads. Braces identify a path parameter; all others are query parameters.
### Core luxury sources
- **The RealReal:** discovery: `therealreal_autocomplete` (`/therealreal/autocomplete`,
`term`), `therealreal_categories`, `therealreal_conditions`,
`therealreal_collections`, and `therealreal_designers` (`category`). Search:
`therealreal_search` (`/therealreal/search`, required `query`; optional
`category_id`, `designer_id`, `condition_id`, `price_from`, `price_to`,
`on_sale`, `available`, `after`). Browse: `therealreal_category` (`path`,
`on_sale`, `available`, `after`), `therealreal_designer` (`slug`, `on_sale`,
`available`, `after`), and `therealreal_collection` (`slug`, `after`). Detail:
`therealreal_listing` (`url`) and `therealreal_similar` (`product_id`).
Reuse `next_after` exactly as returned.
- **Fashionphile:** discovery/catalog: `fashionphile_collections` and
`fashionphile_products` (`page`, `limit`; default 50, maximum 250), plus
`fashionphile_sitemaps` and `fashionphile_sitemap_urls` (`type`, `limit`).
Search: `fashionphile_search` (`/fashionphile/search`; `q`, `condition`,
`availability`, `vendor`, `sort`, `page`, `limit`; default 20, maximum 50).
Use `availability=sold` specifically for its sold archive; `available` is
the default and `all` is also accepted. Details: `fashionphile_product`
(`handle`) and `fashionphile_product_recommendations` (`handle`, `intent`,
`limit`; default 10, maximum 20; `intent` is `related` or `complementary`).
Collection and static-page reads use `fashionphile_collection_products`
(`handle`, `page`, `limit`), `fashionphile_pages` (`page`, `limit`), and
`fashionphile_page` (`handle`); suggestions use
`fashionphile_search_suggest` (`q`, `types`, `limit`; maximum 20).
- **Rebag:** use the same public storefront pattern with only Rebag routes:
`rebag_search` (`/rebag/search`; `q`, `sort`, `page`, `limit`),
`rebag_product` (`handle`), `rebag_product_recommendations` (`handle`,
`intent`, `limit`), `rebag_products` and `rebag_collections` (`page`,
`limit`; default 50, maximum 250), `rebag_collection_products` (`handle`,
`page`, `limit`), `rebag_search_suggest` (`q`, `types`, `limit`; maximum
20), `rebag_sitemaps`, `rebag_sitemap_urls` (`type`, `limit`), `rebag_pages`
(`page`, `limit`), `rebag_page` (`handle`), and `rebag_store`.
- **Vestiaire Collective:** discovery: `vestiaire_brands`,
`vestiaire_categories`, and `vestiaire_conditions`. Search:
`vestiaire_search` (`/vestiaire/search`; `q`, `brand_id`, `category_id`,
`condition_id`, `sort`, `page`, `per_page`). `per_page` is at most 60 and
`page * per_page` must not exceed 1000; use the returned directory IDs.
Detail/context: `vestiaire_product` (`path`), `vestiaire_search_sellers`
(`q`), `vestiaire_seller` (`id`), and `vestiaire_suggest` (`q`).
- **Grailed:** discover filters with `grailed_categories` and designers with
`grailed_designers` (`q`, `page`, `limit`); curated browse is
`grailed_collections` then `grailed_collection` (`id`). Use
`grailed_search` for active asks and `grailed_sold_listings` for sold
evidence. Both accept `q`, `designer`, `department`, `category`, `size`,
`color`, `condition`, `min_price`, `max_price`, `sort`, `page`, and `limit`;
price filters mean final sold price on the sold route. Detail/context:
`grailed_listing` (`id`), `grailed_similar_listings` (`id`, `limit`),
`grailed_seller` (`username`, `page`, `limit`), `grailed_seller_reviews`
(`username`, `page`), and `grailed_suggest` (`q`).
- **Chrono24:** discover `chrono24_brands`, then `chrono24_models` (`brand`),
and `chrono24_facets` (`group`) before advanced filters. Search with
`chrono24_search` (`/chrono24/search`; at least `query` or `brand`; optional
`model`, `sort`, `page`, `page_size`, `condition`, `used_or_new`,
`case_material`, `dial_color`, `bracelet_material`, `movement_type`,
`gender`, `watch_type`, `stock_info`). The UI page sizes are 30, 60, or 120.
Use `chrono24_listing` (`path`) for the reference number, specifications,
price/currency, condition, seller type, and location; dealer context is
`chrono24_dealer` (`slug`) and `chrono24_dealer_reviews` (`slug`, `page`,
`page_size` 1–50, `min_stars` 0–5, `sort`). Suggestions:
`chrono24_autocomplete` (`query`).
### Adjacent resale benchmarks
Use these only when they improve the requested comparison; do not substitute a
streetwear marketplace for a luxury-listing comparable without saying so.
- **Depop:** `depop_search` (`query` plus `brand_ids`, `category`,
`subcategory`, `condition`, `colours`, `sizes`, `gender`, `is_kids`,
`on_sale`, `price_min`, `price_max`, `sort`, `after`); discover with
`depop_brands`, `depop_categories`, `depop_sizes`, and
`depop_search_facets` (`query`). Detail/shop: `/depop/item/{slug}`,
`/depop/item/{slug}/similar` (`after`, `limit`, up to 150),
`depop_search_sellers` (`query`), and `/depop/shop/{username}` with the
compatible filters. Suggestions: `depop_suggest` (`query`).
- **Poshmark:** use `poshmark_brands` and `poshmark_categories` for discovery;
active browse/search is `poshmark_search` (`query`, `department`, `max_id`),
`/poshmark/brand/{name}` (`max_id`), or `/poshmark/category/{path}`
(`max_id`). Details are `/poshmark/listing/{id}`; seller context is
`/poshmark/closet/{username}` (`max_id`). Reuse `next_max_id` exactly.
- **GOAT and StockX:** use product detail for market context, not a confirmed
sale comp unless the response explicitly provides a last-sale field.
`goat_search` supports `query`, facets, `page`, and `limit`; discover with
`goat_search_facets`, `goat_countries`, and `goat_curated`; detail is
`/goat/product/{slug}` (`country_code`). `stockx_search` supports `category`,
`query`, facet filters, `page`, and `limit`; discover `stockx_categories` and
`stockx_brands`; detail is `/stockx/product/{slug}`. `stockx_releases`
(`from`, `page`, `limit`) is a release calendar, not resale history.
## Reporting shape
For a comparison, return a compact table or JSON list with one row per source
listing and include `source`, `listing_url_or_path`, `status` (`active`,
`sold`, or `market_context`), `price`, `currency`, `condition_text`,
`authentication_signal`, `seller_or_dealer_signal`, `sale_date`,
`fees_shipping_duties`, `source_timestamp`, and `retrieved_at`. Leave an
unsupported field null or label it `not provided`; never fill it with an
estimate. Keep active asks and sold evidence in separate summaries before any
user-requested comparison.