OnTheMarket Scraper — Listings & Agent Contacts avatar

OnTheMarket Scraper — Listings & Agent Contacts

Pricing

from $3.00 / 1,000 property listings

Go to Apify Store
OnTheMarket Scraper — Listings & Agent Contacts

OnTheMarket Scraper — Listings & Agent Contacts

Scrape public OnTheMarket UK sale, rental, new-home, and auction listings for research, comparables, monitoring, and agent leads. Returns one stable record per property with price, address, beds, coordinates, photos, EPC, broadband, and agent contacts. Not for private data. $0.003/listing.

Pricing

from $3.00 / 1,000 property listings

Rating

0.0

(0)

Developer

Muhammad Afzal

Muhammad Afzal

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Share

OnTheMarket Scraper extracts public UK property listings from OnTheMarket search, category, and detail pages. It returns stable JSON records with prices, addresses, property types, bedrooms, bathrooms, coordinates, photos, features, tenure, EPC ratings, broadband speeds, nearby schools and stations, and estate-agent contact details. Use it for property-market research, inventory monitoring, comparable listings, relocation analysis, and public agent lead generation.

The Actor accepts for-sale, to-rent, new-home, and auction URLs. Search pages are paginated automatically, duplicate listing IDs are removed across all inputs, and maxResults is enforced as an output and billing cap. Detail enrichment is enabled by default. Each saved property costs $0.003, plus the documented Actor start event.

Do not use this Actor for Rightmove, Zoopla, OnTheMarket sold prices, private account data, saved searches, or property alerts. Those are outside its public listing scope.

What data can I extract with OnTheMarket Scraper?

Each dataset item represents one unique property listing. Optional values remain present as explicit null values or empty arrays, which keeps exports and AI-agent integrations predictable.

Field groupIncluded data
IdentityListing ID, canonical listing URL, source search URL, listing status
PropertyTitle, address, postcode, type, beds, baths, tenure, features, description
PriceDisplayed price, numeric GBP price, qualifier, rental frequency
LocationLatitude, longitude, nearby stations, nearby schools
Property signalsNew home, student, commercial, auction, featured, exclusive, recently added
EnrichmentEPC rating, broadband download/upload speed, photos, floorplans, virtual tours
AgentBranch name, phone, OnTheMarket profile, external website, branch address
ProvenanceScrape timestamp, response format, warnings

responseFormat: "concise" keeps records compact for MCP clients and large exports. responseFormat: "detailed" adds a capped description, more photos, floorplans, virtual tours, nearby schools and stations, and the full public agent address. Both modes use the same keys.

Use cases for OnTheMarket property data

  • Track newly listed or reduced properties in selected towns, postcodes, or neighbourhoods.
  • Build current for-sale and rental inventory datasets for UK housing analysis.
  • Compare asking prices, property types, bedroom counts, tenure, and listing recency.
  • Collect public estate-agent branch contacts for compliant business-development research.
  • Monitor new homes, shared-ownership inventory, retirement properties, or auction stock.
  • Feed normalized listing data into spreadsheets, databases, BI tools, valuation models, or AI agents.
  • Schedule repeated runs and compare listing IDs or statuses in your downstream database.

For broad locations, use several narrow postcode or price-filtered search URLs. OnTheMarket can limit the depth exposed by one broad search, so partitioning London or another large area produces more complete coverage than repeatedly paging one very broad result set.

How much will scraping OnTheMarket cost?

OnTheMarket Scraper uses predictable pay-per-event pricing.

EventPrice
Actor start$0.00005 per run, scaled according to the Apify event definition
property-listing$0.003 per unique property saved

Worked examples for result-event charges:

  • 1 property: about $0.00305 including the base start event.
  • 100 properties: about $0.30005.
  • 1,000 properties: about $3.00005.
  • 10,000 properties: about $30.00005.

The Actor prints the maximum result-event cost before scraping and the actual billed result events at the end. maxResults, ACTOR_MAX_PAID_DATASET_ITEMS, and ACTOR_MAX_TOTAL_CHARGE_USD are enforced before another record is produced. Apify platform compute, proxy, storage, and transfer charges depend on the caller's Apify plan and selected billing option.

How to use OnTheMarket Scraper

  1. Open OnTheMarket and configure the exact property search you need.
  2. Copy the resulting search URL, category URL, or individual /details/{id}/ URL.
  3. Add one or more URLs to startUrls.
  4. Set maxResults to the largest number of unique listings you want to pay for.
  5. Keep enrichDetails enabled for EPC, broadband, floorplans, nearby places, and richer agent data.
  6. Run the Actor and export the dataset as JSON, CSV, Excel, XML, or RSS.

The default input uses a London for-sale search and saves at most 100 listings. It is suitable for Apify's automated health check. For a quick canary, set maxResults to 1–10.

Input

{
"startUrls": [
{
"url": "https://www.onthemarket.com/for-sale/property/london/?page=1"
},
{
"url": "https://www.onthemarket.com/to-rent/property/manchester/"
},
{
"url": "https://www.onthemarket.com/details/18712479/"
}
],
"maxResults": 250,
"enrichDetails": true,
"responseFormat": "concise",
"maxConcurrency": 5
}
InputDefaultNotes
startUrlsLondon for-sale searchSearch/category or /details/{id}/ URLs on onthemarket.com
maxResults100Overall unique-record and billing cap, from 1 to 10,000
enrichDetailstrueOpens each property page after search-card discovery
responseFormatconciseconcise or detailed; output keys stay stable
maxConcurrency5Simultaneous HTTP requests, from 1 to 20

Unsupported domains and OnTheMarket account, agent-directory, or sold-price URLs are ignored with a warning. If every input is invalid, the run exits successfully with an actionable terminal message instead of recording a runtime failure.

