# Bayut API

> Every Bayut endpoint on Cotlet: inputs, JSON Schema, cURL, Python and Node.js examples and an example response for each call.

Source: https://cotlet.dev/docs/api/bayut

Docs sections: [Get started](https://cotlet.dev/docs.md) · [REST API](https://cotlet.dev/docs/api.md) · [MCP](https://cotlet.dev/docs/mcp.md) · [SDKs & CLI](https://cotlet.dev/docs/sdks.md) · [Integrations](https://cotlet.dev/docs/integrations.md)

13 endpoints for Bayut. Each one is a POST with a JSON body, called with your API key.

- Base URL: `https://cotlet.dev/api/v1/bayut`
- Connects with: Your own Bayut Profolio agent account; you enter the sign-in code yourself
- Integration page: https://cotlet.dev/integrations/bayut-api-mcp-server

## Endpoints

| Endpoint | Access | Description |
|---|---|---|
| `list_listings` | read | Your listings from Manage Listings with status, quality score and badges, for Bayut or dubizzle. |
| `get_listing` | read | One listing: details, photos, floor plan, quality score and Checked and TruCheck badges. |
| `get_listing_insights` | read | Impressions, clicks and leads per listing, with a filter for low performing listings. |
| `list_leads` | read | Leads from Reports, Leads by channel, with the listing each one asked about. |
| `get_lead` | read | One lead with the contact details Profolio shows for its channel and the listing asked about. |
| `export_leads` | read | The Excel file Profolio exports from Reports, Leads, as a download link. |
| `get_traffic_report` | read | Top locations by impressions and overall listing performance across Bayut and dubizzle. |
| `get_credits` | read | Your Bayut Credits balance as Manage Listings shows it. |
| `get_market_insights` | read | Most searched communities and buildings, average rent and sale prices and the areas with the highest ROI. |
| `get_transactions` | read | Last sold transactions in Dubai from the Dubai Land Department, as in Transaction Insights. |
| `assign_floor_plan` | write | Link a floor plan from your uploads to a listing, as the floor plan icon does in Profolio. |
| `request_trucheck` | write | Submit up to 5 photos of a Checked property to request TruCheck validation. |
| `apply_boost` | write | Apply a Bayut boost (Signature, Hot, Property of the Week) or a dubizzle boost (Refresh, Featured) to a listing. |

## List listings

`POST https://cotlet.dev/api/v1/bayut/list_listings`

Access: read.

Lists your listings as Manage Listings shows them, for Bayut or for dubizzle. Each item carries the quality score colour, the Checked and TruCheck badges and whether a floor plan is waiting to be assigned. Pages hold up to 100 listings; pass next_cursor back as cursor for the next page.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `platform` | enum | no | bayut or dubizzle. Default: bayut. |
| `limit` | integer | no | 1 to 100. Default: 25. |
| `cursor` | string | no | Next page cursor from the previous call. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/bayut/list_listings \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"platform":"bayut","limit":100}'
```

**Python**

```python
result = client.call("bayut", "list_listings", {"platform":"bayut","limit":100})
```

**Node.js**

```js
const result = await cotlet.call('bayut', 'list_listings', {"platform":"bayut","limit":100});
```

**CLI**

```bash
cotlet call bayut list_listings --data '{"platform":"bayut","limit":100}'
```

### Example response

```json
{
  "listings": [
    {
      "listing_id": "DM-2214",
      "platform": "bayut",
      "title": "2BR in Dubai Marina, marina view",
      "quality_score": "orange",
      "badges": [
        "checked"
      ],
      "floor_plan_waiting": true
    },
    {
      "listing_id": "DM-2290",
      "platform": "bayut",
      "title": "Studio in JLT, furnished",
      "quality_score": "green",
      "badges": [
        "checked"
      ],
      "floor_plan_waiting": false
    }
  ],
  "next_cursor": null
}
```

## Get listing

`POST https://cotlet.dev/api/v1/bayut/get_listing`

Access: read.

Returns one listing with its price, purpose, photos, assigned floor plan, quality score and the badges it has today. Use it to check whether a TruCheck request went through. Read only.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `listing_id` | string | yes | Listing ID or your reference number, from list_listings. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/bayut/get_listing \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"listing_id":"listing_8c41d2"}'
```

**Python**

```python
result = client.call("bayut", "get_listing", {"listing_id":"listing_8c41d2"})
```

**Node.js**

```js
const result = await cotlet.call('bayut', 'get_listing', {"listing_id":"listing_8c41d2"});
```

**CLI**

```bash
cotlet call bayut get_listing --data '{"listing_id":"listing_8c41d2"}'
```

### Example response

```json
{
  "listing_id": "DM-2290",
  "platform": "bayut",
  "title": "Studio in JLT, furnished",
  "purpose": "rent",
  "price_aed": 62000,
  "photos": 14,
  "floor_plan": "assigned",
  "quality_score": "green",
  "badges": [
    "checked"
  ]
}
```

## Get listing insights

`POST https://cotlet.dev/api/v1/bayut/get_listing_insights`

