Zestio
Developer API

Zestio API Reference

Integrate AI-powered real estate image enhancement and virtual staging into your application.

Quick Start

1. Get an API Key

Sign up for an account, then create an API key in your dashboard Settings. Or create one via the API:

curl -X POST https://zestio.de/api/keys \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer ***" \
  -d '{"name": "My App"}'

# Response: { "secret": "zest_a1b2c3d4..." }

2. Make a Request

curl -X POST https://zestio.de/api/enhance \
  -H "Authorization: Bearer ***" \
  -H "Content-Type: application/json" \
  -d '{
    "image": "https://example.com/property.jpg",
    "enhancementType": "sky",
    "model": "auto"
  }'

Authentication

All API requests require an API key passed as a Bearer token:

API Key

Authorization: Bearer zest_x...

Create API keys in your dashboard Settings after signing up. Each key is prefixed zest_ and the full secret is only shown once.

API Key Management

GET/api/keys

List all your API keys (secrets are never returned)

Response

{
  "keys": [
    { "id": "uuid", "name": "My App", "key_prefix": "zest_a1b",
      "last_used_at": "...", "created_at": "...", "is_active": true }
  ]
}
POST/api/keys

Create a new API key. The secret is only returned once.

Parameters

NameTypeRequiredDescription
namestringNoLabel for the key (default: "Default Key")

Response

{
  "key": { "id": "uuid", "name": "My App", "key_prefix": "zest_a1b" },
  "secret": "zest_a1b2c3d4e5f6...",
  "warning": "Store this key securely. It cannot be retrieved again."
}
DELETE/api/keys

Revoke an API key

Parameters

NameTypeRequiredDescription
key_idstringYesThe key ID to revoke

Response

{ "success": true }

Image Enhancement

Enhance, transform, and clean up property photos.

POST/api/enhance
1-2 credits

Enhance a property image using AI. Supports sky replacement, season changes, decluttering, and more.

Parameters

NameTypeRequiredDescription
imagestringYesImage URL or base64 data URL
enhancementTypestringNoType of enhancement (see table). Default: "auto"
modelstringNoModel: "auto" (einzige Option — Diffusions-Modelle entfernt)
customPromptstringNoCustom prompt (overrides enhancementType)

Response

{
  "success": true,
  "output": "https://replicate.delivery/...",
  "creditsUsed": 1,
  "model": "auto"
}

Enhancement Types

TypeNameDescription
autoAuto EnhanceGeneral enhancement
skyBlue SkyClear sunny sky
sky_sunsetGolden SunsetWarm golden hour
sky_dramaticDramatic CloudsMoody cinematic sky
twilightVirtual TwilightBlue hour with warm glow
season_summerSummerLush green landscape
season_autumnAutumnGolden fall foliage
season_winterWinterPristine snow scene
curb_appealCurb AppealGreen lawn & landscaping
facade_refreshFacade RefreshClean painted exterior
object_removalObject RemovalRemove unwanted items
declutterDeclutterRemove personal items

Virtual Staging

Stage empty rooms with AI-generated furniture — or redesign furnished rooms.

POST/api/staging
2 credits

Apply virtual staging to a room photo (empty or furnished).

Parameters

NameTypeRequiredDescription
imagestringYesImage URL or base64 of the empty room
modelstringNo"interior-design" (default, fast), "precision" (mask-based, structure-preserving)
roomTypestringNoliving, bedroom, kitchen, dining, bathroom, office, basement, patio
furnitureStylestringNomodern, scandinavian, luxury, minimalist, industrial, bohemian, midcentury, farmhouse

Response

{
  "success": true,
  "output": "https://replicate.delivery/...",
  "model": "interior-design",
  "creditsUsed": 2,
  "creditsRemaining": 48
}

Staging Models

ModelCreditsDescription
interior-design2Best value, ControlNet-based — synchron; leere & bewohnte Räume
precision2Struktur-erhaltend: Raum-Layout, Fußboden, Fenster & Türen bleiben exakt erhalten; Wände/Decke dürfen neu gestaltet werden (streichen, Paneele, Lampe) — leere Räume werden eingerichtet, Möbel ausgetauscht (asynchron)

Precision — So funktioniert der Ablauf

