Les deux outils reçoivent un fichier en multipart/form-data.
Amélioration de photos
POST /photo/enhance - scope tools:photo, tâche. Une photo par requête.
Parties du formulaire :
| Partie | Description |
|---|---|
image | la photo - obligatoire ; JPEG, PNG ou WebP jusqu'à 25 MB |
mask | cleanup uniquement : un masque PNG, le blanc marque la zone à modifier |
data | options sous forme d'une seule chaîne JSON - obligatoire |
Options dans data :
| Champ | Description |
|---|---|
mode | enhance - lumière, couleurs, netteté ; cleanup - supprimer des éléments ; staging - meubler une pièce vide. Par défaut cleanup |
prompt | obligatoire pour cleanup et staging (3-500 caractères) : ce qu'il faut supprimer ou comment meubler ; facultatif pour enhance |
intensity | light, medium (par défaut), strong |
roomType | living, bedroom, kitchen, bathroom, dining, office, outdoor |
furnitureStyle | pour staging : modern, scandinavian, industrial, luxury, minimalist, coastal |
autoMask | cleanup sans votre propre masque : détecter la zone automatiquement |
seed | un nombre pour obtenir un résultat reproductible |
negativePrompt | ce qu'il faut éviter, jusqu'à 300 caractères |
objectId, objectType | votre bien auquel appartient la photo (property ou complex) |
curl -X POST https://developers.grem.capital/api/v1/photo/enhance \
-H "Authorization: Bearer gsk_live_xxx" \
-F 'data={"mode":"cleanup","prompt":"remove the chair and the boxes"}' \
-F "image=@room.jpg"
Un masque avec enhance ou staging est refusé - il n'y fonctionne pas, et rien n'est facturé. Le prix dépend du mode. Refus : un masque hors de cleanup - 422 avec code: MASK_NOT_SUPPORTED ; un autre type de fichier ou un fichier de plus de 25 MB - 422 avec code: JOB_CREATE_FAILED ; une clé inconnue dans data - 400. La réponse de démarrage contient sku et priceMinor, c'est-à-dire le montant facturé pour l'appel (absents lorsque le quota du forfait le couvre).
202 avec jobId. La tâche terminée (GET /photo/enhance/jobs/{id}) :
| Champ | Description |
|---|---|
results | variantes du résultat |
results[].variant | numéro de la variante |
results[].url | adresse de l'image |
results[].width, results[].height | taille |
metadata.error | pour une tâche échouée : la raison, sous forme de texte générique |
Fichier d'une variante : GET /artifacts/v1/ai/photo-enhancement/jobs/{jobId}/download/{variant}. Événements : photo.completed / photo.failed.
Nettoyage de plans
POST /floorplan/create - scope tools:floorplan. Une photo ou un scan de plan devient un plan propre avec les noms des pièces et leurs surfaces. Le traitement est immédiat : la réponse 202 contient déjà le résultat.
| Partie | Description |
|---|---|
file | l'image du plan (JPEG, PNG, WebP, HEIC ; jusqu'à 20 MB) - obligatoire ; le nom image est aussi accepté |
objectId | rattacher le résultat à votre bien |
objectType | property, rental ou complex |
curl -X POST https://developers.grem.capital/api/v1/floorplan/create \
-H "Authorization: Bearer gsk_live_xxx" \
-F "file=@plan.jpg"
Réponse :
| Champ | Description |
|---|---|
jobId | identifiant de la tâche |
status | done - étiquettes acceptées automatiquement ; review - résultat prêt, étiquettes à vérifier ; rejected - l'image n'est pas un plan ; failed - échec |
state | completed pour done et review, failed pour rejected et failed |
rooms | pièces : label, area (m², si indiquée), stable (l'étiquette a été lue de la même façon à chaque passage), placement (emplacement de l'étiquette sur le plan nettoyé) |
totalArea | surface totale, m², si les surfaces sont indiquées sur le plan |
cleanedFileId | l'image du plan nettoyé |
sourceFileId | le plan que vous avez envoyé |
Rapport : GET /artifacts/v1/ai/floor-plan/jobs/{id}/report.pdf. Récupérer à nouveau le résultat : GET /floorplan/create/jobs/{id}. Événements : floorplan.completed / floorplan.failed. Si l'image n'est pas un plan, rien n'est facturé.
Le traitement de l'envoi peut prendre plus d'une minute, et le réseau devant l'API coupe avec 524 toute réponse qui n'a pas commencé dans les ~100 secondes. Envoyez donc un Idempotency-Key et l'en-tête Prefer: respond-async : dès que le fichier est envoyé, vous recevez 202 avec une tâche de requête (jobId de la forme areq_…, en-têtes Preference-Applied: respond-async, Location et Retry-After). Interrogez GET /floorplan/create/jobs/{id} avec cet identifiant (gratuit) jusqu'à ce que state vaille completed (result contient exactement la réponse décrite ci-dessus, comme sans l'en-tête) ou failed. Une tâche échouée avec code: interrupted (redémarrage du service) n'est pas facturée et libère la clé : renvoyez la même requête avec la même clé - le fichier est envoyé à nouveau. Les événements floorplan.completed / floorplan.failed portent l'identifiant de la tâche de requête. Sans l'en-tête, la réponse reste la même qu'auparavant.