Integrate AI-powered real estate image enhancement and virtual staging into your application.
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..." }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"
}'All API requests require an API key passed as a Bearer token:
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/keysList all your API keys (secrets are never returned)
{
"keys": [
{ "id": "uuid", "name": "My App", "key_prefix": "zest_a1b",
"last_used_at": "...", "created_at": "...", "is_active": true }
]
}/api/keysCreate a new API key. The secret is only returned once.
| Name | Type | Required | Description |
|---|---|---|---|
| name | string | No | Label for the key (default: "Default Key") |
{
"key": { "id": "uuid", "name": "My App", "key_prefix": "zest_a1b" },
"secret": "zest_a1b2c3d4e5f6...",
"warning": "Store this key securely. It cannot be retrieved again."
}/api/keysRevoke an API key
| Name | Type | Required | Description |
|---|---|---|---|
| key_id | string | Yes | The key ID to revoke |
{ "success": true }Enhance, transform, and clean up property photos.
/api/enhanceEnhance a property image using AI. Supports sky replacement, season changes, decluttering, and more.
| Name | Type | Required | Description |
|---|---|---|---|
| image | string | Yes | Image URL or base64 data URL |
| enhancementType | string | No | Type of enhancement (see table). Default: "auto" |
| model | string | No | Model: "auto" (einzige Option — Diffusions-Modelle entfernt) |
| customPrompt | string | No | Custom prompt (overrides enhancementType) |
{
"success": true,
"output": "https://replicate.delivery/...",
"creditsUsed": 1,
"model": "auto"
}| Type | Name | Description |
|---|---|---|
| auto | Auto Enhance | General enhancement |
| sky | Blue Sky | Clear sunny sky |
| sky_sunset | Golden Sunset | Warm golden hour |
| sky_dramatic | Dramatic Clouds | Moody cinematic sky |
| twilight | Virtual Twilight | Blue hour with warm glow |
| season_summer | Summer | Lush green landscape |
| season_autumn | Autumn | Golden fall foliage |
| season_winter | Winter | Pristine snow scene |
| curb_appeal | Curb Appeal | Green lawn & landscaping |
| facade_refresh | Facade Refresh | Clean painted exterior |
| object_removal | Object Removal | Remove unwanted items |
| declutter | Declutter | Remove personal items |
Stage empty rooms with AI-generated furniture — or redesign furnished rooms.
/api/stagingApply virtual staging to a room photo (empty or furnished).
| Name | Type | Required | Description |
|---|---|---|---|
| image | string | Yes | Image URL or base64 of the empty room |
| model | string | No | "interior-design" (default, fast), "precision" (mask-based, structure-preserving) |
| roomType | string | No | living, bedroom, kitchen, dining, bathroom, office, basement, patio |
| furnitureStyle | string | No | modern, scandinavian, luxury, minimalist, industrial, bohemian, midcentury, farmhouse |
{
"success": true,
"output": "https://replicate.delivery/...",
"model": "interior-design",
"creditsUsed": 2,
"creditsRemaining": 48
}| Model | Credits | Description |
|---|---|---|
| interior-design | 2 | Best value, ControlNet-based — synchron; leere & bewohnte Räume |
| precision | 2 | Struktur-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 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:
POST /api/staging mit model: "precision" → Antwort enthält eine jobIdGET /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: mask → inpaint → floor → completed. 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.
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.
| Status | Meaning |
|---|---|
| 400 | Missing or invalid parameters |
| 401 | Missing or invalid authentication |
| 402 | Insufficient credits (0 Credits — aufladen unter /billing) |
| 429 | Rate limit exceeded |
| 500 | Server error or AI model failure |
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.
| Tarif | Limit | Endpoints |
|---|---|---|
| Public (ohne Login) | 10/h | enhance, staging |
| Standard (angemeldet) | 100/h | enhance, staging, keys, MCP |
| Pro / Enterprise | 500/h | alle |
| Video (teure Calls) | 20/h | generate_video |
| Webhooks | 1.000/h | MCP, 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.
Sign up for a free account and get API access with 10 free credits.
Der Zestio MCP Server ermöglicht KI-Assistenten (Claude, Cursor, Windsurf) direkten Zugriff auf deine Immobilien-Daten und Zestio-Funktionen — ohne Code. Über das standardisierte JSON-RPC 2.0 MCP-Protokoll können AI-Agenten Listings durchsuchen, CRM-Daten abrufen, Marktanalysen durchführen und Bilder bearbeiten.
/api/mcpJSON-RPC 2.0 MCP Server. Alle 34 Tools über einen Endpoint.
| Name | Type | Required | Description |
|---|---|---|---|
| Authorization | header | Yes | Bearer zest_YOUR_API_KEY |
// tools/list response
{ "tools": [ { "name": "search_listings", ... }, ... ] }Handshake: Server-Info + Capabilities
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{}}}Listet alle 34 Tools mit Schema
{"jsonrpc":"2.0","id":2,"method":"tools/list"}Führt ein Tool aus
{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"search_listings","arguments":{"location":"Berlin","maxPrice":500000}}}| Kategorie | Tool | Beschreibung | Credits | Admin |
|---|---|---|---|---|
| Listings & Portale | search_listings | Immobilien durchsuchen (Preis, Typ, Ort, Status) | — | — |
| create_listing | Neues Immobilien-Inserat anlegen | — | — | |
| update_listing | Bestehendes Inserat ändern (Preis, Beschreibung, Ort, …) | — | — | |
| publish_to_portal | Inserat auf Portal veröffentlichen | 1 | — | |
| CRM | create_contact | Neuen Kontakt/Lead anlegen | — | — |
| search_leads | Leads/Kontakte durchsuchen | — | — | |
| get_pipeline | Deal-Pipeline mit allen Stages abrufen | — | — | |
| create_deal | Neuen Deal im CRM anlegen | — | — | |
| get_deals | Alle Deals mit Filter abrufen | — | Admin | |
| get_deal | Einzelnen Deal per ID abrufen | — | Admin | |
| get_milestones | Anstehende Meilensteine | — | Admin | |
| update_deal_progress | Deal-Fortschritt aktualisieren (0–100) | — | Admin | |
| get_follow_ups | Fällige Follow-ups abrufen | — | Admin | |
| create_followup | Neues Follow-up anlegen | — | Admin | |
| log_activity | CRM-Aktivität protokollieren | — | Admin | |
| get_property | Immobilien-Details abrufen | — | Admin | |
| 3D Touren | get_tours | 3D-Touren mit Share-URLs abrufen | — | — |
| create_tour | Neue 3D-Tour aus Fotos erstellen | 5 | — | |
| Marktanalyse | get_price_prediction | KI-Preisprognose für Immobilien | — | — |
| get_market_trends | Historische Preistrends für eine Lage | — | — | |
| market_analysis | Vollständige Marktanalyse (IS24 + PLZ) | — | — | |
| KI-Bildbearbeitung | enhance_image | Foto verbessern (Himmel, Saison, etc.) | 1 | — |
| virtual_staging | Räume virtuell möblieren — leer oder möbliert, Struktur bleibt (precision) | 2 | — | |
| renovate_room | KI-Renovierungsvorschau | 2 | — | |
| cleanup_image | Objekte entfernen, Entrümpeln | 1 | — | |
| generate_video | Immobilien-Video aus Bildern | 15 | — | |
| Feed-Syndication | check_feed_token | Feed-Token Status prüfen | — | — |
| generate_feed_token | OpenImmo-Feed-Token generieren | — | — | |
| ensure_feed_token | Feed-Token sicherstellen (erstellt bei Bedarf) | — | — | |
| show_feed_url | Feed-URL für Portale anzeigen | — | — | |
| Agent & Briefing | compile_brief | Tägliches Agent-Briefing | — | — |
| summarize_deal | Einzelnen Deal zusammenfassen | — | — | |
| summarize_pipeline | Pipeline-Übersicht | — | — | |
| Client (E-Mail) | send_drip_email | Drip-E-Mail an Lead senden | — | Admin |
Zestio's Orchestrator delegiert komplexe Anfragen an modulare Agent-Module — gekapselte Komponenten mit eigenem Kontext (supabase,user, previousResults). Die MCP-Tools oben sind die öffentliche Schnittstelle; die Module darunter liefern die Daten & Aktionen. Module werden lazy geladen (nur importiert, wenn sie gebraucht werden).
| Modul | Aktionen | Zweck |
|---|---|---|
| agent | compile_brief, summarize_deal, summarize_pipeline, respond, analyze_market, estimate_value | Orchestrator: Briefings kompilieren, Daten zusammenfassen, Markt-/Wertanalysen |
| crm | fetch_pipeline, fetch_contact, fetch_property, fetch_follow_ups, create_followup, log_activity | CRM-Daten: Pipeline, Kontakte, Follow-ups, Aktivitäten |
| deals | fetch_active_deals, fetch_deal, fetch_milestones | Deal-Pipeline: aktive Deals, Details, Meilensteine |
| calls | fetch_scheduled_calls, trigger_call | Telefonie — aktuell Stubs (erfordert Retell/Twilio API-Keys) |
Aufruf-Pfad: tools/call → Orchestrator → Module-Registry (moduleRegistry[modul][aktion]) → ModuleResult.
„Ändere den Preis des Listings X auf 420.000 €"sucht das Listing, updated price„Zeig mir meine aktuelle Deal-Pipeline"get_pipeline + summarize_pipeline„Veröffentliche Listing Y auf ImmobilienScout24"publish_to_portal (fragt der Client vor der Ausführung nach)„Erstelle eine Marktanalyse für Berlin-Mitte"market_analysis mit LocationDer KI-Client übernimmt die Orchestrierung: Er findet die Listing-ID selbst (via search_listings), ruft die passenden Tools in Folge auf und fragt bei fehlenden Angaben nach.
Benötigt mcp-remote Proxy für HTTP→stdio
{
"mcpServers": {
"zestio": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://zestio.de/api/mcp"],
"env": { "MCP_REMOTE_API_KEY": "zest_YOUR_KEY" }
}
}
}curl -X POST https://zestio.de/api/mcp \
-H "Authorization: Bearer zest_KEY" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'| Code | Bedeutung |
|---|---|
| -32601 | Tool/Methode nicht gefunden |
| -32602 | Ungültige Parameter |
| -32603 | Interner Server-Fehler |
| -32001 | Admin-restricted — Tool nur für Admins |