Listingrail
Live sale and rental listings from Zillow, Realtor.com, Rightmove, Idealista, ImmoScout24 and 13 more property portals in one JSON schema. Tools: list_sources, search_listings. 100 free listings with an email key.
Hosted MCP Server
npx add-mcp 'https://listingrail.com/mcp'Installs into Claude Code, Codex, Cursor and more
Documentation
Listingrail API
Search live sale and rental listings on 18 portals (20 sources, rent and sale) and get every listing back in the same shape. Base address https://listingrail.com. The interactive reference with every request and response model is at /reference; the same models as an OpenAPI file are at /openapi.json, and a summary for AI assistants at /llms.txt.
Quick start
Get a free key on the home page, then:
import requests
r = requests.post(
"https://listingrail.com/v1/listings/search",
headers={"Authorization": "Bearer " + KEY},
json={"source": "idealista", "location": "madrid", "type": "rent", "limit": 50},
timeout=180,
)
r.raise_for_status()
for home in r.json()["listings"]:
print(home["price"], home["currency"], home["address"])
A search answers with the listings and your credit balance:
{
"source": "rightmove",
"location": "SW11",
"count": 1,
"credits_used": 1,
"credits_remaining": 99,
"listings": [
{
"id": "94216239",
"url": "https://www.rightmove.co.uk/properties/94216239",
"source": "rightmove",
"title": "1 bedroom apartment",
"address": "Battersea Power Station, London, SW11",
"city": null,
"region": null,
"postal_code": null,
"country": "GB",
"lat": 51.483057,
"lng": -0.14647,
"price": 3683,
"currency": "GBP",
"price_period": "month",
"beds": 1,
"rooms": null,
"baths": 1,
"area": null,
"area_unit": null,
"property_type": "Apartment",
"listed_at": "2026-10-12T16:45:35Z",
"photos": [
"https://media.rightmove.co.uk/property-photo/8d2f9326b/94216239/8d2f9326b00af02e053ec063a0693474.jpeg",
"https://media.rightmove.co.uk/property-photo/490c2b8ae/94216239/490c2b8aef60695a379d4aba312b248e.jpeg"
],
"agent": {
"name": "JOHNS&CO, Nine Elms",
"phone": "020 3907 3782",
"company": "JOHNS&CO"
}
}
]
}
The raw object is left out above; every listing carries one.
Keys and credits
Send your key as Authorization: Bearer <key> or X-API-Key: <key>. One credit is one listing returned. A request for more listings than you have credits returns as many as your credits cover, and below 20 credits the answer carries an upgrade_url; at zero credits the API answers 402 with the same link and the plan names. A search that fails at the portal is not charged. Paid plans renew their credits at the start of each billing month; the free 100 credits are given once.
Endpoints
| Method and path | What it does |
|---|---|
POST /v1/listings/search | {source, location, type?, minPrice?, maxPrice?, minBeds?, limit}, limit 1 to 500 (default 20). |
POST /v1/listings/details | {source, url}: one listing by link (Craigslist, Redfin rentals). |
GET /v1/sources | Portals, countries, sale or rent, accepted filters. |
POST /v1/monitors | Save a search to be checked for changes. |
GET /v1/monitors | Your monitors with their last report, and how many your plan holds. |
GET /v1/monitors/{id}/changes | New, removed and price-changed listings from the last check. |
DELETE /v1/monitors/{id} | Delete a monitor and free its slot. |
GET /v1/account, GET /v1/usage | Plan, balance and recent requests. |
Portals
| source | Country | Listings | location takes |
|---|---|---|---|
zillow | US | sale | City and state, ZIP code or Zillow search link, e.g. 'Austin, TX' |
realtor | US | sale, rent | City and state, ZIP code, county or address, e.g. 'Austin, TX' or '78704' |
zillow-rentals | US | rent | City and state or ZIP code, e.g. 'Austin, TX' |
redfin | US | sale | City and state, e.g. 'Miami, FL' |
redfin-rentals | US | rent | City and state, e.g. 'San Francisco, CA' |
zumper | US | rent | City and state, e.g. 'San Francisco, CA' (sent as the slug san-francisco-ca) |
padmapper | US, CA | rent | City and state or province, e.g. 'Toronto, ON' |
apartments-com | US | rent | City and state, e.g. 'Austin, TX' |
craigslist | US | rent, sale | Craigslist site code, e.g. 'sfbay', 'newyork', 'losangeles' |
rightmove | GB | sale, rent | UK town, area, outcode or postcode, or a Rightmove search link (for price and bedroom filters) |
idealista | ES, IT, PT | sale, rent | Place name ('madrid', 'roma, it', 'lisboa, pt') or an Idealista search link (for price filters) |
immobilienscout24 | DE | rent, sale | German city or district, e.g. 'Berlin' or 'München' (apartments) |
kleinanzeigen | DE | rent, sale | German city as written in Kleinanzeigen links, e.g. 'berlin', 'hamburg' (apartments) |
fotocasa | ES | sale, rent | Spanish city, e.g. 'madrid', or a Fotocasa search link (for price filters) |
daft | IE | rent, sale | Irish place as written in Daft links, e.g. 'dublin-city', 'cork', or 'ireland' |
otodom | PL | rent, sale | Polish city ('Warszawa', 'Kraków', 'Wrocław' and other large cities), a region path from an Otodom link ('mazowieckie/warszawa'), or 'cala-polska' (apartments) |
imovirtual | PT | sale, rent | Portuguese place as written in Imovirtual links, e.g. 'lisboa', 'porto' (apartments) |
hemnet | SE | sale | A hemnet.se search link, or a Hemnet location id (Stockholm is 17744) |
bayut | AE | rent, sale | UAE city, e.g. 'dubai', 'abu-dhabi', or a Bayut search link (for areas and filters) |
propertyfinder | AE | sale, rent | UAE area or community, e.g. 'Dubai Marina', or a Property Finder search link |
Rightmove and Idealista take no price or bedroom filters here; set them on the portal and pass the search link as location.
Listing fields
| Field | Type | Meaning |
|---|---|---|
id | string | The portal's own listing id. |
url | string | Link to the listing on the portal. |
source | string | Portal key, as in /v1/sources. |
title | string | null | Building name or listing headline. |
address | string | null | Street address as the portal shows it. |
city, region, postal_code | string | null | Where the portal gives them separately. |
country | string | ISO 3166 code. |
lat, lng | number | null | Coordinates. |
price | number | null | Asking price, or the lowest rent of a building. |
currency | string | ISO 4217 code. |
price_period | "month" | null | Set for rentals. |
beds, baths | number | null | 0 beds means a studio. |
rooms | number | null | Total rooms where the portal counts rooms, not bedrooms (Germany, Poland, Sweden, Portugal). |
area, area_unit | number | null, "sqft" | "sqm" | Living area. |
property_type | string | null | As the portal names it. |
listed_at | string | null | ISO date the listing appeared, where shown. |
photos | string[] | Image links, where the portal gives full links. |
agent | {name, phone, company} | Agent, agency or property manager as shown. |
raw | object | Every field the portal returned, unchanged. |
A field a portal does not show is null. Which portal fills which field is shown on the home page.
Monitors
A monitor stores a search and checks it once a day. The first check records what is listed; each later check compares by listing id and reports new listings, listings that are gone, and price changes. Each check costs one credit per listing it reads. A free key or Starter holds 1 monitor, Pro 3, Scale 10; the monitor plans hold 3 and 20 and come with a dashboard to read and export the changes.
{
"source": "zumper",
"location": "Austin, TX",
"filters": {
"type": "rent",
"maxPrice": 2000,
"limit": 50
},
"webhook_url": "https://you.example/hooks/listings"
}
When something changed, the report is also POSTed to webhook_url (public https addresses only). A check that returns fewer listings than the last one reports the missing ones as removed, so keep limit above the number of listings the search usually has.
AI agents (MCP)
The same search is a remote MCP server at https://listingrail.com/mcp (streamable HTTP), so Claude, ChatGPT, Cursor or your own agent can look up listings with your key. It has two tools: list_sources (free) and search_listings (source, location, type, limit up to 50, filters with minPrice, maxPrice, minBeds). Credits work as in the API: one per listing returned, nothing for a failed portal read. The raw object is left out to keep answers short.
Claude Code:
claude mcp add --transport http listingrail https://listingrail.com/mcp \
--header "Authorization: Bearer re_your_key"
Cursor, VS Code and other clients that take a server list:
{
"mcpServers": {
"listingrail": {
"url": "https://listingrail.com/mcp",
"headers": {
"Authorization": "Bearer re_your_key"
}
}
}
}
Clients that take only a link (a custom connector in ChatGPT or claude.ai) can use https://listingrail.com/mcp?key=re_your_key. Anyone who sees that link can spend your credits, so do not share it, and prefer the header where the client allows one.
Errors
| Status | Meaning and what to do |
|---|---|
| 401 | Missing or unknown key. Send it as a Bearer token. |
| 402 | No credits left. The body has upgrade_url and plans; wait for the renewal or buy a pack or plan. |
| 422 | The body is invalid; the answer names the field. |
| 429 | More than 5 requests a second on one key. Retry after a second. |
| 502 | The portal could not be read just now. Nothing was charged; retry in a minute. |
Limits
- Up to 500 listings per request. Larger pulls: page by price range or area, or ask about a delivered dataset.
- Requests can take up to two minutes on large searches; set your client timeout to 180 seconds.
- Listings are what each portal shows a visitor at request time. Results and order can differ between two requests.