Version
La version majeure figure dans le chemin : /api/v1. Au sein de v1, nous ne cassons pas les intégrations existantes. La version actuelle du contrat est info.version dans /openapi.json ; elle augmente à chaque modification.
Ce qui peut changer sans préavis
Ces changements sont compatibles, et votre client doit savoir les gérer :
- nouvelles opérations et nouveaux outils ;
- nouveaux champs de requête facultatifs ;
- nouveaux champs de réponse ;
- nouvelles valeurs dans les énumérations de réponse (statuts, codes), nouveaux codes d'erreur dans
title, nouveaux types d'événements webhook ; - modifications du texte de
detail; - relèvement des limites.
Écrire un client
- Ignorez les champs de réponse inconnus.
- Traitez une valeur d'énumération, un code d'erreur ou un type d'événement inconnu comme « autre », et non comme un échec.
- Basez vos branchements sur
status,titleetcode, pas sur le texte dedetail. - Ne comptez ni sur l'ordre des champs ni sur la longueur des identifiants.
- Fiez-vous au
statede la tâche, pas austatusbrut de l'outil.
Ce qui compte comme rupture
Supprimer ou renommer une opération, un champ, un scope ou un événement ; un nouveau champ de requête obligatoire ; changer le type ou le sens d'un champ ; changer le code de statut pour un même cas ; restreindre les valeurs autorisées. Nous ne faisons pas de tels changements dans v1 sans préavis : l'opération est d'abord marquée deprecated dans /openapi.json et dans ce journal des modifications, et continue de fonctionner pendant au moins 6 mois. La correction d'une vulnérabilité fait exception.
Une correction qui rend une réponse conforme à cette documentation n'est pas un changement cassant.
Journal des modifications
2026-11-09 - version 1.21
Ajouté :
- Mode
Prefer: respond-asyncpourPOST /site/create: un202avec une tâche de requête aussitôt ;GET /site/create/jobs/{id}(gratuit) contient dansresultl’ancienne réponse200. Événementssite.completed/site.failed. Sans l’en-tête, rien ne change. - SDK 1.11.0 :
site.createaccepte l’optionrespondAsync.
2026-11-08 - version 1.20
Ajouté :
- Mode
Prefer: respond-asyncpourPOST /draft/extract: les fichiers sont envoyés et un202avec une tâche de requête arrive aussitôt ;GET /draft/extract/jobs/{id}(gratuit) contient dansresultl’ancienne réponse200. Événementsdraft.completed/draft.failed. Sans l’en-tête, rien ne change. - SDK 1.10.0 :
draft.extractaccepte l’optionrespondAsync.
2026-11-08 - version 1.19
Ajouté :
- L’événement
review.action_required: la vérification de rapport a lu le document et attendPOST /valuation/review/jobs/{id}/confirm. Il arrive une fois par vérification, avec son id, y compris lancée avecPrefer: respond-async. Auparavant, seul le sondage l’indiquait.
2026-11-06 - version 1.18
Ajouté :
Prefer: respond-asyncpourPOST /floorplan/createetPOST /valuation/review: les fichiers sont acceptés, puis un202immédiat avec une tâche de requête (jobIddu typeareq_…) et les en-têtesLocation,Retry-AfteretPreference-Applied. Statut : sur le même chemin,GET /floorplan/create/jobs/{id}etGET /valuation/review/jobs/{id}(gratuit) ;resultcontient le même corps202que sans l'en-tête (une vérification de rapport nécessite toujoursconfirm). Sans l'en-tête, rien ne change.- Une tâche de requête interrompue par un redémarrage du service se termine en
failedaveccode: interrupted: rien n'est facturé et l'Idempotency-Keyest libérée - renvoyez la même requête avec la même clé. - SDK 1.9.0 :
floorplan.createetvaluation.reviewacceptent l'optionrespondAsync; aprèsinterrupted, le client renvoie de lui-même le même formulaire avec la même clé, deux fois au maximum.
2026-11-05 - version 1.17
Ajouté :
Prefer: respond-asyncpourPOST /valuation/expressetPOST /valuation/rent: un202immédiat avec une tâche et les en-têtesLocation,Retry-AfteretPreference-Applied. Statut :GET /valuation/express/jobs/{id}etGET /valuation/rent/jobs/{id}(gratuit) ;resultcontient le même corps que le200synchrone,errorle même problème. Sans l'en-tête, les appels restent synchrones.- Événements webhook
express.completed,express.failed,rent.completed,rent.failed. - SDK 1.8.0 : l'
Idempotency-Keyest créée automatiquement ; après une coupure, un délai dépassé,502,504,524et409 idempotency_conflict, l'appel est répété avec la même clé, pendant au plusretryWindowMs(10 minutes) ; l'optionrespondAsyncet la méthodejobs.result.
Modifié :
- Après
524ou504, l'Idempotency-Keyn'est plus libérée : le travail a pu se terminer et être facturé. Une répétition avec la même clé renvoie le résultat final sans seconde facturation, et reçoit409tant que le premier appel est encore en cours.
2026-10-03 - version 1.16
Modifié :
429porte uncode:minute_limitoudaily_limit(la limite journalière de la clé, réinitialisée à 00:00 UTC).- Un objet écrit avec une clé d'agence appartient à l'agence ; les webhooks
object.*etlead.*des objets et leads de l'agence parviennent aussi aux endpoints de l'agence. - Photos des objets : jusqu'à 50 pour chaque type, comme dans l'espace personnel.
- SDK 1.7.2 : un fragment de flux vide ne coupe plus un événement de chat en deux.
Corrigé :
PUT /objects/{kind}/{id}conserve l'état de modération,isSoldet la publication de l'annonce ; auparavant il les réinitialisait (une simple modification dépubliait une annonce en ligne).GET /objectsne liste plus les objets des propriétaires suspendus ; une fiche masquée aux visiteurs n'est pas non plus affichée par identifiant.PATCH /leads/{id}: l'expéditeur d'un lead sans contrat peut en changer le statut, comme dans l'espace personnel ; la modification et l'archivage sont inscrits dans l'historique du lead.
2026-10-03 - version 1.15
Modifié :
PATCH /leads/{id}(statut) etDELETE /leads/{id}suivent les règles de l'espace personnel : finalisation, encaissement de la commission, contrat ou accord actif -422avec le motif danscode.?expand=historyne contient plus de métadonnées techniques (jetons, identifiants d'autres utilisateurs).- La limite journalière gratuite du chat répond
code: free_daily_limitavecRetry-Afterjusqu'à 00:00 UTC. GET /works:previewUrl,linketobject.photoUrlsont des chemins/files/...pourGET /artifacts/{path};nextCursorvautnullsur la dernière page.- Écriture de leads : les champs inconnus sont ignorés (et non refusés) ; les longueurs imposées par le service figurent dans la spécification ;
pool: trueremet le lead au pool de la plateforme. - SDK 1.7.1 :
jobs.waitattend la fin d'un429;chat.streamgère un CRLF coupé entre deux fragments ;artifact()acceptesignal.
Corrigé :
- Aperçu musical : un
Rangeau-delà de la fin donne416(il était répondu en404) ; une défaillance du service de fichiers donne502, et non404. - Un fichier de plus de 15 MB dans
POST /uploadsdonne413. Une annoncestrictPhotosrefusée indique les photos en échec (code: photo_fetch_failed). - Un refus du pack de contenu indique
form.media.photos. Bac à sable : la vérification prend le premier fichier quel que soit son nom ; les chaînes de loyer et les clés du service photo ne sont pas refusées.
2026-10-03 - version 1.14
Modifié :
- Une répétition de l'estimation express avec la même
Idempotency-Keyest désormais entièrement gratuite : l'appel API n'est pas non plus facturé. GET /works: uncursorqui n'est pasnextCursordonne400(auparavant la liste recommençait silencieusement).POST /webhooks/{id}/test: uneventTypeabsent de la liste donne400(auparavant un test générique était envoyé).- Swipe Match :
reasonCoden'accepte que les motifs listés, comme le service l'a toujours exigé ; lekindd'un lead peut valoirpool. - SDK 1.7.0 :
jobs.waitrésiste à une interrogation perdue ;artifact()accepterange;chat.streamlit les flux CRLF et produit un appel par événement.
Corrigé :
- Aperçu musical :
bytes=-Nrenvoie les N derniers octets, unRangeau-delà de la fin donne416. - Un délai de connexion dépassé avant l'envoi de la requête libère l'
Idempotency-Key. - Bac à sable : photos vidéo sous n'importe quel nom de champ lu par le service, nombres de loyer envoyés sous forme de chaînes, PNG de flyer à la taille indiquée.
2026-10-03 - version 1.13
Ajouté :
GET /worksrenvoie ce que l'espace personnel affiche pour chaque résultat :street,streetNumber,previewUrl,link,repeatIndex,erroret l'annonce (object).GET /chat/sessionsdocumente ses paramètres :limit,cursor,q,projectId,archivedOnly,sort.Problem.titledans la spécification listerange_not_satisfiable; la liste des webhooks porterequestId.- SDK 1.6.1 :
chat.listSessionsaccepte les paramètres de liste.
Modifié :
- La spécification indique les limites déjà appliquées en production :
scriptTextde l'avatar jusqu'à 1200 caractères,formatsdu flyer jusqu'à 3 etlayoutsjusqu'à 5, longueurs des champscontactsdu flyer,seedphoto jusqu'à 2147483647, et aucune clé inconnue dansdataphoto. - Estimation express : la passerelle ne refuse qu'une requête sans aucune surface et sans type de bien ; c'est le service qui décide si
landPlotAreacompte (un terrain indiqué danspropertyTypeouapartmentTypecompte aussi).
Corrigé :
- Le bac à sable refuse les photos comme la production (JPEG, PNG ou WebP jusqu'à 25 MB -
JOB_CREATE_FAILED; un masque hors nettoyage -MASK_NOT_SUPPORTED) et accepte ce que la production tronque ou remplace (titre de la vidéo, volume, carte de fin et options de phrase de clôture, langue de la page d'atterrissage, plus de 20 photos de contenu,furnisheddu loyer sous forme de mot). Une tâche de rapport n'affiche pluspendingaprèsrunning. - Une redirection de téléchargement refusée l'indique au lieu d'un délai dépassé ; un suffixe
Rangeplus long que le fichier renvoie le fichier entier. - SDK 1.6.1 :
verifyWebhookSignaturefonctionne sous Node 18.
2026-10-03 - version 1.12
Ajouté :
416 range_not_satisfiablesous forme de problème RFC 9457 (il arrivait avec un corps vide).priceMinorau lancement de l'amélioration de photos : ce que l'appel coûte, tel que l'affiche l'espace personnel.- SDK 1.6.0 :
worksacceptefrom/to,chat.historyacceptelimit/cursor,chat.sendMessageacceptestyle.
Modifié :
GET /match/leads:limitsupérieur à 50 oupagesupérieur à 1000 répondent400(ils n'ont jamais été tronqués).POST /match/leads/{id}/events: uneIdempotency-Keyd'un autre format donne400au lieu d'être ignorée silencieusement.- Un champ refusé par le flyer donne
400 validationen nommant le champ (auparavant422). - Un appel dont le paiement est encore en cours de réservation sous la même
Idempotency-Keydonne409 idempotency_conflict(auparavant422). - Estimation express :
landPlotAreacompte comme surface uniquement pourland, comme dans le service. - Un délai dépassé, une connexion réinitialisée ou un socket fermé en cours de réponse laissent l'
Idempotency-Keyoccupée ; seule une requête qui n'a jamais atteint le service la libère. - SDK 1.6.0 : un téléversement n'est jamais répété après
503; l'écouteur d'abandon est retiré après chaque pause.
Corrigé :
- Les refus du PDF et de la page d'atterrissage indiquent leur motif :
402avecINSUFFICIENT_FUNDSouQUOTA_EXCEEDED(auparavant422sanscode). - Le bac à sable refuse exactement ce que refuse la production : type et taille des fichiers téléversés ; textes tronqués au lieu d'être refusés ;
length,aspectetlanguagevidéo inconnus reviennent à la valeur par défaut ; les codes du flyer sont insensibles à la casse ; un brouillon sanstype. La simulation de fonds insuffisants répondINSUFFICIENT_FUNDS, le code envoyé par la production. limitetpagesont ramenés dans la plage par la passerelle elle-même (GET /chat/history?limit=500répondait400;limit=0donnait 20 au lieu de 1).
2026-10-03 - version 1.11
Ajouté :
- Les résultats des tâches portent les champs affichés par l'espace personnel : pack de contenu, texte et vidéo -
progress,masterProfile(le canevas de récit sur lequel les textes et la narration ont été construits) eterrorpour une tâche échouée ; photo -metadata.error; plan -rooms[].stable,rooms[].placement,sourceFileId. - Les navigateurs (CORS) peuvent lire les en-têtes
RateLimit-*,Retry-After,Grem-Sandbox,X-Request-IdetContent-Range.
Modifié :
- Webhooks : une clé de test crée et gère uniquement des endpoints de bac à sable ; ils ne reçoivent que les événements des tâches du bac à sable, et les endpoints de production ne les reçoivent jamais.
limitetpagehors plage y sont ramenés au lieu de400;kinddansGET /objectsest insensible à la casse ;roomspeut être fractionnaire.- L'
Idempotency-Keyest liée à la clé API, à la méthode et au chemin réel (POST /objects/propertyetPOST /objects/rentalsont des opérations différentes). Après un délai dépassé, les créations d'annonces et de leads retiennent la clé pendant 15 minutes, comme les outils ; une requête qui n'a jamais atteint le service la libère. text/generate:customDirectionest tronqué à 500 caractères.- SDK 1.5.1 : un
503sur une écriture n'est retenté qu'avec uneIdempotency-Key; unRetry-Aftersupérieur à 30 secondes n'est pas attendu ;maxRetriesvaut au plus 10 ; votreAbortSignalannule la pause ; les identifiants de message fonctionnent sous Node 18.
Corrigé :
- Le bac à sable fonctionne comme la production : vérification des champs
multipart, champs du rapport par catégorie, valeurs de chauffage des maisons,apartmentTypecommercial et ensembles résidentiels ; fichiers uniquement pour les tâches terminées, au chemin propre à l'outil et avec des identifiants d'artefact connus ;Grem-Sandboxaussi sur les réponses faites avant la vérification de la clé ;Grem-Simulateest insensible à la casse. - Sans clé, des paramètres de requête invalides répondent d'abord
401. - Une clé d'agence limitée à un agent ne lit plus les tâches lancées avec la clé de l'agence entière.
- Les endpoints de webhook enregistrés auparavant sur un autre port continuent de recevoir les livraisons.
- Un
Rangeimpossible à satisfaire répond416au lieu de404; un document de vérification de rapport jusqu'à 40 MB est accepté.
2026-10-03 - version 1.10
Ajouté :
- Le code d'erreur
conflict(409) : la ressource est dans un état qui ne permet pas l'action (Erreurs). - Champs de phrase de clôture vidéo dans
POST /video/create:ctaMode,ctaIntent,ctaText,ctaMarket; les options deGET /video/endingsportentintentettext. GET /works: les filtresfrometto.- SDK 1.5.0 : l'option
maxRetries-429et503sont retentés aprèsRetry-After.
Modifié :
- Les paramètres de requête sont vérifiés : un paramètre connu avec une valeur invalide donne
400 validationen nommant le champ. - Webhooks :
httpssur le port 443 uniquement, pas d'identifiants dans l'URL ; la 11e adresse donne422; les webhooks d'agence se gèrent uniquement avec la clé de l'agence entière. - L'
Idempotency-Keyest liée à la clé API et à l'opération ; après un délai dépassé d'un outil, la clé reste réservée pendant 15 minutes. - Les refus financiers (quota, dette, usage équitable, solde) donnent
402 insufficient_fundsaveccode. - Une clé d'agence limitée à un agent ne voit que ses propres tâches et fichiers.
- Les téléchargements de fichiers comptent dans la limite de débit.
Corrigé :
- Chaque erreur, y compris un corps trop volumineux ou mal formé, arrive en RFC 9457
application/problem+json; un corps au-delà de la limite donne413 payload_too_large. - Le champ vidéo
endingn'était jamais lu ; utilisezctaIntentouctaText. - SDK :
simulateavec une clé de production lève une exception au lieu d'exécuter l'appel.
2026-10-03 - versions 1.8-1.9
Ajouté :
- Annonces comparables :
estimate.analogsdans l'estimation express,analogsdans le rapport complet,compsdans l'estimation du loyer - les mêmes que dans l'espace personnel et le PDF. - Les champs des tâches terminées sont décrits en entier : chiffres du rapport sous leurs vrais noms (
potPrice,priceRangeLow,priceRangeHigh, …), vérification, plan, photo, flyer, brouillon. - SDK 1.4.0 : le type
Analog.
Modifié :
- Les réponses des outils ne contiennent que les champs documentés ; les champs internes qui passaient auparavant ne sont plus renvoyés.
- Un outil que
GET /tools/statussignale comme indisponible répond503 service_unavailableavant toute facturation (auparavant, cela ne valait que pour le pack de contenu, les textes et la vidéo). - La réponse de confirmation de la vérification d'évaluation ne contient que les champs de la tâche (
jobId,state,status) ; le champ obsolète_idn'y est plus renvoyé.
Corrigé :
- Vidéo d'avatar :
artifactsliste les identifiants nécessaires pour l'URL de téléchargement. - Les
checkIn/checkOutdes locations sont documentés comme des heures de la journée.
2026-10-02 - version 1.7
Ajouté :
- Bac à sable : les clés de test (
gsk_test) simulent les outils sans facturation ; l'en-têteGrem-Simulatechoisit le résultat. estimate.confidenceScoredans l'estimation express.
Modifié :
- Les appels qui lancent un outil attendent jusqu'à 5 minutes au lieu de 60 secondes.
- L'estimation express répétée avec la même
Idempotency-Keyrenvoie le résultat final sans seconde facturation, y compris après un délai dépassé.
Corrigé :
estimate.confidencede l'estimation express valait toujoursnull.- Les réponses du plan ne contiennent plus de champs internes.
GET /objectssanskind, ainsi que les refus pour les annonces et les leads, expliquent désormais le motif dansdetail.
2026-10-02 - version 1.6
Modifié :
- Chaque réponse de tâche porte le même champ
jobId. Les noms propres à chaque outilid,_id,contentGenJobIdsont toujours renvoyés et obsolètes. - SDK 1.2.0 :
Job.jobIdest toujours présent.
2026-10-02 - versions 1.2-1.5
Ajouté :
GET /voices,GET /avatar/avatars,GET /video/music,GET /video/endings- identifiants pour les outils (Données de référence).GET /tools/status- disponibilité des outils ;GET /works- historique des travaux.POST /flyer/create- flyer personnel, scopetools:flyer.POST /valuation/review/jobs/{id}/confirm- confirmation des données de vérification de rapport.- Le champ
statedans chaque réponse de tâche. - Dans les erreurs - les champs
codeeterrors, les codesforbidden,payload_too_large,service_unavailable. - Dans la description de l'API - schémas complets de requête et de réponse pour chaque outil, contrat complet d'écriture des annonces par type, classe de facturation de chaque opération (
x-grem-billing), liste des scopes et des événements. - Les paramètres
scope(annonces) etpool(leads) sont documentés.
Modifié :
- Un refus pour données manquantes (par exemple des textes sans description ni ville) donne désormais
422 business_ruleavec un motif et un code. Auparavant c'était502 provider_error. - Un refus lié aux droits sur une ressource donne désormais
403 forbiddenavec un motif. Auparavant c'était500. - La livraison webhook de test pour les outils a la même forme qu'une vraie :
{ jobId, status, state }.
Corrigé :
- Les clés d'agence fonctionnent avec tous les outils, le chat et les téléchargements de fichiers.
- Vérification de rapport et plan : le statut de la tâche est disponible via l'identifiant de la réponse, les webhooks arrivent.
- Téléchargement des fichiers du pack de contenu, des textes et de la vidéo - uniquement pour le propriétaire de la tâche.