{
  "openapi": "3.0.1",
  "info": {
    "title": "Property Finder Scraper + Dubai DLD Permit Lookup",
    "description": "Scrape Property Finder listings (UAE, Bahrain, Saudi Arabia, Qatar, Egypt) by location, filters or URL: price, size, GPS, agent and agency contacts, permit. Optional Dubai Land Department register lookup with the agent mobile and e-mail on sales.",
    "version": "0.0",
    "x-build-id": "lnUJvk6B9yijgjw4d"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/nice_dev~propertyfinder-listings-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-nice_dev-propertyfinder-listings-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/nice_dev~propertyfinder-listings-scraper/runs": {
      "post": {
        "operationId": "runs-sync-nice_dev-propertyfinder-listings-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/nice_dev~propertyfinder-listings-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-nice_dev-propertyfinder-listings-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",
        "properties": {
          "startUrls": {
            "title": "Start URLs",
            "maxItems": 1000,
            "type": "array",
            "description": "Property Finder search-result URLs (any filter set on the site is kept, pagination is automatic) or single listing URLs (`https://www.propertyfinder.ae/en/plp/buy/apartment-for-sale-dubai-arjan-curve-by-sentro-142822239.html`). Works for propertyfinder.ae, .bh, .sa, .qa and .eg. When this list is not empty, the search fields below (country, purpose, locations, keywords, site filters) are ignored; caps, post-filters and monitoring still apply. Max 1 000 URLs.",
            "default": [],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "country": {
            "title": "Country",
            "enum": [
              "ae",
              "bh",
              "sa",
              "qa",
              "eg"
            ],
            "type": "string",
            "description": "Property Finder site to search. The Dubai Land Department lookup only works for Dubai listings (propertyfinder.ae).",
            "default": "ae"
          },
          "purpose": {
            "title": "Rent or buy",
            "enum": [
              "rent",
              "buy",
              "commercial-rent",
              "commercial-buy"
            ],
            "type": "string",
            "description": "Type of listings.",
            "default": "rent"
          },
          "location": {
            "title": "Location",
            "maxLength": 200,
            "type": "string",
            "description": "City, community or building, as typed in the site's location box (e.g. `Dubai Marina`, `Jumeirah Village Circle`, `Abu Dhabi`). The best match of the site's own location search is used and written in the log, with the other places of that name and their ids: type an id (e.g. `50`) to search that place. Empty = the whole country."
          },
          "locations": {
            "title": "More locations",
            "maxItems": 100,
            "uniqueItems": true,
            "type": "array",
            "description": "Several locations in one run: one search per location, times each keyword below (searches per run: max 500). Added to **Location**.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "query": {
            "title": "Keyword",
            "maxLength": 200,
            "type": "string",
            "description": "Keyword searched in the listings, as in the site's keyword box (e.g. `sea view`, `pool`). Empty = no keyword."
          },
          "searchQueries": {
            "title": "More keywords",
            "maxItems": 100,
            "uniqueItems": true,
            "type": "array",
            "description": "Several keywords in one run: one search per keyword (times each location). Added to **Keyword**; listings found by several searches are saved once.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "propertyType": {
            "title": "Property type",
            "enum": [
              "",
              "1",
              "35",
              "22",
              "20",
              "42",
              "24",
              "18",
              "29",
              "10",
              "34",
              "31",
              "45"
            ],
            "type": "string",
            "description": "Empty = all types. Each site has its own list: a type the chosen site does not have for this purpose (Townhouse or Penthouse on propertyfinder.sa, Apartment in a commercial search) is refused before the run, with the types it has.",
            "default": ""
          },
          "minBedrooms": {
            "title": "Min bedrooms",
            "minimum": 0,
            "maximum": 8,
            "type": "integer",
            "description": "0 = studio. 8 = the site's `7+`."
          },
          "maxBedrooms": {
            "title": "Max bedrooms",
            "minimum": 0,
            "maximum": 8,
            "type": "integer",
            "description": "0 = studio only. 8 = the site's `7+`."
          },
          "minBathrooms": {
            "title": "Min bathrooms",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "8 = the site's `7+`."
          },
          "maxBathrooms": {
            "title": "Max bathrooms",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "8 = the site's `7+`."
          },
          "minPrice": {
            "title": "Min price",
            "minimum": 0,
            "maximum": 2147483647,
            "type": "integer",
            "description": "In the site's currency (AED on propertyfinder.ae). For rentals: price per **Rent frequency** period."
          },
          "maxPrice": {
            "title": "Max price",
            "minimum": 0,
            "maximum": 2147483647,
            "type": "integer",
            "description": "In the site's currency (AED on propertyfinder.ae)."
          },
          "minArea": {
            "title": "Min size (sqft)",
            "minimum": 0,
            "maximum": 10000000,
            "type": "integer",
            "description": "Built-up area in square feet on every site (converted to m² for Bahrain, Saudi Arabia, Qatar and Egypt, which count in m²)."
          },
          "maxArea": {
            "title": "Max size (sqft)",
            "minimum": 0,
            "maximum": 10000000,
            "type": "integer",
            "description": "Built-up area in square feet on every site (converted to m² for Bahrain, Saudi Arabia, Qatar and Egypt, which count in m²)."
          },
          "furnishing": {
            "title": "Furnishing",
            "enum": [
              "any",
              "furnished",
              "unfurnished",
              "partly"
            ],
            "type": "string",
            "description": "Furnished, unfurnished or partly furnished (as declared by the advertiser).",
            "default": "any"
          },
          "completionStatus": {
            "title": "Completion status",
            "enum": [
              "any",
              "completed",
              "off_plan"
            ],
            "type": "string",
            "description": "Ready or off-plan properties (sale listings).",
            "default": "any"
          },
          "rentFrequency": {
            "title": "Rent frequency",
            "enum": [
              "",
              "yearly",
              "monthly",
              "weekly",
              "daily"
            ],
            "type": "string",
            "description": "For rentals: the period the price is quoted for. Empty = the site's default (yearly on propertyfinder.ae). On propertyfinder.sa it keeps only the listings rented for that period.",
            "default": ""
          },
          "amenities": {
            "title": "Amenities",
            "uniqueItems": true,
            "type": "array",
            "description": "Listings that have ALL the selected amenities. propertyfinder.eg has no Balcony, Built in Wardrobes or Walk-in Closet, and commercial searches have no amenity filter: those are refused before the run.",
            "items": {
              "type": "string",
              "enum": [
                "AC",
                "MR",
                "BA",
                "SP",
                "SS",
                "SY",
                "CS",
                "CP",
                "VW",
                "BL",
                "PA",
                "ST",
                "PG",
                "PP",
                "PY",
                "PJ",
                "BW",
                "WC",
                "BK",
                "MS",
                "PR",
                "CO",
                "BR"
              ],
              "enumTitles": [
                "Central A/C",
                "Maids Room",
                "Balcony",
                "Shared Pool",
                "Shared Spa",
                "Shared Gym",
                "Concierge Service",
                "Covered Parking",
                "View of Water",
                "View of Landmark",
                "Pets Allowed",
                "Study",
                "Private Garden",
                "Private Pool",
                "Private Gym",
                "Private Jacuzzi",
                "Built in Wardrobes",
                "Walk-in Closet",
                "Built in Kitchen Appliances",
                "Maid Service",
                "Children's Play Area",
                "Children's Pool",
                "Barbecue Area"
              ]
            },
            "default": []
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "featured",
              "newest",
              "price_asc",
              "price_desc",
              "beds_asc",
              "beds_desc"
            ],
            "type": "string",
            "description": "Order of the site's results. `newest` (the default) lets **Only new listings** stop early.",
            "default": "newest"
          },
          "maxItems": {
            "title": "Max listings",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Maximum number of listings to save for the whole run (after deduplication and filters). 0 = no limit.",
            "default": 100
          },
          "maxItemsPerQuery": {
            "title": "Max listings per search",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Cap for EACH search (keyword × location, or search URL), so that the first search cannot use up the whole **Max listings** budget. 0 = no per-search cap.",
            "default": 0
          },
          "extractDetails": {
            "title": "Extract details",
            "type": "boolean",
            "description": "Open each listing page (1 extra request per listing) for the advertising permit (register link in Dubai, permit number in Abu Dhabi), broker and agent licence numbers, agent profile (position, experience, rating), availability date and the full photo set. Needed by **Dubai Land Department lookup**, **Unit & building details**, **Official register lookup** and **Bahrain: agent's registered mobile**. Off = search-card fields only (much faster, cheaper).",
            "default": true
          },
          "enrichDld": {
            "title": "Dubai Land Department lookup (permit register)",
            "type": "boolean",
            "description": "For each Dubai listing, look its advertising permit up in the public Dubai Land Department register (Trakheesi / Madmoun) — the check behind the QR code shown on every Dubai listing: official permit number, status and dates, brokerage and its licence, building, zone, registered size in m², rooms and declared value, and, for SALE listings, the agent's name, broker card number, mobile and e-mail as registered with the DLD (rentals: not provided by the register). Turns on **Extract details**. Runs a browser: the run gets 1 GB of memory instead of 512 MB. Charged per listing found in the register.",
            "default": false
          },
          "enrichUnitDetails": {
            "title": "Unit & building details (Dubai)",
            "type": "boolean",
            "description": "For each Dubai listing, add the unit and its building as registered with the Dubai Land Department — the unit's exact size, balcony size, parking spaces, freehold and developer; the building's name, floors, parking spaces, elevators, swimming pools and completion date — and the links of the same listing on Bayut and Dubizzle. Dubai listings only (other listings: `no_permit`); about 6 to 7 Dubai listings in 10 get them. A listing put online less than a day ago may not be found yet (`not_found`). Works with or without **Dubai Land Department lookup**. Turns on **Extract details**. Charged per listing found (not charged when it is not).",
            "default": false
          },
          "enrichRegister": {
            "title": "Official register lookup — Abu Dhabi, Saudi Arabia, Bahrain",
            "type": "boolean",
            "description": "For each listing of Abu Dhabi, Saudi Arabia or Bahrain, look its permit up in the public register of its country — the check behind the permit number or QR code these listings show. **Abu Dhabi** (ADREC, and ADGM for Al Reem / Al Maryah islands): permit status, type, dates and exclusivity, the agency's registered mobile and e-mail, its licence, plot number, district and community. **Saudi Arabia** (REGA): permit status, type and dates, the agency's FAL licence, title deed number, plot, national address, mortgage and seizure (the rest of the record: **Saudi Arabia: full register record**). **Bahrain** (RERA): the licence holder's name, mobile and e-mail, CR number, licence status and dates (one licence per agency; an old QR code the register no longer opens is matched by the agency's licence number, then its name). Turns on **Extract details**. Saudi Arabia's register runs a browser: a run on propertyfinder.sa (or with pasted URLs) gets 1 GB of memory instead of 512 MB. Dubai listings: use **Dubai Land Department lookup**. Charged per listing found in its register.",
            "default": false
          },
          "registerFullRecord": {
            "title": "Saudi Arabia: full register record (REGA)",
            "type": "boolean",
            "description": "For each Saudi listing, the rest of its REGA record on top of **Official register lookup**: the agency's unified number, the responsible employee's name and mobile as registered with REGA, the title deed type, the plot's borders (neighbours, streets, lengths), the land use, halt and inheritance restrictions, the same listing on other portals (Aqar, Bayut.sa, Wasalt… with their URLs) and the register's raw answer. Turns on **Official register lookup**. Charged per Saudi listing found in the register, on top of it.",
            "default": false
          },
          "registerAgentContact": {
            "title": "Bahrain: agent's registered mobile (RERA)",
            "type": "boolean",
            "description": "For each Bahrain listing, find its agent in the public licence directory of RERA (Bahrain's real estate regulator) by the agent's name, and return the agent's licence number, type, status and expiry date and the mobile registered with RERA (and the e-mail when the agent holds the agency's licence). Strict match: every word of the name Property Finder shows, one licence holder only, one uncommon word at least — a name made of common words, or shared by several holders, returns no contact (`registerAgentStatus: uncertain`). Turns on **Extract details**. Charged per listing with the agent's mobile.",
            "default": false
          },
          "postedAfter": {
            "title": "Posted after",
            "type": "string",
            "description": "Only listings listed on or after this date (the date the site shows as Listed): `2026-09-01`, or a period before now such as `7 days`, `2 weeks`, `1 month` (API: `24 hours` and full ISO date-times work too)."
          },
          "postedBefore": {
            "title": "Posted before",
            "type": "string",
            "description": "Only listings listed on or before this date (the whole day is included), or older than a period such as `30 days`."
          },
          "excludeKeywords": {
            "title": "Exclude keywords",
            "maxItems": 50,
            "uniqueItems": true,
            "type": "array",
            "description": "Drop the listings whose title or description contains one of these words (e.g. `penthouse`), case and accents ignored.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "verifiedOnly": {
            "title": "Verified listings only",
            "type": "boolean",
            "description": "Keep only the listings with the site's `Verified` badge. propertyfinder.ae only: the other sites have no such badge (refused there).",
            "default": false
          },
          "superAgentOnly": {
            "title": "SuperAgent listings only",
            "type": "boolean",
            "description": "Keep only the listings whose agent has the site's `SuperAgent` badge.",
            "default": false
          },
          "onlyNew": {
            "title": "Only new listings",
            "type": "boolean",
            "description": "Skip the listings that a previous run (same **Memory key**) already delivered: they are not saved and not charged, and their page is not even opened. First run = everything is new.",
            "default": false
          },
          "stateKey": {
            "title": "Memory key",
            "pattern": "^[a-zA-Z0-9_-]{1,64}$",
            "maxLength": 64,
            "type": "string",
            "description": "Name of the memory used by **Only new listings**. Give each schedule / task its own key (e.g. `paris-rentals`) so that they do not share their memory. Letters, digits, `-` and `_`.",
            "default": "default"
          },
          "resetState": {
            "title": "Reset the memory",
            "type": "boolean",
            "description": "Forget everything remembered under this **Memory key** before the run: this run returns (and charges) every listing again. Untick it afterwards.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apify Proxy or your own proxies. Keep the default: it is included in the price. The residential Apify proxy is not available in this Actor.",
            "default": {
              "useApifyProxy": true
            }
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Maximum number of requests processed in parallel.",
            "default": 8
          },
          "maxRequestsPerMinute": {
            "title": "Max requests per minute",
            "minimum": 10,
            "maximum": 2000,
            "type": "integer",
            "description": "Most requests to the site in any 60 seconds, all of them counted: results pages, listing pages and the extra page read for a listing. A budget, not an even pace: up to this many can leave at once when the minute starts (spread them with the minimum delay below). Lower it if the site answers HTTP 429 / 403 in the log.",
            "default": 180
          },
          "minRequestIntervalMs": {
            "title": "Min delay between requests",
            "minimum": 0,
            "maximum": 60000,
            "type": "integer",
            "description": "Smallest gap between two requests, in milliseconds. Unlike the per-minute rate, this spreads the requests evenly instead of letting them go out in a burst. 0 = no gap.",
            "default": 0
          },
          "maxRequestRetries": {
            "title": "Max request retries",
            "minimum": 0,
            "maximum": 20,
            "type": "integer",
            "description": "Retries per request before it is marked as failed. Behind a proxy, a request the site turns away is also retried on a new proxy session up to 10 times without using up these retries.",
            "default": 5
          },
          "debugLog": {
            "title": "Debug log",
            "type": "boolean",
            "description": "Include debug messages in the run log.",
            "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}