Access: read.

Returns impressions, clicks and leads for each listing, as Listing Insights shows them for Bayut. Low performing means a lower click-through rate than similar listings on Bayut. Filters combine, and the listing ID filter accepts your reference number.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `low_performing_only` | boolean | no | Only listings with a lower click-through rate than similar listings. |
| `location` | string | no | Community or building name. |
| `status` | string | no | Listing status as shown in Profolio. |
| `purpose` | enum | no | sale or rent. Default: both. |
| `category` | string | no | Property category as shown in Profolio. |
| `reference` | string | no | Your reference number or listing ID. |
| `user` | string | no | Only listings of this user. |
| `cursor` | string | no | Next page cursor from the previous call. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/bayut/get_listing_insights \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"low_performing_only":true,"purpose":"rent","location":"Jumeirah Lake Towers"}'
```

**Python**

```python
result = client.call("bayut", "get_listing_insights", {"low_performing_only":True,"purpose":"rent","location":"Jumeirah Lake Towers"})
```

**Node.js**

```js
const result = await cotlet.call('bayut', 'get_listing_insights', {"low_performing_only":true,"purpose":"rent","location":"Jumeirah Lake Towers"});
```

**CLI**

```bash
cotlet call bayut get_listing_insights --data '{"low_performing_only":true,"purpose":"rent","location":"Jumeirah Lake Towers"}'
```

### Example response

```json
{
  "listings": [
    {
      "listing_id": "DM-2214",
      "location": "Dubai Marina",
      "purpose": "sale",
      "impressions": 1840,
      "clicks": 21,
      "leads": 1,
      "low_performing": true
    },
    {
      "listing_id": "DM-2290",
      "location": "JLT",
      "purpose": "rent",
      "impressions": 960,
      "clicks": 40,
      "leads": 3,
      "low_performing": false
    }
  ],
  "next_cursor": null
}
```

## List leads

`POST https://cotlet.dev/api/v1/bayut/list_leads`

Access: read.

Lists leads from all five channels Profolio reports: email, sms, phone, whatsapp and chat. Each lead names the listing of interest and the time it arrived. Pass lead_id to get_lead for the contact details. Pages hold up to 100 leads.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `channel` | enum | no | email, sms, phone, whatsapp or chat. Default: all. |
| `since` | datetime | no | Only leads received after this time. |
| `listing_id` | string | no | Only leads for this listing. |
| `limit` | integer | no | 1 to 100. Default: 50. |
| `cursor` | string | no | Next page cursor from the previous call. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/bayut/list_leads \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"since":"2026-10-11T04:00:00Z","limit":100}'
```

**Python**

```python
result = client.call("bayut", "list_leads", {"since":"2026-10-11T04:00:00Z","limit":100})
```

**Node.js**

```js
const result = await cotlet.call('bayut', 'list_leads', {"since":"2026-10-11T04:00:00Z","limit":100});
```

**CLI**

```bash
cotlet call bayut list_leads --data '{"since":"2026-10-11T04:00:00Z","limit":100}'
```

### Example response

```json
{
  "leads": [
    {
      "lead_id": "ld_40a1",
      "channel": "whatsapp",
      "listing_id": "DM-2214",
      "received_at": "2026-10-10T14:22:00Z"
    },
    {
      "lead_id": "ld_40a7",
      "channel": "whatsapp",
      "listing_id": "DM-2290",
      "received_at": "2026-10-10T18:05:00Z"
    }
  ],
  "next_cursor": null
}
```

## Get lead

`POST https://cotlet.dev/api/v1/bayut/get_lead`

Access: read.

