OnTheMarket Scraper - UK Property Data, Price & Tenure
Pricing
from $1.45 / 1,000 property returneds
OnTheMarket Scraper - UK Property Data, Price & Tenure
OnTheMarket.com listings for sale or to rent as clean JSON: price as a number with its meaning (sale or monthly rent, weekly rent from the page), tenure with lease years, bedrooms, bathrooms, features, coordinates, the agency and added/reduced status. Filters cost no extra requests. Unofficial.
Pricing
from $1.45 / 1,000 property returneds
Rating
0.0
(0)
Developer
NeverEmpty
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
19 hours ago
Last modified
Categories
Share
Pull property listings from OnTheMarket.com — the UK's third-largest property portal — as clean JSON: the price as a number and what it means, tenure with the lease years remaining, bedrooms, bathrooms, features, coordinates and the agency, for sale or to rent, anywhere in the UK.
Unofficial. This Actor is not affiliated with, endorsed by, or sponsored by OnTheMarket. All product names are trademarks of their respective owners.
No API key. Reads the same public pages a visitor sees.
Run it tomorrow and you only get what is new
Schedule this Actor with monitoringMode: true and each run returns only the listings it has not returned before. Not "here is everything again, please de-duplicate it yourself" — the Actor remembers what it already gave you, so a daily feed of a 4,000-listing search costs you the handful of new homes, not 4,000 rows every morning. You are never charged for the same property twice.
Listings your filters removed are remembered too, so widening a filter later does not resurrect them as false "new" listings. Listings that did not fit under your limit are not remembered, so they are still waiting on the next run instead of being silently lost.
Why this one is different
The price is a number that means what it says
OnTheMarket publishes the price as text — £550,000 on a sale, £1,550 pcm (£358 pw) on a rental. This Actor reads it into price and labels it: priceType: "sale" (median in the 86 sales measured: £650,000) or priceType: "monthly-rent" (median in the 28 rentals: £1,410), with rentPerWeek taken from OnTheMarket's own bracket rather than calculated. A listing whose price text carries no figure comes back as price: null with isPriceOnApplication: true — never a zero. OnTheMarket's qualifier (Guide price, Offers over, Shared ownership) is kept in priceQualifier.
Tenure is a value, and the lease length is another
OnTheMarket only states the tenure inside the feature bullets — Tenure: Leasehold (999 years remaining). This Actor lifts it out into tenure (FREEHOLD, LEASEHOLD, SHARE_OF_FREEHOLD) and leaseYearsRemaining (a number, on 35 of the 114 listings measured), and removes the bullet from features so it is not sold twice. The shortest lease in the sample was 59 years.
Advertising slots are not sold as properties
Up to two of the thirty cards on a list page are advertising slots (ad?: true), not listings. They are dropped before counting, so they are never delivered or charged.
No branch phone numbers
OnTheMarket's card data includes the marketing branch's telephone on every one of the 114 listings measured. This Actor returns the agency name and its branch page and leaves the phone out; UK phone numbers written into the address or features are removed too. Property data, not a contact list.
An unknown place is a 404, and it is reported as one
OnTheMarket answers a place it does not know with an honest 404. This Actor returns a no-such-search row that says how OnTheMarket spells its places — distinct from no-results, which is its own "zero listings" answer. OnTheMarket serves at most 34 pages per search and redirects anything beyond to its front page; that is treated as "no more pages", never as an empty search. A page that fails for any other reason is reported as unreadable, with a note saying which pages were delivered before it. All of these rows are free.
Filters run here, because OnTheMarket's robots.txt says so
OnTheMarket's robots.txt disallows the price, bedroom, type and radius query parameters and the /flat/, /apartment/ and *-bed- paths. This Actor requests only /for-sale/property/<place>/ or /to-rent/property/<place>/ plus ?page=N, and every filter — price, bedrooms, bathrooms, type, tenure, shared ownership, developments, recently added, keywords, agency — runs on the rows already fetched. Nothing extra is requested and nothing extra is charged. A property is never dropped for a value OnTheMarket did not publish.
Input
Either paste a search URL, or build one from the fields below.
| Field | Type | Default | Description |
|---|---|---|---|
searchUrl | string | — | e.g. https://www.onthemarket.com/for-sale/property/london/. Query parameters and type paths are dropped |
channel | string | sale | sale or rent |
location | string | london | A town (london, manchester, milton-keynes) or a postcode area (sw1a, m1) |
maxListings | integer | 20 | 1-950. One property = one row = one charged event. OnTheMarket serves at most 34 pages (about 950 properties) per search |
maxPages | integer | 0 | Hard cap on requests; 0 = decide from maxListings. 34 at most |
useProxy | boolean | false | Off by default — OnTheMarket answers Apify's network directly. Switches on by itself if blocked |
keywords / keywordMatch / excludeKeywords | array / string / array | — | Match on title, address, type, features, labels, price qualifier, tenure, added/reduced text and agency |
agencyNames | array | — | Keep only these agencies (partial match) |
minPrice / maxPrice | integer | 0 | GBP. Sale total or rent per calendar month. A property with no price is kept |
requirePrice | boolean | false | Drop listings with no published price |
minBedrooms / maxBedrooms | integer | -1 | -1 = off. An unpublished count is kept |
minBathrooms | integer | -1 | -1 = off |
propertyTypes | array | — | Partial match on OnTheMarket's words: Apartment, Flat, Terraced house, Detached house, Bungalow, Studio … |
tenureTypes | array | — | FREEHOLD, LEASEHOLD, SHARE_OF_FREEHOLD. An unpublished tenure is kept |
excludeSharedOwnership | boolean | false | Drop shared-ownership listings |
excludeDevelopments | boolean | false | Drop developer listings that advertise a range of homes |
recentlyAddedOnly | boolean | false | Keep only listings OnTheMarket flags as recently added |
monitoringMode | boolean | false | Return only properties not returned on a previous run |
resetMonitoringState | boolean | false | One-shot: forget what was already returned |
{ "channel": "sale", "location": "manchester", "maxListings": 100,"minBedrooms": 3, "maxPrice": 400000, "tenureTypes": ["FREEHOLD"], "excludeSharedOwnership": true, "excludeDevelopments": true }
Monitoring mode turns this into a daily feed
OnTheMarket lists in its own "recommended" order, so to catch new stock anywhere in the results set maxListings high (up to 950): every page is read, but only the listings not returned before are delivered and charged.
Schedule it and set monitoringMode: true: each run returns only the properties it has not returned before. Properties removed by your filters are remembered too, so changing a filter later does not resurrect them as false "new" listings — and properties that simply did not fit under maxListings, or were cut off by the run's charge limit, are not remembered, so they are still waiting for you on the next run rather than being silently lost.
Measured on 2026-09-05: 50,000+ properties for sale in London (OnTheMarket caps the count at 50,000); 2,919 to rent in Manchester; 53 for sale in SW1A.
Output
One row per property:
{"source": "onthemarket.com","status": "ok","listingId": "20268229","title": "3 bedroom chalet for sale","address": "David Drive, Harold Park","url": "https://www.onthemarket.com/details/20268229/","searchedLocation": "Property & houses for sale in London","transactionType": "sale","propertyType": "Chalet","bedrooms": 3,"bathrooms": 2,"price": 550000,"priceCurrency": "GBP","priceType": "sale","priceDisplay": "£550,000","priceQualifier": null,"isPriceOnApplication": false,"rentPerMonth": null,"rentPerWeek": null,"isSharedOwnership": false,"tenure": "FREEHOLD","leaseYearsRemaining": null,"features": ["Three Bedrooms", "Semi Detached", "Great Condition"],"labels": [],"latitude": 51.600282905437,"longitude": 0.243168901765,"addedOrReducedText": "Added yesterday","mainLabel": "Added yesterday","isRecentlyAdded": true,"isReduced": false,"isPremium": false,"isExclusive": true,"isSpotlight": false,"hasVirtualTour": false,"agencyName": "haart Estate Agents - Harold Wood","agencyUrl": "https://www.onthemarket.com/agents/branch/haart-estate-agents-harold-wood/","isDevelopment": false,"developmentFeatures": [],"mainImageUrl": "https://media.onthemarket.com/properties/20268229/1641899749/image-0-480x320.jpg","scrapedAt": "2026-09-05T08:36:33.126Z"}
Measured across 114 live listings (113 unique) on 2026-09-05: id, title, address, url, type, price, coordinates, agency and added/reduced text on 114 of 114; bedrooms on 110; bathrooms on 107; tenure on 85; a lease length on 35; a price qualifier on 51. OnTheMarket does not publish a listing date on the list page — only the text Added today / Reduced yesterday / Added > 14 days and a recently-added flag, both passed through.
Rows that are never charged
status | when |
|---|---|
no-results | OnTheMarket reports zero properties for this search. That is its answer, not a failure |
no-such-search | OnTheMarket has no page at that address (HTTP 404) - a place spelled differently from OnTheMarket's addresses. Not a claim that there is nothing there |
no-filter-match | Listings were read, but your filters removed all of them. The row says how many were read |
no-new-listings | Monitoring mode: nothing new since the previous run |
unreadable | The page could not be read, its embedded data was missing, or it claimed a total above zero while yielding nothing |
Pricing
Pay per property returned. Rows that report an empty search, an unknown place, a filter that matched nothing, or a page that could not be read are not charged. A property that appears twice across pages is dropped before delivery, so it is never charged twice.
Notes
robots.txtwas read in full on 2026-09-05. TheUser-agent: *section disallows agent contact pages,*/flat/,*/apartment/,*-bed-paths (except a few named allowances), student and overseas bedroom paths, and the query parametersmax-price,min-price,min-bedrooms,max-bedrooms,prop-types,radius,sort-field,let-agreed,under-offer,new-home-flag=T,view=map…,direction,modal,more-like-this,bounding-box,online-viewings-first,exclusive-first. This Actor requests only the plain listing path with?page=N.- Only public pages are read. No login, no API key.