Methodology
How every figure is computed, what it rests on, and what it is not.
Data model
The tools read compact JSON marts: one manifest, one list of areas and one shard per area (plus a market-wide shard). A shard holds, per property type (apartment, villa):
- monthly sales: count, off-plan count, median and quartiles of price and of price per sqft;
- monthly rent contracts, annualised: count, P10, P25, median, P75, P90;
- rolling 12-month windows of the same, the previous 12 months for comparison, and 12-month sales by bedroom count.
The manifest records the dataset id, the as-of month, sources, attribution, minimum samples, suppression counts and a SHA-256 of every file.
Any source that can fill this schema plugs in through the same DataSource interface.
The synthetic marts (default)
- A seeded generator (
packages/core/src/marts/synthetic.ts) invents 24 areas and five years of transactions, then aggregates them exactly as a real pipeline would. - Names are invented, and map anchors are placed around 0°N 0°E, so synthetic points can never be mistaken for real places.
- Every value carries the label SYNTHETIC – not Dubai data.
Other data sources
- Official DLD open data is used only under DLD's terms or a written licence from DLD and Data.Dubai, through the same marts schema. No DLD data ships with this repository.
- datadubai.ae CC BY 4.0 aggregates: a local import into the same schema is planned (
import-datadubai, not built yet), with the attribution the publisher requires. - Asking-price aggregates from a listings API that implements the documented contract can be synced as a dated snapshot (see Data sources); they are labelled as asking prices and never shown as a trend.
- Planned cleaning rules for a licensed transaction pipeline (not part of this repository): sales procedure group only; single-unit transactions; a value floor; price per area trimmed to P1–P99 per area and type; land excluded from residential; off-plan and ready split by registration type.
Minimum samples and suppression
- A sales cell needs n ≥ 5 and a rent cell n ≥ 10. Smaller cells are suppressed (null), counted in the manifest, and shown as gaps.
- Areas below the minimum are left off maps and listed as "not shown".
Metrics
| Metric | Definition |
|---|---|
| Median price, price per sqft | Median of single-unit sales in the window |
| Change vs previous 12 months | Median price per sqft, last 12 months vs the 12 before. History only |
| Off-plan share | Off-plan sales / all sales in the window |
| Rent range | P10 to P90 of annualised contracts, all sizes (coarse: no bedroom field in the open rent feed) |
| Gross yield | 12-month median annual rent / 12-month median sale price, same area and type; band = P25 rent / P75 price to P75 rent / P25 price. Before costs |
| Nearby | Straight-line distance between area anchors |
| Best value | Highlighted only in the direction of the user's goal (lowest rent for renting, lowest price for buying, highest yield for investing); a tie highlights nothing |
Calculators
Regulatory ceiling (affordability)
The highest price that meets, at the same time:
- the CBUAE Circular 31/2013 loan-to-value limit for the buyer type, first home or not, and price tier;
- the 50% debt-burden ratio, tested at the mortgage rate plus a stress margin;
- the maximum loan multiple of annual income;
- savings covering the down payment and the DLD purchase fees.
It is a regulatory ceiling, not a lending decision. Banks apply their own policies.
Rent vs buy
Year-by-year cumulative net cost. Buying counts the down payment, fees, mortgage payments, service charges and maintenance, minus the equity left after selling costs. Renting counts rent, the agency fee and Ejari, minus the return the buyer's upfront cash would have earned. The break-even year is shown under low, base and high home-value growth assumptions. These are user-editable assumptions, not forecasts. The housing fee applies to renters and owner-occupiers alike, so it is left out of both sides.
Off-plan cashflow
Instalments of a preset or custom payment plan, Oqood registration at purchase, a handover delay entered by the user, and the 50% off-plan LTV cap on any mortgage at handover, compared with buying ready now.
Renewal check
The Decree 43/2013 band is computed only from the average the user enters from the official DLD Smart Rental Index for their unit. Market medians are never used as the legal reference.
Rules config
Every rule lives in packages/core/src/rules/uae.ts with its source URL, a last-verified date and a confidence level:
primary (read at the official source), secondary (secondary source; re-verify), assumption (user-editable default) or placeholder (must be entered by hand before public use).
The 3-month EIBOR value is currently a placeholder: it is entered by hand from the CBUAE page, dated, and never served as a series.
What the agent will not do
- Recommend buying, selling or holding a specific property, project or area.
- Forecast prices or rents.
- Say a user qualifies for a loan.
- Characterise a named developer, broker or project.
- Show listing cards or advertise units.
Data sources and database
Which data the tools read, how sources are switched on and off, and what the app's own database stores.
Maps
MapSpec, area anchors and the SVG renderer.
Code: Apache-2.0. Original docs text and diagrams: CC BY 4.0. Excluded from both: data, figures and charts derived from DLD or Data.Dubai (governed by DATA_LICENSE.md and any DLD grant); EIBOR values (CBUAE terms); third-party names and logos; and the product and operator names and logos (no trademark licence).
The default data is SYNTHETIC – not Dubai data. Nothing here is financial, legal or investment advice.