- Data
- MCP server
- Sourcing
- Search land or units by criteria
Search land or units by criteria
sourcing_searchFind land parcels or residential units matching investment criteria, with the registered owner attached where the bulk register knows it; open space and utility land excluded by default.
Same call over REST
Sourcing search/v1/sourcing/searchNot connected yet? Connect your assistant. Sign in with your MarketCode account; no API key needed.
Reference
What sourcing_search answers
The sourcing tool. Give a place or a bounding box and the criteria that matter, and get back the parcels or units that match, ranked, with ownership attached where the HM Land Registry corporate and overseas registers know it. Land is filtered by use class and built coverage (footprint as a share of plot, so 0.2 finds substantially empty plots); units by type, bedrooms, EPC band and tenure; either by owner, where min_years_owned is the classic off-market signal and owner_types separates companies from public bodies. It costs 8 credits because the response carries licensed parcel and ownership records.
The full description, as the assistant reads it
STRATEGY MODE (preferred). Pass a strategy key from sourcing_strategies with lad_code or postcode_district, and the search runs the published preset: its filters, its ranking, and a score_components breakdown on every row saying which term earned what. Override any published filter with strategy_overrides — {"min_yield_pct": 8} — or pass null for a key to switch that filter off. An unknown key is rejected rather than ignored. listing_state restricts to on- or off-market units; page with cursor from next_cursor. Strategy mode ignores the legacy filters below.
Filter land by use class and max_built_coverage (built footprint as a share of plot, so 0.2 finds substantially empty plots), units by type, bedrooms, EPC band and tenure, and either by owner — min_years_owned is the usual off-market signal, and owner_types separates companies from public bodies.
Returns parcels with ownership attached where the bulk register knows it. Use sourcing_owners to resolve a specific set afterwards.
PARKS, HEATHS, RAILWAYS, CEMETERIES AND UTILITY LAND ARE EXCLUDED BY DEFAULT. The scan is ordered by parcel size, and the largest parcels in any area are its open spaces — unfiltered, a Camden search returned Regent's Park, Hampstead Heath, a cemetery and railway land as its top six, while 13,047 residential parcels in the same borough never appeared. Pass include_undevelopable=True to see them; they come back with no indicative land value, because a residual on a heath is a meaningless number that reads as an authoritative one.
Some land constraints (green belt, brownfield register, conservation area, flood zone) are accepted but NOT YET ENFORCED — the backing columns are still being populated. When you pass one, the response names it under filters_not_yet_enforced; treat those results as unfiltered on that dimension and say so rather than implying the constraint was applied.
UK only.
Reference
When to use it, and when not to
Use it to build a shortlist: under-built land in a borough, EPC F and G flats a landlord must fix or sell, units not sold in fifteen years, parcels held by dissolved companies. Then sourcing_owners resolves the owners of the ones you pick, site_appraisal assembles the dossier for the best of them, and planning_designations confirms the constraints. plot_utilisation is the narrower land-only version when coverage is the only question.
Inputs
Before you call it
A location (a place or area name) or a bbox, and asset as land or units. Everything else is a filter; start broad and tighten, because a search that returns nothing has still been charged.
- postcode_district
- Give a postcode district ("SW11") or a postcode area ("SW"). Auction records carry a postcode rather than an area id, so there is no
area_idpath here and no lookup to make first. - location
- Coordinates are WGS84 latitude and longitude, the order a map gives them. A postcode is accepted wherever
locationis, and is usually the easier input.
Example
An example call to sourcing_search
Use the MarketCode tool sourcing_search with {"asset":"land","location":"Lewisham","max_built_coverage":0.2,"limit":3} and show me the result.{
"columns": [
{
"key": "<string>",
"label": "<string>"
}
],
"rows": [
{
"id": "<string>",
"inspire_id": "<string>",
"area_m2": 0,
"land_id": "<string>",
"title_number": null,
"land_name": "<string>",
"landuse": "<string>",
"built_coverage_ratio": 0,
"tenure": null,
"last_land_sale_date": null,
"last_land_sale_price": null,
"local_authority": null,
"owner_name": null,
"owner_type": null,
"company_number": null,
"owned_since": null,
"proprietor_service_address": null,
"oh_property_address": null,
"company_status": null,
"gdv_psm": 0,
"asset": "<string>",
"score": 0,
"score_breakdown": {
"coverage": 0,
"tenure": 0,
"owner": 0,
"distress": 0
},
"signals": [
"<string>"
],
"opportunity": false,
"rlv": 0,
"rlv_per_m2": 0,
"rlv_detail": {
"rlv": 0,
"rlv_per_m2": 0,
"gdv": 0,
"units": 0,
"viable": false,
"assumptions": {
"gdv_psm": 0,
"build_cost_psm": 0,
"region": "<string>",
"regional_multiplier": 0,
"dwellings_per_ha": 0,
"profit_on_gdv_pct": 0
},
"basis": "<string>"
}
}
],
"geojson": {
"type": "<string>",
"features": [
{
"type": "<string>",
"geometry": {
"type": "<string>",
"coordinates": "<string>"
},
"properties": {
"id": "<string>",
"inspire_id": null,
"area_m2": 0,
"land_id": "<string>",
"title_number": null,
"land_name": "<string>",
"landuse": "<string>",
"built_coverage_ratio": null,
"tenure": null,
"last_land_sale_date": null,
"last_land_sale_price": null,
"local_authority": null,
"owner_name": null,
"owner_type": null,
"company_number": null,
"owned_since": null,
"proprietor_service_address": null,
"oh_property_address": null,
"company_status": null,
"gdv_psm": 0,
"asset": "<string>",
"score": 0,
"signals": "<string>",
"opportunity": false,
"rlv": 0,
"rlv_per_m2": 0
}
}
]
},
"meta": {
"asset": "<string>",
"resolved_area": {
"id": "<string>",
"name": "<string>",
"type": "<string>"
},
"count": 0,
"truncated": false,
"filter_warnings": []
},
"credits_charged": 0
}Shape only. This call returns licensed records, so the keys are real and every value is a placeholder of its type.
Inputs
Arguments sourcing_search takes
| Name | Type | Required | Description |
|---|---|---|---|
| asset | string | No | One of: land, unitsDefault: land |
| location | string | No | |
| bbox | any | No | |
| landuse | string[] | No | |
| max_built_coverage | number | No | |
| property_types | string[] | No | |
| min_beds | integer | No | |
| max_beds | integer | No | |
| epc_in | string[] | No | |
| tenure | string | No | |
| owner_types | string[] | No | |
| exclude_owner_types | string[] | No | |
| require_owner | boolean | No | Default: false |
| min_years_owned | integer | No | |
| company_status | string[] | No | |
| min_score | integer | No | |
| min_rlv | integer | No | |
| opportunities_only | boolean | No | Default: false |
| include_undevelopable | boolean | No | Default: false |
| limit | integer | No | Default: 50 |
| strategy | string | No | |
| strategy_overrides | object | No | |
| lad_code | string | No | |
| postcode_district | string | No | |
| listing_state | string | No | One of: any, live, live_sale, live_rent, off_market |
| cursor | string | No |
Response
What comes back
| Field | Type |
|---|---|
| columns | array |
| columns[].key | string |
| columns[].label | string |
| rows | array |
| rows[].id | string |
| rows[].inspire_id | string |
| rows[].area_m2 | number |
| rows[].land_id | string |
| rows[].title_number | null |
| rows[].land_name | string |
| rows[].landuse | string |
| rows[].built_coverage_ratio | number |
| rows[].tenure | null |
| rows[].last_land_sale_date | null |
| rows[].last_land_sale_price | null |
| rows[].local_authority | null |
| rows[].owner_name | null |
| rows[].owner_type | null |
| rows[].company_number | null |
| rows[].owned_since | null |
| rows[].proprietor_service_address | null |
| rows[].oh_property_address | null |
| rows[].company_status | null |
| rows[].gdv_psm | number |
| rows[].asset | string |
| rows[].score | integer |
| rows[].score_breakdown | object |
| rows[].score_breakdown.coverage | number |
| rows[].score_breakdown.tenure | integer |
| rows[].score_breakdown.owner | number |
| rows[].score_breakdown.distress | integer |
| rows[].signals | array |
| rows[].opportunity | boolean |
| rows[].rlv | integer |
| rows[].rlv_per_m2 | number |
| rows[].rlv_detail | object |
| rows[].rlv_detail.rlv | integer |
| rows[].rlv_detail.rlv_per_m2 | number |
| rows[].rlv_detail.gdv | integer |
| rows[].rlv_detail.units | integer |
| rows[].rlv_detail.viable | boolean |
| rows[].rlv_detail.assumptions | object |
| rows[].rlv_detail.assumptions.gdv_psm | integer |
| rows[].rlv_detail.assumptions.build_cost_psm | integer |
| rows[].rlv_detail.assumptions.region | string |
| rows[].rlv_detail.assumptions.regional_multiplier | integer |
| rows[].rlv_detail.assumptions.dwellings_per_ha | integer |
| rows[].rlv_detail.assumptions.profit_on_gdv_pct | number |
| rows[].rlv_detail.basis | string |
| geojson | object |
| geojson.type | string |
| geojson.features | array |
| geojson.features[].type | string |
| geojson.features[].geometry | object |
| geojson.features[].geometry.type | string |
| geojson.features[].geometry.coordinates | string |
| geojson.features[].properties | object |
| geojson.features[].properties.id | string |
| geojson.features[].properties.inspire_id | null |
| geojson.features[].properties.area_m2 | number |
| geojson.features[].properties.land_id | string |
| geojson.features[].properties.title_number | null |
| geojson.features[].properties.land_name | string |
| geojson.features[].properties.landuse | string |
| geojson.features[].properties.built_coverage_ratio | null |
| geojson.features[].properties.tenure | null |
| geojson.features[].properties.last_land_sale_date | null |
| geojson.features[].properties.last_land_sale_price | null |
| geojson.features[].properties.local_authority | null |
| geojson.features[].properties.owner_name | null |
| geojson.features[].properties.owner_type | null |
| geojson.features[].properties.company_number | null |
| geojson.features[].properties.owned_since | null |
| geojson.features[].properties.proprietor_service_address | null |
| geojson.features[].properties.oh_property_address | null |
| geojson.features[].properties.company_status | null |
| geojson.features[].properties.gdv_psm | number |
| geojson.features[].properties.asset | string |
| geojson.features[].properties.score | integer |
| geojson.features[].properties.signals | string |
| geojson.features[].properties.opportunity | boolean |
| geojson.features[].properties.rlv | integer |
| geojson.features[].properties.rlv_per_m2 | number |
| meta | object |
| credits_charged | integer |
Fields observed in the example response above; a field the example did not exercise is not listed.
Reference
Things that catch people out
- Parks, heaths, railways, cemeteries and utility land are excluded by default. The scan is ordered by parcel size and the largest parcels in any area are its open spaces: unfiltered, a Camden search returned Regent's Park, Hampstead Heath, a cemetery and railway land as its top six while thirteen thousand residential parcels never appeared. Pass
include_undevelopableto see them; they come back with no indicative land value. - Some constraints are accepted before they are enforced. Green belt, brownfield register, conservation area and flood zone filters are accepted, but where their backing columns are still being populated the response names them under
filters_not_yet_enforced. Treat those results as unfiltered on that dimension and check the shortlist withplanning_designations. - Ownership is companies, public bodies and overseas entities. Individually owned titles come back unresolved;
require_ownerrestricts to parcels where the register does name one. - Coverage is measured on about 41% of parcels. A coverage ceiling excludes parcels with no measurement rather than counting them as empty.
Usage
How to run sourcing_search in your assistant
Ask your assistant in plain English, for example:
"Use the MarketCode tool sourcing_search for <address or area>.
Show the result and the credits charged."
The arguments the assistant will send, for the example on this page:
{"asset":"land","location":"Lewisham","max_built_coverage":0.2,"limit":3}The connect steps for Claude, ChatGPT, Codex, Cursor and Claude Code are on the MCP page.
Skills
Skills that use sourcing_search
- Property research: A sourced answer to any UK property question: the right tool for the job, the credit cost stated first, the wording rules that keep an estimate an estimate.
- Site and unit sourcing: A shortlist of land or units matching your criteria, scored, with the registered owner resolved for each and a recipient list ready for outreach.
Price and licence
What it costs, and where the data comes from
sourcing_search costs 8 credits per successful call over MCP and over REST, and the two surfaces share one credit balance.
The price covers licensed records in the response, from HM Land Registry, Ordnance Survey, Ministry of Housing, Communities and Local Government, planning.data.gov.uk and Companies House. A call that fails is not charged.
Credits are granted on sign-up and bought in packs; the pricing page lists every call.
Sources
- HM Land Registry
Commercial and Corporate Ownership (CCOD) and Overseas Companies Ownership (OCOD)
HM Land Registry's dataset licence for CCOD and OCOD: free of charge, with conditions on onward use · England and Wales
- Ordnance Survey
National Geographic Database (buildings, land and sites)
Used under licence from Ordnance Survey · Great Britain
- Ministry of Housing, Communities and Local Government
Energy Performance Certificates (domestic and non-domestic)
MHCLG's EPC open data terms · England and Wales
- planning.data.gov.uk
National planning designations and the local planning authority register
Open Government Licence v3 · England
- Companies House
Company register, officers and persons with significant control
Free to use under Companies House terms; Crown copyright · UK
Related
Tools used with sourcing_search
- Owners of sourced parcels5 credits
sourcing_ownersResolve registered owners for parcels returned by `sourcing_search`.Pairs with this - Site appraisal dossier5 credits
site_appraisalEverything known about ONE site, assembled and judged — the site dossier.Pairs with this - Plot utilisation of land parcels6 credits
plot_utilisationLand parcels by size and how much of them is built on. Set `max_built_coverage` to 0.2 to find largely undeveloped plots.Pairs with this - Planning designations at a locationFree
planning_designationsEvery planning designation affecting a location, in one call: conservationPairs with this - Proprietor profile5 credits
owner_profileWhat the Land Registry shows for one proprietor: titles held, company status, country of incorporation, directors and PSCs where known.Pairs with this - The nine sourcing strategies, with readinessFree
sourcing_strategiesThe nine sourcing strategies as data — read this BEFORE running `sourcing_search` in strategy mode. Each preset publishes its thesis, its filters (every key overridable, with the default and the unit), its ranking components with weights and scales, the feature columns it reads, the data gaps that limit it, and its version.Named in the description
Glossary
Terms used here
- Tenure (freehold and leasehold): How a property is held: freehold outright, or leasehold for a fixed term under a lease from the freeholder; recorded on every registered sale and every title.
- Article 4 direction: A direction by a local planning authority withdrawing specified permitted development rights in an area, so work that is normally automatic needs a planning application.
- Green belt: Land around cities designated to prevent urban sprawl, where new building is inappropriate except in defined circumstances; one of the designations MarketCode checks live.
- Brownfield land: Previously developed land; local authorities keep a register of brownfield sites suitable for housing, which MarketCode reads as a designation.
- Plot utilisation (built coverage): The share of a land parcel covered by building footprint; a low figure on a large parcel is the signature of an under-built site.
FAQ
Questions about sourcing_search
How much does `sourcing_search` cost?
+
sourcing_search costs 8 credits per successful call over MCP and over REST, and the two surfaces share one credit balance. The price covers licensed records in the response, from HM Land Registry, Ordnance Survey, Ministry of Housing, Communities and Local Government, planning.data.gov.uk and Companies House. A call that fails is not charged.
Which assistants can run `sourcing_search`?
+
Any MCP client: Claude (claude.ai, Claude Desktop, Claude Code), ChatGPT in developer mode, Codex and Cursor, each documented on the MCP page. You sign in with your MarketCode account over OAuth; there is no key to paste, and the connection is read-only.
Where does the data come from?
+
Read from HM Land Registry ownership registers, Ordnance Survey NGD, Ministry of Housing, Communities and Local Government EPC register, planning.data.gov.uk and Companies House company register, officers and persons with significant control. Coverage is England and Wales.
Can I store or republish the results?
+
The response includes records we license from HM Land Registry, Ordnance Survey, Ministry of Housing, Communities and Local Government, planning.data.gov.uk and Companies House. Use them in your own analysis, reports and products; bulk redistribution of the raw records or building a competing dataset from them is not covered. Ask us if you need a redistribution licence.
Does `sourcing_search` change anything?
+
No. The tool is annotated read-only on the server, so it never writes to your data or ours and an assistant can call it without a confirmation step.
What is the difference between sourcing_search and plot_utilisation?
+
plot_utilisation returns land parcels by size and coverage for an area id and nothing else. sourcing_search adds use class, ownership, tenure, EPC and unit filters, a location or bounding box, opportunity scoring and an indicative land value, and returns units as well as land.
Why did my search return nothing?
+
The filters were too tight, or the constraint you relied on is not yet enforced and the coverage or ownership filter removed everything. Loosen one filter at a time; the response reports which filters applied.
Can I get the owners in the same call?
+
Where the bulk register knows the owner, it is attached to the parcel. sourcing_owners resolves a chosen set in one call afterwards and is the step before an outreach list.
Try sourcing_search in your assistant.
30-minute call. We'll connect your assistant live on a real address.