The Watch Pages APIthewatchpages.com ↗
Access current luxury watch collections via The Watch Pages API. Retrieve reference numbers, model names, retail prices, and product URLs for brands like Rolex and Patek Philippe.
What is the The Watch Pages API?
The Watch Pages API exposes 3 endpoints for querying current-production luxury watch collections, returning reference numbers, model names, retail prices (RRP/MSRP), and product URLs. The list_brand_watches endpoint delivers the full structured collection for a given brand slug, while list_brand_watches_map returns a reference-keyed object for fast lookups. Coverage includes brands such as Patek Philippe, Rolex, and Audemars-Piguet.
curl -X GET 'https://api.parse.bot/scraper/b75e7af2-a89f-43be-9797-f6d829a8874a/list_brand_watches?brand=patek-philippe&collection_status=current' \ -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 thewatchpages-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: WatchPages SDK — browse luxury watch brand collections."""
from parse_apis.thewatchpages_com_api import WatchPages, CollectionStatus, BrandNotFound
client = WatchPages()
# List current Patek Philippe watches — limit caps total items fetched.
for watch in client.brand_collections.get(brand="patek-philippe", collection_status=CollectionStatus.CURRENT, limit=5):
print(watch.model_name, watch.reference, watch.price)
# Drill into a different brand's collection.
rolex_watch = client.brand_collections.get(brand="rolex", collection_status=CollectionStatus.CURRENT, limit=1).first()
if rolex_watch:
print(rolex_watch.reference, rolex_watch.model_name, rolex_watch.url)
# Typed error handling for a non-existent brand.
try:
client.brand_collections.get(brand="nonexistent-brand", collection_status=CollectionStatus.CURRENT, limit=1).first()
except BrandNotFound as exc:
print(f"Brand not found: {exc.brand}")
print("exercised: brand_collections.get (patek-philippe, rolex, error case)")
Retrieves all watches in a brand's current production collection. Paginates through all results automatically to return the complete set. Each watch includes its reference number, model/collection name, retail price (RRP/MSRP) when shown, and the product detail URL. Results are ordered by the site's default sort (newest first).
| Param | Type | Description |
|---|---|---|
| brandrequired | string | Brand slug in lowercase with hyphens. Known working values include: patek-philippe, rolex, audemars-piguet, vacheron-constantin, omega, cartier, tudor, iwc, jaeger-lecoultre, breitling. |
| collection_status | string | Filter by collection status. When set to 'current', returns only watches in the brand's current production lineup. |
{
"type": "object",
"fields": {
"brand": "string — the brand slug queried",
"watches": "array of watch objects with reference, model_name, price, and url",
"total_count": "integer — total number of watches matching the query",
"collection_status": "string — the collection status filter applied"
},
"sample": {
"data": {
"brand": "patek-philippe",
"watches": [
{
"url": "https://www.thewatchpages.com/watches/patek-philippe-grand-complications-5236p-011-5236p-011/",
"price": "$153,844",
"reference": "5236P-011",
"model_name": "Grand Complications 5236P-011"
},
{
"url": "https://www.thewatchpages.com/watches/patek-philippe-golden-ellipse-3738-100g-014-3738-100g-014/",
"price": "$39,940",
"reference": "3738/100G-014",
"model_name": "Golden Ellipse 3738/100G-014"
},
{
"url": "https://www.thewatchpages.com/watches/patek-philippe-golden-ellipse-5738g-001-5738g-001/",
"price": "$42,406",
"reference": "5738G-001",
"model_name": "Golden Ellipse 5738G-001"
}
],
"total_count": 187,
"collection_status": "current"
},
"status": "success"
}
}About the The Watch Pages API
What the API Returns
All three endpoints query The Watch Pages by brand slug (e.g., patek-philippe, rolex, audemars-piguet) and an optional collection_status filter. When collection_status is set to current, results are limited to watches in the brand's active production lineup. The list_brand_watches endpoint returns an array of watch objects, each containing reference, model_name, price, and url fields, along with a total_count integer and the collection_status value that was applied.
Text and Map Formats
list_brand_watches_text returns the same collection as a paginated plain-text string. Each line is formatted as reference || model_name || price, with an empty string substituted when price data is unavailable. Pagination is controlled via the page (1-based) and page_size (1–50) parameters; the response includes total_count and total_pages to support iterating through large brand catalogs. This format is useful for feeding data into LLM pipelines or diff-based price monitors without needing to parse nested JSON.
list_brand_watches_map builds a single JSON object keyed by reference number, with values formatted as model_name || price. It aggregates across all available pages server-side before returning, so no client-side pagination loop is needed. This structure suits use cases where reference number is the primary lookup key, such as cross-referencing a known reference against current retail pricing.
Coverage and Limitations
Prices reflect the retail (RRP/MSRP) figures shown on The Watch Pages where listed; not every reference includes a price, and market or secondary prices are not covered. The brand parameter requires a lowercase hyphenated slug — documented working values include patek-philippe, rolex, audemars-piguet, and vacheron-constantin. Brands outside this set may not return results. Discontinued references are excluded when the current filter is applied.
The The Watch Pages API is a managed, monitored endpoint for thewatchpages.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when thewatchpages.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 thewatchpages.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?+
- Build a retail price reference tool using
list_brand_watches_mapkeyed by reference number for fast lookups - Monitor whether a specific Patek Philippe or Rolex reference is still in current production
- Feed watch reference and price data into an LLM prompt using the
list_brand_watches_textpipe-delimited format - Generate a brand-specific catalog page with model names, references, and direct product URLs from
list_brand_watches - Cross-reference a list of known references against current retail prices to flag discontinued models
- Aggregate and compare current-collection sizes across multiple luxury brands using
total_count
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does The Watch Pages have an official developer API?+
How does the `collection_status` filter affect results?+
collection_status is set to current, all three endpoints restrict results to watches in the brand's active production lineup. Omitting the parameter may include additional records depending on what the source exposes for that brand.Does the API return secondary-market or dealer prices?+
Is watch-level detail data — such as movement specs, case dimensions, or materials — available?+
What happens when a watch doesn't have a listed price?+
list_brand_watches, the price field will be absent or empty for that watch object. In the text and map formats (list_brand_watches_text and list_brand_watches_map), an empty string is substituted in the pipe-delimited value so the format remains consistent across all records.