How to get Property Finder listings in Python
By the end of this guide you have a CSV of Dubai Marina apartments for rent from Property Finder with yearly rent, size and agent, from one script you can run again tomorrow. Everything below was run on 16 October 2026; the output table is what it returned.
Why scraping Property Finder yourself breaks
- Property Finder's Enterprise API is for agencies on PF Expert and gives access to their own listings and leads. There is no public API for searching all listings.
- The search pages are rendered on the server with Next.js, so the listings sit in each page's __NEXT_DATA__ JSON rather than in a data feed.
- A place has to be matched to Property Finder's location tree before it can be searched.
None of that is impossible, but each point is code you then maintain. The rest of this guide uses Listingrail, which does the reading and hands back clean JSON. The Property Finder API page has the official options with sources.
1. Get a key
One request with your email returns a key with 100 free listings. It is shown once, so keep it in an environment variable.
curl -X POST https://listingrail.com/v1/signup \
-H "content-type: application/json" \
-d '{"email": "you@example.com"}'
export LISTINGRAIL_KEY=re_...2. Search and save to CSV
Install requests (pip install requests), then run:
import csv
import os
import requests
r = requests.post(
"https://listingrail.com/v1/listings/search",
headers={"Authorization": f"Bearer {os.environ['LISTINGRAIL_KEY']}"},
json={"source":"propertyfinder","location":"Dubai Marina","type":"rent","limit":50},
timeout=300,
)
r.raise_for_status()
listings = r.json()["listings"]
fields = ["price", "currency", "beds", "baths", "area", "address", "url"]
with open("propertyfinder-dubai-marina.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
writer.writerow(fields)
for home in listings:
writer.writerow([home[k] for k in fields])
print(len(listings), "listings saved to propertyfinder-dubai-marina.csv")The request body, on its own:
{
"source": "propertyfinder",
"location": "Dubai Marina",
"type": "rent",
"limit": 50
}Each listing returned costs one credit. A search that finds nothing, or fails at Property Finder, costs nothing. A request can take up to a minute or two, because Property Finder is read at that moment.
3. What comes back
The first three rows of the run on 16 October 2026:
Every listing has the same keys on all 17 portals, so the code for Property Finder reads the others too. Fields Property Finder does not show come back as null, and the portal's own record sits in raw. With pandas:
import pandas as pd
df = pd.DataFrame(listings)
df["agent"] = df["agent"].str.get("company")
print(df[["price", "beds", "baths", "area", "address", "agent"]].head())4. Get new listings and price cuts every day
Running the script on a schedule works, but then you compare the files yourself. A monitor stores the search, checks it once a day, and sends only what changed: new listings and price cuts. The free key holds one monitor.
requests.post(
"https://listingrail.com/v1/monitors",
headers={"Authorization": f"Bearer {os.environ['LISTINGRAIL_KEY']}"},
json={
"source": "propertyfinder",
"location": "Dubai Marina",
"filters": {"type":"rent"},
"webhook_url": "https://example.com/new-listings",
},
timeout=30,
)Changes can also be read with GET /v1/monitors/{id}/changes or downloaded as CSV. Plans and limits are on the monitors page.
Property Finder quirks worth knowing
- Pass a UAE area or community ("Dubai Marina", "Downtown Dubai") or a Property Finder search link.
- Rents are yearly: price_period is "year" and price is the annual rent in AED.
- area is in square metres (area_unit "sqm"); the site shows square feet, which is in raw.area_sqft.
- Every row names the agent, a phone number and the brokerage. listed_at is when the listing went live.
Questions
Does Property Finder have a public API?
No. The Enterprise API is for paying agencies managing their own listings.
Why is the rent so high?
UAE rents are yearly. Divide price by 12 for a monthly figure.
Does it cover Bayut too?
Yes, as "source": "bayut", in the same listing format.