# OnTheMarket Scraper - UK Property, EPC, Tenure & Agents (`sian.agency/onthemarket-property-scraper`) Actor

Scrape OnTheMarket UK listings: price, tenure, EPC rating, council tax band, beds and baths, agent contacts and coordinates. For sale and to rent, any location.

- **URL**: https://apify.com/sian.agency/onthemarket-property-scraper.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.96 / 1,000 property searches

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## OnTheMarket Scraper — UK Property Data, Prices & Agents 🏘️

[![Store-SIÁN Agency](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![Store-Rightmove Property Scraper](https://img.shields.io/badge/Store-Rightmove%20Property%20Scraper-00DEB6)](https://apify.com/sian.agency/rightmove-property-scraper?fpr=sian) [![Store-Zoopla Property Scraper](https://img.shields.io/badge/Store-Zoopla%20Property%20Scraper-8046F0)](https://apify.com/sian.agency/zoopla-property-scraper?fpr=sian) [![Store-Smart Idealista Scraper](https://img.shields.io/badge/Store-Smart%20Idealista%20Scraper-E60023)](https://apify.com/sian.agency/smart-idealista-scraper?fpr=sian)

#### 🎉 Every UK listing with the fields buyers actually filter on: EPC, tenure and council tax band

##### Built for property analysts, buying agents, proptech teams and anyone tracking UK housing stock

***

### 🔎 What is the OnTheMarket Scraper — and when should you use it?

The **OnTheMarket Scraper** turns live UK property listings from OnTheMarket, the country's third property portal into clean, structured rows you can filter, export and feed straight into a spreadsheet, database or AI agent. No account, no portal API key, no browser automation to maintain.

**Use it when you need:** UK listings for sale, to rent or new-build, from any town, city, county or postal district. Every row carries the asking price as a number, the address, bedrooms and bathrooms, property type, coordinates, photos and the marketing estate agent's name and phone number. Switch on full property details and each row also carries the postcode, tenure, EPC rating and its assessment date, council tax band, measured broadband speed, nearest stations and schools, floorplans and the complete description.

**Use something else when:** the property is not on OnTheMarket, or you need sold prices. Use [Rightmove Property Scraper](https://apify.com/sian.agency/rightmove-property-scraper?fpr=sian) for the largest UK portal by inventory, plus sold-price comparables stitched to Land Registry records. Use [Zoopla Property Scraper](https://apify.com/sian.agency/zoopla-property-scraper?fpr=sian) for the second UK portal, with sale and rent valuation estimates alongside the listings. Use [Smart Idealista Scraper](https://apify.com/sian.agency/smart-idealista-scraper?fpr=sian) for Spain, Italy and Portugal, where OnTheMarket has no coverage at all. This actor covers live OnTheMarket listings. There is no sold-price archive on the portal, so price history is out of scope, and agent email addresses are never published — enquiries route through OnTheMarket's own form, so you get the branch phone number instead.

### 🤖 Use with AI agents

Already connected to the [Apify MCP server](https://mcp.apify.com)? Just ask for this Actor by name: sian.agency/onthemarket-property-scraper

**Your agent can pay for its own runs.** This Actor is eligible for [agentic payments](https://docs.apify.com/platform/actors/publishing/monetize), so an agent can discover it, run it and settle the bill over [x402](https://www.x402.org/) (USDC on Base) or [Skyfire](https://www.skyfire.xyz/) — without an Apify account or API token of its own. Billing is the same either way: per successful row, never for errors.

Otherwise copy this prompt into Claude, ChatGPT, Cursor or any MCP-enabled assistant:

```text
I want UK property listings, prices and estate agent contacts from OnTheMarket using the Apify Actor `sian.agency/onthemarket-property-scraper`.

Use it when I need: UK listings for sale, to rent or new-build, from any town, city, county or postal district. Every row carries the asking price as a number, the address, bedrooms and bathrooms, property type, coordinates, photos and the marketing estate agent's name and phone number. Switch on full property details and each row also carries the postcode, tenure, EPC rating and its assessment date, council tax band, measured broadband speed, nearest stations and schools, floorplans and the complete description.

Don't use it when: the property is not on OnTheMarket, or you need sold prices — use rightmove-property-scraper or zoopla-property-scraper or smart-idealista-scraper instead.

How to call it: give `locations` a list of OnTheMarket location slugs (`london`, `manchester`, `e14`) and pick a `channel` of `for-sale`, `to-rent` or `new-homes`. Narrow with `minPrice`, `maxPrice`, `minBedrooms`, `maxBedrooms`, `propertyType`, `radius`, `keywords` or `addedSince` (`24-hours` is the cheap way to run it on a schedule). `includeDetails` adds EPC, tenure, council tax band, stations and schools for an extra charge per property. To expand properties you already have, set `operation` to `detail` and pass `propertyUrls`; to reuse a search you built on the site, or to sweep one estate agent's whole book, paste the URL into `searchUrls`.

Start with this input:
{
  "operation": "search",
  "channel": "for-sale",
  "locations": [
    "manchester"
  ],
  "minPrice": 200000,
  "maxPrice": 400000,
  "minBedrooms": 2,
  "maxResults": 100
}

Ask me which UK area and channel they want, their budget and bedroom range, and whether they need the EPC and tenure detail fields, then run the Actor and summarise the results as a table.
```

**Things you can ask your agent for:**

- *Pull every 2-3 bed flat to rent in E14 added in the last 24 hours and rank them by monthly rent.*
- *Find all for-sale properties in Bath with an EPC rating of D or worse so I can build a retrofit prospect list.*
- *Scrape the Connells Watford branch and tell me how many new instructions they took this week.*

Machine-readable API, MCP config and OpenAPI definition for this Actor are published at [apify.com/sian.agency/onthemarket-property-scraper.md](https://apify.com/sian.agency/onthemarket-property-scraper.md).

### 📋 Overview

**OnTheMarket lists property that never reaches the other portals** — agents often post there first, and some list there exclusively. This Actor reads it the way a data team wants it read: one row per property, typed values, no HTML.

**What you get:**

- ✅ **The UK fields that decide a deal**: tenure, EPC rating *and* its assessment date, council tax band, measured broadband speed, nearest stations with distances and rail lines, nearest schools. Five of the eight OnTheMarket scrapers on the Store return the listing card and stop.
- ⚡ **30 properties per request**: a whole town in seconds, and a 1,000-property sweep in under a minute.
- 🎯 **Typed values, not scraped text**: `price` arrives as `525000`, not `"Offers in excess of £525,000"`. Latitude and longitude are floats. Bedrooms is an integer.
- 💰 **No charge for failures**: you pay per property returned. Error rows cost nothing.
- 💎 **Estate agent contacts on every row**: branch name, phone number, postal address and branch URL — the lead data, attached to the stock.
- ✨ **Sale, rent and new homes**: one Actor, all three channels, the same output shape.

***

### ✨ Features

- 🔍 **Search any UK location**: towns, cities, counties and postal districts — `london`, `manchester`, `e14`, `sw1a`, `milton-keynes`.
- 🏷️ **For sale, to rent or new homes**: switch channel, keep the same columns.
- 🎛️ **Filters that match the site's own**: price range, bedroom range, property type, radius, keyword, and "added in the last 24 hours".
- 📄 **Optional full detail**: turn on one switch to add EPC, tenure, council tax, broadband, stations, schools, floorplans and the complete description.
- 🏢 **Estate agent branch sweeps**: paste a branch URL and get that agent's entire book.
- 🌐 **Paste any OnTheMarket search URL**: every filter in the URL is honoured, including ones this form does not expose.
- 📍 **Coordinates on every row**: map it, geofence it, join it to your own boundaries.
- 📮 **Postcode and country** on detail rows — the join key for every other UK dataset.
- 🔢 **A hard row budget**: set `maxResults` and the run stops there. No surprise bills.
- 🚫 **Adverts filtered out**: sponsored slots in the results list are dropped, never billed as properties.

***

### 🎬 Quick Start

Pick an operation, give it a location, press Start. The Actor paginates, parses and writes one row per property to your dataset — then saves an HTML run report next to it.

```bash
curl -X POST "https://api.apify.com/v2/acts/sian.agency~onthemarket-property-scraper/runs?token=YOUR_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"operation":"search","channel":"for-sale","locations":["manchester"],"maxResults":100}'
```

***

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Choose your channel

Pick **For sale**, **To rent** or **New homes**.

#### Step 2: Name your locations

Type the location slug the way OnTheMarket writes it in its own URL — `manchester`, `bristol`, `e14`. Add several to sweep a region in one run.

#### Step 3: Set a row budget and run

`maxResults` caps the whole run. Turn on **Add full property details** if you need EPC, tenure and council tax band.

**That's it! In under a minute, you'll have:**

- One clean row per property, ready for CSV or Excel
- Estate agent name and phone number on every row
- An HTML report showing exactly what you were charged for

***

### 📥 Input Configuration

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `operation` | string | No | `search` (default) or `detail` |
| `channel` | string | No | `for-sale`, `to-rent` or `new-homes` |
| `locations` | array | No | OnTheMarket location slugs, e.g. `["london","manchester"]` |
| `searchUrls` | array | No | Full OnTheMarket search or agent-branch URLs |
| `propertyUrls` | array | No | Property URLs for the `detail` operation |
| `maxResults` | integer | No | Whole-run row budget (default 100) |
| `includeDetails` | boolean | No | Add EPC, tenure, council tax, stations, schools |
| `minPrice` / `maxPrice` | integer | No | Price bounds in pounds (pcm for rentals) |
| `minBedrooms` / `maxBedrooms` | integer | No | Bedroom bounds |
| `propertyType` | string | No | `detached`, `terraced`, `flats-apartments`, … |
| `radius` | integer | No | Miles around the location |
| `keywords` | string | No | Listing must mention this word, e.g. `garden` |
| `addedSince` | string | No | `24-hours`, `3-days`, `7-days`, `14-days` |
| `includeUnderOffer` | boolean | No | Include stock already under offer |
| `sortBy` | string | No | `recommended`, `newest`, `price-high`, `price-low` |

**Example — a filtered sale search:**

```json
{
  "operation": "search",
  "channel": "for-sale",
  "locations": ["manchester", "bristol"],
  "minPrice": 200000,
  "maxPrice": 400000,
  "minBedrooms": 2,
  "propertyType": "semi-detached",
  "sortBy": "newest",
  "maxResults": 500
}
```

**Example — full detail for specific properties:**

```json
{
  "operation": "detail",
  "propertyUrls": [
    "https://www.onthemarket.com/details/19275782/"
  ]
}
```

***

### 📤 Output

Results are saved to the Apify dataset with **40+ fields** including:

| Field | Type | Description |
|-------|------|-------------|
| `propertyId` | string | OnTheMarket's own listing ID |
| `price` | number | Asking price, or monthly rent for rentals |
| `priceQualifier` | string | "Offers in excess of", "Guide price", … |
| `address` | string | Display address |
| `postcode` | string | Full postcode *(detail rows)* |
| `propertyType` | string | Semi-detached house, Flat, Terraced house, … |
| `bedrooms` / `bathrooms` | number | Room counts |
| `tenure` | string | Freehold / Leasehold *(detail rows)* |
| `epcRating` | string | A–G energy rating *(detail rows)* |
| `councilTaxBand` | string | Band A–H *(detail rows)* |
| `broadbandSpeedMbps` | number | Measured max download *(detail rows)* |
| `latitude` / `longitude` | number | Coordinates |
| `addedOrReduced` | string | "Added yesterday", "Reduced", … |
| `agentName` / `agentPhone` | string | Marketing branch and its phone number |
| `nearestStations` | array | Name, distance and rail lines *(detail rows)* |
| `imageUrls` | array | Every photo on the listing |

**Example row:**

```json
{
  "propertyId": "19638202",
  "propertyTitle": "3 bedroom terraced house for sale",
  "url": "https://www.onthemarket.com/details/19638202/",
  "price": 365000,
  "priceText": "£365,000",
  "channel": "for-sale",
  "address": "Furber Road, Bristol",
  "propertyType": "Terraced house",
  "bedrooms": 3,
  "bathrooms": 1,
  "latitude": 51.453959,
  "longitude": -2.522341,
  "addedOrReduced": "Added > 14 days",
  "agentName": "Connells - Kingswood, Bristol",
  "agentPhone": "0117 295 3066",
  "agentUrl": "https://www.onthemarket.com/agents/branch/connells-kingswood-bristol/",
  "imageCount": 5,
  "features": ["Tenure: Freehold", "Three bedroom terraced home", "Off-street parking"],
  "status": "success"
}
```

***

### 💼 Use Cases & Examples

#### 1. New-Stock Alerts for Buyers and Investors

**A buying agent who needs to see new instructions the morning they land.**

**Input:** one location, `addedSince: "24-hours"`, on a daily schedule
**Output:** only the properties added since yesterday
**Use:** Bristol drops from 3,477 properties to 28, so the run costs pennies and every row is genuinely new.

#### 2. Estate Agent Lead Generation

**An agency selling services to estate agents.**

**Input:** a county or city, a few hundred rows
**Output:** every listing with its marketing branch name, phone number and branch URL
**Use:** group by agent to rank who is winning instructions in that patch, with a live phone number attached.

#### 3. Competitor Stock Monitoring

**An estate agent tracking a rival branch.**

**Input:** the rival's branch URL in `searchUrls`
**Output:** that agent's entire book, for sale or to rent
**Use:** run weekly and diff the results to see every new instruction, price reduction and withdrawal.

#### 4. Buy-To-Let and Yield Modelling

**A landlord sizing up a postcode.**

**Input:** the same area run twice — once `for-sale`, once `to-rent`, same bedroom filter
**Output:** both halves of a gross-yield calculation for the same streets
**Use:** turn on full details and every row also carries tenure, EPC and council tax band.

#### 5. EPC and Retrofit Targeting

**A retrofit, insulation or heat-pump business building a prospect list.**

**Input:** a region with `includeDetails: true`
**Output:** every property with its EPC rating and assessment date
**Use:** filter to D, E, F and G — the stock facing the tightening rental efficiency floor.

#### 6. Property Market Analysis

**An analyst tracking asking prices over time.**

**Input:** a fixed set of locations on a weekly schedule
**Output:** a time series of asking prices, price qualifiers and days-on-market labels
**Use:** measure how long stock sits and how often it is reduced, by area and property type.

#### 7. Proptech and AI Agent Data Feeds

**A product that needs live UK listings behind it.**

**Input:** the API or MCP call, on demand
**Output:** typed JSON with coordinates and postcodes
**Use:** the postcode joins straight to any other UK dataset — Land Registry, census, flood risk.

***

### 🔗 Integration Examples

#### JavaScript/Node.js

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('sian.agency/onthemarket-property-scraper').call({
  operation: 'search',
  channel: 'for-sale',
  locations: ['manchester'],
  minBedrooms: 2,
  maxResults: 200,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]);
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')

run = client.actor('sian.agency/onthemarket-property-scraper').call(
    run_input={
        'operation': 'search',
        'channel': 'to-rent',
        'locations': ['e14'],
        'addedSince': '24-hours',
    }
)

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item['address'], item['price'])
```

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~onthemarket-property-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"operation":"search","locations":["bristol"],"maxResults":100}'
```

#### Automation Workflows (N8N / Zapier / Make)

1. **Trigger**: a daily schedule
2. **HTTP Request**: call the Actor with `addedSince: "24-hours"`
3. **Process**: filter the returned rows on your own criteria
4. **Action**: write to a sheet, post to Slack, or start an outreach sequence

***

### 📊 Performance & Pricing

#### FREE Tier (Try It Now)

- **25 properties** per run — every field, every filter, same quality
- No credit card required
- Enough to check the output shape against your own pipeline

#### PAID Tier (Production Ready)

- **Unlimited** properties per run
- 30 properties per request — a 1,000-row sweep finishes in under a minute
- Pay-per-result: charged per property returned, never for an error row

💰 **You are charged for what you receive.** Full property details are a separate, optional add-on — leave the switch off and you pay for listing rows only.

🔗 [View current pricing](https://apify.com/sian.agency/onthemarket-property-scraper?fpr=sian)

***

### ❓ Frequently Asked Questions

**Q: Do I need an API key, a proxy or a login?**
A: No. Give it a location and press Start.

**Q: How many properties can one search return?**
A: About 1,020. OnTheMarket stops paginating at page 34 of 30 rows. The result counter on the site will say 50,000, but those rows are not reachable by anyone. To go wider, add locations, narrow the price band, or split by property type.

**Q: Which locations work?**
A: Any slug OnTheMarket itself uses — towns, cities, counties and postal districts. Copy it out of the site's own URL. An unknown slug returns a clear error row instead of silently scraping nothing.

**Q: What does "Add full property details" cost?**
A: It reads each property's own page, so it bills one Property Detail event per property on top of the listing row. It is the only way to get EPC, tenure, council tax band and the full description — the search page does not carry them.

**Q: Does it cover rentals as well as sales?**
A: Yes, and new homes too. Rental prices come back as the monthly figure, with the formatted string keeping the weekly equivalent alongside it.

**Q: Can I get sold prices or price history?**
A: No. OnTheMarket publishes live listings, not a sold-price archive. If a price changes between runs you can derive the reduction yourself, and each row says when it was last reduced.

**Q: Are estate agent email addresses included?**
A: No, because OnTheMarket does not publish them — enquiries route through its own contact form. You get the branch name, phone number, postal address and branch URL.

**Q: What output formats are available?**
A: JSON, CSV and Excel — export directly from the Apify dataset.

***

### 🐛 Troubleshooting

**"is not a location OnTheMarket knows"**

- Open OnTheMarket, search for the place, and copy the slug out of the address bar.
- `leeds` works; `leeds-city-centre` does not. Use the broader slug and a radius.

**A search returns fewer rows than the site claims**

- OnTheMarket caps every search at 34 pages of 30 rows. That ceiling is the site's, not the Actor's.
- Split the search: add locations, tighten the price band, or filter by property type.

**EPC, tenure or council tax band are empty**

- Those live on the property page. Turn on **Add full property details**.
- Some agents simply do not supply them. A field the agent left as "Ask agent" is returned empty rather than as a fake value.

**A rental price looks wrong**

- Rentals are returned as the monthly (pcm) figure. The weekly figure stays in `priceText`.

**The run stopped before my row budget**

- On the FREE tier a run stops at 25 properties. Add credits for unlimited rows.

***

### ⚖️ Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the **GDPR** in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

OnTheMarket is a trademark of OnTheMarket plc. This actor is not affiliated with, endorsed by, or sponsored by OnTheMarket.

***

### 🤝 Support

[![Telegram Support](https://img.shields.io/badge/Telegram-Support%20Group-0088cc?logo=telegram)](https://t.me/+vyh1sRE08sAxMGRi)

**Join our active support community**

- For issues or questions, open an issue in the actor's repository
- Check [SIÁN Agency Store](https://apify.com/sian.agency?fpr=sian) for more automation tools
- 📧 <apify@sian-agency.online>

***

**Built by [SIÁN Agency](https://www.sian-agency.online)** | **[More Tools](https://apify.com/sian.agency?fpr=sian)**

# Actor input Schema

## `operation` (type: `string`):

Pick one per run. Property Search returns listing rows for any UK location, filter set or estate-agent branch; Property Detail takes OnTheMarket property URLs and returns the full record including EPC, tenure, council tax band, broadband, stations and schools.

## `locations` (type: `array`):

OnTheMarket location slugs to search, exactly as they appear in the site's own URL: london, manchester, bristol, edinburgh, cardiff, milton-keynes. Postal districts work too: e14, sw1a, m1. One search runs per location, so three locations return roughly three times the rows — and that is how you get past the ~1,020-property ceiling OnTheMarket puts on any single search.

## `channel` (type: `string`):

Which OnTheMarket channel to search. For-sale prices are the asking price; to-rent prices are monthly (pcm) with the weekly figure kept alongside.

## `maxResults` (type: `integer`):

Stop after this many properties across all locations. Each search request returns up to 30 rows, so the run stops at the first page that crosses your limit.

## `includeDetails` (type: `boolean`):

Read each property's own page to add EPC rating and date, tenure, council tax band, broadband speed, nearest stations and schools, floorplans and the full description. Costs one extra request per property and bills the Property Detail event on top of the search row. Leave it off and you pay for listing rows only.

## `propertyUrls` (type: `array`):

Used by the Property Detail operation: OnTheMarket property URLs to expand, e.g. https://www.onthemarket.com/details/19275782/. A bare property ID works too.

## `searchUrls` (type: `array`):

Paste OnTheMarket search URLs instead of filling the fields below, and every filter in the URL is read straight off it — including filters this form does not expose, such as auction, retirement or shared-ownership. Estate-agent branch URLs work here too (https://www.onthemarket.com/agents/branch/<branch>/properties/), which returns that agent's whole stock.

## `minPrice` (type: `integer`):

Lowest price to include, in pounds. For rentals this is the monthly (pcm) figure. 0 means no lower bound.

## `maxPrice` (type: `integer`):

Highest price to include, in pounds. For rentals this is the monthly (pcm) figure. 0 means no upper bound.

## `minBedrooms` (type: `integer`):

Fewest bedrooms to include. 0 means no lower bound.

## `maxBedrooms` (type: `integer`):

Most bedrooms to include. 0 means no upper bound.

## `propertyType` (type: `string`):

Restrict to one property type. To combine several, paste a search URL with a repeated prop-types parameter instead — OnTheMarket takes prop-types=detached\&prop-types=terraced, and silently ignores a comma-separated list.

## `radius` (type: `integer`):

Widen the search to this many miles around the location. 0 searches the location itself only.

## `keywords` (type: `string`):

Only return properties whose listing mentions this word, e.g. garden, garage, annexe, sea view. Leave empty to take everything.

## `addedSince` (type: `string`):

Only properties added to OnTheMarket in this window. This is the cheap way to run the actor on a schedule: 'Last 24 hours' on Bristol cut 3,477 properties to 28, so you pay for new stock only.

## `includeUnderOffer` (type: `boolean`):

Add properties already under offer or sold subject to contract. Useful for market analysis — it roughly doubles the result set — and noise if you are hunting available stock.

## `sortBy` (type: `string`):

'Most recent' is what you want for monitoring, because the newest stock lands on page 1 and your row budget is spent on it. 'Recommended' is OnTheMarket's own default and puts promoted listings first.

## Actor input object example

```json
{
  "operation": "search",
  "locations": [
    "london",
    "manchester",
    "bristol"
  ],
  "channel": "for-sale",
  "maxResults": 100,
  "includeDetails": false,
  "propertyUrls": [],
  "searchUrls": [],
  "minPrice": 0,
  "maxPrice": 0,
  "minBedrooms": 0,
  "maxBedrooms": 0,
  "propertyType": "any",
  "radius": 0,
  "keywords": "",
  "addedSince": "any",
  "includeUnderOffer": false,
  "sortBy": "recommended"
}
```

# Actor output Schema

## `onthemarketProperties` (type: `string`):

Every property this run returned — one row per listing, search and detail rows in the same shape.

## `scrapingSummary` (type: `string`):

HTML summary showing successful and failed results with key metrics

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "operation": "search",
    "locations": [
        "london",
        "manchester",
        "bristol"
    ],
    "channel": "for-sale",
    "maxResults": 100,
    "includeDetails": false,
    "propertyUrls": [],
    "searchUrls": [],
    "minPrice": 0,
    "maxPrice": 0,
    "minBedrooms": 0,
    "maxBedrooms": 0,
    "propertyType": "any",
    "radius": 0,
    "keywords": "",
    "addedSince": "any",
    "includeUnderOffer": false,
    "sortBy": "recommended"
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/onthemarket-property-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "operation": "search",
    "locations": [
        "london",
        "manchester",
        "bristol",
    ],
    "channel": "for-sale",
    "maxResults": 100,
    "includeDetails": False,
    "propertyUrls": [],
    "searchUrls": [],
    "minPrice": 0,
    "maxPrice": 0,
    "minBedrooms": 0,
    "maxBedrooms": 0,
    "propertyType": "any",
    "radius": 0,
    "keywords": "",
    "addedSince": "any",
    "includeUnderOffer": False,
    "sortBy": "recommended",
}

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/onthemarket-property-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "operation": "search",
  "locations": [
    "london",
    "manchester",
    "bristol"
  ],
  "channel": "for-sale",
  "maxResults": 100,
  "includeDetails": false,
  "propertyUrls": [],
  "searchUrls": [],
  "minPrice": 0,
  "maxPrice": 0,
  "minBedrooms": 0,
  "maxBedrooms": 0,
  "propertyType": "any",
  "radius": 0,
  "keywords": "",
  "addedSince": "any",
  "includeUnderOffer": false,
  "sortBy": "recommended"
}' |
apify call sian.agency/onthemarket-property-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,sian.agency/onthemarket-property-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/jnyhAavmwslXbvzzg/builds/C50SsbNjTGNC1NQQe/openapi.json
