API REST

L’API REST

Vos outils lisent le catalogue de Realton et votre CRM, et y écrivent clients, notes, tâches et étapes d’affaires, au nom de la personne qui a créé la clé.

Formule Agency

Démarrage rapide

  1. Dans Realton, un propriétaire ou un administrateur ouvre Paramètres › API et MCP, coche API REST et choisit Créer une clé. Copiez-la aussitôt : elle ne s’affiche qu’une fois.
  2. Gardez-la sur votre serveur, dans une variable d’environnement :
    export REALTON_API_KEY="rtk_live_…"
  3. Faites votre premier appel :
    curl "https://realton.ai/api/v1/projects?place=Dubai&beds=2&limit=5" \
      -H "Authorization: Bearer $REALTON_API_KEY"

Développer l’intégration avec une IA

Aujourd’hui, la plupart des intégrations sont écrites par une IA. Donnez-lui ces deux adresses et la tâche en quelques mots ; elle lit le reste toute seule.

Un prompt à copier, en complétant les crochets :
Je veux connecter [mon site web / mon CRM / mon système] à l’API REST de Realton.
Lisez d’abord la note de cadrage : https://realton.ai/docs/api.md
Le document OpenAPI complet : https://realton.ai/docs/openapi.json
Ma stack : [par exemple, Next.js sur Vercel].
Ce que je veux : [par exemple, afficher sur mon site les projets Realton à Dubaï, mis à jour une fois par jour].
La clé d’API se trouve dans la variable d’environnement REALTON_API_KEY. Ne me demandez jamais la clé et ne l’écrivez jamais dans le code.

Ne collez jamais la clé dans une conversation. Définissez vous-même REALTON_API_KEY sur le serveur, et ne donnez à l’IA que son nom.

Les règles

La clé

Chaque appel envoie la clé dans l’en-tête Authorization. Une clé n’ouvre l’API REST que si API REST a été coché à sa création, et seulement tant que l’espace de travail est en formule Agency.

Authorization: Bearer rtk_live_…

Au nom de qui agit un appel

Un appel agit au nom du membre qui a créé la clé, avec ce qu’il peut voir : ses propres clients pour un agent, ceux de l’agence pour un propriétaire ou un administrateur. Quand ce membre quitte l’espace de travail, la clé cesse de fonctionner.

Limites

Jusqu’à 120 appels par minute et par clé. Au-delà, la réponse est 429 avec RATE_LIMITED et retryAfterSec : attendez ce nombre de secondes et rappelez.

Pagination

GET /projects renvoie jusqu’à 100 projets à la fois : limit indique combien, offset à partir d’où, et total combien il y en a en tout.

Identifiants

La clé d’un projet vient de GET /projects, l’identifiant d’un client de GET /clients, et celui d’une affaire de la fiche du client, GET /clients/{id}, dans deals[].id.

Rien ne part vers un client

Aucun appel n’envoie quoi que ce soit à un client : POST /brochures renvoie un lien que l’agent envoie lui-même. Les prix sont ceux du promoteur, dans sa devise.

Refus

Un refus est un JSON avec un code stable. Basez-vous sur le code, jamais sur le message.

{ "code": "plan_required" }
StatutCodeSignification
401key_requiredPas d’en-tête Authorization avec une clé.
401key_invalidLa clé est inconnue ou a été révoquée.
403key_scopeLa clé n’ouvre pas l’API REST. Créez-en une en cochant API REST.
403plan_requiredL’espace de travail n’est plus en formule Agency.
403key_member_goneLa personne qui a créé la clé a quitté l’espace de travail. Créez une nouvelle clé.
404not_foundIntrouvable, ou hors de ce que ce membre peut voir.
429RATE_LIMITEDTrop d’appels cette minute. Attendez retryAfterSec secondes.
400place_unknown, whatsapp_invalid, …Un champ hors limites ou une valeur non valide. Le code indique lequel.

Référence

Chaque appel avec ses champs et un exemple, comme dans le document OpenAPI.

