List published projects (paginated, filterable)
const url = 'https://agent-dev.azizdubai.com/projects?developer_ids=3%2C4&unit_types=1%2C2&development_status=1%2C2&bedrooms=0%2C1%2C2&statuses=3%2C4&handover_from=2027-01-01&handover_to=2029-12-31&preference_ids=1%2C7&unit_preference_ids=1%2C3&limit=20&offset=0';const options = {method: 'GET', headers: {'X-API-Key': '<X-API-Key>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url 'https://agent-dev.azizdubai.com/projects?developer_ids=3%2C4&unit_types=1%2C2&development_status=1%2C2&bedrooms=0%2C1%2C2&statuses=3%2C4&handover_from=2027-01-01&handover_to=2029-12-31&preference_ids=1%2C7&unit_preference_ids=1%2C3&limit=20&offset=0' \ --header 'X-API-Key: <X-API-Key>'Returns published projects only (is_draft = false).
Price bounds must be expressed in the prices the client sees, that is, with the key’s price vector already applied. The service converts them back to base prices before querying the database, so that filtering and the displayed prices are always consistent.
CSV parameters accept a comma-separated list, for example
statuses=3,4.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Query Parameters
Section titled “Query Parameters”Case-insensitive substring of the project name or its developer’s name.
CSV of developer company IDs.
CSV of Project.type values (positive integers).
CSV of construction stages, values 1–3.
CSV of bedroom counts; 0 denotes a studio. The value 5 is
interpreted as “5+” and matches five or more bedrooms.
CSV of unit statuses, values 1–5.
Minimum unit price, in the key’s prices.
Maximum unit price, in the key’s prices.
Minimum price per ft², in the key’s prices. Calculated as price divided by area.
Minimum price per m², in the key’s prices.
Minimum unit area in m² (the storage unit of Unit.unit_area).
Minimum number of parking spaces for the unit.
Branded project.
The project has an escrow account.
Lower bound of the handover date. RFC3339 or YYYY-MM-DD.
Upper bound of the handover date. RFC3339 or YYYY-MM-DD.
Maximum percentage of payments due before handover (0–100).
Minimum percentage of payments due after handover (0–100).
Only projects with post-handover payments.
Latitude of the search centre. Must be used together with lng and radius_km.
Longitude of the search centre. Must be used together with lat and radius_km.
Search radius in kilometres; must be greater than zero.
The project has a nearby facility in the “airports and ports”
category. The proximity threshold is configured on the server
(AMENITIEST_RADIUS) and cannot be set per request. The other
seven categories use flags of the same form.
CSV of project feature/amenity IDs. AND semantics: the project must have all of the listed items.
CSV of unit tag IDs. AND semantics, applied to a single unit: the project must have one unit that carries all of the listed tags and also satisfies every other unit-level filter.
Page size. Values above 100 are capped at 100.
Responses
Section titled “Responses”A page of projects.
object
The shape depends on the operation.
object
Total number of projects matching the filters
object
Free-form integer with no defined meaning.
Lowest unit price in the project, in the key’s prices. null if the project has no priced units.
Smallest unit area
object
Ready-to-use logo link, built from STATIC_BASE_URL.
object
1 — down payment, 2 — during construction, 3 — on completion.
object
object
1 — feature, 2 — amenity.
object
1 — feature, 2 — amenity.
Example
{ "status": "success", "data": { "items": [ { "development_status": 0, "currency": "AED", "payment_plans": [ { "type": 1 } ], "preferences": { "features": [ { "name": "Infinity Pool", "type": 1 } ], "amenities": [ { "name": "Infinity Pool", "type": 1 } ] } } ] }}A parameter or the request body failed validation.
object
Human-readable message.
Examples
{ "status": "error", "message": "id must be a positive integer"}The key is missing (missing api key) or invalid (invalid api key).
The latter covers unknown, revoked and deleted keys. Every operation
requires a key, so any request without one receives this response.
object
Human-readable message.
Examples
{ "status": "error", "message": "invalid api key"}The key is valid, but it is restricted to a list of domains and the
request’s Origin (or Referer) does not match any of them; or the
key’s agency has no approved licence.
object
Human-readable message.
Examples
{ "status": "error", "message": "origin is not allowed for this api key"}{ "status": "error", "message": "agency license is required: upload a company license and wait for its approval"}An unexpected error. The cause is logged; a generic message is returned.
object
Human-readable message.
Examples
{ "status": "error", "message": "internal server error"}