Listingrail API
Search live sale and rental listings on 17 portals 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.
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; at zero credits the API answers 402. 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' |
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.
Errors
| Status | Meaning and what to do |
|---|---|
| 401 | Missing or unknown key. Send it as a Bearer token. |
| 402 | No credits left. Wait for the renewal or move to a larger 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.