Chrono24 Listing Scraper avatar
Chrono24 Listing Scraper

Pricing

Pay per event

Go to Apify Store
Chrono24 Listing Scraper

Chrono24 Listing Scraper

Developed by

Eliana

Eliana

Maintained by Community

Extracting structured watch data from Chrono24. Provide a listing URL, and it returns clean JSON with brand, model, reference, price, condition, specs, images, seller ratings, reviews, delivery details, availability, and multi-currency support—ready for instant integration.

0.0 (0)

Pricing

Pay per event

0

1

1

Last modified

2 hours ago

Chrono24 Watch Scraper API

A powerful Flask-based API for scraping individual watch listings from Chrono24 across multiple domains with consistent data structure and automatic Unicode decoding.

🚀 Quick Start

Installation

# Clone the repository
git clone <repository-url>
cd chrono24
# Install dependencies
pip install -r requirements.txt
# Start the Flask app
python app.py

Basic Usage

# Scrape a watch listing
GET /scrape_watch?url=https://chrono24.ch/rolex/datejust-36-1970-top-condition--id28485741.htm
# Health check
GET /health
# API information
GET /

🌍 Supported Domains

DomainCountryLanguageCurrencyURL
chrono24.comUnited StatesEnglishUSDhttps://chrono24.com
chrono24.chSwitzerlandGermanCHFhttps://chrono24.ch
chrono24.deGermanyGermanEURhttps://chrono24.de
chrono24.frFranceFrenchEURhttps://chrono24.fr
chrono24.itItalyItalianEURhttps://chrono24.it
chrono24.esSpainSpanishEURhttps://chrono24.es
chrono24.co.ukUnited KingdomEnglishGBPhttps://chrono24.co.uk
chrono24.com.auAustraliaEnglishAUDhttps://chrono24.com.au
chrono24.inIndiaEnglish/HindiINRhttps://chrono24.in
chrono24.appMobile AppAuto-detectedAuto-detectedhttps://chrono24.app

Note: chrono24.app URLs are automatically converted to the appropriate domain based on the SETLANG and SETCURR parameters.

📡 API Endpoints

1. Scrape Watch Listing

Endpoint: GET /scrape_watch or GET /scrape_watch/

Query Parameters:

  • url (required): The Chrono24 watch listing URL to scrape

Example Request:

$GET /scrape_watch?url=https://chrono24.app/rolex/datejust-36-1970-top-condition--id28485741.htm?SETLANG=en_CH&SETCURR=CHF

Example Response:

{
"success": true,
"data": {
"title": "Rolex Datejust 36 1970 Top Condition",
"price": "4800",
"currency": "CHF",
"domain": "chrono24.ch",
"manufacturer": "Rolex",
"location": "Switzerland, Bülach bei Zürich",
"condition": "Used (Very good) The item shows minor signs of wear, such as small, intangible scratches.",
"additional_details": {
"reference_number": "1603",
"case_diameter": "36 mm",
"movement": "Automatic",
"year_of_production": "1970"
},
"image_urls": ["https://img.chrono24.com/..."],
"image_count": 17
},
"domain": "chrono24.ch",
"currency": "CHF"
}

2. Health Check

Endpoint: GET /health or GET /health/

Response:

{
"status": "healthy",
"supported_domains": ["chrono24.com", "chrono24.ch", "chrono24.in", ...],
"flare_solverr_enabled": false
}

3. API Information

Endpoint: GET / or GET /index or GET /index/

Response:

{
"service": "Chrono24 Watch Scraper API",
"version": "1.0.0",
"endpoints": {
"/scrape_watch": {
"method": "GET",
"description": "Scrape a single watch listing",
"parameters": {
"url": "The Chrono24 watch listing URL to scrape"
}
}
},
"supported_domains": ["chrono24.com", "chrono24.ch", "chrono24.in", ...],
"usage": "Send a GET request to /scrape_watch with the 'url' parameter containing a Chrono24 watch listing URL or chrono24.app URL"
}

🔧 Features

Automatic URL Conversion

  • chrono24.app URLs are automatically converted to the appropriate domain
  • Smart detection based on SETLANG and SETCURR parameters

Price Cleaning

  • Removes Unicode characters (e.g., \u2019')
  • Strips currency symbols and formatting
  • Returns clean numeric values

Unicode Decoding

  • Automatically converts Unicode escape sequences to readable symbols
  • Supports German (ü, ö, ä, ß), French (é, è, à, ç), Spanish (ñ), and more
  • Handles quotation marks, dashes, and special characters

Consistent Data Structure

  • Same output format across all supported domains
  • Domain and currency information included
  • Comprehensive watch details extraction

📊 Data Structure

All responses follow the same structure regardless of the source domain:

{
"success": boolean,
"data": {
"title": "string",
"price": "string (cleaned)",
"currency": "string",
"domain": "string",
"manufacturer": "string",
"location": "string",
"condition": "string",
"description": "string",
"image_urls": ["string"],
"image_count": number,
"additional_details": {
"reference_number": "string",
"case_diameter": "string",
"movement": "string",
"year_of_production": "string",
// ... other watch specifications
}
},
"domain": "string",
"currency": "string"
}

🛡️ Error Handling

The API returns appropriate HTTP status codes and error messages:

  • 200: Success
  • 400: Bad Request (missing URL, invalid URL, scraping failed)
  • 500: Internal Server Error

Error Response Format:

{
"error": "Error description",
"usage": "Usage instructions (for 400 errors)"
}

🚀 Advanced Usage

Mobile App URL Support

# Mobile app URL with Swiss parameters
GET /scrape_watch?url=https://chrono24.app/rolex/datejust-36-1970-top-condition--id28485741.htm?SETLANG=en_CH&SETCURR=CHF
# This automatically converts to chrono24.ch and scrapes with Swiss settings

Direct Domain URLs

# Swiss domain
GET /scrape_watch?url=https://chrono24.ch/rolex/datejust-36-1970-top-condition--id28485741.htm
# US domain
GET /scrape_watch?url=https://chrono24.com/rolex/submariner-date-126610ln--id12345678.htm
# Indian domain
GET /scrape_watch?url=https://chrono24.in/rolex/datejust-41mm-blue-dial--id87654321.htm

🔍 Troubleshooting

Common Issues

  1. 403 Forbidden Errors: Use FlareSolverr (see CLOUDFLARE_BYPASS.md)
  2. No Listings Found: Check if the URL is valid and accessible
  3. Connection Errors: Verify your internet connection and try again

Getting Help

  • Check the health endpoint: GET /health
  • Verify the app is running: python app.py
  • Check console logs for debugging information

📝 Examples

Python Requests

import requests
# Scrape a watch listing
response = requests.get('http://localhost:5000/scrape_watch',
params={'url': 'https://chrono24.ch/rolex/datejust-36-1970-top-condition--id28485741.htm'})
if response.status_code == 200:
data = response.json()
print(f"Watch: {data['data']['title']}")
print(f"Price: {data['data']['price']} {data['data']['currency']}")
print(f"Location: {data['data']['location']}")
else:
print(f"Error: {response.json()}")

cURL

# Basic scraping
curl "http://localhost:5000/scrape_watch?url=https://chrono24.ch/rolex/datejust-36-1970-top-condition--id28485741.htm"
# Health check
curl "http://localhost:5000/health"

📄 License

This project is licensed under the terms specified in the LICENSE file.


The Chrono24 Watch Scraper API is ready to use! 🎉

For information about bypassing Cloudflare protection, see CLOUDFLARE_BYPASS.md.