Bayut + Property Finder
UAE Real Estate API documentation
One API for listings, agents, agencies and transactions from Bayut and Property Finder. Every request names its portal
with platform, and the endpoints are the same for both. Product overview and
plans: UAE Real Estate API. This page is separate
from the Property Finder API documentation, which is a different API.
Base URL, keys and the platform parameter
Base URL: https://uae-real-estate-api.p.rapidapi.com. All endpoints are GET.
The API is sold on RapidAPI: subscribe, copy your key, and send these two headers with every request.
{
"x-rapidapi-key": "YOUR_API_KEY",
"x-rapidapi-host": "uae-real-estate-api.p.rapidapi.com"
} Choosing the portal
- Bayut: send
platform=other, the name RapidAPI lists for the Bayut source.platform=bayutis accepted too. - Property Finder: send
platform=propertyfinder. - Every Bayut response comes back with "platform": "other". That is the Bayut data: treat other as Bayut in your code.
Responses and errors
Every success is JSON wrapped in success, platform and
data. Inside data, each portal keeps its own field names, listed under each endpoint below.
{
"success": true,
"platform": "other",
"data": { ... }
}
A missing or invalid parameter returns 400 with the problem listed under
error.issues. Asking a portal for data it does not have also returns a 400, with
"error": "PLATFORM_LIMITATION", instead of an empty result.
{
"success": false,
"error": {
"issues": [
{ "code": "custom", "message": "PropertyFinder requires 'location' parameter.", "path": ["location"] }
],
"name": "ZodError"
}
} {
"success": false,
"message": "Agent details is not available for PropertyFinder. Use /search-agents to find agents or /agent-properties to view their listings.",
"error": "PLATFORM_LIMITATION"
} Which id goes where
Ids belong to one portal. Pass them back to the same platform they came from.
| From | Field | Use as |
|---|---|---|
/search-properties (Bayut) | externalID | /property-details property_id |
/search-properties (Property Finder) | property_id | /property-details property_id |
/search-agents (Bayut) | agent_external_id | /agent-details and /agent-properties agent_id |
/search-agents (Property Finder) | id | /agent-properties agent_id |
/search-agencies (Bayut) | externalID | /agency-details and /agency-properties agency_id |
/search-agencies (Property Finder) | id | /agency-properties agency_id |
/autocomplete | location_id | location_id on the same portal |
/autocomplete
BothFind a location
Locations matching a name, each with the portal's own location id, its path and coordinates.
| Parameter | Required | Values | Notes |
|---|---|---|---|
| platform | yes | other (Bayut), propertyfinder | bayut is accepted too. Bayut responses say "platform": "other". |
| query | yes | text, e.g. Dubai Marina, JBR |
Returns
- Both:
data: a list of{location_id, name, type, path, coordinates}
- Location ids belong to one portal: a Bayut id does not work on Property Finder, and the other way round.
- You rarely need this call:
/search-properties,/search-agents,/search-agenciesand/get-transactionsall take alocationname.
curl --request GET \
--url 'https://uae-real-estate-api.p.rapidapi.com/autocomplete?platform=other&query=Dubai+Marina' \
--header 'x-rapidapi-host: uae-real-estate-api.p.rapidapi.com' \
--header 'x-rapidapi-key: YOUR_API_KEY' /search-properties
BothSearch listings
Listings for rent or sale in one location, with filters, sorting and paging.
| Parameter | Required | Values | Notes |
|---|---|---|---|
| platform | yes | other (Bayut), propertyfinder | bayut is accepted too. Bayut responses say "platform": "other". |
| purpose | yes | rent, buy | |
| location | see notes | area name, e.g. Dubai Marina | Resolved to the portal's location id for you. Required on Property Finder. |
| location_id | see notes | id from /autocomplete | Skips the name lookup. Bayut only: on Property Finder send location. |
| page | no | integer, default 1 | Starts at 1. |
| sort | no | popular (default), newest, price_low, price_high | |
| property_type | no | comma-separated: apartment, villa, townhouse, penthouse, office, shop, warehouse, hotel-apartment | |
| bedrooms | no | comma-separated, 0 = studio | e.g. 0,1,2 |
| bathrooms | no | comma-separated | |
| price_min | no | AED | |
| price_max | no | AED | |
| area_min | no | square feet | |
| area_max | no | square feet | |
| furnishing | no | furnished, unfurnished | |
| completion_status | no | ready, off_plan | |
| rent_frequency | no | yearly, monthly, weekly, daily | Rent only. Default yearly. |
Returns
- Both:
data:{properties, total, page, totalPages, hitsPerPage} - Bayut: Each listing has
id,externalID,title,price,rentFrequency,rooms,baths,area,location,agency,ownerAgent,completionStatus,furnishingStatus,amenities - Property Finder: Each listing has
property_id,property_type,price,bedrooms,bathrooms,size,location_tree,agent_details,broker_id,listed_date,property_url
- Send
locationorlocation_id. On Property Finder,location_idalone returns a 400 ("PropertyFinder requires 'location' parameter"). - The same search returns different totals on each portal, because they hold different listings. On 5 Nov 2026, 1-bedroom rentals in Dubai Marina: 2,158 on Bayut, 2,269 on Property Finder.
curl --request GET \
--url 'https://uae-real-estate-api.p.rapidapi.com/search-properties?platform=other&purpose=rent&location=Dubai+Marina&bedrooms=1' \
--header 'x-rapidapi-host: uae-real-estate-api.p.rapidapi.com' \
--header 'x-rapidapi-key: YOUR_API_KEY' /property-details
BothGet one listing
The full record for one listing: description, photos, amenities, agent and agency, permit details.
| Parameter | Required | Values | Notes |
|---|---|---|---|
| platform | yes | other (Bayut), propertyfinder | bayut is accepted too. Bayut responses say "platform": "other". |
| property_id | yes | Bayut: externalID; Property Finder: property_id | Both come from /search-properties. |
Returns
- Bayut:
data: the listing record (id,ownerID,purpose,price,rentFrequency,title,description,geography, ...) - Property Finder:
data.property:{id, property_type, price, title, location, images, agent, broker, bedrooms, bathrooms, size, amenities, completion_status, furnished, rera, description, ...}
- On Bayut, use the listing's
externalID, not itsid.
curl --request GET \
--url 'https://uae-real-estate-api.p.rapidapi.com/property-details?platform=other&property_id=EXTERNAL_ID' \
--header 'x-rapidapi-host: uae-real-estate-api.p.rapidapi.com' \
--header 'x-rapidapi-key: YOUR_API_KEY' /search-agents
BothSearch agents
Agents active in a location, or by name on Bayut.
| Parameter | Required | Values | Notes |
|---|---|---|---|
| platform | yes | other (Bayut), propertyfinder | bayut is accepted too. Bayut responses say "platform": "other". |
| query | no | agent name | Bayut only. |
| location | see notes | area name, e.g. Dubai Marina | Resolved to the portal's location id for you. Required on Property Finder. |
| location_id | see notes | id from /autocomplete | Skips the name lookup. Bayut only: on Property Finder send location. |
| purpose | no | rent, buy (default) | |
| category | no | residential (default), commercial | Bayut location searches only. |
| page | no | integer, default 1 | Starts at 1. |
Returns
- Bayut:
data:{agents, total, page, totalPages}; each agent hasagent_external_id,agent_name_en,agency_name_enand badge fields - Property Finder:
data:{agents, total, page}; each agent hasid,name,position,nationality,total_properties,broker_name
- Property Finder needs a
location: a name search alone returns a 400.
curl --request GET \
--url 'https://uae-real-estate-api.p.rapidapi.com/search-agents?platform=propertyfinder&location=Dubai+Marina' \
--header 'x-rapidapi-host: uae-real-estate-api.p.rapidapi.com' \
--header 'x-rapidapi-key: YOUR_API_KEY' /agent-details
Bayut onlyGet an agent's profile
An agent's profile: listing counts for sale and rent, agency, service areas, languages and contact options.
| Parameter | Required | Values | Notes |
|---|---|---|---|
| platform | yes | other (Bayut), propertyfinder | bayut is accepted too. Bayut responses say "platform": "other". |
| agent_id | yes | agent_external_id from /search-agents |
Returns
- Bayut:
data:{externalID, name, sale_count, rent_count, agency, service_areas, user_langs, isTruBroker, ...}
- On Property Finder this returns a 400 with
"error": "PLATFORM_LIMITATION". Use/search-agentsand/agent-propertiesthere instead.
curl --request GET \
--url 'https://uae-real-estate-api.p.rapidapi.com/agent-details?platform=other&agent_id=AGENT_EXTERNAL_ID' \
--header 'x-rapidapi-host: uae-real-estate-api.p.rapidapi.com' \
--header 'x-rapidapi-key: YOUR_API_KEY' /agent-properties
BothList an agent's listings
Every listing an agent has live.
| Parameter | Required | Values | Notes |
|---|---|---|---|
| platform | yes | other (Bayut), propertyfinder | bayut is accepted too. Bayut responses say "platform": "other". |
| agent_id | yes | Bayut: the agent's externalID; Property Finder: id from /search-agents | |
| page | no | integer, default 1 | Starts at 1. |
| sort | no | popular, newest, price_low, price_high | Property Finder only; ignored on Bayut. |
| transaction_type | no | sale, rental | Property Finder only; ignored on Bayut. |
Returns
- Bayut:
data:{properties, total, page, totalPages, hitsPerPage} - Property Finder:
data:{properties: {listings, total_count}, total, page}
- On Bayut, pass the agent's
externalID(theagent_external_idfrom/search-agents). Other ids return an empty list rather than an error, so checktotal.
curl --request GET \
--url 'https://uae-real-estate-api.p.rapidapi.com/agent-properties?platform=other&agent_id=AGENT_EXTERNAL_ID' \
--header 'x-rapidapi-host: uae-real-estate-api.p.rapidapi.com' \
--header 'x-rapidapi-key: YOUR_API_KEY' /search-agencies
BothSearch agencies and brokers
Agencies (Bayut) or brokers (Property Finder) in a location, or by name on Bayut. Both portals mean the same thing: the brokerage.
| Parameter | Required | Values | Notes |
|---|---|---|---|
| platform | yes | other (Bayut), propertyfinder | bayut is accepted too. Bayut responses say "platform": "other". |
| query | no | agency name | Bayut only. |
| location | see notes | area name, e.g. Dubai Marina | Resolved to the portal's location id for you. Required on Property Finder. |
| location_id | see notes | id from /autocomplete | Skips the name lookup. Bayut only: on Property Finder send location. |
| page | no | integer, default 1 | Starts at 1. |
Returns
- Bayut:
data:{agencies, total, page, totalPages, hitsPerPage}; each agency hasexternalID,name,agentsCount,location,stats - Property Finder:
data:{agencies, total, page}; each broker hasid,name,total_properties,address,location
- Property Finder needs a
location; name search is Bayut only.
curl --request GET \
--url 'https://uae-real-estate-api.p.rapidapi.com/search-agencies?platform=other&location=Dubai' \
--header 'x-rapidapi-host: uae-real-estate-api.p.rapidapi.com' \
--header 'x-rapidapi-key: YOUR_API_KEY' /agency-details
Bayut onlyGet an agency's profile
An agency's profile: licences, agent count, the areas it covers, listing counts and description.
| Parameter | Required | Values | Notes |
|---|---|---|---|
| platform | yes | other (Bayut), propertyfinder | bayut is accepted too. Bayut responses say "platform": "other". |
| agency_id | yes | externalID from /search-agencies |
Returns
- Bayut:
data:{externalID, name, agentsCount, licenses, locations, stats, description, ...}
- On Property Finder this returns
"error": "PLATFORM_LIMITATION".
curl --request GET \
--url 'https://uae-real-estate-api.p.rapidapi.com/agency-details?platform=other&agency_id=AGENCY_EXTERNAL_ID' \
--header 'x-rapidapi-host: uae-real-estate-api.p.rapidapi.com' \
--header 'x-rapidapi-key: YOUR_API_KEY' /agency-properties
BothList an agency's listings
Every listing an agency or broker has live.
| Parameter | Required | Values | Notes |
|---|---|---|---|
| platform | yes | other (Bayut), propertyfinder | bayut is accepted too. Bayut responses say "platform": "other". |
| agency_id | yes | Bayut: externalID; Property Finder: broker id | Both from /search-agencies. |
| page | no | integer, default 1 | Starts at 1. |
| sort | no | popular, newest, price_low, price_high | Property Finder only; ignored on Bayut. |
| transaction_type | no | sale, rental | Property Finder only; ignored on Bayut. |
Returns
- Bayut:
data:{properties, total, page, totalPages, hitsPerPage} - Property Finder:
data:{properties: {listings, total_count}, total, page}
curl --request GET \
--url 'https://uae-real-estate-api.p.rapidapi.com/agency-properties?platform=propertyfinder&agency_id=BROKER_ID' \
--header 'x-rapidapi-host: uae-real-estate-api.p.rapidapi.com' \
--header 'x-rapidapi-key: YOUR_API_KEY' /get-transactions
BothGet past transactions
Historical sale or rental transactions for a location, by property type and bedrooms, over 3 months to 2 years.
| Parameter | Required | Values | Notes |
|---|---|---|---|
| platform | yes | other (Bayut), propertyfinder | bayut is accepted too. Bayut responses say "platform": "other". |
| transaction_type | yes | sale, rental | |
| location | see notes | area name, e.g. Dubai Marina | Resolved to the portal's location id for you. |
| location_id | see notes | id from /autocomplete | Send location or location_id. |
| property_type | no | comma-separated, same values as /search-properties | Property Finder uses the first value only. |
| bedrooms | no | comma-separated | Property Finder uses the first value only. |
| sort | no | newest (default), oldest, price_high, price_low | |
| time_period | no | 3m, 6m, 1y (default), 2y | |
| page | no | integer, default 1 | Starts at 1. |
Returns
- Bayut:
data:{hits, nbHits, nbPages}; each hit hasdate_transaction_nk,transaction_amount,builtup_area_sqm,beds,bayut_leaf_location_name_en - Property Finder:
data.data.attributes:{transactions, summary, total_items}
- The two portals return different shapes here, so read them with separate code paths.
curl --request GET \
--url 'https://uae-real-estate-api.p.rapidapi.com/get-transactions?platform=propertyfinder&transaction_type=sale&location=Dubai+Marina&time_period=1y' \
--header 'x-rapidapi-host: uae-real-estate-api.p.rapidapi.com' \
--header 'x-rapidapi-key: YOUR_API_KEY' /health
n/aHealth check
Checks that the API is up. No parameters.
curl --request GET \
--url 'https://uae-real-estate-api.p.rapidapi.com/health' \
--header 'x-rapidapi-host: uae-real-estate-api.p.rapidapi.com' \
--header 'x-rapidapi-key: YOUR_API_KEY' Try it without writing code
Every endpoint is in the Postman collection (fork it from the public workspace and paste your key). Python and JavaScript examples are on GitHub. This page is also available as markdown for AI agents.
The UAE Real Estate API is an independent, third-party API from Happy Endpoint. It is not affiliated with or endorsed by Bayut or Property Finder.
Bayut and Property Finder in one API
Subscribe on RapidAPI, copy your key, and query both UAE portals with one parameter.