Adresse de base
https://realton.ai/api/v1

Catalogue

GET/projectsSearch the catalog

Projects that fit, newest first, with their price from. Up to 100 a page.

Paramètres

NomTypeDescription
q
dans la requête
string ≤ 120Words of a project's or a developer's name.
place
dans la requête
string ≤ 80A city or an emirate, by name or slug: Dubai, Batumi, Limassol.
area
dans la requête
string ≤ 80An area, by name or slug: Dubai Islands, JVC.
beds
dans la requête
integer 0–9Bedrooms: 0 is a studio, 4 is four and more.
maxPrice
dans la requête
numberThe most the client would pay, in currency.
currency
dans la requête
stringThe currency of maxPrice.
handoverBy
dans la requête
integer 2025–2045The latest handover year.
lang
dans la requête
en | heThe language of place and area names.
limit
dans la requête
integer 1–100How many projects in this page.
offset
dans la requête
integerHow many to skip: the next page starts at offset + limit.

Réponse 200

NomTypeDescription
totalobligatoireintegerHow many projects fit, across all pages.
offsetobligatoireintegerThe offset of this page.
catalogDateobligatoirestringThe day the catalog was last built, YYYY-MM-DD.
projectsobligatoirearray

Chacun d’eux

NomTypeDescription
keystringThe project key, for GET /projects/{key} and POST /brochures.
namestringThe project's name.
developerstring | nullThe developer's name.
marketae | cy | ge | om | saae, cy, ge, om or sa.
placestring | nullThe city or emirate.
areastring | nullThe area.
stageOFF_PLAN | UNDER_CONSTRUCTION | READYOFF_PLAN, UNDER_CONSTRUCTION or READY.
handoverstring | nullWhen it is handed over, as the developer says it: Q4 2028.
priceFromnumber | nullThe lowest price, in currency.
currencystringThe developer's currency: AED, EUR, USD, OMR, SAR.
bedroomsarrayThe bedroom counts it has; 0 is a studio.
commissionPctnumber | nullThe agent's commission, in percent.
photostring | nullA photo of it.
Exemple
{
  "total": 312,
  "offset": 0,
  "catalogDate": "2026-10-24",
  "projects": [
    {
      "key": "studio:soma-residences",
      "name": "Soma Residences",
      "developer": "Origami Properties",
      "market": "ae",
      "place": "Dubai",
      "area": "Dubai Islands",
      "stage": "OFF_PLAN",
      "handover": "Q4 2028",
      "priceFrom": 1670000,
      "currency": "AED",
      "bedrooms": [
        1,
        2,
        3
      ],
      "commissionPct": 5,
      "photo": "https://…/soma-residences.avif"
    }
  ]
}
curl
curl -X GET "https://realton.ai/api/v1/projects" \
  -H "Authorization: Bearer $REALTON_API_KEY"
GET/projects/{key}One project in full

Unit types with sizes and prices, payment plans, amenities, the gallery and what is nearby.

Paramètres

NomTypeDescription
keyobligatoire
dans le chemin
stringThe project key from GET /projects.
lang
dans la requête
en | heThe language of names, plans and amenities.

Réponse 200

NomTypeDescription
entryobjectIts catalog line: the same figures as GET /projects, with title for the name and slugs for place and area.
placeNamestring | nullThe city or emirate.
areaNamestring | nullThe area.
unitTypesarrayEach unit type: label, beds, available (from the inventory), sizeSqft, sizeSqm, priceFrom, currency, pricePerArea, areaUnit.
plansarrayPayment plans: each with its steps (label, timing, percent, phase) and its share before and after handover.
dldPctnumber | nullDubai's registration fee on booking, in percent; null elsewhere.
amenitiesarrayWhat the project offers.
galleryobjectcount, and images with their url.
nearbyarrayPlaces near it: category, name, km.
curl
curl -X GET "https://realton.ai/api/v1/projects/{key}" \
  -H "Authorization: Bearer $REALTON_API_KEY"

Clients

GET/clientsYour clients