Precision gestaltet den Raum neu — ob leer oder möbliert — in zwei Zonen: Die Fix-Zone (Fenster, Türen, Vorhänge, Außenbereiche wie Balkon/Terrasse) wird 1:1 vom Original übernommen; die Edit-Zone (Möbel, Deko, Wände, Decke) darf gestaltet werden — Wände dürfen gestrichen oder mit Wandpaneelen ausgestattet werden, die Decke eine Lampe bekommen. Der Fußboden ist Teil der Maske (damit Möbel vollständig gezeichnet werden) und wird anschließend 1:1 aus dem Original zurückgeführt(Floor-Restore) — der sichtbare Boden ist immer exakt das Original, inklusive Schatten & Möbelfüßen, die darüber liegen. Lichtschalter/Steckdosen werden über eine feste Prompt-Instruktion geschützt (keine ADE20K-Klasse → kein Masken-Schutz). Die Verarbeitung läuft asynchron:

  1. POST /api/staging mit model: "precision" → Antwort enthält eine jobId
  2. Klassenbasierte Segmentierung (SegFormer): Fenster, Türen & Außenbereiche werden automatisch erkannt (Fix-Zone); Innen-Struktur-Anteil wird geprüft — reine Außenaufnahmen brechen ab („Kein Innenraum erkannt")
  3. Zonen-Maske: Alles außer der Fix-Zone wird einrichtbare Fläche — Möbel, Wände (streichen/Paneele), Decke (Lampe) und Boden (damit Möbel vollständig gezeichnet werden)
  4. Masked Inpainting (flux-fill-pro): Nur die maskierten Bereiche werden neu gestaltet — mit Instruktionen: Boden 1:1 lassen, Schalter/Steckdosen unverändert, Wände frisch streichen, Lampe ergänzen
  5. Floor-Restore: Ein zweiter SegFormer-Lauf erkennt den sichtbaren Boden im Inpaint-Ergebnis und führt ihn pixelgenau aus dem Original zurück — Möbel & Schatten bleiben darüber stehen
  6. Hard-Composite: Fix-Zone (Fenster/Türen/Außen) pixelgenau vom Original
  7. GET /api/staging/poll?jobId=<id> pollen, bis status: "completed" (typische Dauer ~1–2,5 Min)
# 1) Job starten
curl -X POST https://zestio.de/api/staging \
  -H "Authorization: Bearer ***" -H "Content-Type: application/json" \
  -d '{"image":"https://example.com/room.jpg","model":"precision","roomType":"living","furnitureStyle":"modern"}'

# → { "status": "processing", "stage": "mask", "jobId": "uuid", "maskPredictionId": "..." }

# 2) Fortschritt abfragen (alle ~5 s)
curl "https://zestio.de/api/staging/poll?jobId=uuid" -H "Authorization: Bearer ***"

# → { "status": "completed", "output": "https://...result.jpg", "stats": { "maskCoverage": 0.75, "structureCoverage": 0.35, "floorCoverage": 0.92 } }
#   Fehler: { "status": "failed", "error": "..." } — Rate-Limits (429) werden automatisch retried,
#   Außenaufnahmen ohne Innen-Struktur brechen mit klarer Meldung ab ("Kein Innenraum erkannt")

Fortschritt: maskinpaintfloorcompleted. Die Job-Metadaten enthalten die Zonen-Analyse (maskCoverage = Edit-Zone/einrichtbare Fläche,structureCoverage = erkannte Innen-Struktur (Guard-Basis, Außenaufnahmen),protectedLabels = erkannte Fix-Zonen-Klassen,floorCoverage = Anteil des 1:1 zurückgeführten Bodens, floorPreserved= Floor-Restore aktiv) und die Pixel-Differenz außerhalb der Maske — dein Nachweis, dass Fenster & Außenbereiche unangetastet blieben. Jobs, die länger als 10 Minuten ohne Fortschritt hängen, werden automatisch als fehlgeschlagen markiert.

AI-Kennzeichnung (EU AI Act)

Alle KI-generierten oder -veränderten Bilder (Staging, Sky-Replacement, Objekt-Entfernung, Videos, Grundrisse) tragen ein fest eingebranntes offizielles EU-KI-Symbol(Art. 50(3) EU-KI-VO) mit Label wie „Mit KI-Unterstützung (KI-modifiziert)". Das Symbol ist Teil des Bildes selbst (unten rechts) — es kann nicht entfernt oder per UI-Overlay überspielt werden. So bleiben KI-Inhalte auch nach Download/Weitergabe eindeutig kennzeichnbar.

Zusätzlich maschinenlesbar in den XMP-Metadaten: IPTC DigitalSourceType: trainedAlgorithmicMediasowie comZestio:MarkingLabel / comZestio:MarkingVersion(Namespace http://zestio.de/ns/ai-marking/1.0/). Assistive Standard-Editierungen (Helligkeit, Farbkorrektur, Upscaling) gelten als Art.-50-Abs.-2-Ausnahme und werden nicht gekennzeichnet.

Errors & Rate Limits

HTTP Error Codes

StatusMeaning
400Missing or invalid parameters
401Missing or invalid authentication
402Insufficient credits (0 Credits — aufladen unter /billing)
429Rate limit exceeded
500Server error or AI model failure

Rate Limits

Limits gelten pro API-Key/User pro Stunde und sind nach Tarif gestaffelt. Die verbleibenden Requests stehen in den Headern X-RateLimit-Remaining / X-RateLimit-Reset.

TarifLimitEndpoints
Public (ohne Login)10/henhance, staging
Standard (angemeldet)100/henhance, staging, keys, MCP
Pro / Enterprise500/halle
Video (teure Calls)20/hgenerate_video
Webhooks1.000/hMCP, Feed

Bei 429 antwortet die API mit Retry-After. Asynchrone Jobs (Precision) versuchen Rate-Limit-Überschreitungen automatisch erneut. Credits werden vor der Ausführung abgezogen; schlägt der AI-Call fehl (5xx, Modellfehler), werden sie automatisch erstattet — kein doppelter Abbuchungseffekt bei Retries.

Ready to integrate?

Sign up for a free account and get API access with 10 free credits.