{"openapi":"3.1.0","info":{"title":"PIX API","version":"1.0.0","description":"The PIX API gives licensed organisations direct, programmatic access to the\nDubai Land Department records that PropertyIndex models: every registered\nsale, every registered tenancy period, its location labels and floor,\nand the PIX market index, as flat rows you can pull into your\nown systems. Each record carries its registered figures and our per-record\ncalculations (price and rent per square foot, normalised property type and\nbedrooms). Location and floor labels are not identifiers or proof of a\nunique physical structure.\nUnit numbers, persistent property identities and cross-record histories are\nnot part of the API.\n\n## Location labels\n\nSales and rentals carry the record's assigned location as labels:\n\n- `location_path` is the full published path, an ordered list of labels\n  from Dubai to the assigned location.\n- `highest_location_level` is the first node after Dubai, regardless of\n  its kind.\n- `lowest_location_level` is the final assigned location node, which\n  may be an area, community, subcommunity, tower or the city itself.\n\nFor a sale in Beach Vista Tower 1:\n\n```json\n{\n  \"location_path\": [\"Dubai\", \"Dubai Harbour\", \"Emaar Beachfront\", \"Beach Vista\", \"Beach Vista Tower 1\"],\n  \"highest_location_level\": \"Dubai Harbour\",\n  \"lowest_location_level\": \"Beach Vista Tower 1\"\n}\n```\n\nWhen only one node follows Dubai, both level fields contain that node's\nlabel. For a city-only assignment, the path is `[\"Dubai\"]`, the highest\nvalue is null and the lowest is `Dubai`. All three are null when the\nlocation is unresolved; a path is never partial.\n\nLabels are names, not identifiers, and names can repeat across the tree.\n`location_path` is returned by default and can be requested with\n`fields`, but it is not a filter, sort or cursor field. To scope a query\nto a place, use `location_id`.\n\n## Base URL\n\nAll endpoints are served from `https://api.propertyindex.ae`. Only `GET`\nrequests are accepted. Responses are JSON.\n\n## Authentication\n\nSend your key as a bearer token on every request:\n\n```\nAuthorization: Bearer pix_api_XXXXXXXXXX_...\n```\n\nKeys are issued to your organisation, not to a person. Keep them server-side.\nA key can be revoked and reissued at any time on request.\n\n## Allowance and rate limits\n\nAuthenticated responses carry your meter in headers: `PIX-Usage-Used`,\n`PIX-Usage-Allowance`, `PIX-Usage-Remaining`, `PIX-Usage-Period` and,\nwhere the period has an end, `PIX-Usage-Period-End`.\n`PIX-Usage-Unit: records` identifies the unit. `PIX-Usage-Remaining`\nmeans included records remaining, excluding optional overage capacity.\n`GET /v1/usage` returns these figures and the effective\n`recordsRemaining`, including any enabled overage capacity, without\nconsuming records.\n\nThe paid plan is AED 5,000 per month and includes 1,000,000 sales and rental\nrecords per billing period, shared across the organisation's API keys.\nEach actual row returned by a sales or rentals\nlist counts as one record; a successful single-record response counts as\none. Repeated retrievals count again. Query and validation failures and\nempty responses consume no records. Locations, market index, documentation\nand usage are unmetered.\n\nOptional overage costs AED 2 per 1,000 records, prorated to the nearest fils\non the billing period total: `overageCostMinor = round(overageRecords / 5)`.\nOverage is off by default. An organisation owner or admin must opt in and\nset a finite monthly overage spending cap, excluding the subscription and\nany applicable taxes. `overageCapMinor` is that cap\nin fils; when enabled, each fils adds five records to `recordLimit` above\nthe included allowance. `remaining` counts only unused included records;\n`recordsRemaining` counts capacity up to the effective `recordLimit`.\nDemo grants have a fixed record allowance with no overage.\n\nBoth demo and paid keys enforce a hard limit. If the actual response would\nexceed `recordsRemaining`, the whole response is rejected with\n`429 allowance_exhausted` and no records are charged. Request a smaller\n`limit` to fit the remaining capacity. The per-page maximum remains 1,000.\nDemo and paid keys expose the same fields.\n\nEach key may make 60 requests per minute, including unmetered authenticated\nendpoints. Beyond that you receive\n`429 rate_limited` with a `Retry-After` header.\n\n## Listing, filtering and paging\n\nEvery list endpoint accepts the same grammar.\n\n- **Exact match**: `?property_type=Apartment`. Repeat a parameter to match\n  any of several values: `?bedrooms=1%20Bed&bedrooms=2%20Bed`. A home whose\n  record carries no bedroom count has an empty `bedrooms` value; match it with\n  `?bedrooms=`.\n- **Ranges**: `_min` and `_max` on numbers, `_from` and `_to` on dates\n  (`?sale_price_min=1000000&sale_date_from=2026-01-01`). Both suffix pairs\n  work on either type.\n- **Text**: `_contains` on free-text fields\n  (`?lowest_location_level_contains=marina%20gate`).\n  `lowest_location_level=Marina%20Gate%201` matches the final location label;\n  `floor` is a text label, so read it off the rows rather than range it.\n- **Location text search**: on sales and rentals lists,\n  `?location_search=marina&property_type=Apartment` matches apartments\n  whose `highest_location_level` or `lowest_location_level` contains\n  `marina`, ignoring case. The search is a literal substring:\n  `%` and `_` are ordinary characters.\n  Only these two endpoint labels are searched, not intermediate ancestors.\n  All other filters must also match. Send one value, with 1 to 500 characters\n  after trimming surrounding whitespace; empty or repeated values are\n  rejected. Keep the same search and filters when following a cursor.\n  `location_search` is unavailable on locations, market index and\n  single-record endpoints, and is not a response field or sort option.\n- **Exclusion and nulls**: `_not` to exclude a value, `_null=true` or\n  `_null=false` to test for missing values. Neither applies to the\n  identifiers (`sale_id`, `rental_id`, `location_id`), which\n  accept exact matches only, and `_null` does not apply to booleans.\n- **Location lookup**: `GET /v1/locations` lists all published location\n  nodes: Dubai itself, areas, communities, subcommunities and towers. Each\n  entry contains only an opaque `location_id` and `name`, with no\n  hierarchy fields. Names may repeat. Search names with\n  `GET /v1/locations?q=Beach%20Vista`, then use an identifier from the\n  results in `GET /v1/sales?location_id=loc_...` (replace `loc_...`\n  with the returned identifier). `GET /v1/locations/{id}` retrieves a\n  single lookup entry.\n- **Location scope**: on sales and rentals lists, `location_id` includes\n  records assigned to that node or any descendant. Repeat the parameter to\n  include any of several locations (OR); overlapping scopes return each\n  record once. All other filters, including `location_search`, must also\n  match (AND). Preserve the same identifiers and filters when paging.\n  `location_id` is query-only on these lists: it is not returned and\n  cannot be requested with `fields`, used as `sort`, or given suffixes.\n- **Sorting**: `sort` names a returned field on sales, rentals or market\n  index, other than `location_path`; the location lookup sorts by\n  `name`. `order` is `asc`\n  (default) or `desc`. Nulls sort last.\n- **Paging**: `limit` defaults to 100 rows and allows up to 1,000 per call.\n  Use `GET /v1/sales?page=2&limit=100` for a numbered page. `page` accepts\n  one positive integer, starting at 1, and cannot be combined with\n  `cursor`. Both the page number and the computed offset\n  `(page - 1) * limit` must be safe integers (at most 9,007,199,254,740,991).\n  Without `page` or `cursor`, the response is the first page.\n  Large page numbers may be slower because earlier rows must be skipped;\n  prefer cursors for sequential bulk walks. When more rows exist, both\n  numbered and cursor pages include `next_cursor`. Send it back as\n  `cursor`, removing `page` and keeping the same `sort`, `order`\n  and filters. A cursor records a position in the sort\n  order, not a snapshot of the data. The data refreshes nightly, and a walk\n  that spans a refresh can miss or repeat rows whose sort value changed or\n  that arrived in between. For a complete extract, finish the walk within a\n  day or re-check recent rows by date afterwards.\n- **Projection**: `fields=sale_id,sale_date,sale_price` returns only those\n  columns. `fields=sale_id,location_path` returns each record's id and\n  location path.\n- **Page metadata**: every list response includes `page` and `limit`.\n  `page` echoes the requested numbered page, defaults to 1 when neither\n  paging parameter is supplied, and is null for cursor requests because\n  a cursor position is not a numbered page. `limit` echoes the requested\n  page size, or 100 when omitted. It is the maximum rows requested, not the\n  actual number returned; `data` may contain fewer rows. Detail and usage\n  responses do not include these fields.\n- **Total matches**: every list response includes a top-level `total`\n  after `as_of`. It is the exact number of records matching all filters,\n  including `q`, `location_search` and location scopes where supported.\n  It ignores `page`, `limit` and `cursor`, so it counts all matches rather than\n  the current page or the rows remaining. It is always included, even on\n  empty pages. There is no `include_total` option. The total is not a\n  snapshot and can change after a data refresh. Detail and usage responses\n  do not include it.\n\nIdentifiers (`sale_id`, `rental_id`, `location_id`) are opaque and\nstable. They resolve only through this API and carry no meaning elsewhere.\n\nDates are `YYYY-MM-DD` in the Asia/Dubai calendar. Money is AED. Sizes are\nsquare feet. Every response carries `as_of`, the date of the DLD delivery\nthe data was built from.\n\n## Rental figures and dates\n\n`annual_rent_psf` is the annual rent per square foot. It is null when the\nrecord does not support a reliable rent-per-square-foot figure. A null\nvalue means the figure is unavailable, not that the rent is zero.\n\n- `start_date` and `end_date` describe the registered tenancy period.\n  The scheduled end date does not prove that a tenancy is still active.\n- `terminated_date` is the evidenced termination date. A null value means\n  no termination date is recorded; it does not establish active occupancy.\n- `registration_date` is the Ejari filing date. It is not an ingestion\n  timestamp or watermark for newly delivered records. Use `as_of` for\n  the DLD delivery date, and re-check recent periods when refreshing an\n  extract because filings can arrive later than their registration date.\n\n## Errors\n\nErrors are JSON: `{ \"error\": { \"code\": \"...\", \"message\": \"...\" } }`. The\ncode is stable and machine-readable; the message says what to change.\n\n| Status | Codes |\n|---|---|\n| 400 | `invalid_parameter`, `unknown_parameter`, `invalid_cursor`, `cursor_mismatch` |\n| 401 | `missing_api_key`, `invalid_api_key` |\n| 403 | `credential_pending`, `credential_revoked`, `organization_inactive`, `no_entitlement`, `demo_expired` |\n| 404 | `not_found` |\n| 429 | `rate_limited`, `allowance_exhausted` |\n| 503 | `service_unavailable` |\n\n## Licence\n\nUse of the API is governed by the PropertyIndex\n[Terms of Service](https://www.propertyindex.ae/terms-of-service), including\nthe PIX© API Licence section, which sets out what you may build, how to\ncredit PropertyIndex© and the Dubai Land Department, and what you may not\nredistribute. Our approval from the Dubai Land Department applies to\nPropertyIndex© alone and does not imply DLD endorsement of your product.\n\nQuestions, demo access and licensing: [info@propertyindex.ae](mailto:info@propertyindex.ae).","contact":{"name":"PropertyIndex","email":"info@propertyindex.ae","url":"https://www.propertyindex.ae"},"termsOfService":"https://www.propertyindex.ae/terms-of-service","license":{"name":"PIX API licence (proprietary)","url":"https://www.propertyindex.ae/terms-of-service"}},"servers":[{"url":"https://api.propertyindex.ae"}],"security":[{"bearerAuth":[]}],"tags":[{"name":"Locations","description":"All published Dubai location nodes as a flat lookup of opaque identifiers and names. Names may repeat; identifiers scope sales and rentals to a node and its descendants."},{"name":"Sales","description":"Registered DLD sale records, one row per registration."},{"name":"Rentals","description":"Registered Ejari tenancy periods, one row per property period."},{"name":"Market index","description":"Monthly PIX index levels and supporting observations by segment."},{"name":"Account","description":"Your key's allowance and usage."}],"paths":{"/v1/locations":{"get":{"tags":["Locations"],"operationId":"listLocations","summary":"List locations","description":"All published Dubai location nodes, as a flat lookup of public identifiers and names. All published location nodes: Dubai itself, areas, communities, subcommunities and towers. Each row contains only an opaque location_id and name, with no hierarchy fields. Names may repeat. Use the identifier to retrieve a single lookup entry or filter sales and rentals to that node and its descendants. Unmetered: consumes no records. The burst rate limit still applies.","parameters":[{"name":"q","in":"query","description":"Case-insensitive location name search. Names may repeat.","required":false,"schema":{"type":"string","example":"Beach Vista"}},{"name":"sort","in":"query","description":"Field to sort by. Default name.","required":false,"schema":{"type":"string","enum":["name"]}},{"name":"order","in":"query","description":"Sort direction. Default asc.","required":false,"schema":{"type":"string","enum":["asc","desc"]}},{"name":"limit","in":"query","description":"Rows per page, 1 to 1,000. Default 100.","required":false,"schema":{"type":"integer","minimum":1,"maximum":1000}},{"name":"page","in":"query","description":"Numbered page, starting at 1. Send one positive integer. Uses limit (default 100, maximum 1000). Cannot be combined with cursor. Omit both to start at the first page. The computed offset (page - 1) * limit must also be a safe integer. Large page numbers may be slower because earlier rows must be skipped; prefer cursors for sequential bulk walks.","required":false,"schema":{"type":"integer","minimum":1,"maximum":9007199254740991}},{"name":"cursor","in":"query","description":"Opaque cursor from a previous response's next_cursor. Send the same sort, order and filters, including location_id and location_search where supported. Cannot be combined with page. To continue a numbered page using next_cursor, remove page.","required":false,"schema":{"type":"string"}},{"name":"fields","in":"query","description":"Comma-separated list of fields to return. Default all.","required":false,"schema":{"type":"string","example":"location_id,name"}}],"responses":{"200":{"description":"One page of rows.","headers":{"PIX-Usage-Kind":{"description":"paid or demo.","schema":{"type":"string","enum":["paid","demo"]}},"PIX-Usage-Unit":{"description":"The usage unit is records.","schema":{"type":"string","const":"records"}},"PIX-Usage-Used":{"description":"Sales and rental records used in the current period, including this response.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Allowance":{"description":"Records included in the current period, before optional overage.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Remaining":{"description":"Included records remaining, excluding overage capacity. GET /v1/usage returns recordsRemaining for effective capacity.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Period":{"description":"Identifier of the current period.","schema":{"type":"string"}},"PIX-Usage-Period-End":{"description":"When the current period ends, if it does.","schema":{"type":"string","format":"date-time"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocationList"}}}},"400":{"description":"The request is not valid. The message names the parameter.","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or unrecognised API key.","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key is not active, or the organisation holds no licence or demo allowance.","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached, or the response exceeds recordsRemaining (allowance_exhausted). The whole response is rejected without consuming records; request a smaller limit if capacity remains.","headers":{"PIX-Usage-Kind":{"description":"paid or demo.","schema":{"type":"string","enum":["paid","demo"]}},"PIX-Usage-Unit":{"description":"The usage unit is records.","schema":{"type":"string","const":"records"}},"PIX-Usage-Used":{"description":"Sales and rental records used in the current period, including this response.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Allowance":{"description":"Records included in the current period, before optional overage.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Remaining":{"description":"Included records remaining, excluding overage capacity. GET /v1/usage returns recordsRemaining for effective capacity.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Period":{"description":"Identifier of the current period.","schema":{"type":"string"}},"PIX-Usage-Period-End":{"description":"When the current period ends, if it does.","schema":{"type":"string","format":"date-time"}},"Retry-After":{"description":"Seconds to wait before retrying (rate limit only).","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/locations/{id}":{"get":{"tags":["Locations"],"operationId":"getLocation","summary":"Get one location","description":"Unmetered: consumes no records. The burst rate limit still applies.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"example":"loc_0123456789abcdef"}],"responses":{"200":{"description":"The location.","headers":{"PIX-Usage-Kind":{"description":"paid or demo.","schema":{"type":"string","enum":["paid","demo"]}},"PIX-Usage-Unit":{"description":"The usage unit is records.","schema":{"type":"string","const":"records"}},"PIX-Usage-Used":{"description":"Sales and rental records used in the current period, including this response.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Allowance":{"description":"Records included in the current period, before optional overage.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Remaining":{"description":"Included records remaining, excluding overage capacity. GET /v1/usage returns recordsRemaining for effective capacity.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Period":{"description":"Identifier of the current period.","schema":{"type":"string"}},"PIX-Usage-Period-End":{"description":"When the current period ends, if it does.","schema":{"type":"string","format":"date-time"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocationSingle"}}}},"400":{"description":"The request is not valid. The message names the parameter.","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or unrecognised API key.","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key is not active, or the organisation holds no licence or demo allowance.","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No location with that id.","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached, or the response exceeds recordsRemaining (allowance_exhausted). The whole response is rejected without consuming records; request a smaller limit if capacity remains.","headers":{"PIX-Usage-Kind":{"description":"paid or demo.","schema":{"type":"string","enum":["paid","demo"]}},"PIX-Usage-Unit":{"description":"The usage unit is records.","schema":{"type":"string","const":"records"}},"PIX-Usage-Used":{"description":"Sales and rental records used in the current period, including this response.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Allowance":{"description":"Records included in the current period, before optional overage.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Remaining":{"description":"Included records remaining, excluding overage capacity. GET /v1/usage returns recordsRemaining for effective capacity.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Period":{"description":"Identifier of the current period.","schema":{"type":"string"}},"PIX-Usage-Period-End":{"description":"When the current period ends, if it does.","schema":{"type":"string","format":"date-time"}},"Retry-After":{"description":"Seconds to wait before retrying (rate limit only).","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/sales":{"get":{"tags":["Sales"],"operationId":"listSales","summary":"List sales","description":"Registered DLD sale records. Registered DLD sale records resolved to the property's own location node. Each actual row returned consumes one record, including repeat retrievals. Query and validation failures and empty responses consume no records.","parameters":[{"name":"location_id","in":"query","description":"Opaque location identifier returned by GET /v1/locations. Exact match only. Includes records assigned to that node or its descendants. Repeat to include any of several locations (OR); overlapping scopes return each record once. Other filters, including location_search, are combined with AND. Keep the same identifiers and filters when following a cursor. Query-only: not a response field, projection field or sort option; no suffix forms.","required":false,"schema":{"type":"array","minItems":1,"items":{"type":"string","pattern":"^loc_[0-9a-f]{16}$"}},"style":"form","explode":true},{"name":"location_search","in":"query","description":"Case-insensitive literal substring match on highest_location_level OR lowest_location_level: the first node after Dubai or the final assigned location node. Only these endpoint labels are searched, not intermediate ancestors. Other filters are combined with AND. Send one value of 1 to 500 characters after trimming surrounding whitespace; empty or repeated values are rejected. Percent and underscore characters are literal. Keep the same search and filters when following a cursor.","required":false,"schema":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","example":"Marina"}},{"name":"sort","in":"query","description":"Field to sort by. Default sale_id.","required":false,"schema":{"type":"string","enum":["sale_id","highest_location_level","lowest_location_level","floor","sale_date","property_type","bedrooms","sale_price","sale_psf","size_sqft","market_basis","procedure","financed"]}},{"name":"order","in":"query","description":"Sort direction. Default asc.","required":false,"schema":{"type":"string","enum":["asc","desc"]}},{"name":"limit","in":"query","description":"Rows per page, 1 to 1,000. Default 100.","required":false,"schema":{"type":"integer","minimum":1,"maximum":1000}},{"name":"page","in":"query","description":"Numbered page, starting at 1. Send one positive integer. Uses limit (default 100, maximum 1000). Cannot be combined with cursor. Omit both to start at the first page. The computed offset (page - 1) * limit must also be a safe integer. Large page numbers may be slower because earlier rows must be skipped; prefer cursors for sequential bulk walks.","required":false,"schema":{"type":"integer","minimum":1,"maximum":9007199254740991}},{"name":"cursor","in":"query","description":"Opaque cursor from a previous response's next_cursor. Send the same sort, order and filters, including location_id and location_search where supported. Cannot be combined with page. To continue a numbered page using next_cursor, remove page.","required":false,"schema":{"type":"string"}},{"name":"fields","in":"query","description":"Comma-separated list of fields to return. Default all. location_path can be returned but not filtered or sorted.","required":false,"schema":{"type":"string","example":"sale_id,highest_location_level"}},{"name":"sale_id","in":"query","description":"Exact match on sale_id. Repeat the parameter to match any of several values.","required":false,"schema":{"type":"array","items":{"type":"string"}},"style":"form","explode":true},{"name":"highest_location_level","in":"query","description":"Exact match on highest_location_level. Repeat the parameter to match any of several values.","required":false,"schema":{"type":"array","items":{"type":"string"}},"style":"form","explode":true},{"name":"highest_location_level_not","in":"query","description":"Exclude rows where highest_location_level equals this value.","required":false,"schema":{"type":"string"}},{"name":"highest_location_level_null","in":"query","description":"true keeps only rows with no highest_location_level; false keeps only rows with one.","required":false,"schema":{"type":"boolean"}},{"name":"highest_location_level_contains","in":"query","description":"Case-insensitive substring match on highest_location_level.","required":false,"schema":{"type":"string"}},{"name":"lowest_location_level","in":"query","description":"Exact match on lowest_location_level. Repeat the parameter to match any of several values.","required":false,"schema":{"type":"array","items":{"type":"string"}},"style":"form","explode":true},{"name":"lowest_location_level_not","in":"query","description":"Exclude rows where lowest_location_level equals this value.","required":false,"schema":{"type":"string"}},{"name":"lowest_location_level_null","in":"query","description":"true keeps only rows with no lowest_location_level; false keeps only rows with one.","required":false,"schema":{"type":"boolean"}},{"name":"lowest_location_level_contains","in":"query","description":"Case-insensitive substring match on lowest_location_level.","required":false,"schema":{"type":"string"}},{"name":"floor","in":"query","description":"Exact match on floor. Repeat the parameter to match any of several values.","required":false,"schema":{"type":"array","items":{"type":"string"}},"style":"form","explode":true},{"name":"floor_not","in":"query","description":"Exclude rows where floor equals this value.","required":false,"schema":{"type":"string"}},{"name":"floor_null","in":"query","description":"true keeps only rows with no floor; false keeps only rows with one.","required":false,"schema":{"type":"boolean"}},{"name":"floor_contains","in":"query","description":"Case-insensitive substring match on floor.","required":false,"schema":{"type":"string"}},{"name":"sale_date","in":"query","description":"Exact match on sale_date. Repeat the parameter to match any of several values.","required":false,"schema":{"type":"array","items":{"type":"string","format":"date","example":"2026-01-01"}},"style":"form","explode":true},{"name":"sale_date_not","in":"query","description":"Exclude rows where sale_date equals this value.","required":false,"schema":{"type":"string","format":"date","example":"2026-01-01"}},{"name":"sale_date_null","in":"query","description":"true keeps only rows with no sale_date; false keeps only rows with one.","required":false,"schema":{"type":"boolean"}},{"name":"sale_date_from","in":"query","description":"sale_date on or after this date.","required":false,"schema":{"type":"string","format":"date","example":"2026-01-01"}},{"name":"sale_date_to","in":"query","description":"sale_date on or before this date.","required":false,"schema":{"type":"string","format":"date","example":"2026-01-01"}},{"name":"property_type","in":"query","description":"Exact match on property_type. Repeat the parameter to match any of several values.","required":false,"schema":{"type":"array","items":{"type":"string","enum":["Apartment","Building","Clinic","Hotel Apartment","Hotel Room","Land","Office","Other Commercial","Parking","Shop","Villa","Warehouse"]}},"style":"form","explode":true},{"name":"property_type_not","in":"query","description":"Exclude rows where property_type equals this value.","required":false,"schema":{"type":"string","enum":["Apartment","Building","Clinic","Hotel Apartment","Hotel Room","Land","Office","Other Commercial","Parking","Shop","Villa","Warehouse"]}},{"name":"property_type_null","in":"query","description":"true keeps only rows with no property_type; false keeps only rows with one.","required":false,"schema":{"type":"boolean"}},{"name":"bedrooms","in":"query","description":"Exact match on bedrooms. Repeat the parameter to match any of several values.","required":false,"schema":{"type":"array","items":{"type":"string","enum":["Studio","1 Bed","2 Bed","3 Bed","4 Bed","5 Bed","6 Bed","7 Bed","8 Bed","9 Bed","10 Bed","11 Bed","15 Bed","Penthouse","Duplex"]}},"style":"form","explode":true},{"name":"bedrooms_not","in":"query","description":"Exclude rows where bedrooms equals this value.","required":false,"schema":{"type":"string","enum":["Studio","1 Bed","2 Bed","3 Bed","4 Bed","5 Bed","6 Bed","7 Bed","8 Bed","9 Bed","10 Bed","11 Bed","15 Bed","Penthouse","Duplex"]}},{"name":"bedrooms_null","in":"query","description":"true keeps only rows with no bedrooms; false keeps only rows with one.","required":false,"schema":{"type":"boolean"}},{"name":"sale_price","in":"query","description":"Exact match on sale_price. Repeat the parameter to match any of several values.","required":false,"schema":{"type":"array","items":{"type":"number"}},"style":"form","explode":true},{"name":"sale_price_not","in":"query","description":"Exclude rows where sale_price equals this value.","required":false,"schema":{"type":"number"}},{"name":"sale_price_null","in":"query","description":"true keeps only rows with no sale_price; false keeps only rows with one.","required":false,"schema":{"type":"boolean"}},{"name":"sale_price_min","in":"query","description":"sale_price greater than or equal to.","required":false,"schema":{"type":"number"}},{"name":"sale_price_max","in":"query","description":"sale_price less than or equal to.","required":false,"schema":{"type":"number"}},{"name":"sale_psf","in":"query","description":"Exact match on sale_psf. Repeat the parameter to match any of several values.","required":false,"schema":{"type":"array","items":{"type":"number"}},"style":"form","explode":true},{"name":"sale_psf_not","in":"query","description":"Exclude rows where sale_psf equals this value.","required":false,"schema":{"type":"number"}},{"name":"sale_psf_null","in":"query","description":"true keeps only rows with no sale_psf; false keeps only rows with one.","required":false,"schema":{"type":"boolean"}},{"name":"sale_psf_min","in":"query","description":"sale_psf greater than or equal to.","required":false,"schema":{"type":"number"}},{"name":"sale_psf_max","in":"query","description":"sale_psf less than or equal to.","required":false,"schema":{"type":"number"}},{"name":"size_sqft","in":"query","description":"Exact match on size_sqft. Repeat the parameter to match any of several values.","required":false,"schema":{"type":"array","items":{"type":"number"}},"style":"form","explode":true},{"name":"size_sqft_not","in":"query","description":"Exclude rows where size_sqft equals this value.","required":false,"schema":{"type":"number"}},{"name":"size_sqft_null","in":"query","description":"true keeps only rows with no size_sqft; false keeps only rows with one.","required":false,"schema":{"type":"boolean"}},{"name":"size_sqft_min","in":"query","description":"size_sqft greater than or equal to.","required":false,"schema":{"type":"number"}},{"name":"size_sqft_max","in":"query","description":"size_sqft less than or equal to.","required":false,"schema":{"type":"number"}},{"name":"market_basis","in":"query","description":"Exact match on market_basis. Repeat the parameter to match any of several values.","required":false,"schema":{"type":"array","items":{"type":"string","enum":["existing","off_plan"]}},"style":"form","explode":true},{"name":"market_basis_not","in":"query","description":"Exclude rows where market_basis equals this value.","required":false,"schema":{"type":"string","enum":["existing","off_plan"]}},{"name":"market_basis_null","in":"query","description":"true keeps only rows with no market_basis; false keeps only rows with one.","required":false,"schema":{"type":"boolean"}},{"name":"procedure","in":"query","description":"Exact match on procedure. Repeat the parameter to match any of several values.","required":false,"schema":{"type":"array","items":{"type":"string"}},"style":"form","explode":true},{"name":"procedure_not","in":"query","description":"Exclude rows where procedure equals this value.","required":false,"schema":{"type":"string"}},{"name":"procedure_null","in":"query","description":"true keeps only rows with no procedure; false keeps only rows with one.","required":false,"schema":{"type":"boolean"}},{"name":"procedure_contains","in":"query","description":"Case-insensitive substring match on procedure.","required":false,"schema":{"type":"string"}},{"name":"financed","in":"query","description":"Exact match on financed. Repeat the parameter to match any of several values.","required":false,"schema":{"type":"array","items":{"type":"boolean"}},"style":"form","explode":true},{"name":"financed_not","in":"query","description":"Exclude rows where financed equals this value.","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"One page of rows.","headers":{"PIX-Usage-Kind":{"description":"paid or demo.","schema":{"type":"string","enum":["paid","demo"]}},"PIX-Usage-Unit":{"description":"The usage unit is records.","schema":{"type":"string","const":"records"}},"PIX-Usage-Used":{"description":"Sales and rental records used in the current period, including this response.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Allowance":{"description":"Records included in the current period, before optional overage.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Remaining":{"description":"Included records remaining, excluding overage capacity. GET /v1/usage returns recordsRemaining for effective capacity.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Period":{"description":"Identifier of the current period.","schema":{"type":"string"}},"PIX-Usage-Period-End":{"description":"When the current period ends, if it does.","schema":{"type":"string","format":"date-time"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaleList"}}}},"400":{"description":"The request is not valid. The message names the parameter.","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or unrecognised API key.","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key is not active, or the organisation holds no licence or demo allowance.","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached, or the response exceeds recordsRemaining (allowance_exhausted). The whole response is rejected without consuming records; request a smaller limit if capacity remains.","headers":{"PIX-Usage-Kind":{"description":"paid or demo.","schema":{"type":"string","enum":["paid","demo"]}},"PIX-Usage-Unit":{"description":"The usage unit is records.","schema":{"type":"string","const":"records"}},"PIX-Usage-Used":{"description":"Sales and rental records used in the current period, including this response.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Allowance":{"description":"Records included in the current period, before optional overage.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Remaining":{"description":"Included records remaining, excluding overage capacity. GET /v1/usage returns recordsRemaining for effective capacity.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Period":{"description":"Identifier of the current period.","schema":{"type":"string"}},"PIX-Usage-Period-End":{"description":"When the current period ends, if it does.","schema":{"type":"string","format":"date-time"}},"Retry-After":{"description":"Seconds to wait before retrying (rate limit only).","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/sales/{id}":{"get":{"tags":["Sales"],"operationId":"getSale","summary":"Get one sale","description":"A successful response consumes one record, including repeat retrievals. Query and validation failures consume no records.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"example":"sale_x1Yb9Qm3ZcVwLkT0pRs7NgHfEuJd2AaK4B6CvDeF8GhI"}],"responses":{"200":{"description":"The sale.","headers":{"PIX-Usage-Kind":{"description":"paid or demo.","schema":{"type":"string","enum":["paid","demo"]}},"PIX-Usage-Unit":{"description":"The usage unit is records.","schema":{"type":"string","const":"records"}},"PIX-Usage-Used":{"description":"Sales and rental records used in the current period, including this response.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Allowance":{"description":"Records included in the current period, before optional overage.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Remaining":{"description":"Included records remaining, excluding overage capacity. GET /v1/usage returns recordsRemaining for effective capacity.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Period":{"description":"Identifier of the current period.","schema":{"type":"string"}},"PIX-Usage-Period-End":{"description":"When the current period ends, if it does.","schema":{"type":"string","format":"date-time"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaleSingle"}}}},"400":{"description":"The request is not valid. The message names the parameter.","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or unrecognised API key.","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key is not active, or the organisation holds no licence or demo allowance.","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No sale with that id.","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached, or the response exceeds recordsRemaining (allowance_exhausted). The whole response is rejected without consuming records; request a smaller limit if capacity remains.","headers":{"PIX-Usage-Kind":{"description":"paid or demo.","schema":{"type":"string","enum":["paid","demo"]}},"PIX-Usage-Unit":{"description":"The usage unit is records.","schema":{"type":"string","const":"records"}},"PIX-Usage-Used":{"description":"Sales and rental records used in the current period, including this response.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Allowance":{"description":"Records included in the current period, before optional overage.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Remaining":{"description":"Included records remaining, excluding overage capacity. GET /v1/usage returns recordsRemaining for effective capacity.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Period":{"description":"Identifier of the current period.","schema":{"type":"string"}},"PIX-Usage-Period-End":{"description":"When the current period ends, if it does.","schema":{"type":"string","format":"date-time"}},"Retry-After":{"description":"Seconds to wait before retrying (rate limit only).","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/rentals":{"get":{"tags":["Rentals"],"operationId":"listRentals","summary":"List rentals","description":"Registered Ejari tenancy periods. Registered DLD/Ejari rental-contract evidence resolved to the property's own location node. Each actual row returned consumes one record, including repeat retrievals. Query and validation failures and empty responses consume no records.","parameters":[{"name":"location_id","in":"query","description":"Opaque location identifier returned by GET /v1/locations. Exact match only. Includes records assigned to that node or its descendants. Repeat to include any of several locations (OR); overlapping scopes return each record once. Other filters, including location_search, are combined with AND. Keep the same identifiers and filters when following a cursor. Query-only: not a response field, projection field or sort option; no suffix forms.","required":false,"schema":{"type":"array","minItems":1,"items":{"type":"string","pattern":"^loc_[0-9a-f]{16}$"}},"style":"form","explode":true},{"name":"location_search","in":"query","description":"Case-insensitive literal substring match on highest_location_level OR lowest_location_level: the first node after Dubai or the final assigned location node. Only these endpoint labels are searched, not intermediate ancestors. Other filters are combined with AND. Send one value of 1 to 500 characters after trimming surrounding whitespace; empty or repeated values are rejected. Percent and underscore characters are literal. Keep the same search and filters when following a cursor.","required":false,"schema":{"type":"string","minLength":1,"maxLength":500,"pattern":"\\S","example":"Marina"}},{"name":"sort","in":"query","description":"Field to sort by. Default rental_id.","required":false,"schema":{"type":"string","enum":["rental_id","highest_location_level","lowest_location_level","floor","start_date","end_date","terminated_date","registration_date","contract_type","is_new_contract","property_type","bedrooms","annual_rent","annual_rent_psf","size_sqft"]}},{"name":"order","in":"query","description":"Sort direction. Default asc.","required":false,"schema":{"type":"string","enum":["asc","desc"]}},{"name":"limit","in":"query","description":"Rows per page, 1 to 1,000. Default 100.","required":false,"schema":{"type":"integer","minimum":1,"maximum":1000}},{"name":"page","in":"query","description":"Numbered page, starting at 1. Send one positive integer. Uses limit (default 100, maximum 1000). Cannot be combined with cursor. Omit both to start at the first page. The computed offset (page - 1) * limit must also be a safe integer. Large page numbers may be slower because earlier rows must be skipped; prefer cursors for sequential bulk walks.","required":false,"schema":{"type":"integer","minimum":1,"maximum":9007199254740991}},{"name":"cursor","in":"query","description":"Opaque cursor from a previous response's next_cursor. Send the same sort, order and filters, including location_id and location_search where supported. Cannot be combined with page. To continue a numbered page using next_cursor, remove page.","required":false,"schema":{"type":"string"}},{"name":"fields","in":"query","description":"Comma-separated list of fields to return. Default all. location_path can be returned but not filtered or sorted.","required":false,"schema":{"type":"string","example":"rental_id,highest_location_level"}},{"name":"rental_id","in":"query","description":"Exact match on rental_id. Repeat the parameter to match any of several values.","required":false,"schema":{"type":"array","items":{"type":"string"}},"style":"form","explode":true},{"name":"highest_location_level","in":"query","description":"Exact match on highest_location_level. Repeat the parameter to match any of several values.","required":false,"schema":{"type":"array","items":{"type":"string"}},"style":"form","explode":true},{"name":"highest_location_level_not","in":"query","description":"Exclude rows where highest_location_level equals this value.","required":false,"schema":{"type":"string"}},{"name":"highest_location_level_null","in":"query","description":"true keeps only rows with no highest_location_level; false keeps only rows with one.","required":false,"schema":{"type":"boolean"}},{"name":"highest_location_level_contains","in":"query","description":"Case-insensitive substring match on highest_location_level.","required":false,"schema":{"type":"string"}},{"name":"lowest_location_level","in":"query","description":"Exact match on lowest_location_level. Repeat the parameter to match any of several values.","required":false,"schema":{"type":"array","items":{"type":"string"}},"style":"form","explode":true},{"name":"lowest_location_level_not","in":"query","description":"Exclude rows where lowest_location_level equals this value.","required":false,"schema":{"type":"string"}},{"name":"lowest_location_level_null","in":"query","description":"true keeps only rows with no lowest_location_level; false keeps only rows with one.","required":false,"schema":{"type":"boolean"}},{"name":"lowest_location_level_contains","in":"query","description":"Case-insensitive substring match on lowest_location_level.","required":false,"schema":{"type":"string"}},{"name":"floor","in":"query","description":"Exact match on floor. Repeat the parameter to match any of several values.","required":false,"schema":{"type":"array","items":{"type":"string"}},"style":"form","explode":true},{"name":"floor_not","in":"query","description":"Exclude rows where floor equals this value.","required":false,"schema":{"type":"string"}},{"name":"floor_null","in":"query","description":"true keeps only rows with no floor; false keeps only rows with one.","required":false,"schema":{"type":"boolean"}},{"name":"floor_contains","in":"query","description":"Case-insensitive substring match on floor.","required":false,"schema":{"type":"string"}},{"name":"start_date","in":"query","description":"Exact match on start_date. Repeat the parameter to match any of several values.","required":false,"schema":{"type":"array","items":{"type":"string","format":"date","example":"2026-01-01"}},"style":"form","explode":true},{"name":"start_date_not","in":"query","description":"Exclude rows where start_date equals this value.","required":false,"schema":{"type":"string","format":"date","example":"2026-01-01"}},{"name":"start_date_null","in":"query","description":"true keeps only rows with no start_date; false keeps only rows with one.","required":false,"schema":{"type":"boolean"}},{"name":"start_date_from","in":"query","description":"start_date on or after this date.","required":false,"schema":{"type":"string","format":"date","example":"2026-01-01"}},{"name":"start_date_to","in":"query","description":"start_date on or before this date.","required":false,"schema":{"type":"string","format":"date","example":"2026-01-01"}},{"name":"end_date","in":"query","description":"Exact match on end_date. Repeat the parameter to match any of several values.","required":false,"schema":{"type":"array","items":{"type":"string","format":"date","example":"2026-01-01"}},"style":"form","explode":true},{"name":"end_date_not","in":"query","description":"Exclude rows where end_date equals this value.","required":false,"schema":{"type":"string","format":"date","example":"2026-01-01"}},{"name":"end_date_null","in":"query","description":"true keeps only rows with no end_date; false keeps only rows with one.","required":false,"schema":{"type":"boolean"}},{"name":"end_date_from","in":"query","description":"end_date on or after this date.","required":false,"schema":{"type":"string","format":"date","example":"2026-01-01"}},{"name":"end_date_to","in":"query","description":"end_date on or before this date.","required":false,"schema":{"type":"string","format":"date","example":"2026-01-01"}},{"name":"terminated_date","in":"query","description":"Exact match on terminated_date. Repeat the parameter to match any of several values.","required":false,"schema":{"type":"array","items":{"type":"string","format":"date","example":"2026-01-01"}},"style":"form","explode":true},{"name":"terminated_date_not","in":"query","description":"Exclude rows where terminated_date equals this value.","required":false,"schema":{"type":"string","format":"date","example":"2026-01-01"}},{"name":"terminated_date_null","in":"query","description":"true keeps only rows with no terminated_date; false keeps only rows with one.","required":false,"schema":{"type":"boolean"}},{"name":"terminated_date_from","in":"query","description":"terminated_date on or after this date.","required":false,"schema":{"type":"string","format":"date","example":"2026-01-01"}},{"name":"terminated_date_to","in":"query","description":"terminated_date on or before this date.","required":false,"schema":{"type":"string","format":"date","example":"2026-01-01"}},{"name":"registration_date","in":"query","description":"Exact match on registration_date. Repeat the parameter to match any of several values.","required":false,"schema":{"type":"array","items":{"type":"string","format":"date","example":"2026-01-01"}},"style":"form","explode":true},{"name":"registration_date_not","in":"query","description":"Exclude rows where registration_date equals this value.","required":false,"schema":{"type":"string","format":"date","example":"2026-01-01"}},{"name":"registration_date_null","in":"query","description":"true keeps only rows with no registration_date; false keeps only rows with one.","required":false,"schema":{"type":"boolean"}},{"name":"registration_date_from","in":"query","description":"registration_date on or after this date.","required":false,"schema":{"type":"string","format":"date","example":"2026-01-01"}},{"name":"registration_date_to","in":"query","description":"registration_date on or before this date.","required":false,"schema":{"type":"string","format":"date","example":"2026-01-01"}},{"name":"contract_type","in":"query","description":"Exact match on contract_type. Repeat the parameter to match any of several values.","required":false,"schema":{"type":"array","items":{"type":"string"}},"style":"form","explode":true},{"name":"contract_type_not","in":"query","description":"Exclude rows where contract_type equals this value.","required":false,"schema":{"type":"string"}},{"name":"contract_type_null","in":"query","description":"true keeps only rows with no contract_type; false keeps only rows with one.","required":false,"schema":{"type":"boolean"}},{"name":"contract_type_contains","in":"query","description":"Case-insensitive substring match on contract_type.","required":false,"schema":{"type":"string"}},{"name":"is_new_contract","in":"query","description":"Exact match on is_new_contract. Repeat the parameter to match any of several values.","required":false,"schema":{"type":"array","items":{"type":"boolean"}},"style":"form","explode":true},{"name":"is_new_contract_not","in":"query","description":"Exclude rows where is_new_contract equals this value.","required":false,"schema":{"type":"boolean"}},{"name":"property_type","in":"query","description":"Exact match on property_type. Repeat the parameter to match any of several values.","required":false,"schema":{"type":"array","items":{"type":"string","enum":["Apartment","Building","Clinic","Hotel Apartment","Hotel Room","Land","Office","Other Commercial","Parking","Shop","Villa","Warehouse"]}},"style":"form","explode":true},{"name":"property_type_not","in":"query","description":"Exclude rows where property_type equals this value.","required":false,"schema":{"type":"string","enum":["Apartment","Building","Clinic","Hotel Apartment","Hotel Room","Land","Office","Other Commercial","Parking","Shop","Villa","Warehouse"]}},{"name":"property_type_null","in":"query","description":"true keeps only rows with no property_type; false keeps only rows with one.","required":false,"schema":{"type":"boolean"}},{"name":"bedrooms","in":"query","description":"Exact match on bedrooms. Repeat the parameter to match any of several values.","required":false,"schema":{"type":"array","items":{"type":"string","enum":["Studio","1 Bed","2 Bed","3 Bed","4 Bed","5 Bed","6 Bed","7 Bed","8 Bed","9 Bed","10 Bed","11 Bed","15 Bed","Penthouse","Duplex"]}},"style":"form","explode":true},{"name":"bedrooms_not","in":"query","description":"Exclude rows where bedrooms equals this value.","required":false,"schema":{"type":"string","enum":["Studio","1 Bed","2 Bed","3 Bed","4 Bed","5 Bed","6 Bed","7 Bed","8 Bed","9 Bed","10 Bed","11 Bed","15 Bed","Penthouse","Duplex"]}},{"name":"bedrooms_null","in":"query","description":"true keeps only rows with no bedrooms; false keeps only rows with one.","required":false,"schema":{"type":"boolean"}},{"name":"annual_rent","in":"query","description":"Exact match on annual_rent. Repeat the parameter to match any of several values.","required":false,"schema":{"type":"array","items":{"type":"number"}},"style":"form","explode":true},{"name":"annual_rent_not","in":"query","description":"Exclude rows where annual_rent equals this value.","required":false,"schema":{"type":"number"}},{"name":"annual_rent_null","in":"query","description":"true keeps only rows with no annual_rent; false keeps only rows with one.","required":false,"schema":{"type":"boolean"}},{"name":"annual_rent_min","in":"query","description":"annual_rent greater than or equal to.","required":false,"schema":{"type":"number"}},{"name":"annual_rent_max","in":"query","description":"annual_rent less than or equal to.","required":false,"schema":{"type":"number"}},{"name":"annual_rent_psf","in":"query","description":"Exact match on annual_rent_psf. Repeat the parameter to match any of several values.","required":false,"schema":{"type":"array","items":{"type":"number"}},"style":"form","explode":true},{"name":"annual_rent_psf_not","in":"query","description":"Exclude rows where annual_rent_psf equals this value.","required":false,"schema":{"type":"number"}},{"name":"annual_rent_psf_null","in":"query","description":"true keeps only rows with no annual_rent_psf; false keeps only rows with one.","required":false,"schema":{"type":"boolean"}},{"name":"annual_rent_psf_min","in":"query","description":"annual_rent_psf greater than or equal to.","required":false,"schema":{"type":"number"}},{"name":"annual_rent_psf_max","in":"query","description":"annual_rent_psf less than or equal to.","required":false,"schema":{"type":"number"}},{"name":"size_sqft","in":"query","description":"Exact match on size_sqft. Repeat the parameter to match any of several values.","required":false,"schema":{"type":"array","items":{"type":"number"}},"style":"form","explode":true},{"name":"size_sqft_not","in":"query","description":"Exclude rows where size_sqft equals this value.","required":false,"schema":{"type":"number"}},{"name":"size_sqft_null","in":"query","description":"true keeps only rows with no size_sqft; false keeps only rows with one.","required":false,"schema":{"type":"boolean"}},{"name":"size_sqft_min","in":"query","description":"size_sqft greater than or equal to.","required":false,"schema":{"type":"number"}},{"name":"size_sqft_max","in":"query","description":"size_sqft less than or equal to.","required":false,"schema":{"type":"number"}}],"responses":{"200":{"description":"One page of rows.","headers":{"PIX-Usage-Kind":{"description":"paid or demo.","schema":{"type":"string","enum":["paid","demo"]}},"PIX-Usage-Unit":{"description":"The usage unit is records.","schema":{"type":"string","const":"records"}},"PIX-Usage-Used":{"description":"Sales and rental records used in the current period, including this response.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Allowance":{"description":"Records included in the current period, before optional overage.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Remaining":{"description":"Included records remaining, excluding overage capacity. GET /v1/usage returns recordsRemaining for effective capacity.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Period":{"description":"Identifier of the current period.","schema":{"type":"string"}},"PIX-Usage-Period-End":{"description":"When the current period ends, if it does.","schema":{"type":"string","format":"date-time"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RentalList"}}}},"400":{"description":"The request is not valid. The message names the parameter.","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or unrecognised API key.","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key is not active, or the organisation holds no licence or demo allowance.","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached, or the response exceeds recordsRemaining (allowance_exhausted). The whole response is rejected without consuming records; request a smaller limit if capacity remains.","headers":{"PIX-Usage-Kind":{"description":"paid or demo.","schema":{"type":"string","enum":["paid","demo"]}},"PIX-Usage-Unit":{"description":"The usage unit is records.","schema":{"type":"string","const":"records"}},"PIX-Usage-Used":{"description":"Sales and rental records used in the current period, including this response.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Allowance":{"description":"Records included in the current period, before optional overage.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Remaining":{"description":"Included records remaining, excluding overage capacity. GET /v1/usage returns recordsRemaining for effective capacity.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Period":{"description":"Identifier of the current period.","schema":{"type":"string"}},"PIX-Usage-Period-End":{"description":"When the current period ends, if it does.","schema":{"type":"string","format":"date-time"}},"Retry-After":{"description":"Seconds to wait before retrying (rate limit only).","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/rentals/{id}":{"get":{"tags":["Rentals"],"operationId":"getRental","summary":"Get one rental","description":"A successful response consumes one record, including repeat retrievals. Query and validation failures consume no records.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"example":"rent_q7Wn2Lp8KsJd0Vx4MzRt6CyBfHgAe1UoI3NkT5PaZ9Ql"}],"responses":{"200":{"description":"The rental.","headers":{"PIX-Usage-Kind":{"description":"paid or demo.","schema":{"type":"string","enum":["paid","demo"]}},"PIX-Usage-Unit":{"description":"The usage unit is records.","schema":{"type":"string","const":"records"}},"PIX-Usage-Used":{"description":"Sales and rental records used in the current period, including this response.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Allowance":{"description":"Records included in the current period, before optional overage.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Remaining":{"description":"Included records remaining, excluding overage capacity. GET /v1/usage returns recordsRemaining for effective capacity.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Period":{"description":"Identifier of the current period.","schema":{"type":"string"}},"PIX-Usage-Period-End":{"description":"When the current period ends, if it does.","schema":{"type":"string","format":"date-time"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RentalSingle"}}}},"400":{"description":"The request is not valid. The message names the parameter.","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or unrecognised API key.","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key is not active, or the organisation holds no licence or demo allowance.","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No rental with that id.","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached, or the response exceeds recordsRemaining (allowance_exhausted). The whole response is rejected without consuming records; request a smaller limit if capacity remains.","headers":{"PIX-Usage-Kind":{"description":"paid or demo.","schema":{"type":"string","enum":["paid","demo"]}},"PIX-Usage-Unit":{"description":"The usage unit is records.","schema":{"type":"string","const":"records"}},"PIX-Usage-Used":{"description":"Sales and rental records used in the current period, including this response.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Allowance":{"description":"Records included in the current period, before optional overage.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Remaining":{"description":"Included records remaining, excluding overage capacity. GET /v1/usage returns recordsRemaining for effective capacity.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Period":{"description":"Identifier of the current period.","schema":{"type":"string"}},"PIX-Usage-Period-End":{"description":"When the current period ends, if it does.","schema":{"type":"string","format":"date-time"}},"Retry-After":{"description":"Seconds to wait before retrying (rate limit only).","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/market-index":{"get":{"tags":["Market index"],"operationId":"listMarketIndexObservations","summary":"List observations","description":"Monthly PIX index levels by segment. Monthly PropertyIndex (PIX) levels and supporting Dubai market observations. Unmetered: consumes no records. The burst rate limit still applies.","parameters":[{"name":"sort","in":"query","description":"Field to sort by. Default segment.","required":false,"schema":{"type":"string","enum":["segment","month","index_level","mom_pct","yoy_pct","median_psf","sales_count"]}},{"name":"order","in":"query","description":"Sort direction. Default asc.","required":false,"schema":{"type":"string","enum":["asc","desc"]}},{"name":"limit","in":"query","description":"Rows per page, 1 to 1,000. Default 100.","required":false,"schema":{"type":"integer","minimum":1,"maximum":1000}},{"name":"page","in":"query","description":"Numbered page, starting at 1. Send one positive integer. Uses limit (default 100, maximum 1000). Cannot be combined with cursor. Omit both to start at the first page. The computed offset (page - 1) * limit must also be a safe integer. Large page numbers may be slower because earlier rows must be skipped; prefer cursors for sequential bulk walks.","required":false,"schema":{"type":"integer","minimum":1,"maximum":9007199254740991}},{"name":"cursor","in":"query","description":"Opaque cursor from a previous response's next_cursor. Send the same sort, order and filters, including location_id and location_search where supported. Cannot be combined with page. To continue a numbered page using next_cursor, remove page.","required":false,"schema":{"type":"string"}},{"name":"fields","in":"query","description":"Comma-separated list of fields to return. Default all.","required":false,"schema":{"type":"string","example":"segment,month"}},{"name":"segment","in":"query","description":"Exact match on segment. Repeat the parameter to match any of several values.","required":false,"schema":{"type":"array","items":{"type":"string","enum":["residential","apartment","villa","ready","offplan"]}},"style":"form","explode":true},{"name":"segment_not","in":"query","description":"Exclude rows where segment equals this value.","required":false,"schema":{"type":"string","enum":["residential","apartment","villa","ready","offplan"]}},{"name":"segment_null","in":"query","description":"true keeps only rows with no segment; false keeps only rows with one.","required":false,"schema":{"type":"boolean"}},{"name":"month","in":"query","description":"Exact match on month. Repeat the parameter to match any of several values.","required":false,"schema":{"type":"array","items":{"type":"string","format":"date","example":"2026-01-01"}},"style":"form","explode":true},{"name":"month_not","in":"query","description":"Exclude rows where month equals this value.","required":false,"schema":{"type":"string","format":"date","example":"2026-01-01"}},{"name":"month_null","in":"query","description":"true keeps only rows with no month; false keeps only rows with one.","required":false,"schema":{"type":"boolean"}},{"name":"month_from","in":"query","description":"month on or after this date.","required":false,"schema":{"type":"string","format":"date","example":"2026-01-01"}},{"name":"month_to","in":"query","description":"month on or before this date.","required":false,"schema":{"type":"string","format":"date","example":"2026-01-01"}},{"name":"index_level","in":"query","description":"Exact match on index_level. Repeat the parameter to match any of several values.","required":false,"schema":{"type":"array","items":{"type":"number"}},"style":"form","explode":true},{"name":"index_level_not","in":"query","description":"Exclude rows where index_level equals this value.","required":false,"schema":{"type":"number"}},{"name":"index_level_null","in":"query","description":"true keeps only rows with no index_level; false keeps only rows with one.","required":false,"schema":{"type":"boolean"}},{"name":"index_level_min","in":"query","description":"index_level greater than or equal to.","required":false,"schema":{"type":"number"}},{"name":"index_level_max","in":"query","description":"index_level less than or equal to.","required":false,"schema":{"type":"number"}},{"name":"mom_pct","in":"query","description":"Exact match on mom_pct. Repeat the parameter to match any of several values.","required":false,"schema":{"type":"array","items":{"type":"number"}},"style":"form","explode":true},{"name":"mom_pct_not","in":"query","description":"Exclude rows where mom_pct equals this value.","required":false,"schema":{"type":"number"}},{"name":"mom_pct_null","in":"query","description":"true keeps only rows with no mom_pct; false keeps only rows with one.","required":false,"schema":{"type":"boolean"}},{"name":"mom_pct_min","in":"query","description":"mom_pct greater than or equal to.","required":false,"schema":{"type":"number"}},{"name":"mom_pct_max","in":"query","description":"mom_pct less than or equal to.","required":false,"schema":{"type":"number"}},{"name":"yoy_pct","in":"query","description":"Exact match on yoy_pct. Repeat the parameter to match any of several values.","required":false,"schema":{"type":"array","items":{"type":"number"}},"style":"form","explode":true},{"name":"yoy_pct_not","in":"query","description":"Exclude rows where yoy_pct equals this value.","required":false,"schema":{"type":"number"}},{"name":"yoy_pct_null","in":"query","description":"true keeps only rows with no yoy_pct; false keeps only rows with one.","required":false,"schema":{"type":"boolean"}},{"name":"yoy_pct_min","in":"query","description":"yoy_pct greater than or equal to.","required":false,"schema":{"type":"number"}},{"name":"yoy_pct_max","in":"query","description":"yoy_pct less than or equal to.","required":false,"schema":{"type":"number"}},{"name":"median_psf","in":"query","description":"Exact match on median_psf. Repeat the parameter to match any of several values.","required":false,"schema":{"type":"array","items":{"type":"number"}},"style":"form","explode":true},{"name":"median_psf_not","in":"query","description":"Exclude rows where median_psf equals this value.","required":false,"schema":{"type":"number"}},{"name":"median_psf_null","in":"query","description":"true keeps only rows with no median_psf; false keeps only rows with one.","required":false,"schema":{"type":"boolean"}},{"name":"median_psf_min","in":"query","description":"median_psf greater than or equal to.","required":false,"schema":{"type":"number"}},{"name":"median_psf_max","in":"query","description":"median_psf less than or equal to.","required":false,"schema":{"type":"number"}},{"name":"sales_count","in":"query","description":"Exact match on sales_count. Repeat the parameter to match any of several values.","required":false,"schema":{"type":"array","items":{"type":"number"}},"style":"form","explode":true},{"name":"sales_count_not","in":"query","description":"Exclude rows where sales_count equals this value.","required":false,"schema":{"type":"number"}},{"name":"sales_count_null","in":"query","description":"true keeps only rows with no sales_count; false keeps only rows with one.","required":false,"schema":{"type":"boolean"}},{"name":"sales_count_min","in":"query","description":"sales_count greater than or equal to.","required":false,"schema":{"type":"number"}},{"name":"sales_count_max","in":"query","description":"sales_count less than or equal to.","required":false,"schema":{"type":"number"}}],"responses":{"200":{"description":"One page of rows.","headers":{"PIX-Usage-Kind":{"description":"paid or demo.","schema":{"type":"string","enum":["paid","demo"]}},"PIX-Usage-Unit":{"description":"The usage unit is records.","schema":{"type":"string","const":"records"}},"PIX-Usage-Used":{"description":"Sales and rental records used in the current period, including this response.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Allowance":{"description":"Records included in the current period, before optional overage.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Remaining":{"description":"Included records remaining, excluding overage capacity. GET /v1/usage returns recordsRemaining for effective capacity.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Period":{"description":"Identifier of the current period.","schema":{"type":"string"}},"PIX-Usage-Period-End":{"description":"When the current period ends, if it does.","schema":{"type":"string","format":"date-time"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketIndexObservationList"}}}},"400":{"description":"The request is not valid. The message names the parameter.","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or unrecognised API key.","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key is not active, or the organisation holds no licence or demo allowance.","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached, or the response exceeds recordsRemaining (allowance_exhausted). The whole response is rejected without consuming records; request a smaller limit if capacity remains.","headers":{"PIX-Usage-Kind":{"description":"paid or demo.","schema":{"type":"string","enum":["paid","demo"]}},"PIX-Usage-Unit":{"description":"The usage unit is records.","schema":{"type":"string","const":"records"}},"PIX-Usage-Used":{"description":"Sales and rental records used in the current period, including this response.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Allowance":{"description":"Records included in the current period, before optional overage.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Remaining":{"description":"Included records remaining, excluding overage capacity. GET /v1/usage returns recordsRemaining for effective capacity.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Period":{"description":"Identifier of the current period.","schema":{"type":"string"}},"PIX-Usage-Period-End":{"description":"When the current period ends, if it does.","schema":{"type":"string","format":"date-time"}},"Retry-After":{"description":"Seconds to wait before retrying (rate limit only).","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/usage":{"get":{"tags":["Account"],"operationId":"getUsage","summary":"Current allowance and usage","description":"Unmetered: consumes no records. The burst rate limit still applies.","responses":{"200":{"description":"Usage for the key's current period.","headers":{"PIX-Usage-Kind":{"description":"paid or demo.","schema":{"type":"string","enum":["paid","demo"]}},"PIX-Usage-Unit":{"description":"The usage unit is records.","schema":{"type":"string","const":"records"}},"PIX-Usage-Used":{"description":"Sales and rental records used in the current period, including this response.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Allowance":{"description":"Records included in the current period, before optional overage.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Remaining":{"description":"Included records remaining, excluding overage capacity. GET /v1/usage returns recordsRemaining for effective capacity.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Period":{"description":"Identifier of the current period.","schema":{"type":"string"}},"PIX-Usage-Period-End":{"description":"When the current period ends, if it does.","schema":{"type":"string","format":"date-time"}}},"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/Usage"}}}}}},"401":{"description":"Missing or unrecognised API key.","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The key is not active, or the organisation holds no licence or demo allowance.","headers":{},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit reached, or the response exceeds recordsRemaining (allowance_exhausted). The whole response is rejected without consuming records; request a smaller limit if capacity remains.","headers":{"PIX-Usage-Kind":{"description":"paid or demo.","schema":{"type":"string","enum":["paid","demo"]}},"PIX-Usage-Unit":{"description":"The usage unit is records.","schema":{"type":"string","const":"records"}},"PIX-Usage-Used":{"description":"Sales and rental records used in the current period, including this response.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Allowance":{"description":"Records included in the current period, before optional overage.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Remaining":{"description":"Included records remaining, excluding overage capacity. GET /v1/usage returns recordsRemaining for effective capacity.","schema":{"type":"integer","minimum":0}},"PIX-Usage-Period":{"description":"Identifier of the current period.","schema":{"type":"string"}},"PIX-Usage-Period-End":{"description":"When the current period ends, if it does.","schema":{"type":"string","format":"date-time"}},"Retry-After":{"description":"Seconds to wait before retrying (rate limit only).","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Your PIX API key, sent as `Authorization: Bearer pix_api_...`."}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","example":"invalid_parameter"},"message":{"type":"string"}}}}},"Usage":{"type":"object","required":["kind","unit","used","allowance","remaining","hardCap","periodKey","periodEnd","overageEnabled","overageCapMinor","overageRecords","overageCostMinor","recordLimit","recordsRemaining"],"properties":{"kind":{"type":"string","enum":["paid","demo"]},"unit":{"type":"string","const":"records"},"used":{"type":"integer","minimum":0,"description":"Sales and rental records returned in this period. Repeated retrievals count again."},"allowance":{"type":"integer","minimum":0,"description":"Included records: 1,000,000 per paid billing period, or the fixed demo grant."},"remaining":{"type":"integer","minimum":0,"description":"Included records remaining: max(0, allowance - used). Excludes overage capacity."},"hardCap":{"type":"boolean","const":true,"description":"Always true. A response exceeding recordsRemaining is rejected in full without consuming records."},"periodKey":{"type":"string"},"periodEnd":{"type":["string","null"],"format":"date-time"},"overageEnabled":{"type":"boolean","description":"Off by default. Requires paid-plan owner/admin opt-in and a finite monthly overage spending cap. Demos do not support overage."},"overageCapMinor":{"type":"integer","minimum":0,"description":"Monthly overage spending cap in fils (100 fils = AED 1)."},"overageRecords":{"type":"integer","minimum":0,"description":"Records above the included allowance: max(0, used - allowance)."},"overageCostMinor":{"type":"integer","minimum":0,"description":"Overage cost in fils, rounded on the billing period total: round(overageRecords / 5). Equivalent to AED 2 per 1,000 records."},"recordLimit":{"type":"integer","minimum":0,"description":"Effective record limit: allowance + (overageEnabled ? overageCapMinor * 5 : 0)."},"recordsRemaining":{"type":"integer","minimum":0,"description":"Effective records remaining, including enabled overage capacity: max(0, recordLimit - used)."}}},"Location":{"type":"object","description":"All published location nodes: Dubai itself, areas, communities, subcommunities and towers. Each row contains only an opaque location_id and name, with no hierarchy fields. Names may repeat. Use the identifier to retrieve a single lookup entry or filter sales and rentals to that node and its descendants.","properties":{"location_id":{"type":["string","null"],"pattern":"^loc_[0-9a-f]{16}$","description":"Opaque public location identifier. Use it to retrieve this lookup entry or filter sales and rentals to this location and its descendants."},"name":{"type":["string","null"],"description":"Location display name. Names are not unique."}}},"LocationList":{"type":"object","required":["data","next_cursor","as_of","total","page","limit"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Location"}},"next_cursor":{"type":["string","null"],"description":"Returned for cursor and numbered pages when more data exists. Pass as cursor to fetch the next page, removing page and preserving sort, order and filters. null on the last page."},"as_of":{"type":["string","null"],"format":"date","description":"The DLD delivery date the data was built from."},"total":{"type":"integer","minimum":0,"description":"Exact number of records matching all filters, including q, location_search and location scopes where supported. Ignores page, limit and cursor. Always included, even on empty pages. Not a snapshot: can change after a data refresh."},"page":{"type":["integer","null"],"minimum":1,"maximum":9007199254740991,"description":"Requested numbered page, or 1 when neither page nor cursor was supplied. null for cursor requests because a cursor position is not a numbered page."},"limit":{"type":"integer","minimum":1,"maximum":1000,"description":"Requested page size, or 100 when omitted. This is the maximum rows requested, not the actual number returned; data can contain fewer rows."}}},"LocationSingle":{"type":"object","required":["data","as_of"],"properties":{"data":{"$ref":"#/components/schemas/Location"},"as_of":{"type":["string","null"],"format":"date"}}},"Sale":{"type":"object","description":"Registered DLD sale records resolved to the property's own location node.","properties":{"sale_id":{"type":"string","description":"Opaque public identifier of this sale record. Stable; use it with the single-record endpoint. It carries no meaning outside this API."},"highest_location_level":{"type":["string","null"],"description":"First location after Dubai in the record's breadcrumb, regardless of location kind. For Dubai > Dubai Harbour > Emaar Beachfront > Beach Vista > Beach Vista Tower 1, this is Dubai Harbour. Null when no location below the city is known."},"lowest_location_level":{"type":["string","null"],"description":"Final assigned location in the record's breadcrumb. This may be an area, community, subcommunity or building, rather than a physical building. For Dubai > Dubai Harbour > Emaar Beachfront > Beach Vista > Beach Vista Tower 1, this is Beach Vista Tower 1. Labels are not unique. Null when no location is known."},"location_path":{"type":["array","null"],"items":{"type":"string"},"minItems":1,"description":"Ordered location labels from Dubai to the record's assigned location, following the published location hierarchy. For a record assigned to Beach Vista Tower 1 this is [\"Dubai\", \"Dubai Harbour\", \"Emaar Beachfront\", \"Beach Vista\", \"Beach Vista Tower 1\"]. When present, it starts with Dubai and ends with lowest_location_level, and any second element equals highest_location_level. Labels only: names are not unique and are not identifiers. Null when the location cannot be resolved. Returned only; not a filter, sort or cursor field.","example":["Dubai","Dubai Harbour","Emaar Beachfront","Beach Vista","Beach Vista Tower 1"]},"floor":{"type":["string","null"],"description":"Registered floor label, as text: numeric floors plus values such as 'G' or 'P'-prefixed podium levels. Null for houses and unresolved records."},"sale_date":{"type":["string","null"],"format":"date","description":"DLD registration date."},"property_type":{"type":["string","null"],"description":"Normalized property type. Known values: Apartment, Building, Clinic, Hotel Apartment, Hotel Room, Land, Office, Other Commercial, Parking, Shop, Villa, Warehouse."},"bedrooms":{"type":["string","null"],"description":"Normalized bedroom label; empty when the record carries no bedroom count. Known values: Studio, 1 Bed, 2 Bed, 3 Bed, 4 Bed, 5 Bed, 6 Bed, 7 Bed, 8 Bed, 9 Bed, 10 Bed, 11 Bed, 15 Bed, Penthouse, Duplex."},"sale_price":{"type":["number","null"],"description":"Registered sale price. Unit: AED."},"sale_psf":{"type":["number","null"],"description":"Registered sale price per square foot. Unit: AED/sqft."},"size_sqft":{"type":["number","null"],"description":"Registered property size. Unit: sqft."},"market_basis":{"type":["string","null"],"description":"DLD registration category. A delayed handover still registers as off_plan. Known values: existing, off_plan."},"procedure":{"type":["string","null"],"description":"DLD transaction procedure name."},"financed":{"type":["boolean","null"],"description":"Whether a mortgage was registered on the property the same day."}}},"SaleList":{"type":"object","required":["data","next_cursor","as_of","total","page","limit"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Sale"}},"next_cursor":{"type":["string","null"],"description":"Returned for cursor and numbered pages when more data exists. Pass as cursor to fetch the next page, removing page and preserving sort, order and filters. null on the last page."},"as_of":{"type":["string","null"],"format":"date","description":"The DLD delivery date the data was built from."},"total":{"type":"integer","minimum":0,"description":"Exact number of records matching all filters, including q, location_search and location scopes where supported. Ignores page, limit and cursor. Always included, even on empty pages. Not a snapshot: can change after a data refresh."},"page":{"type":["integer","null"],"minimum":1,"maximum":9007199254740991,"description":"Requested numbered page, or 1 when neither page nor cursor was supplied. null for cursor requests because a cursor position is not a numbered page."},"limit":{"type":"integer","minimum":1,"maximum":1000,"description":"Requested page size, or 100 when omitted. This is the maximum rows requested, not the actual number returned; data can contain fewer rows."}}},"SaleSingle":{"type":"object","required":["data","as_of"],"properties":{"data":{"$ref":"#/components/schemas/Sale"},"as_of":{"type":["string","null"],"format":"date"}}},"Rental":{"type":"object","description":"Registered DLD/Ejari rental-contract evidence resolved to the property's own location node.","properties":{"rental_id":{"type":"string","description":"Opaque public identifier of this rental record. Stable; use it with the single-record endpoint. It carries no meaning outside this API."},"highest_location_level":{"type":["string","null"],"description":"First location after Dubai in the record's breadcrumb, regardless of location kind. For Dubai > Dubai Harbour > Emaar Beachfront > Beach Vista > Beach Vista Tower 1, this is Dubai Harbour. Null when no location below the city is known."},"lowest_location_level":{"type":["string","null"],"description":"Final assigned location in the record's breadcrumb. This may be an area, community, subcommunity or building, rather than a physical building. For Dubai > Dubai Harbour > Emaar Beachfront > Beach Vista > Beach Vista Tower 1, this is Beach Vista Tower 1. Labels are not unique. Null when no location is known."},"location_path":{"type":["array","null"],"items":{"type":"string"},"minItems":1,"description":"Ordered location labels from Dubai to the record's assigned location, following the published location hierarchy. For a record assigned to Beach Vista Tower 1 this is [\"Dubai\", \"Dubai Harbour\", \"Emaar Beachfront\", \"Beach Vista\", \"Beach Vista Tower 1\"]. When present, it starts with Dubai and ends with lowest_location_level, and any second element equals highest_location_level. Labels only: names are not unique and are not identifiers. Null when the location cannot be resolved. Returned only; not a filter, sort or cursor field.","example":["Dubai","Dubai Harbour","Emaar Beachfront","Beach Vista","Beach Vista Tower 1"]},"floor":{"type":["string","null"],"description":"Registered floor label, as text: numeric floors plus values such as 'G' or 'P'-prefixed podium levels. Null for houses and unresolved records."},"start_date":{"type":["string","null"],"format":"date","description":"Registered tenancy period start date."},"end_date":{"type":["string","null"],"format":"date","description":"Scheduled end date for this exact registered tenancy period. It is not proof the tenancy is active until this date."},"terminated_date":{"type":["string","null"],"format":"date","description":"Evidenced actual termination date for this exact registered tenancy period. Null means no termination date is evidenced, not that the tenancy is active."},"registration_date":{"type":["string","null"],"format":"date","description":"Date this period was filed with Ejari. This can differ from start_date; it is not a PropertyIndex ingestion or last-updated timestamp."},"contract_type":{"type":["string","null"],"description":"Normalized rental contract structure."},"is_new_contract":{"type":["boolean","null"],"description":"Whether this is a new rather than renewed contract (version = 1)."},"property_type":{"type":["string","null"],"description":"Normalized property type. Known values: Apartment, Building, Clinic, Hotel Apartment, Hotel Room, Land, Office, Other Commercial, Parking, Shop, Villa, Warehouse."},"bedrooms":{"type":["string","null"],"description":"Normalized bedroom label; empty when the record carries no bedroom count. Known values: Studio, 1 Bed, 2 Bed, 3 Bed, 4 Bed, 5 Bed, 6 Bed, 7 Bed, 8 Bed, 9 Bed, 10 Bed, 11 Bed, 15 Bed, Penthouse, Duplex."},"annual_rent":{"type":["number","null"],"description":"Registered annual rent (contract amount annualised). Unit: AED/year."},"annual_rent_psf":{"type":["number","null"],"description":"Annual rent per square foot. Null when a reliable figure is unavailable; null does not mean zero rent. Unit: AED/sqft/year."},"size_sqft":{"type":["number","null"],"description":"Registered property size. Unit: sqft."}}},"RentalList":{"type":"object","required":["data","next_cursor","as_of","total","page","limit"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Rental"}},"next_cursor":{"type":["string","null"],"description":"Returned for cursor and numbered pages when more data exists. Pass as cursor to fetch the next page, removing page and preserving sort, order and filters. null on the last page."},"as_of":{"type":["string","null"],"format":"date","description":"The DLD delivery date the data was built from."},"total":{"type":"integer","minimum":0,"description":"Exact number of records matching all filters, including q, location_search and location scopes where supported. Ignores page, limit and cursor. Always included, even on empty pages. Not a snapshot: can change after a data refresh."},"page":{"type":["integer","null"],"minimum":1,"maximum":9007199254740991,"description":"Requested numbered page, or 1 when neither page nor cursor was supplied. null for cursor requests because a cursor position is not a numbered page."},"limit":{"type":"integer","minimum":1,"maximum":1000,"description":"Requested page size, or 100 when omitted. This is the maximum rows requested, not the actual number returned; data can contain fewer rows."}}},"RentalSingle":{"type":"object","required":["data","as_of"],"properties":{"data":{"$ref":"#/components/schemas/Rental"},"as_of":{"type":["string","null"],"format":"date"}}},"MarketIndexObservation":{"type":"object","description":"Monthly PropertyIndex (PIX) levels and supporting Dubai market observations.","properties":{"segment":{"type":["string","null"],"description":"PIX market segment. Known values: residential, apartment, villa, ready, offplan."},"month":{"type":["string","null"],"format":"date","description":"Index observation month."},"index_level":{"type":["number","null"],"description":"PIX index level for the segment and month. Unit: index points."},"mom_pct":{"type":["number","null"],"description":"Month-on-month PIX change. Unit: percent."},"yoy_pct":{"type":["number","null"],"description":"Year-on-year PIX change. Unit: percent."},"median_psf":{"type":["number","null"],"description":"Observed median registered sale PSF. Unit: AED/sqft."},"sales_count":{"type":["number","null"],"description":"Registered sales supporting the observation. Unit: sales."}}},"MarketIndexObservationList":{"type":"object","required":["data","next_cursor","as_of","total","page","limit"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/MarketIndexObservation"}},"next_cursor":{"type":["string","null"],"description":"Returned for cursor and numbered pages when more data exists. Pass as cursor to fetch the next page, removing page and preserving sort, order and filters. null on the last page."},"as_of":{"type":["string","null"],"format":"date","description":"The DLD delivery date the data was built from."},"total":{"type":"integer","minimum":0,"description":"Exact number of records matching all filters, including q, location_search and location scopes where supported. Ignores page, limit and cursor. Always included, even on empty pages. Not a snapshot: can change after a data refresh."},"page":{"type":["integer","null"],"minimum":1,"maximum":9007199254740991,"description":"Requested numbered page, or 1 when neither page nor cursor was supplied. null for cursor requests because a cursor position is not a numbered page."},"limit":{"type":"integer","minimum":1,"maximum":1000,"description":"Requested page size, or 100 when omitted. This is the maximum rows requested, not the actual number returned; data can contain fewer rows."}}}}}}