An agent's own clients; an owner's or an admin's, the agency's. Last active first.

Paramètres

NomTypeDescription
q
dans la requête
string ≤ 80A name, a number or an email to look for.

Réponse 200

NomTypeDescription
clientsobligatoirearray

Chacun d’eux

NomTypeDescription
idstringThe client id.
namestring | nullTheir name.
whatsappstring | nullTheir number.
emailstring | nullTheir email.
languagestring | nullThe language they speak.
sourcestringWhere they came from.
stageNEW | CONTACTED | VIEWING | EOI | BOOKED | WON | LOSTThe stage of their most advanced open deal.
projectstring | nullThe project of that deal.
lastActivityAtstringThe last thing that happened with them, ISO date-time.
ownerUserIdstringThe member they belong to.
openTasksintegerTheir open tasks.
curl
curl -X GET "https://realton.ai/api/v1/clients" \
  -H "Authorization: Bearer $REALTON_API_KEY"
POST/clientsA new client

A name and at least one way to reach them is the usual; a name alone is accepted.

Corps

NomTypeDescription
nameobligatoirestring ≤ 120Their full name.
whatsappstring ≤ 30A number with its country code, +971 50 555 0147.
emailstring ≤ 200An email address.
languagestring ≤ 5The language they speak, a two-letter code: en, ar, he, ru…
Exemple
{
  "name": "Elena Petrova",
  "whatsapp": "+971505550147",
  "language": "ru"
}

Réponse 201

NomTypeDescription
idstringThe client id.
namestring | nullTheir name.
languagestring | nullThe language they speak.
whatsappstring | nullTheir number, E.164.
emailstring | nullTheir email.
ownerUserIdstringThe member they belong to.
updatedAtstringISO date-time.
curl
curl -X POST "https://realton.ai/api/v1/clients" \
  -H "Authorization: Bearer $REALTON_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Elena Petrova","whatsapp":"+971505550147","language":"ru"}'
GET/clients/{id}A client's card

Their details, what they are looking for, and their deals with each deal's id for PATCH /deals/{id}.

Paramètres

NomTypeDescription
idobligatoire
dans le chemin
stringThe client id from GET /clients.
lang
dans la requête
en | heThe language of place names.

Réponse 200

NomTypeDescription
idstringThe client id.
namestring | nullTheir name.
whatsappstring | nullTheir number.
emailstring | nullTheir email.
languagestring | nullThe language they speak.
requirementsobjectWhat they are looking for: places, bedrooms, budget, handover.
ownerNamestring | nullThe member they belong to.
dealsarrayTheir deals: id, stage, projectKey, projectTitle, beds, unitLabel, price, currency, commissionPct, commission, lostReason.
curl
curl -X GET "https://realton.ai/api/v1/clients/{id}" \
  -H "Authorization: Bearer $REALTON_API_KEY"
POST/clients/{id}/notesA note on a client's card

Free text on the client's timeline, as the member.

Paramètres

NomTypeDescription
idobligatoire
dans le chemin
stringThe client id.

Corps

NomTypeDescription
textobligatoirestring ≤ 4000The note.
Exemple
{
  "text": "Wants a sea view, budget AED 2M, moving in 2028."
}

Réponse 201

NomTypeDescription
idobligatoirestringThe note id.
curl
curl -X POST "https://realton.ai/api/v1/clients/{id}/notes" \
  -H "Authorization: Bearer $REALTON_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"text":"Wants a sea view, budget AED 2M, moving in 2028."}'

Tâches

GET/tasksYour tasks

The member's own tasks, with how many there are in each scope.

Paramètres

NomTypeDescription
scope
dans la requête
open | overdue | today | upcoming | someday | doneopen is every task not done.

Réponse 200

NomTypeDescription
tasksobligatoirearray
countsobligatoireobjectHow many tasks in overdue, today, upcoming, someday and done.

Chacun d’eux

