Searchthewatchmarket APIsearchthewatchmarket.com ↗
Access aggregated luxury watch listings from Chrono24, eBay, Reddit WatchExchange, and independent dealers via two structured endpoints.
What is the Searchthewatchmarket API?
The Search The Watch Market API gives developers access to 1,800–2,400 daily luxury watch listings aggregated from Chrono24, eBay, Reddit WatchExchange, and independent dealers through 2 endpoints. The list_products endpoint returns the full day's catalog with price, currency, seller, brand, and model data. The search_products endpoint filters that same catalog by freetext query across product name, brand, model number, and seller fields.
curl -X GET 'https://api.parse.bot/scraper/9a07d740-edea-4660-97d5-17f68ddf0aca/list_products?page=0' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace searchthewatchmarket-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: SearchTheWatchMarket SDK — browse and search luxury watch listings."""
from parse_apis.searchthewatchmarket_com_api import SearchTheWatchMarket, InputFormatInvalid
client = SearchTheWatchMarket()
# List today's watches, capped at 5 items total.
for watch in client.products.list(limit=5):
print(f"{watch.name} — {watch.currency} {watch.price} (seller: {watch.seller_name})")
# Search for a specific model and drill into the first result.
hit = client.products.search(query="Rolex Submariner", limit=1).first()
if hit is not None:
print(f"\n{hit.name} (listing {hit.listing_id})")
print(f" Brand: {hit.brand}")
print(f" URL: {hit.url}")
print(f" USD: {hit.converted_prices.get('USD')}")
print(f" EUR: {hit.converted_prices.get('EUR')}")
print(f" Specifics keys: {list(hit.specifics.keys())}")
# Demonstrate typed error handling for an invalid day offset.
try:
client.products.list(day_offset=-99, limit=1).first()
except InputFormatInvalid as e:
print(f"\nExpected error for out-of-range day: {e.message} — {yesterday_hit.currency} {yesterday_hit.price}")
print("\nexercised: products.list / products.search / error handling")
Returns the complete list of all watches currently for sale on the platform for a given day. The site publishes a daily cache of all active listings (typically 1800-2400 per day) from sources including Chrono24, eBay, Reddit WatchExchange, independent dealers, and certified pre-owned programs. Each product includes pricing in multiple currencies, seller info, watch specifications, and listing URLs. When page is 0 (default/today) and the current day's data is not yet available or has fewer than 100 items, automatically falls back to the previous day.
| Param | Type | Description |
|---|---|---|
| page | integer | Day offset from today. 0 = today (default), -1 = yesterday, -2 = two days ago, etc. Only the most recent ~5 days of data are available. |
{
"type": "object",
"fields": {
"total": "integer count of products returned",
"products": "array of product objects, each containing listing_id, name, price, currency, converted_prices, seller_name, seller_id, brand, model_number, url, image_url, type, added_date, previous_price, previous_price_date, verified, specifics, and optionally nickname",
"day_number": "integer representing the internal day identifier used"
},
"sample": {
"data": {
"total": 1807,
"products": [
{
"url": "https://www.watches-of-switzerland.co.uk/Rolex-Certified-Pre+Owned-Sky+Dweller-01250004492/p/408102327490",
"name": "Rolex Sky-Dweller",
"type": "INDEPEND",
"brand": null,
"price": 21950,
"currency": "GBP",
"verified": 1,
"image_url": "https://f003.backblazeb2.com/file/rw2026/2026-08-24/pro_142299289.webp",
"seller_id": 110,
"specifics": {
"case": [
"42mm"
],
"year": [
"2022"
],
"color": [
"blue"
],
"material": [
"oystersteel and white gold"
],
"box_papers": [
"yes"
]
},
"added_date": 1787544727,
"listing_id": 176774359,
"seller_name": "Watches of Switzerland CPO",
"model_number": null,
"previous_price": null,
"converted_prices": {
"AED": 106785,
"AUD": 41791,
"CAD": 41336,
"CHF": 23996,
"EUR": 25655,
"GBP": 21950,
"HKD": 234937,
"JPY": 4762378,
"PLN": 110635,
"SGD": 38038,
"USD": 29969
},
"previous_price_date": null
}
],
"day_number": 601
},
"status": "success"
}
}About the Searchthewatchmarket API
What the API Returns
Both endpoints return an array of product objects with a consistent set of fields: listing_id, name, price, currency, converted_prices, seller_name, seller_id, brand, model (and related specifics including model number, nickname, and condition). Each response also includes a total count and a day_number identifier that corresponds to the internal daily cache.
list_products — Full Daily Catalog
The list_products endpoint accepts an optional page integer parameter representing a day offset from today. Pass 0 (default) for today's listings, -1 for yesterday, -2 for two days ago, and so on. The site maintains roughly five days of history, so offsets beyond that range will not return data. This makes the endpoint useful for snapshotting daily inventory changes or detecting new listings that have appeared since a prior pull.
search_products — Freetext Filtering
The search_products endpoint requires a query string. It matches all space-separated terms against product name, seller name, brand, model number, specifics, and nickname — all terms must match for a listing to be included. The response mirrors the structure of list_products and echoes back the query that was used, making it straightforward to verify which query produced a given result set. Filtering is applied against the current day's active listings only.
Coverage and Data Sources
Listings are drawn from Chrono24, eBay, Reddit WatchExchange, independent dealers, and certified pre-owned sources. The converted_prices field provides normalized pricing across currencies, which is useful when comparing listings sourced from different markets. The catalog refreshes daily, so listing counts and availability reflect the state of the market at the time the daily cache was built.
The Searchthewatchmarket API is a managed, monitored endpoint for searchthewatchmarket.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when searchthewatchmarket.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official searchthewatchmarket.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Track daily price movements for a specific watch reference by querying
search_productswith a model number each day. - Build a price-comparison tool that surfaces the lowest
priceacross allseller_nameentries for a given brand. - Monitor new listings for rare references by diffing consecutive days using the
pageoffset parameter inlist_products. - Aggregate market depth data by counting
totallistings per brand across the daily catalog. - Alert collectors when a specific seller posts a new listing by filtering
seller_namefromsearch_productsresults. - Populate a watch valuation tool with current
converted_pricesdata to estimate fair market value across currencies. - Research seller activity by tracking
seller_idappearances across multiple daily snapshots.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Search The Watch Market have an official developer API?+
How far back does the listing history go?+
list_products endpoint supports a page offset parameter covering approximately the most recent 5 days. Listings older than that are not accessible through the current endpoints. You can fork this API on Parse and revise it to add a deeper history endpoint if your use case requires it.Can I filter listings by price range, condition, or specific marketplace source?+
search_products endpoint filters by freetext query matched against name, brand, model, seller, and related fields, but does not accept structured filters for price range, condition, or source marketplace. The raw product objects do include price, currency, and condition data, so client-side filtering is possible. You can fork this API on Parse and revise it to add server-side structured filters.What does the `converted_prices` field contain?+
converted_prices field provides price representations in multiple currencies for each listing, normalized from the original price and currency values. This allows consistent comparison across listings sourced from different regional markets without performing currency conversion on the client side.