Returns one lead. What it holds depends on the channel: the email address for email leads, the enquiry text for SMS leads, the phone number and the call recording for phone leads, and the message. Read only.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `lead_id` | string | yes | Lead ID from list_leads. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/bayut/get_lead \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"lead_id":"lead_8c41d2"}'
```

**Python**

```python
result = client.call("bayut", "get_lead", {"lead_id":"lead_8c41d2"})
```

**Node.js**

```js
const result = await cotlet.call('bayut', 'get_lead', {"lead_id":"lead_8c41d2"});
```

**CLI**

```bash
cotlet call bayut get_lead --data '{"lead_id":"lead_8c41d2"}'
```

### Example response

```json
{
  "lead_id": "ld_40a1",
  "channel": "whatsapp",
  "listing_id": "DM-2214",
  "name": "Sample Buyer",
  "phone": "+971500000000",
  "message": "Is the unit still available for viewing this week?",
  "received_at": "2026-10-10T14:22:00Z"
}
```

## Export leads

`POST https://cotlet.dev/api/v1/bayut/export_leads`

Access: read.

Runs the export option at the top right of Reports, Leads and returns the Excel file as a download link. Pass a channel to export one channel only. Read only: nothing in Profolio changes.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `channel` | enum | no | email, sms, phone, whatsapp or chat. Default: all. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/bayut/export_leads \
  -H "Authorization: Bearer $COTLET_API_KEY"
```

**Python**

```python
result = client.call("bayut", "export_leads")
```

**Node.js**

```js
const result = await cotlet.call('bayut', 'export_leads');
```

**CLI**

```bash
cotlet call bayut export_leads
```

### Example response

```json
{
  "channel": "whatsapp",
  "file": "bayut-leads.xlsx",
  "download_url": "https://files.cotlet.example/exports/bayut-leads.xlsx",
  "rows": 2
}
```

## Get traffic report

`POST https://cotlet.dev/api/v1/bayut/get_traffic_report`

Access: read.

Returns the Traffic report from Reports: the top locations by impressions and the overall performance of your listings, for Bayut and dubizzle. Read only.

### Parameters

No parameters.

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/bayut/get_traffic_report \
  -H "Authorization: Bearer $COTLET_API_KEY"
```

**Python**

```python
result = client.call("bayut", "get_traffic_report")
```

**Node.js**

```js
const result = await cotlet.call('bayut', 'get_traffic_report');
```

**CLI**

```bash
cotlet call bayut get_traffic_report
```

### Example response

```json
{
  "top_locations": [
    {
      "location": "Dubai Marina",
      "impressions": 5210
    },
    {
      "location": "JLT",
      "impressions": 3180
    }
  ],
  "overall": {
    "impressions": 8390,
    "clicks": 144,
    "leads": 11
  }
}
```

## Get Bayut Credits

`POST https://cotlet.dev/api/v1/bayut/get_credits`

Access: read.

Returns the Bayut Credits balance shown in Manage Listings. Read only.

### Parameters

No parameters.

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/bayut/get_credits \
  -H "Authorization: Bearer $COTLET_API_KEY"
```

**Python**

```python
result = client.call("bayut", "get_credits")
```

**Node.js**

```js
const result = await cotlet.call('bayut', 'get_credits');
```

**CLI**

```bash
cotlet call bayut get_credits
```

### Example response

```json
{
  "bayut_credits": 120
}
```

## Get market insights

`POST https://cotlet.dev/api/v1/bayut/get_market_insights`

Access: read.

Returns Market Insights for Dubai or Abu Dhabi: the most searched communities, sub-communities and buildings, the average rent and sale prices, and the areas with the highest ROI. Read only.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `city` | enum | yes | dubai or abu_dhabi. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/bayut/get_market_insights \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"city":"dubai"}'
```

**Python**

```python
result = client.call("bayut", "get_market_insights", {"city":"dubai"})
```

**Node.js**

```js
const result = await cotlet.call('bayut', 'get_market_insights', {"city":"dubai"});
```

**CLI**

```bash
cotlet call bayut get_market_insights --data '{"city":"dubai"}'
```

### Example response

```json
{
  "city": "dubai",
  "most_searched": [
    {
      "community": "Dubai Marina",
      "type": "community"
    },
    {
      "community": "Business Bay",
      "type": "community"
    }
  ],
  "average_prices_aed": {
    "rent": 118000,
    "sale": 1950000
  },
  "highest_roi": [
    {
      "community": "Jumeirah Village Circle",
      "roi_percent": 7.4
    }
  ]
}
```

## Get transactions

`POST https://cotlet.dev/api/v1/bayut/get_transactions`

Access: read.

Returns last sold transaction data from the Dubai Land Department, as BayutPro shows it in Transactions. Only agencies registered in Dubai have this section. Filter by location, transaction type, time period, property type and bedrooms. Read only.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `location` | string | no | Community or building name. |
| `transaction_type` | string | no | As the Transactions filter offers it. |
| `period` | string | no | Time period as the Transactions filter offers it. |
| `property_type` | string | no | e.g. apartment, villa. |
| `bedrooms` | integer | no | Number of bedrooms. |
| `cursor` | string | no | Next page cursor from the previous call. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/bayut/get_transactions \
  -H "Authorization: Bearer $COTLET_API_KEY"
