{
  "openapi": "3.0.1",
  "info": {
    "title": "Bayut Dubai $0.8💰 URL Search | Location Filters | Rich Output",
    "description": "From $0.8/1K. Extract property listings from bayut.com. Get fully-detailed listings with price, bedrooms, baths, area, geocoordinates, agent name + mobile + WhatsApp + email, agency profile, RERA/Trakheesi permit, full photo gallery, categorised amenities, and TruCheck verification dates.",
    "version": "1.0",
    "x-build-id": "5Sfy7SNHsw0UHDLDd"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/abotapi~bayut-com-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-abotapi-bayut-com-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/abotapi~bayut-com-scraper/runs": {
      "post": {
        "operationId": "runs-sync-abotapi-bayut-com-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/abotapi~bayut-com-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-abotapi-bayut-com-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "1. Search mode",
            "enum": [
              "search",
              "url"
            ],
            "type": "string",
            "description": "Search mode = pick city + property type + filters below. URL mode = paste any bayut.com search URL(s) you already refined in a browser. URL mode supports multiple URLs and walks pagination forward from each.",
            "default": "search"
          },
          "locations": {
            "title": "Cities / areas to search",
            "type": "array",
            "description": "Pick one or more emirates / cities. Use the Bayut city slug - e.g. 'dubai', 'abu-dhabi', 'sharjah', 'ras-al-khaimah', 'ajman', 'fujairah', 'umm-al-quwain'. For sub-areas use the slug as Bayut writes it in the URL, e.g. 'dubai/dubai-marina', 'dubai/downtown-dubai', 'dubai/jumeirah-village-circle-jvc'.",
            "items": {
              "type": "string"
            }
          },
          "purpose": {
            "title": "Buy or rent? (Search mode)",
            "enum": [
              "for-sale",
              "to-rent"
            ],
            "type": "string",
            "description": "Pick for-sale or for-rent. Search mode only.",
            "default": "for-sale"
          },
          "propertyType": {
            "title": "Property type (Search mode)",
            "enum": [
              "property",
              "apartments",
              "villas",
              "townhouses",
              "penthouses",
              "hotel-apartments",
              "compounds",
              "duplex",
              "land",
              "full-floors",
              "half-floors",
              "whole-buildings",
              "bulk-units",
              "commercial"
            ],
            "type": "string",
            "description": "What kind of property to search for. 'property' includes everything residential. Search mode only.",
            "default": "property"
          },
          "minPrice": {
            "title": "Min price (AED)",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum price filter in AED. Leave empty for no minimum. Search mode only."
          },
          "maxPrice": {
            "title": "Max price (AED)",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum price filter in AED. Leave empty for no maximum. Search mode only."
          },
          "minBedrooms": {
            "title": "Min bedrooms",
            "minimum": 0,
            "maximum": 20,
            "type": "integer",
            "description": "Minimum bedrooms (0 = studio). Search mode only."
          },
          "maxBedrooms": {
            "title": "Max bedrooms",
            "minimum": 0,
            "maximum": 20,
            "type": "integer",
            "description": "Maximum bedrooms. Search mode only."
          },
          "minArea": {
            "title": "Min area (sqft)",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum area in square feet. Search mode only."
          },
          "maxArea": {
            "title": "Max area (sqft)",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum area in square feet. Search mode only."
          },
          "furnishing": {
            "title": "Furnishing (Search mode)",
            "enum": [
              "any",
              "furnished",
              "unfurnished"
            ],
            "type": "string",
            "description": "Furnishing filter. Search mode only.",
            "default": "any"
          },
          "completionStatus": {
            "title": "Completion status (Search mode)",
            "enum": [
              "any",
              "completed",
              "off-plan"
            ],
            "type": "string",
            "description": "Completed = ready to move in. Off-plan = under construction / pre-launch. Search mode only.",
            "default": "any"
          },
          "rentFrequency": {
            "title": "Rent frequency (Rent only)",
            "enum": [
              "any",
              "yearly",
              "monthly",
              "weekly",
              "daily"
            ],
            "type": "string",
            "description": "Only applies when purpose=to-rent.",
            "default": "any"
          },
          "verifiedOnly": {
            "title": "TruCheck verified only (Search mode)",
            "type": "boolean",
            "description": "Only return TruCheck-verified listings (Bayut's vetted-by-RERA badge). Useful to filter agency spam.",
            "default": false
          },
          "sortBy": {
            "title": "Sort order (Search mode)",
            "enum": [
              "popular",
              "newest",
              "oldest",
              "price-asc",
              "price-desc",
              "verified-score-desc"
            ],
            "type": "string",
            "description": "How to order results. Search mode only - in URL mode the sort is taken from your pasted URL.",
            "default": "popular"
          },
          "urls": {
            "title": "Search URLs (URL mode)",
            "type": "array",
            "description": "One or more full bayut.com search URLs. Multi-URL supported - each URL is scraped independently across all its result pages. Filter-mode fields (city, propertyType, price, beds, etc.) are IGNORED in URL mode - paste the URL exactly as Bayut produced it. If your URL ends with `/page-N/`, results are collected starting from page N.",
            "items": {
              "type": "string"
            }
          },
          "maxPages": {
            "title": "Max result pages per location/URL",
            "minimum": 0,
            "type": "integer",
            "description": "Safety bound on how many result pages to walk per location or start URL (24 listings per page). 0 (default) means unlimited - the walk stops naturally once a page comes back empty or repeats listings already collected, or sooner once Max total listings is reached. Set a number only for an explicit page cap below that natural stop.",
            "default": 0
          },
          "maxListings": {
            "title": "Max total listings (default 20, 0 = unlimited)",
            "minimum": 0,
            "type": "integer",
            "description": "The sole soft cap on the run, applied across all locations/URLs. Defaults to 20 so a run stays small unless you raise it. 0 means unlimited (bounded only by the natural stop on Max result pages).",
            "default": 20
          },
          "fetchDetails": {
            "title": "Enrich each listing with full detail (extra cost per listing)",
            "type": "boolean",
            "description": "Off by default. The base result already includes ~50 fields: lat/lng, agent phone, WhatsApp, agency, beds/baths, area, price and photo IDs. Turn this on to additionally enrich every listing with its full description (English + Arabic), categorized amenities, Trakheesi/RERA permit number, the full photo gallery, floor plans, payment plans, and off-plan completion details. Each enriched listing makes one extra lightweight request. Billed per enriched listing.",
            "default": false
          },
          "proxy": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apify residential proxy with country=AE is strongly recommended. Datacenter proxies often produce empty pages - residential IPs (especially UAE) give the most reliable results."
          },
          "mcpConnectors": {
            "title": "Pipe results into your apps (optional)",
            "type": "array",
            "description": "Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON; the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com)."
          },
          "notionParentPageUrl": {
            "title": "Notion parent page (Notion connector only)",
            "type": "string",
            "description": "URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors."
          },
          "maxNotifyListings": {
            "title": "Max items to export per connector",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Cap on items written to each connector per run. Does not affect the dataset.",
            "default": 50
          },
          "resumeFromRunId": {
            "title": "Resume from a prior run",
            "type": "string",
            "description": "Optional. Paste a previous run ID or dataset ID to continue a large walk-all pull: listings already saved by that run are loaded before scraping starts and skipped, so this run only appends new listings. For recurring daily monitoring of the same search, use Incremental mode below instead. Leave empty for a normal fresh run."
          },
          "incrementalMode": {
            "title": "Incremental changes for scheduled runs",
            "type": "boolean",
            "description": "Turn this on for daily or recurring monitoring of the SAME search. The first run returns all matching listings as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED listings. Turn on \"Emit unchanged\" or \"Emit expired\" only when you also want those listings returned (and billed). State is kept separately per city/filters/URL and fetchDetails setup; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a prior run above.",
            "default": false
          },
          "stateKey": {
            "title": "State key (optional, incremental mode only)",
            "type": "string",
            "description": "Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the city/filters/URL and fetchDetails settings — different searches then never mix state with each other."
          },
          "emitUnchanged": {
            "title": "Emit unchanged listings (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return listings that have not changed since the last run, marked UNCHANGED. This returns — and bills — extra rows you already have, so leave it off unless you specifically want the full snapshot every run.",
            "default": false
          },
          "emitExpired": {
            "title": "Emit expired listings (incremental mode only)",
            "type": "boolean",
            "description": "Off by default. Turn on to also return listings that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned every tracked search — not when Max total listings or Max result pages capped it, when a block stopped a search early, or when Resume was used. This returns — and bills — extra synthetic rows, so leave it off unless you need expiry tracking.",
            "default": false
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}