Mettez en scène une photo immobilière depuis votre propre code. Un appel HTTP renvoie une image meublée. Crédits prépayés à 0,15 $ l’image, sans abonnement, sans minimum et sans facture qui s’emballe.
- URL de base
- https://stagify.ai/api/v1
- Authentification
- Bearer stg_live_…
- Type de contenu
- multipart/form-data
Introduction
L’API expose une seule chose : le moteur de mise en scène derrière l’application web. Vous envoyez la photo d’une pièce, indiquez un type de pièce et un style de mobilier, et recevez l’image meublée dans la même réponse. Il n’y a pas de file d’attente ni rien à interroger sur le chemin normal.
Les crédits sont des images entières. Vous les achetez d’avance et chaque rendu réussi en consomme un. Un rendu qui échoue est remboursé automatiquement : vous ne payez que pour une photo que vous avez reçue. Et comme le solde est prépayé, une clé volée vous coûte au plus ce qu’il en reste. Aucune facture en fin de mois.
Les clés sont prévues pour un usage serveur à serveur. L’API n’envoie aucun en-tête CORS, donc un navigateur ne peut pas l’appeler directement ; c’est délibéré, et une clé accessible depuis du JavaScript de navigateur est une clé divulguée. Nous affichons une clé une seule fois, n’en stockons qu’un hachage et la révoquons immédiatement.
Démarrage rapide
Créez une clé sur votre page de clés d’API, achetez un pack de crédits, puis envoyez une photo. La réponse contient l’image meublée sous forme de data URL.
curl https://stagify.ai/api/v1/renders \
-H "Authorization: Bearer $STAGIFY_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-F "image=@living-room.jpg" \
-F "roomType=Living room" \
-F "furnitureStyle=modern" \
-F "labelVirtuallyStaged=true"
Un rendu peut prendre quelques minutes. Réglez le délai de lecture de votre client sur 300 secondes et réessayez avec la même Idempotency-Key. C’est ce qui garantit que vous n’êtes jamais facturé deux fois pour une photo.
Packs de crédits
Chargement des tarifs…
Paramètres de la requête
POST /api/v1/renders, envoyé en multipart/form-data. Toutes les valeurs acceptées ci-dessous sont également servies en JSON par GET /api/v1/options, qui ne demande aucune clé d’API : un client peut donc remplir ses propres listes déroulantes au lieu de figer ce tableau dans son code.
| Champ | Type | Notes |
|---|---|---|
image | file | Obligatoire. La photo de la pièce. JPEG, PNG ou WebP, jusqu’à 25 Mo. C’est le type MIME qui est vérifié, pas l’extension du fichier. |
roomType | enum | Bedroom, Living room, Dining room, Kitchen, Office, Bathroom, Outdoors, Dorm. Par défaut Living room. Sensible à la casse et aux espaces, et une valeur non reconnue n’est pas rejetée. Elle est écrite telle quelle dans le prompt, donc Living Room n’est pas Living room. |
furnitureStyle | enum | standard, modern, midcentury, scandinavian, luxury, coastal, farmhouse, custom. Par défaut standard, qui est aussi ce que devient silencieusement une valeur non reconnue. custom utilise votre additionalPrompt à la place du texte de style intégré. |
additionalPrompt | string | Consignes en texte libre pour ce rendu. |
removeFurniture | boolean | Vider la pièce avant de la meubler. Envoyez true ou on ; tout le reste, y compris 1 et yes, vaut faux. |
keepFurniture | string | Texte libre indiquant ce qu’il faut conserver, par ex. keep the dining table and the built-in shelves. Lu uniquement lorsque removeFurniture est activé. 500 caractères. |
furnitureImage | file[] | Jusqu’à 5 photos de référence de mobilier à imiter. Mêmes formats et même limite de taille que image. |
labelVirtuallyStaged | boolean | Grave la mention « Virtually staged » dans l’image produite. |
stampStyle | enum | dark, light, minimal, banner. Par défaut dark. Insensible à la casse ; une valeur non reconnue revient à la valeur par défaut. |
stampScale | number | De 0.7 à 1.6, par défaut 1. Les valeurs hors plage sont ramenées à la borne plutôt que refusées. |
stampLang | enum | La langue du badge : english, spanish, french, german, chinese, korean, portuguese, russian, italian, japanese, dutch. Par défaut english. |
variations | integer | Seul 1 est accepté. Lancez des requêtes simultanées pour en obtenir davantage. |
Idempotence
Un rendu garde la connexion ouverte plusieurs minutes, ce qui veut dire que la panne qui vous touchera vraiment est un socket coupé après la fin du travail : facturé, les mains vides. Envoyez un en-tête Idempotency-Key à chaque requête et réessayez avec la même valeur.
| Ce que nous avons en base | Ce que fait une nouvelle tentative |
|---|---|
| Une requête réussie, mêmes paramètres | Renvoie le résultat stocké avec X-Stagify-Replayed: true. Pas de second débit. |
| Une requête encore en cours | 409 REQUEST_IN_FLIGHT. Attendez, puis réessayez. |
| Une requête abandonnée en plein rendu | Relancée sur le débit existant, jusqu’à trois tentatives. |
| La même clé avec des paramètres différents | 422 IDEMPOTENCY_KEY_REUSED. Utilisez une nouvelle clé. |
Omettre l’en-tête est autorisé et signifie aucune protection contre les rejeux, ce qui est le comportement honnête par défaut. Nous ne dérivons pas de clé à partir de votre photo : deux rendus réellement distincts de la même pièce entreraient en collision et le second appelant recevrait l’image du premier.
Mentions de mise en scène
De nombreuses règles MLS et NAR exigent qu’une photo meublée virtuellement le signale. labelVirtuallyStaged grave cette mention dans les pixels plutôt que de l’attacher en métadonnée qu’un outil en aval peut retirer.
Si la mention ne peut pas être appliquée, l’image est retenue plutôt que livrée sans étiquette, l’appel répond 500 DISCLOSURE_STAMP_FAILED et votre crédit est remboursé. Ce comportement ne peut pas être désactivé, et aucune valeur par défaut par clé ne le neutralise en silence.
Erreurs
Chaque échec répond { "error": "…", "code": "…" }. Branchez sur code, jamais sur le message. Les messages changent, pas les codes.
| Statut | Code | Que faire |
|---|---|---|
| 401 | API_KEY_MISSING / API_KEY_INVALID / API_KEY_REVOKED | Vérifiez l’en-tête Authorization, ou créez une nouvelle clé. |
| 402 | INSUFFICIENT_CREDITS | Rechargez. Le corps contient credits_remaining. |
| 403 | ACCOUNT_SUSPENDED | Contactez le support. |
| 400 | VARIATIONS_UNSUPPORTED | Cette API produit une image par requête. Lancez plutôt des requêtes simultanées. |
| 409 | REQUEST_IN_FLIGHT | Cette clé d’idempotence est encore en cours. Attendez, puis réessayez. |
| 409 | CONCURRENCY_LIMIT | Trop de rendus en même temps. Réessayez dans quelques secondes. |
| 422 | IDEMPOTENCY_KEY_REUSED | Vous avez réutilisé une clé avec des paramètres différents. Utilisez-en une nouvelle. |
| 422 | NO_IMAGE_GENERATED | Le modèle n’a rien renvoyé. Remboursé ; réessayez ou changez de photo. |
| 429 | RATE_LIMITED | Ralentissez, puis réessayez. |
| 500 | DISCLOSURE_STAMP_FAILED | La mention n’a pas pu être appliquée, l’image a donc été retenue. Remboursé. |
| 500 | RENDER_FAILED | Remboursé. Indiquez le ref si vous contactez le support. |
Autres points de terminaison
GET /api/v1/options: les valeurs acceptées de chaque énumération ci-dessus. Aucune clé d’API requise.GET /api/v1/me: ma clé fonctionne-t-elle ? Renvoie le compte et le solde.GET /api/v1/credits: solde et totaux cumulés.GET /api/v1/renders/{id}: l’état d’un rendu.
Chaque réponse porte X-Stagify-Credits-Remaining, ce qui vous permet de voir le solde baisser sans l’interroger.
Questions, limites plus élevées ou facture au lieu d’une carte : team@stagify.ai.