```

**Python**

```python
result = client.call("bayut", "get_transactions")
```

**Node.js**

```js
const result = await cotlet.call('bayut', 'get_transactions');
```

**CLI**

```bash
cotlet call bayut get_transactions
```

### Example response

```json
{
  "transactions": [
    {
      "location": "Dubai Marina",
      "property_type": "apartment",
      "bedrooms": 2,
      "price_aed": 2150000,
      "date": "2026-09-28"
    }
  ],
  "next_cursor": null
}
```

## Assign floor plan

`POST https://cotlet.dev/api/v1/bayut/assign_floor_plan`

Access: write. Confirm: waits for the user's OK before it runs.

Assigns a floor plan from the uploads section to one listing, the same step as clicking the floor plan icon in Profolio. The icon turns green once the plan is linked, and Bayut requires a floor plan for a perfect quality score. The floor plan becomes visible on the live listing. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `listing_id` | string | yes | Listing ID or your reference number, from list_listings. |
| `floor_plan_id` | string | yes | Floor plan from the uploads section of Profolio. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/bayut/assign_floor_plan \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"listing_id":"DM-2214","floor_plan_id":"fp_3302"}'
```

**Python**

```python
result = client.call("bayut", "assign_floor_plan", {"listing_id":"DM-2214","floor_plan_id":"fp_3302"})
```

**Node.js**

```js
const result = await cotlet.call('bayut', 'assign_floor_plan', {"listing_id":"DM-2214","floor_plan_id":"fp_3302"});
```

**CLI**

```bash
cotlet call bayut assign_floor_plan --data '{"listing_id":"DM-2214","floor_plan_id":"fp_3302"}'
```

### Example response

```json
{
  "listing_id": "DM-2214",
  "floor_plan_id": "fp_3302",
  "status": "assigned"
}
```

## Request TruCheck

`POST https://cotlet.dev/api/v1/bayut/request_trucheck`

Access: write. Confirm: waits for the user's OK before it runs.

Uploads up to 5 photos of a Checked property and submits them to request TruCheck validation, as the multiple photo upload in BayutPro does. Bayut recommends clear photos that show the unit number and an inside view. Bayut's moderation team reviews the submission, so the call returns "submitted"; check the badge later with get_listing. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `listing_id` | string | yes | Listing ID or your reference number, from list_listings. |
| `photo_urls` | string[] | yes | Up to 5 photo URLs. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/bayut/request_trucheck \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"listing_id":"listing_8c41d2","photo_urls":["https://example.com"]}'
```

**Python**

```python
result = client.call("bayut", "request_trucheck", {"listing_id":"listing_8c41d2","photo_urls":["https://example.com"]})
```

**Node.js**

```js
const result = await cotlet.call('bayut', 'request_trucheck', {"listing_id":"listing_8c41d2","photo_urls":["https://example.com"]});
```

**CLI**

```bash
cotlet call bayut request_trucheck --data '{"listing_id":"listing_8c41d2","photo_urls":["https://example.com"]}'
```

### Example response

```json
{
  "listing_id": "DM-2290",
  "photos": 2,
  "status": "submitted"
}
```

## Apply boost

`POST https://cotlet.dev/api/v1/bayut/apply_boost`

Access: write. Confirm: waits for the user's OK before it runs.

Applies one boost product to one listing, as the boost products in Profolio do. Bayut offers Signature, Hot and Property of the Week; dubizzle offers Refresh and Featured. Check get_credits first. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `listing_id` | string | yes | Listing ID or your reference number, from list_listings. |
| `product` | enum | yes | signature, hot or property_of_the_week on Bayut; refresh or featured on dubizzle. |

### Request

**cURL**

```bash
curl -X POST https://cotlet.dev/api/v1/bayut/apply_boost \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"listing_id":"listing_8c41d2","product":"signature"}'
```

**Python**

```python
result = client.call("bayut", "apply_boost", {"listing_id":"listing_8c41d2","product":"signature"})
```

**Node.js**

```js
const result = await cotlet.call('bayut', 'apply_boost', {"listing_id":"listing_8c41d2","product":"signature"});
```

**CLI**

```bash
cotlet call bayut apply_boost --data '{"listing_id":"listing_8c41d2","product":"signature"}'
```

### Example response

```json
{
  "listing_id": "DM-2214",
  "platform": "bayut",
  "product": "hot",
  "status": "applied"
}
```
