Rilt AI Realty

API documentation

Authentication

Send your key in the Authorization header on every request. All requests use HTTPS and return JSON.

curl -H "Authorization: Bearer YOUR_API_KEY" "https://realty.rilt.ai/api/v1/projects?per_page=10&city=Dubai"

Base URL: https://realty.rilt.ai/api/v1. Keys can be revoked or rotated at any time; the old key stops working immediately.

Endpoints
PathWhat it doesParameters
GET/api/v1/projectsList projects (paginated).page, per_page (max 100), q*, city, community, developer†, type†, status†, min_price†, max_price†, bedrooms†, updated_since†, bbox† (south,west,north,east, needs maps), sort (newest|updated|name|price_asc†|price_desc†)
GET/api/v1/projects/{id}One project with description, amenities, payment plan, units and media your plan includes.
GET/api/v1/projects/{id}/mediaImage, brochure and floor-plan links the plan includes.
GET/api/v1/unitsList unit types (property configurations) across projects.page, per_page, project_id, bedrooms†, min_price†, max_price†, min_area†
GET/api/v1/units/{id}One unit type.
GET/api/v1/developersDevelopers with project counts (needs advanced filters).
GET/api/v1/locationsCities and communities with project counts.
GET/api/v1/changesRecords created or changed after a cursor; removed records come back as {deleted:true}.cursor (version of the last record you processed; start at 0), limit (max 500), since (ISO time, alternative start)
GET/api/v1/statusWhen the data last changed and was last synced from the source.
GET/api/v1/usageYour own quota, limits and plan features. Does not use quota.

* needs the Search feature · † needs Advanced filters. Lists return { data: [...], meta: { page, per_page, total, has_more } }.

Examples
const res = await fetch("https://realty.rilt.ai/api/v1/projects?per_page=10", {
  headers: { Authorization: "Bearer YOUR_API_KEY" },
});
if (!res.ok) throw new Error((await res.json()).error.message);
const { data, meta } = await res.json();
import requests
r = requests.get("https://realty.rilt.ai/api/v1/projects", params={"per_page": 10},
                 headers={"Authorization": "Bearer YOUR_API_KEY"}, timeout=30)
r.raise_for_status()
projects = r.json()["data"]

Staying in sync with the change feed

Every record has a version that only goes up. Ask for everything after the last version you saw; deleted or archived records come back as { "id": "...", "deleted": true }. Start with cursor=0 for a full copy.

// Keep your own copy up to date: run this every few minutes (or as often as your plan allows)
let cursor = Number(loadCursor() ?? 0);
for (;;) {
  const r = await fetch(`https://realty.rilt.ai/api/v1/changes?cursor=${cursor}&limit=200`, { headers: { Authorization: "Bearer YOUR_API_KEY" } });
  const { data, meta } = await r.json();
  for (const p of data) p.deleted ? removeLocal(p.id) : saveLocal(p);
  cursor = meta.next_cursor; saveCursor(cursor);
  if (!meta.has_more) break;
}
Example response
GET /api/v1/projects/{id}

{
  "data": {
    "id": "…", "external_id": "5785", "version": 12345, "updated_at": "2026-10-11T09:09:21.000Z",
    "name": "…", "developer": { "id": "…", "name": "…" }, "city": "Dubai", "community": "…",
    "latitude": 25.2, "longitude": 55.3, "status": "Announced",
    "completion": { "date": "2029-12-31", "text": "31-12-2029" },
    "price_min": 599000, "price_max": 599000, "currency": "AED",
    "units": [ { "type": "1Bedrooms", "bedrooms": 1, "area_min": 645, "price_min": 999000 } ],
    "media": [ { "kind": "cover", "url": "https://…" } ]
  }
}

Fields appear only if your plan includes them. Prices shown by the source are rounded (e.g. “AED 1.2M”) and are returned as such.

Fields a plan can include
  • name – Project name
  • developer – Developer
  • description – Description
  • propertyTypes – Property types
  • city – City
  • community – Community / district
  • address – Address
  • latitude – Latitude
  • longitude – Longitude
  • saleStatus – Sale / construction status
  • completionDate – Completion date
  • priceMin – Minimum price
  • priceMax – Maximum price
  • currency – Currency
  • amenities – Amenities
  • paymentPlan – Payment plan
  • sourceUrl – Source link
Features a plan can include
  • images – Image URLs and galleries
  • brochures – Brochures and documents
  • floorPlans – Floor plans
  • maps – Coordinates, map bounding-box search
  • search – Free-text search
  • advancedFilters – Advanced filters (price, bedrooms, developer, type)
  • units – Unit / property endpoints
  • changeFeed – Change feed (records changed since a time)
  • syncStatus – Data update and sync status endpoint
  • webhooks – Webhooks (we notify your system when data changes)
  • export – CSV / JSON export from the portal
Webhooks (plans that include them)

Instead of polling, register an HTTPS endpoint in the portal. We send data.updated when new data is ready (only counts and versions, never property data), plus quota.warning and subscription.changed. Each request is signed: X-Rilt-Signature: t=<time>,v1=HMAC-SHA256(secret, t + "." + body). Reply with a 2xx within 8 seconds; failures retry after 1 min, 5 min, 30 min, 2 h and 6 h. On data.updated, call /api/v1/changes with your stored cursor.

Limits

Every response carries X-RateLimit-Limit/Remaining/Reset (per minute) and X-Quota-Limit/Remaining (per month, UTC calendar month). The change feed may also be limited to one call every N seconds on smaller plans.

Errors

Errors use a consistent shape: { "error": { "code": "…", "message": "…", "status": 429, "request_id": "req_…" } }

HTTPCodeMeaning
400invalid_parameterA query parameter is malformed or out of range.
400history_limit`since` is older than your plan's change-history window.
401missing_credentialsNo API key was sent.
401invalid_api_keyThe key does not exist or is malformed.
401key_revokedThe key was revoked.
401key_expiredThe key passed its expiry date.
402no_subscription / subscription_expired / subscription_paused / subscription_pendingThe company has no active subscription.
403feature_not_in_planThe endpoint, filter or field needs a feature your plan does not include.
403scope_not_allowedThe key was restricted and may not use this endpoint.
403tenant_suspended / tenant_pending / tenant_closedThe company account is not active.
404not_foundNo such record, or it is outside your plan.
429rate_limitedPer-minute limit hit. Wait for `Retry-After` seconds.
429quota_exceededMonthly request quota used up.
429too_frequentChange-feed called more often than your plan allows.
500internal_errorOur side. Retry later and quote `request_id`.
Media and licensing

Images, brochures and floor plans are returned as links to the original files and only when the platform has confirmed it may redistribute them and your plan includes them. Respect the source's terms when you display them. A machine-readable description is at https://realty.rilt.ai/api/v1/openapi.json.