Style een vastgoedfoto vanuit je eigen code. Eén HTTP-aanroep levert één ingerichte afbeelding op. Vooraf betaalde credits van $ 0,15 per afbeelding, zonder abonnement, zonder minimum en zonder rekening die uit de hand loopt.
- Basis-URL
- https://stagify.ai/api/v1
- Authenticatie
- Bearer stg_live_…
- Inhoudstype
- multipart/form-data
Inleiding
De API stelt één ding beschikbaar: de stagingpijplijn achter de webapp. Je stuurt een foto van een kamer, geeft een kamertype en een meubelstijl op, en krijgt de ingerichte afbeelding in dezelfde reactie terug. Er is geen taakwachtrij en op het normale pad valt niets te pollen.
Credits zijn hele afbeeldingen. Je koopt ze vooraf en elke geslaagde render verbruikt er één. Een mislukte render wordt automatisch terugbetaald, dus je betaalt alleen voor een foto die je hebt ontvangen. En omdat het saldo vooraf betaald is, kost een gestolen sleutel je hooguit wat er nog op staat. Geen rekening aan het eind van de maand.
Sleutels zijn bedoeld voor server-naar-servergebruik. De API stuurt geen CORS-headers, dus een browser kan haar niet rechtstreeks aanroepen; dat is bewust, en een sleutel die bereikbaar is vanuit browser-JavaScript is een gelekte sleutel. We tonen een sleutel één keer, bewaren alleen een hash en trekken hem direct in.
Snel starten
Maak een sleutel aan op je API-sleutelpagina, koop een creditpakket en stuur een foto. De reactie bevat de ingerichte afbeelding als 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"
Een render duurt tot een paar minuten. Zet de leestime-out van je client op 300 seconden en probeer opnieuw met dezelfde Idempotency-Key. Dat is wat garandeert dat je nooit twee keer voor één foto betaalt.
Creditpakketten
Prijzen laden…
Aanvraagparameters
POST /api/v1/renders, verstuurd als multipart/form-data. Elke toegestane waarde hieronder wordt ook als JSON geleverd door GET /api/v1/options, waarvoor geen API-sleutel nodig is, zodat een client zijn eigen keuzelijsten kan vullen in plaats van deze tabel hard te coderen.
| Veld | Type | Toelichting |
|---|---|---|
image | file | Verplicht. De foto van de kamer. JPEG, PNG of WebP, tot 25 MB. Het MIME-type wordt gecontroleerd, niet de bestandsextensie. |
roomType | enum | Bedroom, Living room, Dining room, Kitchen, Office, Bathroom, Outdoors, Dorm. Standaard Living room. Hoofdletter- en spatiegevoelig, en een onbekende waarde wordt niet geweigerd. Ze wordt als vrije tekst in de prompt geschreven, dus Living Room is niet Living room. |
furnitureStyle | enum | standard, modern, midcentury, scandinavian, luxury, coastal, farmhouse, custom. Standaard standard, wat een onbekende waarde ook stilzwijgend wordt. custom gebruikt je additionalPrompt in plaats van de ingebouwde stijltekst. |
additionalPrompt | string | Vrije tekst met aanwijzingen voor deze render. |
removeFurniture | boolean | De kamer leegmaken voordat hij wordt ingericht. Stuur true of on; al het andere, ook 1 en yes, geldt als onwaar. |
keepFurniture | string | Vrije tekst die benoemt wat moet blijven staan, bijv. keep the dining table and the built-in shelves. Wordt alleen gelezen als removeFurniture aanstaat. 500 tekens. |
furnitureImage | file[] | Maximaal 5 referentiefoto’s van meubels om na te bootsen. Zelfde formaten en groottelimiet als image. |
labelVirtuallyStaged | boolean | Brandt de vermelding “Virtually staged” in het resultaat. |
stampStyle | enum | dark, light, minimal, banner. Standaard dark. Niet hoofdlettergevoelig; een onbekende waarde valt terug op de standaard. |
stampScale | number | 0.7 tot 1.6, standaard 1. Waarden buiten het bereik worden begrensd in plaats van geweigerd. |
stampLang | enum | De taal van het label: english, spanish, french, german, chinese, korean, portuguese, russian, italian, japanese, dutch. Standaard english. |
variations | integer | Alleen 1 wordt geaccepteerd. Stuur gelijktijdige aanvragen voor meer. |
Idempotentie
Een render houdt de verbinding minutenlang open, wat betekent dat de storing die je echt raakt een afgebroken socket is nadat het werk al klaar was: betaald en met lege handen. Stuur bij elke aanvraag een Idempotency-Key-header en probeer opnieuw met dezelfde waarde.
| Wat wij geregistreerd hebben | Wat een nieuwe poging doet |
|---|---|
| Een geslaagde aanvraag, zelfde parameters | Geeft het opgeslagen resultaat terug met X-Stagify-Replayed: true. Geen tweede afschrijving. |
| Een aanvraag die nog loopt | 409 REQUEST_IN_FLIGHT. Wacht en probeer opnieuw. |
| Een aanvraag die halverwege is afgebroken | Loopt opnieuw op de bestaande afschrijving, tot drie pogingen. |
| Dezelfde sleutel met andere parameters | 422 IDEMPOTENCY_KEY_REUSED. Gebruik een nieuwe sleutel. |
De header weglaten mag en betekent geen replaybeveiliging, wat de eerlijke standaard is. We leiden geen sleutel af uit je foto: twee werkelijk losstaande renders van dezelfde kamer zouden botsen en de tweede aanroeper zou de afbeelding van de eerste krijgen.
Vermelding van virtuele styling
Veel MLS- en NAR-regels eisen dat een virtueel ingerichte foto dat vermeldt. labelVirtuallyStaged brandt die vermelding in de pixels in plaats van haar mee te sturen als metadata die een volgend hulpmiddel kan verwijderen.
Kan de vermelding niet worden aangebracht, dan wordt de afbeelding ingehouden in plaats van ongelabeld geleverd, antwoordt de aanroep 500 DISCLOSURE_STAMP_FAILED en wordt je credit terugbetaald. Dat gedrag is niet uit te schakelen, en er is geen standaard per sleutel die het stilletjes uitzet.
Fouten
Elke fout antwoordt met { "error": "…", "code": "…" }. Vertak op code, nooit op de melding. Meldingen veranderen, codes niet.
| Status | Code | Wat te doen |
|---|---|---|
| 401 | API_KEY_MISSING / API_KEY_INVALID / API_KEY_REVOKED | Controleer de Authorization-header, of maak een nieuwe sleutel aan. |
| 402 | INSUFFICIENT_CREDITS | Vul aan. De body bevat credits_remaining. |
| 403 | ACCOUNT_SUSPENDED | Neem contact op met support. |
| 400 | VARIATIONS_UNSUPPORTED | Deze API rendert één afbeelding per aanvraag. Stuur in plaats daarvan gelijktijdige aanvragen. |
| 409 | REQUEST_IN_FLIGHT | Die idempotentiesleutel loopt nog. Wacht en probeer opnieuw. |
| 409 | CONCURRENCY_LIMIT | Te veel renders tegelijk. Probeer het over enkele seconden opnieuw. |
| 422 | IDEMPOTENCY_KEY_REUSED | Je hebt een sleutel hergebruikt met andere parameters. Gebruik een nieuwe. |
| 422 | NO_IMAGE_GENERATED | Het model gaf niets terug. Terugbetaald; probeer opnieuw of neem een andere foto. |
| 429 | RATE_LIMITED | Rustiger aan en probeer opnieuw. |
| 500 | DISCLOSURE_STAMP_FAILED | De vermelding kon niet worden aangebracht, dus de afbeelding is ingehouden. Terugbetaald. |
| 500 | RENDER_FAILED | Terugbetaald. Noem de ref als je contact opneemt met support. |
Overige endpoints
GET /api/v1/options: de toegestane waarden van elke opsomming hierboven. Geen API-sleutel nodig.GET /api/v1/me: werkt mijn sleutel? Geeft account en saldo terug.GET /api/v1/credits: saldo en totalen.GET /api/v1/renders/{id}: de status van één render.
Elke reactie bevat X-Stagify-Credits-Remaining, zodat je het saldo ziet dalen zonder ernaar te vragen.
Vragen, hogere limieten of een factuur in plaats van een kaart: team@stagify.ai.