Get OnTheMarket data with one API
The OnTheMarket API returns UK real-estate listings as clean JSON.
3 active endpoints, on 0, 2 and 3 credit tiers.
- POST/onthemarket/v1/location_search
- POST/onthemarket/v1/search
- POST/onthemarket/v1/property_detail
What OnTheMarket endpoints does ReefAPI ship?
3 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.
OnTheMarket API
3 of 3 endpoints, ready to run
Resolve a text location (town, postcode, borough, area) to OnTheMarket location slug(s).
// Press "Try it" and this pane shows exactly what the // live site returned this second — including an empty // result, if that is the truth. No key, no account.
How the OnTheMarket API works
OnTheMarket is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.
No OAuth app, no request signing, no per-site account. One key covers all 185 engines.
Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.
Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.
One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.
OnTheMarket price fields, and why some rows have almost nothing in them
Prices behave differently in the two channels and differently between search and property_detail, and every page of 30 results can contain sponsored rows that look like broken listings. These values were read from live for-sale and to-rent searches plus a property_detail call on 2026-08-27.
| Field | for-sale | to-rent | Note |
|---|---|---|---|
| property_id | "19648142" | "18159214" | 8 digits for a real listing. Sponsored rows carry a short 4-digit id such as "1689". |
| price_display | "£695,000" | "£1,625 pcm (£375 pw)" | Formatted text. The rental string packs monthly and weekly rent into one value. |
| price_short | "£695k" | "£1,625" | Abbreviated display text. |
| price_amount | absent on search rows | absent on search rows | The numeric price exists only on property_detail, which returned 695000 for the same listing. |
| price_qualifier | "Guide price" or null | null on every row sampled | Free text from the agent, not a fixed list. null means no qualifier was set. |
| added | "Added today", "Reduced today", "Added > 14 days" | "Added today", "Added < 14 days" | A human phrase, not a date. Use added_within_days to filter by recency. |
| features[0] | "Tenure: Share of freehold" | - | Tenure is usually first in features on a sale listing; property_detail returns it properly in key_info. |
| total_results vs count | 8933 vs 30 | 2071 vs 30 | total_results is the market-wide match count; count is what came back on this page. |
Sponsored developer adverts are returned inside items[] alongside real listings. They have a short property_id, an agent block, images under an /agent-products/in-market-ads/ path, and null for title, price_display, bedrooms, address, latitude, longitude and details_url. A Manchester to-rent page of 30 contained 2 of them. Filter on details_url being non-null to get properties only.
What people build with OnTheMarket
The jobs this data is most often used for.
endpoints
credits per call
Property portals call location_search then search to list properties in an area.
Dashboards use property_detail to enrich a listing.
Analysts use search to track UK inventory over time.
What OnTheMarket data costs
The cheapest call here is 0 credits, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.
Full pricing →- 1,000 free credits on signup, no card
- One key, all 185 APIs, one credit pool
- Failed and blocked calls are never charged
- Credits roll over and never expire
Call it in two lines
Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.
curl -X POST https://api.reefapi.com/onthemarket/v1/location_search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"London"}'import requests
r = requests.post(
"https://api.reefapi.com/onthemarket/v1/location_search",
headers={"x-api-key": REEF_KEY},
json={
"query": "London"
},
)
print(r.json()["data"])Have a question? We got answers.
The questions people actually ask before wiring up OnTheMarket.
Get a free key →Why do some items have a property_id but null for price, address and bedrooms?▾
Those are sponsored developer adverts, not properties, and OnTheMarket mixes them into the results grid. They are easy to spot: the property_id is short ("1689", "2448", "2598" rather than an 8-digit listing id), details_url is null, every listing field is null, and the images sit under an /agent-products/in-market-ads/ path. A Manchester to-rent search returned 2 of them inside a page of 30 on 2026-08-27. Filtering on details_url being non-null removes them cleanly.
Where is the numeric price? I only get "£695,000" as a string.▾
search rows carry price_display and price_short only, and price_amount is not present on them at all. property_detail does return it: the same listing came back with price_display "£695,000" and price_amount 695000 on 2026-08-27. If you are only doing search, parse the display string, or filter server-side with price_min and price_max, which do take integers in GBP.
How is rent represented?▾
As one formatted string holding both periods: price_display "£1,625 pcm (£375 pw)", with price_short "£1,625" carrying the monthly figure alone. For the to-rent channel, price_min and price_max are monthly rent in pounds, not annual and not weekly. price_qualifier was null on every rental row sampled, since qualifiers are a sales-market thing.
What is price_qualifier, and what values can it take?▾
It is the agent's wording next to the asking price. "Guide price" is what showed up on live London flats, and null is common, meaning the agent set no qualifier rather than that the field failed. It is free text from the listing rather than a fixed set, so treat any string as valid and match loosely if you are grouping on it. property_detail returns the same field alongside a price_coming_soon flag.
Is `added` a date I can sort on?▾
No. added is a human phrase. "Added today", "Reduced today", "Added < 14 days" and "Added > 14 days" were all returned on 2026-08-27, and everything older collapses into one bucket. To work with recency, use added_within_days, which maps to the nearest window the site supports (1, 3, 7 or 14 days), and sort with sort: "newest". Anything finer than 14 days is not exposed.
Does the search include Sold STC and Under Offer properties?▾
Not by default. The response echoes back what it asked for in filters_applied, and a plain for-sale search showed "under-offer": false on 2026-08-27. Set include_under_offer to true to bring those listings in. The same echo is useful for debugging generally, since it shows exactly how your location, price, bedroom and property-type filters were translated, including the location slug that was resolved.
Why does total_results not match the number of items I got?▾
total_results is how many listings match your filters across the whole market; count is how many rows this response contains. A London flats search from £400k to £900k with 2+ beds returned total_results 8933 with count 30, and a Manchester 2-bed rental search returned 2071 with count 30. Pages are 30 listings each, max_pages merges up to 42 of them in one call, and stop_reason tells you why fetching stopped, "max_pages" when you hit your own limit.
What happens if I pass a channel value the API does not know?▾
channel is one of the few parameters here that rejects rather than ignores. Sending channel "purchase" returned INVALID_PARAM with detail.allowed listing every accepted value: for-sale, to-rent, buy, sale, rent, lettings. So buy and sale are aliases of for-sale, and rent and lettings of to-rent. Most other filters (price, beds, property_type, radius, sort, keywords) ignore an invalid value, meaning a bad value silently drops the filter and widens your result set instead of erroring.
How do I get the right location slug?▾
Call location_search first and pass a match's location_id into search as location_id. A postcode district resolves cleanly: "SW9" returned exactly one match with location_id "sw9" on 2026-08-27. Broad names are looser, and "London" resolves to the slug "london", which the echoed filters_applied reported with location-type "country". Pair a slug with radius, in miles from the 0, 0.25, 0.5, 1, 3, 5, 10, 15, 20 and 30 set, when you want a ring around a point rather than an administrative area.
What is the OnTheMarket API?▾
OnTheMarket API is a ReefAPI endpoint group for onthemarket It returns live JSON through POST requests under /onthemarket/v1.
Is the OnTheMarket API free to try?▾
Yes. ReefAPI starts with 1,000 free credits, no card required. OnTheMarket calls use the same shared credit balance as every other ReefAPI engine.
Do I need an OnTheMarket login or account?▾
No login to OnTheMarket is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the OnTheMarket data?▾
The page example is captured from a live location_search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the OnTheMarket API use?▾
OnTheMarket actions currently cost 1-3 credits per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.
11 Real Estate APIs on the same key
One key, one credit pool, one response envelope. If you are pulling OnTheMarket, you are one call away from the rest of the category — no second contract, no second integration.
Try it on your own data before you pay anything
The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 184 APIs, and the same envelope everywhere.
Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts.