# 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`; the endpoints are the same for both. This is a different API from the Property Finder API documented at https://uaepropertyapi.com/documentation.

- Product page: https://uaepropertyapi.com/uae-real-estate-api
- Subscribe on RapidAPI: https://rapidapi.com/happyendpoint/api/uae-real-estate-api
- Postman collection: https://documenter.getpostman.com/view/56555678/2sBYHXRJR2
- Example code: https://github.com/happyendpointhq/uae-real-estate-api

## Base URL, keys and the platform parameter

Base URL: `https://uae-real-estate-api.p.rapidapi.com`. All endpoints are GET. Send `x-rapidapi-key` (your RapidAPI key) and `x-rapidapi-host: uae-real-estate-api.p.rapidapi.com` with every request.

- Bayut: send `platform=other`, the name RapidAPI lists for the Bayut source. `platform=bayut` is 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 `{"success": true, "platform": "...", "data": {...}}`. Inside `data`, each portal keeps its own field names (listed per endpoint below).

A missing or invalid parameter returns 400 with the problem under `error.issues`:

```json
{
  "success": false,
  "error": {
    "issues": [
      { "code": "custom", "message": "PropertyFinder requires 'location' parameter.", "path": ["location"] }
    ],
    "name": "ZodError"
  }
}
```

Asking a portal for data it does not have returns 400 with `PLATFORM_LIMITATION` instead of an empty result:

```json
{
  "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 |

## GET /autocomplete

**Find a location** (Both). 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}`

Notes:

- 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-agencies` and `/get-transactions` all take a `location` name.

```bash
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'
```

## GET /search-properties

**Search listings** (Both). 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`

Notes:

- Send `location` or `location_id`. On Property Finder, `location_id` alone 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.

```bash
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'
```

## GET /property-details

**Get one listing** (Both). 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, ...}`

Notes:

- On Bayut, use the listing's `externalID`, not its `id`.

```bash
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'
```

## GET /search-agents

**Search agents** (Both). 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 has `agent_external_id`, `agent_name_en`, `agency_name_en` and badge fields
- **Property Finder:** `data`: `{agents, total, page}`; each agent has `id`, `name`, `position`, `nationality`, `total_properties`, `broker_name`

Notes:

- Property Finder needs a `location`: a name search alone returns a 400.

```bash
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'
```

## GET /agent-details

**Get an agent's profile** (Bayut only). 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, ...}`

Notes:

- On Property Finder this returns a 400 with `"error": "PLATFORM_LIMITATION"`. Use `/search-agents` and `/agent-properties` there instead.

```bash
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'
```

## GET /agent-properties

**List an agent's listings** (Both). 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}`

Notes:

- On Bayut, pass the agent's `externalID` (the `agent_external_id` from `/search-agents`). Other ids return an empty list rather than an error, so check `total`.

```bash
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'
```

## GET /search-agencies

**Search agencies and brokers** (Both). 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 has `externalID`, `name`, `agentsCount`, `location`, `stats`
- **Property Finder:** `data`: `{agencies, total, page}`; each broker has `id`, `name`, `total_properties`, `address`, `location`

Notes:

- Property Finder needs a `location`; name search is Bayut only.

```bash
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'
```

## GET /agency-details

**Get an agency's profile** (Bayut only). 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, ...}`

Notes:

- On Property Finder this returns `"error": "PLATFORM_LIMITATION"`.

```bash
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'
```

## GET /agency-properties

**List an agency's listings** (Both). 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}`

```bash
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 /get-transactions

**Get past transactions** (Both). 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 has `date_transaction_nk`, `transaction_amount`, `builtup_area_sqm`, `beds`, `bayut_leaf_location_name_en`
- **Property Finder:** `data.data.attributes`: `{transactions, summary, total_items}`

Notes:

- The two portals return different shapes here, so read them with separate code paths.

```bash
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'
```

## GET /health

**Health check** (n/a). Checks that the API is up. No parameters.

```bash
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'
```

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. Contact: hello@happyendpoint.com

HTML version: https://uaepropertyapi.com/documentation/uae-real-estate-api