Output

{
"listingId": "18712479",
"listingUrl": "https://www.onthemarket.com/details/18712479/",
"sourceUrl": "https://www.onthemarket.com/details/18712479/",
"searchUrl": "https://www.onthemarket.com/for-sale/property/london/?page=1",
"scrapedAt": "2026-08-11T09:15:00.000Z",
"responseFormat": "concise",
"status": "live",
"transactionType": "sale",
"title": "5 bedroom semi-detached house for sale",
"address": "Sandpiper Road, South Croydon, Surrey, CR2",
"postcode": "CR2 8PQ",
"price": "£625,000",
"priceValue": 625000,
"priceQualifier": "Offers in excess of",
"priceFrequency": null,
"currency": "GBP",
"propertyType": "Semi-detached house",
"bedrooms": 5,
"bathrooms": 2,
"tenure": "Freehold",
"description": null,
"features": ["Tenure: Freehold", "Nearest station 1.1mi."],
"latitude": 51.339126,
"longitude": -0.053157,
"isNewHome": false,
"isStudent": false,
"isCommercial": false,
"isAuction": false,
"isFeatured": true,
"isExclusive": false,
"isRecentlyAdded": false,
"addedOrReduced": "Added > 14 days",
"epcRating": "C",
"broadbandMaxDownloadMbps": 1800,
"broadbandMaxUploadMbps": 220,
"imageUrl": "https://media.onthemarket.com/properties/18712479/example/image-0.jpg",
"imageUrls": ["https://media.onthemarket.com/properties/18712479/example/image-0.jpg"],
"floorplanUrls": [],
"virtualTourUrls": [],
"nearbyStations": [],
"nearbySchools": [],
"agentName": "Bairstow Eves - Selsdon",
"agentPhone": "020 4645 2088",
"agentProfileUrl": "https://www.onthemarket.com/agents/branch/bairstow-eves-selsdon/",
"agentWebsiteUrl": "https://www.bairstoweves.co.uk/estate-agents/selsdon",
"agentAddress": null,
"warnings": []
}

The default dataset contains records. The OUTPUT key in the default key-value store contains the final status, output and charge counts, settings, failed-request count, warnings, timing, and build number.

Use OnTheMarket Scraper with the API

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('muhammadafzal/onthemarket-scraper').call({
startUrls: [{ url: 'https://www.onthemarket.com/to-rent/property/bristol/' }],
maxResults: 100,
enrichDetails: true,
responseFormat: 'concise'
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Python

from apify_client import ApifyClient
client = ApifyClient('YOUR_APIFY_TOKEN')
run = client.actor('muhammadafzal/onthemarket-scraper').call(run_input={
'startUrls': [{'url': 'https://www.onthemarket.com/new-homes/property/birmingham/'}],
'maxResults': 100,
'enrichDetails': True,
'responseFormat': 'detailed',
})
items = list(client.dataset(run['defaultDatasetId']).iterate_items())
print(items)

Use OnTheMarket Scraper through MCP

Connect an MCP client to https://mcp.apify.com and add muhammadafzal/onthemarket-scraper, or filter the hosted server with:

https://mcp.apify.com?tools=muhammadafzal/onthemarket-scraper

Use the concise response format for ordinary agent calls. The declared dataset schema supplies semantic field names, nullable types, examples, and descriptions; get-actor-output can page through larger datasets without putting every property into one model context.

Reliability and limits

OnTheMarket currently provides server-rendered HTML plus a structured page-state payload. The Actor uses lightweight HTTP requests, a session pool, proxy rotation, retries, deduplication, selector-independent state parsing, and a canary request before paid work. If detail enrichment fails after retries but a valid search card was collected, the Actor preserves that partial property record and adds a warning.

Target websites can change without notice. A valid search with no matching properties is treated as a graceful empty result. A run where every request is blocked or exhausted is reported honestly as failed. Large searches should be divided by postcode, price band, bedroom count, or property type because OnTheMarket may expose only a limited result depth for one broad query.

FAQ

How many results can I scrape with OnTheMarket Scraper?

One run can save up to 10,000 unique listings, subject to the URLs' available inventory, OnTheMarket's search-depth limits, Apify run resources, and your charge cap. Split very broad areas into narrower searches for deeper coverage.

Can I integrate OnTheMarket Scraper with other apps?

Yes. Use Apify integrations, webhooks, schedules, Make, Zapier, Google Sheets, cloud storage, or your own database pipeline. Dataset exports are available in JSON, CSV, Excel, XML, and other Apify formats.

Can I use OnTheMarket Scraper with the Apify API?

Yes. Start runs through the Apify REST API or official JavaScript and Python clients, then read records from the run's default dataset and the summary from its default key-value store.

Can I use OnTheMarket Scraper through an MCP Server?

Yes. The Actor is designed for the hosted Apify MCP server. Its concise mode, stable keys, explicit nulls, output schema, bounded price, and actionable terminal messages are suitable for Claude, ChatGPT, and other MCP clients.

Do I need proxies to scrape OnTheMarket?

The deployed Actor uses Apify Proxy by default for stable cloud execution. Local parser tests can run without a proxy. The implementation uses HTTP rather than a browser because the public listing data is currently server-rendered.

Scraping legality depends on your jurisdiction, purpose, volume, contractual obligations, and treatment of personal data. This Actor only extracts information publicly visible without logging in. You are responsible for reviewing OnTheMarket's terms, robots guidance, database rights, copyright, privacy law, and any rules applicable to marketing or automated decision-making. Do not use the data for unlawful discrimination, harassment, spam, or privacy invasion.

Your feedback

If a field changes, a page type stops working, or you need a public-data field that is genuinely available on OnTheMarket, open an issue on the Actor's Apify page and include a non-sensitive example URL and run ID.