NomTypeDescription
idstringThe task id.
titlestringWhat to do.
notestring | nullMore words about it.
dueAtstring | nullWhen, ISO date-time.
dueKindAT | DAY | NONEAT, DAY or NONE.
doneAtstring | nullWhen it was done.
scopeoverdue | today | upcoming | someday | doneWhere it stands now, in the member's time zone.
contactobject | nullThe client it is for: id and name.
dealIdstring | nullThe deal it belongs to.
curl
curl -X GET "https://realton.ai/api/v1/tasks" \
  -H "Authorization: Bearer $REALTON_API_KEY"
POST/tasksA new task

A task at a time, on a day, or with no date; for a client when clientId is given.

Corps

NomTypeDescription
titleobligatoirestring ≤ 200What to do.
notestring ≤ 2000More words about it.
dueAtstring ≤ 40When: an ISO date-time with its offset, 2026-10-25T11:00:00+04:00. With dueKind DAY, any time on that day.
dueKindAT | DAY | NONEAT for a time, DAY for a whole day, NONE for no date.
clientIdstringThe client the task is for.
Exemple
{
  "title": "Call Elena about Soma Residences",
  "dueAt": "2026-10-25T11:00:00+04:00",
  "dueKind": "AT",
  "clientId": "cm2x8k1qz0001abcdeffghijk"
}

Réponse 201

NomTypeDescription
idstringThe task id.
titlestringWhat to do.
notestring | nullMore words about it.
dueAtstring | nullWhen, ISO date-time.
dueKindAT | DAY | NONEAT, DAY or NONE.
doneAtstring | nullWhen it was done.
scopeoverdue | today | upcoming | someday | doneWhere it stands now, in the member's time zone.
contactobject | nullThe client it is for: id and name.
dealIdstring | nullThe deal it belongs to.
curl
curl -X POST "https://realton.ai/api/v1/tasks" \
  -H "Authorization: Bearer $REALTON_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"title":"Call Elena about Soma Residences","dueAt":"2026-10-25T11:00:00+04:00","dueKind":"AT","clientId":"cm2x8k1qz0001abcdeffghijk"}'

Affaires

PATCH/deals/{id}Move a deal's stage

A deal's id is on its client's card (GET /clients/{id}, deals[].id).

Paramètres

NomTypeDescription
idobligatoire
dans le chemin
stringThe deal id.

Corps

NomTypeDescription
stageobligatoireNEW | CONTACTED | VIEWING | EOI | BOOKED | WON | LOSTThe new stage.
lostReasonstring ≤ 200Why it was lost; read only with LOST.
Exemple
{
  "stage": "VIEWING"
}

Réponse 200

NomTypeDescription
okobligatoireboolean
curl
curl -X PATCH "https://realton.ai/api/v1/deals/{id}" \
  -H "Authorization: Bearer $REALTON_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"stage":"VIEWING"}'

Brochures

POST/brochuresA brochure link

A brochure of a project in your brand, with open tracking, for the agent to send. Realton does not send it.

Corps

NomTypeDescription
projectobligatoirestringThe project key.
clientIdstringThe client it is for: their opens show on their card.
langobligatoireen | heThe language of the brochure.
Exemple
{
  "project": "studio:soma-residences",
  "clientId": "cm2x8k1qz0001abcdeffghijk",
  "lang": "en"
}

Réponse 201

NomTypeDescription
idobligatoirestringThe link id.
urlobligatoirestringThe address to send: it opens the brochure in the agency's brand.
projectobligatoirestringThe project name.
langobligatoirestringThe language of the brochure.
clientobligatoirestring | nullThe client's name, when it is for one.
Exemple
{
  "id": "cm2x9p0aa0002abcdeffghijk",
  "url": "https://realton.ai/b/Hk3…",
  "project": "Soma Residences",
  "lang": "en",
  "client": "Elena Petrova"
}
curl
curl -X POST "https://realton.ai/api/v1/brochures" \
  -H "Authorization: Bearer $REALTON_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"project":"studio:soma-residences","clientId":"cm2x8k1qz0001abcdeffghijk","lang":"en"}'