Zoopla API
Read-only live access to Zoopla public property listings, listing details, sold house prices, and estate-agent search results. Search routes accept Zoopla location slugs and preserve the source's page and filter parameters.
Endpoint health
Loading verification…
Connect your agent
Connect through MCP so your agent can find this API, read its docs, and call its endpoints.
Add the server from your terminal.
claude mcp add --transport http agent-data https://agent-data.motie.dev/mcpIn Claude Code, run /mcp, select agent-data, then Authenticate. Sign in to your agent-data account in the browser.
Then ask your agent to use the Zoopla API for your task.
Call it over HTTP
Get an API keySign up free, generate an API key, and set it as AGENT_DATA_API_KEY in your environment. Your first 100 calls each month are free.
curl --request GET --get 'https://api.agent-data.dev/zoopla-co-uk/v1/properties/for-sale' \
--header "Authorization: Bearer $AGENT_DATA_API_KEY"Endpoints
Inputs and response fields for every endpoint in this API.
GETProperties for sale/v1/properties/for-sale
Search Properties For Sale
Input
locationOptionalQuery · string, default: londonZoopla location slug, such as london or west-yorkshire/leeds.
Example: london
pageOptionalQuery · integer, min: 1, default: 1One-based Zoopla result page.
Example: 1
radiusOptionalQuery · number, min: 0, max: 40 | nullSearch radius in miles; 0 means the selected area only.
Example: 5
max_bedsOptionalQuery · integer, min: 0, max: 20 | nullMaximum bedrooms.
Example: 4
min_bedsOptionalQuery · integer, min: 0, max: 20 | nullMinimum bedrooms.
Example: 2
max_priceOptionalQuery · integer, min: 0 | nullMaximum asking price in GBP.
Example: 750000
min_priceOptionalQuery · integer, min: 0 | nullMinimum asking price in GBP.
Example: 250000
property_typeOptionalQuery · string | nullZoopla property type slug, such as houses or flats.
Example: houses
Response
pageintegerlistingsobject[]listings[].tags?string[]listings[].price?string | nulllistings[].summary?string | nulllistings[].listedOn?string | nulllistings[].agentName?string | nulllistings[].amenities?string[]listings[].detailUrlstringlistings[].listingIdstringlistings[].displayAddress?string | nulllocationstringtotalResultsintegerFields marked ? are optional.
GETProperties to rent/v1/properties/to-rent
Search Properties To Rent
Input
locationOptionalQuery · string, default: londonZoopla location slug, such as london or west-yorkshire/leeds.
Example: london
pageOptionalQuery · integer, min: 1, default: 1One-based Zoopla result page.
Example: 1
radiusOptionalQuery · number, min: 0, max: 40 | nullSearch radius in miles; 0 means the selected area only.
Example: 5
max_bedsOptionalQuery · integer, min: 0, max: 20 | nullMaximum bedrooms.
Example: 4
min_bedsOptionalQuery · integer, min: 0, max: 20 | nullMinimum bedrooms.
Example: 2
max_priceOptionalQuery · integer, min: 0 | nullMaximum rent in GBP for the source's default frequency.
Example: 3000
min_priceOptionalQuery · integer, min: 0 | nullMinimum rent in GBP for the source's default frequency.
Example: 1000
property_typeOptionalQuery · string | nullZoopla property type slug, such as houses or flats.
Example: houses
Response
pageintegerlistingsobject[]listings[].tags?string[]listings[].price?string | nulllistings[].summary?string | nulllistings[].listedOn?string | nulllistings[].agentName?string | nulllistings[].amenities?string[]listings[].detailUrlstringlistings[].listingIdstringlistings[].displayAddress?string | nulllocationstringtotalResultsintegerFields marked ? are optional.
GETProperties by listing id/v1/properties/{listing_id}
Get Property Listing Details
Input
listing_idRequiredPath · stringZoopla numeric property listing ID.
Example: 73745526
Response
titlestringcountsobjectcounts.numBedrooms?integer | nullcounts.numBathrooms?integer | nullcounts.numLivingRooms?integer | nullsectionstringbranchV2objectingestedobjectlocationobjectlistingIdstring | integeradTargetingobjectpropertyTypestringdisplayAddressstringmetaDescriptionstringFields marked ? are optional.
GETHouse prices/v1/house-prices
Search Sold House Prices
Input
locationOptionalQuery · string, default: londonZoopla location slug, such as london or west-yorkshire/leeds.
Example: london
pageOptionalQuery · integer, min: 1, default: 1One-based Zoopla sold-price result page.
Example: 1
max_bedsOptionalQuery · integer, min: 0, max: 20 | nullMaximum bedrooms.
Example: 4
min_bedsOptionalQuery · integer, min: 0, max: 20 | nullMinimum bedrooms.
Example: 2
max_bathsOptionalQuery · integer, min: 0, max: 20 | nullMaximum bathrooms.
Example: 3
min_bathsOptionalQuery · integer, min: 0, max: 20 | nullMinimum bathrooms.
Example: 1
property_typeOptionalQuery · string | nullZoopla sold-price type code (D detached, S semi-detached, T terraced, F flats) or matching label.
Example: D
Response
pageintegerresultsobject[]results[].datestringresults[].priceintegerresults[].address?string | nullresults[].propertyType?string | nulllocationstringpageInfoobjectpageInfo.endCursorstringpageInfo.hasNextPagebooleanpageInfo.startCursorstringpageInfo.hasPreviousPagebooleantotalResultsintegerFields marked ? are optional.
GETEstate agents/v1/estate-agents
Search Estate Agents
Input
locationOptionalQuery · string, default: londonZoopla location slug, such as london or west-yorkshire/leeds.
Example: london
pageOptionalQuery · integer, min: 1, default: 1One-based Zoopla estate-agent result page.
Example: 1
Response
totalintegeragentsobject[]agents[].idintegeragents[].logo?object | nullagents[].namestringagents[].uriNamestringagents[].featured?boolean | nullagents[].description?string | nullagents[].displayNamestringagents[].contactNumber?string | nullagents[].displayAddressstringagents[].listingsStatistics?object | nulllocationstringpaginationobjectpagination.pageTotalintegerpagination.pageNumberintegerFields marked ? are optional.
Don’t see the endpoint you need?
Ask agent-data to add an endpoint or return more fields. Extensions are free and keep existing endpoints working.
An account is required to submit an extension. Prepare your request, then sign in to build.