Sommaire(8)
- Ce que vous construisez : l'architecture d'une fonctionnalité de staging
- Avant de commencer : clés, environnements et exigences d'image
- Étape 1 : soumettre un job de staging
- Étape 2 : gérer la complétion — webhooks vs polling
- Étape 3 : livrer les résultats à vos utilisateurs
- Enjeux de production : limites de débit, retries et budget de crédits
- Erreurs courantes dans les intégrations d'API de staging
- L'essentiel : livrez la boucle, puis étendez-la
Ce tutoriel montre aux développeurs comment ajouter le home staging virtuel par IA à toute app via une API REST. Le schéma : téléverser une photo de pièce, soumettre un job asynchrone et recevoir les résultats meublés via webhook ou polling en 10 à 40 secondes. Avec l'API de Roomagen comme exemple pratique, l'intégration cœur tient en un endpoint POST, un handler de webhook et une étape de stockage, à 0,20 $ – 0,25 $ par image sur les packs de volume, avec remboursement automatique des jobs échoués.
Home Staging Virtuel AI — Meublez des pièces vides en quelques secondes
Roomagen Home Staging Virtuel utilise l'AI pour placer des meubles photoréalistes dans des photos de pièces vides. Choisissez parmi 10 styles de design et 8 types de pièces — pour les annonces immobilières, les chambres d'hôtel, les logements locatifs et les présentations de design. Chaque image coûte 2 crédits, avec des plans à partir de $12/mois.
Ce que vous construisez : l'architecture d'une fonctionnalité de staging
À la fin de ce tutoriel, votre app acceptera une photo de pièce d'un utilisateur, l'enverra à une API de home staging virtuel et renverra une version meublée et photoréaliste de cette pièce 10 à 40 secondes plus tard. C'est toute la fonctionnalité. Tout le reste — webhooks, retries, budget de crédits, étiquettes de divulgation — n'existe que pour rendre cette boucle fiable à l'échelle de la production.
Le versant demande est bien établi. Le marché mondial du home staging virtuel a atteint 454 millions $ en 2025 et la demande de staging continue de grimper à mesure que les annonces se disputent l'attention en ligne :
« Le marché mondial des solutions de home staging virtuel devrait passer de 454 millions $ en 2025 à 4,73 milliards $ d'ici 2035. » — Business Research Insights
Si vous exploitez une plateforme d'annonces, un outil de livraison photo, un tableau de bord de gestion locative ou un CRM proptech, le staging est de plus en plus une fonctionnalité que vos utilisateurs attendent dans votre produit plutôt qu'un service séparé qu'ils visitent.
Sur le plan architectural, chaque API de staging du marché — Roomagen, AI HomeDesign, Decor8 et une poignée d'autres — suit le même schéma de job asynchrone. La génération prend des dizaines de secondes, bien trop long pour maintenir une requête HTTP ouverte, donc le flux est toujours : soumettre un job, obtenir immédiatement un identifiant de job, et recevoir les résultats plus tard.
| Étape | Qui la gère | Latence typique |
|---|---|---|
| Téléversement et validation de la photo | Votre app | Moins d'1 seconde |
| Soumission du job de staging | Votre backend → API de staging | Moins d'1 seconde |
| Génération IA | Fournisseur de staging | 10 – 40 secondes |
| Notification de complétion | Webhook (push) ou polling (pull) | 0 – 10 secondes |
| Stockage et affichage des résultats | Votre app | Moins d'1 seconde |
Ce tutoriel utilise l'API Roomagen comme exemple pratique parce que ses endpoints se calquent proprement sur le schéma générique, mais chaque concept ici — jobs asynchrones, webhooks contre polling, idempotence, économie de l'échec — se transpose directement à n'importe quel fournisseur. Lorsqu'un comportement spécifique à Roomagen compte, il est signalé explicitement.
Avant de commencer : clés, environnements et exigences d'image
Vous avez besoin de trois choses avant d'écrire le code d'intégration : une clé API, un plan de séparation des environnements, et des images conformes aux exigences d'entrée du fournisseur.
Obtenir une clé. L'API Roomagen est en accès anticipé : rejoignez la liste d'attente sur roomagen.com/api, et l'offre développeur gratuite inclut 50 appels filigranés par mois — assez pour construire et tester l'intégration complète avant de dépenser quoi que ce soit. Les clés ressemblent à rmg_live_... et sont envoyées dans un en-tête X-Api-Key. Quel que soit le fournisseur choisi, les deux mêmes règles s'appliquent : gardez la clé dans une variable d'environnement côté serveur, et ne l'embarquez jamais dans du JavaScript côté client ou un binaire mobile, où n'importe qui peut l'extraire et vider vos crédits.
Environnements. Utilisez des clés séparées pour le développement et la production si le fournisseur en délivre. En développement, la sortie filigranée est en réalité utile — elle empêche les images de test d'atteindre accidentellement une annonce en ligne.
Entrées d'image. La qualité du staging dépend fortement de la qualité de l'entrée. Le tableau ci-dessous résume ce qu'une API de staging attend typiquement, en prenant les exigences de Roomagen comme cas concret.
| Exigence | Recommandation |
|---|---|
| Format | JPEG ou PNG |
| Livraison | image_url publique (préférée) ou image_base64 |
| Résolution | 1024 px+ sur le grand côté ; une entrée plus grande donne une sortie de meilleure qualité |
| Contenu | Une seule pièce, prise à niveau, raisonnablement éclairée ; le grand-angle fonctionne |
| État de la pièce | Les pièces vides se meublent le plus prévisiblement ; les pièces meublées conviennent aux outils de redesign |
Une note pratique : passer une URL vaut mieux que le base64 pour tout fichier au-delà d'une taille triviale. Votre backend évite le surcoût de ré-encodage, les corps de requête restent petits, et le fournisseur récupère l'image directement depuis votre CDN ou votre URL de stockage signée.
Enfin, vérifiez votre solde de crédits par programme. Roomagen expose GET /api/v1/account, qui renvoie image_credits — interrogez-le depuis votre tableau de bord admin ou un cron quotidien pour ne jamais être surpris en cours de mois. La plupart des fournisseurs à crédits offrent un endpoint équivalent, et câbler une alerte de solde bas prend dix minutes maintenant contre une panne plus tard.
Étape 1 : soumettre un job de staging
L'appel cœur est un unique POST. Vous précisez l'outil à exécuter, l'image, les options de style, et éventuellement une URL de webhook pour la notification de complétion.
curl -X POST https://api.roomagen.com/api/v1/jobs \
-H "X-Api-Key: rmg_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"tool": "virtual-staging",
"image_url": "https://cdn.yourapp.com/rooms/123.jpg",
"options": { "room_type": "living_room", "style": "scandinavian" },
"webhook_url": "https://yourapp.com/hooks/roomagen"
}'
La réponse revient immédiatement — avant la fin de la génération :
{ "job_id": "job_8f3ka92m", "status": "processing", "images_charged": 1 }
Le même appel depuis un backend Node.js :
const res = await fetch("https://api.roomagen.com/api/v1/jobs", {
method: "POST",
headers: {
"X-Api-Key": process.env.ROOMAGEN_API_KEY,
"Content-Type": "application/json"
},
body: JSON.stringify({
tool: "virtual-staging",
image_url: imageUrl,
options: { room_type: "living_room", style: "scandinavian" },
webhook_url: "https://yourapp.com/hooks/roomagen"
})
});
const { job_id } = await res.json();
Deux choses à faire dès que la réponse arrive. D'abord, persistez le job_id rattaché à votre propre enregistrement — l'annonce, la photo, l'utilisateur — avant toute autre chose. Cette ligne est votre ancre d'idempotence : si votre processus plante, vous pouvez récupérer le job par son identifiant au lieu de le resoumettre et de payer deux fois. Ensuite, enregistrez images_charged pour que votre comptabilité interne corresponde à celle du fournisseur.
Notez que tool n'est qu'un slug. L'endpoint GET /api/v1/tools de Roomagen liste 40+ outils qui utilisent tous ce schéma de job identique — le home staging virtuel pour les pièces vides, la conversion crépusculaire jour-crépuscule, la suppression d'objets pour désencombrer, l'amélioration d'image pour la correction d'exposition et de couleur, la conversion croquis vers plan d'étage et la rénovation virtuelle, entre autres. Une fois que la boucle de job ci-dessous fonctionne pour le staging, ajouter un bouton « photo crépusculaire » ou « retirer le désordre » à votre app est un changement d'une ligne dans le champ tool. Ce schéma multi-outils mérite d'être vérifié chez tout fournisseur que vous évaluez : les API mono-outil signifient tout ré-intégrer de zéro quand votre feuille de route s'étend.
Pour les annonces de pièces vides en particulier, virtual-staging est le cheval de trait, tandis que les pièces meublées passent mieux d'abord par un outil de redesign ou un outil de démeublement — une distinction que votre UI peut exposer via un simple interrupteur « la pièce est-elle vide ? ».
Étape 2 : gérer la complétion — webhooks vs polling
Votre job est en cours de traitement. Vous devez maintenant savoir quand il se termine. Il existe exactement deux mécanismes, et les intégrations matures utilisent les deux.
| Dimension | Webhooks (push) | Polling (pull) |
|---|---|---|
| Latence | Quasi instantanée à la complétion | Jusqu'à un intervalle de polling (5 – 10 s) |
| Infrastructure | Endpoint HTTPS public requis | Rien au-delà d'un ordonnanceur |
| Fiabilité | La livraison peut échouer (votre indisponibilité, le réseau) | Robuste — vous contrôlez la boucle |
| Travail de sécurité | Vérification de signature requise | Clé API uniquement |
| Coût serveur | Une requête par job | N requêtes par job |
| Idéal pour | La production en volume | Le développement, le repli, les faibles volumes |
Le schéma recommandé : webhooks comme canal principal, polling comme repli. Enregistrez une webhook_url sur chaque job, et planifiez aussi une vérification par polling — GET /api/v1/jobs/{id} toutes les 5 à 10 secondes — qui s'active si aucun webhook n'est arrivé au bout de, disons, 60 secondes. Plafonnez le polling avec un timeout dur (2 – 3 minutes) après lequel le job est marqué échoué dans votre UI. Cette combinaison survit aux pannes de webhook de part et d'autre sans coût significatif. Les recommandations webhook de GitHub comme de Stripe convergent vers les mêmes principes : répondre vite, vérifier les signatures, dédupliquer et réconcilier par polling.
Un handler de webhook Express minimal avec vérification de signature :
app.post("/hooks/roomagen", express.raw({ type: "*/*" }), (req, res) => {
const sig = req.get("X-Roomagen-Signature");
const expected = crypto
.createHmac("sha256", process.env.ROOMAGEN_WEBHOOK_SECRET)
.update(req.body)
.digest("hex");
if (!sig || !crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected))) {
return res.sendStatus(401);
}
const { job_id, status, result_urls } = JSON.parse(req.body);
completeJob(job_id, status, result_urls); // must be idempotent
res.sendStatus(200);
});
Trois détails comptent ici. D'abord, vérifiez la signature sur le corps brut, avant le parsing JSON — Roomagen signe les payloads en HMAC-SHA256 (RFC 2104) et envoie le condensé dans X-Roomagen-Signature ; la plupart des fournisseurs utilisent un schéma équivalent. Sauter la vérification signifie que quiconque découvre l'URL de votre endpoint peut injecter de faux événements « completed » dans votre app. Ensuite, utilisez une comparaison à temps constant, pas ===. Enfin, rendez le handler de complétion idempotent : les systèmes de webhook réessaient en cas d'échec, donc le même événement peut arriver deux fois, et le polling peut aussi avoir déjà terminé le job. Une garde UPDATE ... WHERE status = 'processing' suffit généralement.
En polling, l'endpoint de statut renvoie tout ce dont vous avez besoin : status (processing, completed ou failed), result_urls en cas de succès, error en cas d'échec, et processing_ms — utile à journaliser pour la surveillance de latence.
Étape 3 : livrer les résultats à vos utilisateurs
Un job terminé renvoie result_urls — un tableau d'URL pointant vers les images générées. Résistez à la tentation de les hotlinker.
Ré-hébergez les résultats dans votre propre stockage. Téléchargez chaque URL de résultat et écrivez-la dans votre propre bucket S3, R2 ou GCS, puis servez depuis votre CDN. Les URL de résultat du fournisseur doivent être traitées comme des mécanismes de livraison transitoires, pas comme une infrastructure permanente : les politiques de rétention varient, et les images de votre produit ne doivent pas casser si un fournisseur purge les anciens jobs ou si vous changez de prestataire. L'étape téléchargement-et-stockage tient en cinq lignes de code et supprime toute une catégorie d'incidents futurs.
Gardez l'original, toujours. Stockez la photo source et la photo meublée comme une paire liée. Cela compte pour trois raisons : votre UI peut proposer un curseur avant/après (invariablement la présentation du staging la plus engageante), vos utilisateurs peuvent revenir en arrière, et — dans les contextes immobiliers américains — la réglementation exige de plus en plus que l'image non retouchée reste disponible. Les résultats de job de Roomagen sont conçus pour apparier image originale et retouchée exactement pour cette raison.
Étiquetez les images meublées dans les contextes d'annonces. Si vos utilisateurs publient sur des plateformes MLS, la divulgation n'est plus une courtoisie optionnelle. La loi californienne AB 723 exige la divulgation des images d'annonce retouchées par IA depuis le 1er janvier 2026, et les règles MLS à travers les États-Unis attendent une étiquette « Virtually Staged » visible. Roomagen expose un paramètre optionnel d'étiquette de divulgation qui rend le marquage directement sur l'image de sortie, ce qui est le moyen le moins coûteux de garder la publication en aval conforme. Le détail juridique est un sujet à part entière — la version courte pour votre intégration : stockez la distinction meublé/original dans votre modèle de données, et affichez une étiquette partout où une image meublée peut atteindre une annonce.
Exposez la régénération. La sortie générative a de la variance ; parfois le canapé est raté. Roomagen inclut 1 régénération gratuite par image, donc un bouton « Régénérer » à côté de chaque résultat ne vous coûte rien pour le premier réessai et réduit drastiquement les tickets de support. Quel que soit votre fournisseur, vérifiez sa politique de régénération et reflétez-la dans votre UI plutôt que de faire payer vos utilisateurs pour un pile ou face.
Le même pipeline de livraison sert tous les autres outils que vous ajouterez plus tard — un plan d'étage généré depuis un croquis, un extérieur crépusculaire, un remplacement de ciel ou un aperçu de rénovation de cuisine reviennent tous en result_urls via le webhook identique.
Enjeux de production : limites de débit, retries et budget de crédits
L'intégration ci-dessus fonctionne. Ces quatre pratiques la font fonctionner sous charge.
Retries et backoff. Traitez les réponses 429 et 5xx à la soumission de job comme réessayables avec backoff exponentiel (1 s, 2 s, 4 s, plafonné à 30 s). Point crucial : ne réessayez que lorsque vous savez que le job n'a pas été créé — si la soumission a expiré après l'envoi de la requête, vérifiez vos enregistrements stockés et la liste des jobs du compte avant de resoumettre, ou vous paierez des générations en double. C'est l'ancre d'idempotence de l'étape 1 qui prouve son utilité.
Économie de l'échec. Comprenez ce que coûtent les échecs avant de modéliser vos marges. Chez Roomagen, les échecs d'infrastructure ne consomment jamais de crédits et les jobs échoués sont remboursés automatiquement, donc un statut failed est un désagrément, pas un coût. Tous les fournisseurs ne fonctionnent pas ainsi — certains facturent chaque tentative — donc ce point a sa place dans votre checklist d'évaluation à côté du prix par image. Votre UI devrait distinguer « échoué, non facturé, réessayez » de « terminé mais pas à votre goût, utilisez votre régénération gratuite ».
Budget de crédits. Les API à packs de crédits récompensent l'engagement en volume. Les packs actuels de Roomagen :
| Volume mensuel | Prix du pack | Coût effectif par image |
|---|---|---|
| 500 images | $125 | $0.25 |
| 2,500 images | $550 | $0.22 |
| 10,000 images | $2,000 | $0.20 |
| 50,000+ images | Sur mesure | Négocié |
À titre de comparaison, l'API d'AI HomeDesign tourne autour de 0,24 $ par image et Decor8 autour de 0,20 $ — les fournisseurs crédibles se regroupent dans la même fourchette, donc le choix du fournisseur dépend plus de l'étendue des outils, de la qualité des webhooks et des fonctionnalités de conformité que de quelques centimes de prix unitaire. Pour budgétiser, multipliez le volume attendu par environ 1,1× pour couvrir les régénérations au-delà de la gratuite et l'expérimentation des utilisateurs, et rappelez-vous le calcul de marge côté acheteur : les agents paient couramment 16 $ – 69 $ par image pour des services de staging humains, donc une fonctionnalité qui vous coûte 0,20 $ – 0,25 $ par image laisse de la place pour une tarification saine quel que soit votre packaging.
Une réserve honnête sur la maturité. L'API Roomagen est une entrante de 2026 actuellement en accès anticipé derrière une liste d'attente — vous obtenez une ergonomie moderne (webhooks HMAC, remboursements automatiques, 40+ outils sur un seul endpoint) mais pas une décennie d'historique de disponibilité éprouvé ni une grande communauté publique. Si vous avez besoin d'une inscription en libre-service immédiate aujourd'hui, les alternatives ci-dessus vendent un accès API depuis plus longtemps. L'architecture générique de ce tutoriel est délibérément portable entre fournisseurs exactement pour cette raison : votre table de jobs, votre handler de webhook et votre pipeline de stockage survivent à un changement de prestataire presque intacts.
Erreurs courantes dans les intégrations d'API de staging
Sept modes d'échec reviennent régulièrement dans les intégrations de staging. Tous sont évitables.
1. Bloquer le thread de requête. Maintenir la requête HTTP de l'utilisateur ouverte pendant les 10 à 40 secondes de génération immobilise des ressources serveur et expire sur la plupart des load balancers. Soumettez le job, renvoyez 202 Accepted avec votre identifiant d'enregistrement interne, et laissez le client s'abonner aux mises à jour via WebSocket, SSE ou un simple polling de votre propre API.
2. Se fier aux webhooks seuls. Votre fenêtre de déploiement, une mauvaise configuration TLS ou un raté de livraison côté fournisseur finira par avaler un webhook. Sans repli par polling, ce job reste bloqué en « processing » pour toujours dans votre UI. Le schéma bicanal de l'étape 2 ne coûte presque rien.
3. Sauter la vérification de signature. Un endpoint de webhook non vérifié est une API d'écriture ouverte sur l'état de votre application. Vérifiez le HMAC sur le corps brut avec une comparaison à temps constant — ce sont dix lignes, montrées ci-dessus.
4. Hotlinker les URL de résultat. Les URL du fournisseur sont transitoires. Ré-hébergez les résultats dans votre propre stockage à la complétion, à chaque fois.
5. Resoumettre sans contrôles d'idempotence. Timeouts réseau plus retries naïfs égalent doubles facturations. Persistez le job_id immédiatement à la soumission et conditionnez les retries à vos propres enregistrements.
6. Ignorer la divulgation sur les marchés d'annonces. Si des images meublées peuvent atteindre un MLS via votre produit, une image non étiquetée est désormais une exposition juridique pour vos utilisateurs en Californie et une violation de politique sur les grands portails. Transportez l'indicateur « meublé » dans votre modèle de données et rendez l'étiquette.
7. Livrer sans UX d'échec. 10 à 40 secondes, c'est long en termes d'UI, et un petit pourcentage de jobs échouera. Concevez l'état de traitement (indication de progression, image squelette), l'état d'échec (réessai clair, « vous n'avez pas été facturé ») et l'affordance de régénération avant le lancement, pas après le premier ticket de support.
L'essentiel : livrez la boucle, puis étendez-la
Ajouter le home staging virtuel à une app est une intégration réellement petite : un POST pour créer un job, un handler de webhook avec repli par polling, et une étape de stockage des résultats. Un prototype fonctionnel tient en un après-midi ; le durcissement production — complétion idempotente, vérification de signature, discipline de retry, étiquettes de divulgation — prend un jour de plus. À 0,20 $ – 0,25 $ par image sur les packs de volume, avec les jobs échoués remboursés automatiquement et les résultats livrés en 10 à 40 secondes, l'économie fonctionne pour tout, du portail de livraison d'un photographe à une plateforme d'annonces nationale.
L'architecture est délibérément neutre vis-à-vis du fournisseur : soumission de job asynchrone, gestion bicanale de la complétion, résultats ré-hébergés et paire meublé/original dans votre modèle de données s'adapteront à toute API de staging que vous choisirez maintenant ou vers laquelle vous migrerez plus tard.
Si vous voulez construire sur l'exemple pratique de ce tutoriel, rejoignez la liste d'attente de l'API Roomagen — l'offre développeur gratuite inclut 50 appels filigranés par mois, ce qui couvre l'ensemble du cycle d'intégration et de test de ce guide sans engagement payant. À partir de là, le même endpoint de jobs vous donne le home staging virtuel, le jour-crépuscule, la suppression d'objets, l'amélioration d'image et les outils de plans d'étage derrière une seule intégration.
Prêt à transformer vos annonces ?
Essayez gratuitement le home staging virtuel IA de Roomagen. Téléchargez votre première photo et voyez la différence en quelques secondes.
Commencer gratuitementSources et références
- 1.Business Research Insights – Virtual Staging Solution Market
- 2.California Legislature – AB 723 (AI-Altered Listing Images, 2025)
- 3.Stripe Documentation – Webhook Best Practices
- 4.GitHub Docs – Best Practices for Using Webhooks
- 5.IETF – RFC 2104: HMAC, Keyed-Hashing for Message Authentication
- 6.National Association of Realtors – 2025 Profile of Home Staging
- 7.Roomagen – Real Estate Image API (Early Access)
Questions fréquemment posées
Rédigé par
Roomagen Team
L'équipe Roomagen crée des guides approfondis sur le home staging virtuel IA, la photographie immobilière et les stratégies de marketing immobilier.





