API-Referenz

Somantic API-Dokumentation

Zwei REST/GraphQL-Endpunkte für deutsche Immobiliendaten und sofortige Immobilienbewertungen. Authentifizierung über einen einzigen API-Schlüssel.

Einführung

Alle Endpunkte teilen sich die Basis-URL https://www.somantic.net/api. Anfragen und Antworten erfolgen im JSON-Format. Erstelle zunächst einen kostenlosen API-Schlüssel im Entwickler-Dashboard – auf der BASIC-Stufe ohne Kreditkarte.

ProduktMethodeEndpunkt
Immobiliendaten-API
POST
/graphql
Immobilienbewertungs-API
POST
/estimate

Authentifizierung

Übergib deinen geheimen Schlüssel bei jeder Anfrage im X-API-Key-Header. Alternativ wird auch ein Bearer-Token im Authorization-Header akzeptiert. Schlüssel haben die Form som_live_… und werden nur einmal bei der Erstellung angezeigt – bewahre sie sicher auf und gib sie niemals im Client-Code preis.

X-API-Key: som_live_DEIN_SCHLUESSEL
# oder
Authorization: Bearer som_live_DEIN_SCHLUESSEL

Kontingente & Limits

Jede API wird separat auf Monatsbasis abgerechnet. Die Nutzung wird zu Beginn jedes Kalendermonats zurückgesetzt und ist in deinem Dashboard sichtbar. Auf der kostenlosen FREE-Stufe gibt die API nach Erreichen des inkludierten Kontingents 429 Too Many Requests zurück, bis du upgradest. Bezahlte Stufen liefern weiterhin Anfragen aus und rechnen Mehrverbrauch pro Anfrage ab. Alle Preise netto zzgl. 19% MwSt.

StufeDaten-API / Mon.Bewertungs-API / Mon.MehrverbrauchAnf. / Sek.
FREE (kostenlos)50252
STARTER4004000,0085 € / Anf.5
GROWTH2.5002.0000,0055 / 0,007 € / Anf.15
SCALE10.0008.0000,004 € / Anf.40
BUSINESS30.00025.0000,003 € / Anf.80

Immobiliendaten-API (GraphQL)

Ein flexibler GraphQL-Endpunkt über aggregierte deutsche Inserate für Häuser und Wohnungen – von Immobilienscout24, Immowelt, Kleinanzeigen, Ohne Makler, Immobilien.de, Wohnung-Jetzt und weiteren Portalen. Jedes Inserat wird mit dem fairen Schätzwert unseres SOM-Modells (som_model_price), der Abweichung vom Markt (som_model_percentage) sowie Cashflow- und ROI-Kennzahlen angereichert. Frage all_appartments oder all_houses mit dem filters-Argument ab und wähle genau die Felder, die du brauchst. Praxisnahe Vorlagen findest du unter Beispielabfragen.

Unterstützte Plattformen

immobilienscout24.de
immowelt.de
immonet.de
kleinanzeigen.de
ohne-makler.net
private-immobilienangebote.de
immobilien.de
immobilienmarkt.faz.net
ovbimmo.de
immo.swp.de
vrm-immo.de
wohnung-jetzt.de

In Arbeit: meinstadt.de, regionalimmobilien, Sparkasse Immobilien.

Verfügbare Abfragen

AbfrageLiefert
all_appartmentsPaginierte Liste von Wohnungen (edges → node)
all_housesPaginierte Liste von Häusern (edges → node)
total_appartments_countInt: Gesamtanzahl passender Wohnungen
total_houses_countInt: Gesamtanzahl passender Häuser
avg_appartmentsDurchschnittswerte für Wohnungen (avg_price_per_square_meter, avg_rent_per_square_meter)
avg_housesDurchschnittswerte für Häuser (avg_price_per_square_meter, avg_rent_per_square_meter)

Alle Abfragen akzeptieren die Argumente filters, page, per_page (max. 100), order_by (Feldname für aufsteigend, - davor für absteigend, z. B. "-uptime_date") sowie equity_percentage, interest und repayment zur Anpassung der Cashflow- und ROI-Berechnung. is_active wird automatisch auf true gesetzt, sofern nicht anders angegeben.

Beispielabfrage

{
  all_appartments(
    filters: { city: "München", price_lt: 600000, square_meter_gt: 50 }
    per_page: 5
    order_by: "roi"
  ) {
    edges {
      node {
        immo_id
        title
        city
        price
        square_meter
        rooms
        price_per_square_meter
        som_model_price        # fairer Schätzwert unseres Modells
        som_model_percentage   # % über/unter Markt
        roi
      }
    }
  }
}

Abfrage senden

curl https://www.somantic.net/api/graphql \
  -H "X-API-Key: som_live_DEIN_SCHLUESSEL" \
  -H "Content-Type: application/json" \
  -d '{"query":"{ all_appartments(filters:{city:\"München\"}, per_page:5){ edges{ node{ immo_id title price som_model_price roi } } } }"}'

Felder & Filter

Jedes Ergebnis wird als Relay-Verbindung zurückgegeben – die Objekte stehen unter edges → node. Wähle in der node-Auswahl beliebige der folgenden Felder; du erhältst ausschließlich die angefragten Felder zurück. avg_appartments und avg_houses liefern zusätzlich die aggregierten Felder avg_price_per_square_meter und avg_rent_per_square_meter.

Abfragbare Felder

Identifikation & Metadaten

FeldTypBeschreibung
immo_idStringEindeutige ID des Inserats auf der Quellplattform
titleStringTitel des Inserats
descriptionStringBeschreibungstext des Inserats
urlStringLink zum Original-Inserat
spiderStringQuellplattform (z. B. immoscout, immowelt, kleinanzeigen, ohnemakler, immobiliende, wohnungjetzt)
typStringObjektart: "wohnung" oder "haus"
actionStringVermarktungsart: "kaufen" oder "mieten"
currencyStringWährung (i. d. R. EUR)
dateDateTimeZeitpunkt der letzten Aktualisierung des Datensatzes
uptime_dateDateTimeZeitpunkt, seit dem das Inserat online ist

Standort

FeldTypBeschreibung
streetStringStraße und Hausnummer (falls verfügbar)
cityStringStadt
zipcodeIntPostleitzahl
stateStringBundesland
locationStringNormalisierter Standort-Slug (z. B. bl-bayern)
latFloatBreitengrad
lonFloatLängengrad

Preis & Finanzen

FeldTypBeschreibung
priceFloatKaufpreis (€)
price_per_square_meterFloatKaufpreis pro m² (€)
rent_priceFloatKaltmiete (€)
rent_per_square_meterFloatKaltmiete pro m² (€)
warm_rent_priceFloatWarmmiete (€)
extra_charges_priceFloatNebenkosten (€)
heat_priceFloatHeizkosten (€)
parking_lot_priceFloatStellplatzpreis (€)
maintenance_priceFloatHausgeld / Instandhaltung (€)
cashflowFloatGeschätzter monatlicher Cashflow bei Kauf – berechnet
roiFloatGeschätzte Rendite – berechnet
price_changes[PriceChangeHistory]Historie der Preisänderungen: { date, price }
most_recent_price_changeFloatJüngster Preis aus der Änderungshistorie
most_oldest_price_changeFloatÄltester Preis aus der Änderungshistorie
price_has_changedBooleanOb sich der Preis seit Erfassung geändert hat
price_has_increasedBooleanOb der Preis zuletzt gestiegen ist
price_below_market_valueBooleanLiegt der Angebotspreis unter dem Modellwert

SOM-Modellwerte

FeldTypBeschreibung
som_model_priceFloatFairer Kaufpreis-Schätzwert des SOM-Modells (€)
som_model_rentFloatFairer Miet-Schätzwert des SOM-Modells (€)
som_model_percentageFloatAbweichung des Angebotspreises vom Modellwert (%); negativ = unter Markt

Objekt & Größe

FeldTypBeschreibung
square_meterFloatWohnfläche (m²)
property_square_meterFloatGrundstücksfläche (m²) – nur bei Häusern
roomsFloatAnzahl Zimmer
bed_roomsIntAnzahl Schlafzimmer
bath_roomsIntAnzahl Badezimmer
year_of_constructionDateTimeBaujahr
floor_numberStringEtage
floor_numbersIntAnzahl Etagen im Gebäude
type_categoryStringObjektkategorie
house_typeStringHaustyp
move_inStringBezugsfrei ab
parking_lot_countIntAnzahl Stellplätze
parking_lot_typeStringArt des Stellplatzes
more_roomsStringWeitere Räume
floor_typeStringBodenbelag
view_typeStringAusblick
windows_typeStringFensterart
security_technologyStringSicherheitstechnik
servicesStringServices
current_usageStringAktuelle Nutzung

Ausstattung & Zustand

FeldTypBeschreibung
has_balconyBooleanBalkon
has_terraceBooleanTerrasse
has_loggiaBooleanLoggia
has_gardenBooleanGarten
has_cellarBooleanKeller
has_storage_roomBooleanAbstellraum
has_kitchenBooleanEinbauküche
has_bathtubBooleanBadewanne
has_window_in_bathBooleanFenster im Bad
has_showerBooleanDusche
has_parking_lotBooleanStellplatz vorhanden
has_elevatorBooleanAufzug
has_caretakerBooleanHausmeister
has_cleanerBooleanReinigungsdienst
has_cable_connectionBooleanKabelanschluss
has_dsl_connectionBooleanDSL-Anschluss
is_barrier_freeBooleanBarrierefrei
pets_allowedBooleanHaustiere erlaubt
use_as_holiday_propertyBooleanAls Ferienimmobilie nutzbar
is_new_buildingBooleanNeubau
is_provisionfreeBooleanProvisionsfrei
is_rentedBooleanAktuell vermietet
is_foreclosureBooleanZwangsversteigerung
is_erbbaurechtBooleanErbbaurecht
vacantBooleanLeerstehend / bezugsfrei
renovation_neededBooleanRenovierungsbedarf
is_activeBooleanInserat noch online

Energie & Heizung

FeldTypBeschreibung
energy_efficency_classStringEnergieeffizienzklasse (A+ … H)
energy_consumptionStringEnergieverbrauch (kWh/m²a)
energy_sourceStringEnergieträger
heating_typeStringHeizungsart
energy_building_typeStringGebäudetyp laut Energieausweis
energy_type_documentStringArt des Energieausweises
energy_document_year_of_constructionStringBaujahr laut Energieausweis
energy_document_validityStringGültigkeit des Energieausweises
energy_supplyStringEnergieversorgung

Beschreibungen & Medien

FeldTypBeschreibung
location_descriptionStringLagebeschreibung
furnishing_descriptionStringAusstattungsbeschreibung
object_descriptionStringObjektbeschreibung
other_descriptionStringSonstige Hinweise
keywords_descriptionStringSchlagworte
seller_nameStringName des Anbieters
image_urls[Images]Bilder: { key, url, description }
renovation_estimateRenovationEstimateKI-Renovierungsschätzung: { items { item, cost, description }, total_cost, summary }

Filter

Übergib Filter als filters-Objekt. Numerische und Datumsfelder unterstützen die Suffixe _lt, _gt, _lte und _gte (kombiniere _gt und _lt für Bereiche). _in erwartet eine Liste, _exists einen Boolean und _contains eine case-insensitive Teilstring-Suche.

Identität, Plattform & Ort

FilterTypBeschreibung
immo_idStringGenau dieses Inserat
immo_id_in[String]Inserat ist eines der angegebenen immo_id
immo_id_all[String]Inserat enthält alle angegebenen immo_id
spiderStringQuellplattform (immoscout, immowelt, kleinanzeigen, ohnemakler, immobiliende, wohnungjetzt, …)
typString"wohnung" oder "haus"
actionString"kaufen" oder "mieten"
locationStringStandort-Slug (z. B. bl-bayern, hamburg)
cityStringExakter Stadtname (schnell, tokenbasiert)
city_containsStringTeilstring im Stadtnamen (case-insensitive)
city_tokens_all[String]Stadt enthält alle angegebenen Tokens
title_containsStringTeilstring im Titel (case-insensitive)
zipcode_in[Int]Postleitzahl ist eine der angegebenen
zipcode_existsBooleanNur Inserate mit / ohne Postleitzahl

Preis, Größe & Finanzen

FilterTypBeschreibung
price_lt / price_gtIntKaufpreis kleiner / größer als
price_per_square_meter_lt / _gtIntKaufpreis pro m² kleiner / größer als
rent_price_lt / rent_price_gtIntKaltmiete kleiner / größer als
rent_per_square_meter_lt / _gtIntKaltmiete pro m² kleiner / größer als
square_meter_lt / square_meter_gtIntWohnfläche kleiner / größer als
rooms_lt / _gt / _lte / _gteFloatZimmeranzahl kleiner / größer (oder gleich) als
cashflow_lt / cashflow_gtIntMonatlicher Cashflow kleiner / größer als
roi_lt / roi_gtFloatRendite kleiner / größer als

Bewertung & SOM-Modell

FilterTypBeschreibung
price_below_market_valueBooleanNur Objekte unter dem Modellwert
som_model_percentage_lt / _gtFloatAbweichung vom Modellwert kleiner / größer als (negativ = unter Markt)
som_model_price_existsBooleanNur Objekte mit Kaufpreis-Schätzwert
som_model_rent_existsBooleanNur Objekte mit Miet-Schätzwert
price_has_changedBooleanPreis hat sich geändert
price_has_increasedBooleanPreis ist gestiegen

Zustand, Energie, Datum & Geo

FilterTypBeschreibung
is_activeBooleanInserat noch online (Standard: true)
is_foreclosureBooleanZwangsversteigerung
is_erbbaurechtBooleanErbbaurecht
vacantBooleanLeerstehend / bezugsfrei
renovation_neededBooleanRenovierungsbedarf
energy_efficency_class_in[String]Energieeffizienzklasse ist eine der angegebenen
year_of_construction_lt / _gt / _lte / _gteDateTimeBaujahr vor / nach (oder gleich)
year_of_construction_existsBooleanNur Inserate mit Baujahr-Angabe
uptime_date_lt / uptime_date_gtDateTimeOnline seit vor / nach
date_lt / date_gtDateTimeZuletzt aktualisiert vor / nach
lat_gt / lat_lt / lon_gt / lon_ltIntGeografische Eingrenzung (Bounding Box)
lat_exists / lon_existsBooleanNur Inserate mit Koordinaten

Beispielabfragen

Sende jede dieser Abfragen per POST an https://www.somantic.net/api/graphql – im JSON-Body unter dem Schlüssel query und mit deinem X-API-Key-Header (siehe Abfrage senden).

Aktive Kaufwohnungen in Bayern (nur Kleinanzeigen)

Die 10 neuesten aktiven Eigentumswohnungen in Bayern von kleinanzeigen.de, sortiert nach Online-Datum.

{
  all_appartments(
    order_by: "-uptime_date"
    per_page: 10
    page: 1
    filters: { is_active: true, action: "kaufen", location: "bl-bayern", spider: "kleinanzeigen" }
  ) {
    edges {
      node {
        uptime_date
        url
        square_meter
        price
      }
    }
  }
}

Nächste Seite (Pagination)

Zum Blättern einfach page erhöhen. per_page ist auf maximal 100 begrenzt.

{
  all_appartments(
    order_by: "-uptime_date"
    per_page: 10
    page: 2
    filters: { is_active: true, action: "kaufen", location: "bl-bayern", spider: "kleinanzeigen" }
  ) {
    edges { node { uptime_date url square_meter price } }
  }
}

Häuser zum Kauf in Baden-Württemberg (immowelt)

Die 20 teuersten aktiven Häuser in Baden-Württemberg von immowelt.de, absteigend nach Preis.

{
  all_houses(
    order_by: "-price"
    per_page: 20
    page: 1
    filters: { is_active: true, action: "kaufen", location: "bl-baden-wuerttemberg", spider: "immowelt" }
  ) {
    edges {
      node {
        uptime_date
        url
        square_meter
        property_square_meter
        price
      }
    }
  }
}

Durchschnittlicher Kaufpreis pro m² (Wohnungen, BW)

Durchschnittlicher Quadratmeterpreis aller aktiven Kaufwohnungen in Baden-Württemberg.

{
  avg_appartments(filters: { is_active: true, action: "kaufen", location: "bl-baden-wuerttemberg" }) {
    edges { node { avg_price_per_square_meter } }
  }
}

Durchschnittliche Miete pro m² (Wohnungen, Hamburg)

Durchschnittliche Kaltmiete pro Quadratmeter aller aktiven Mietwohnungen in Hamburg.

{
  avg_appartments(filters: { is_active: true, action: "mieten", location: "hamburg" }) {
    edges { node { avg_rent_per_square_meter } }
  }
}

Anzahl aktiver Mietwohnungen in Hamburg

Gesamtanzahl der passenden Wohnungen – ideal, um vor dem Paginieren die Treffermenge zu kennen.

{
  total_appartments_count(filters: { is_active: true, action: "mieten", location: "hamburg" })
}

Alle Mietwohnungen in einer Stadt (Hagen)

Bis zu 100 aktive Mietwohnungen in einer bestimmten Stadt, mit umfangreichem Feldsatz.

{
  all_appartments(
    order_by: "-uptime_date"
    per_page: 100
    page: 1
    filters: { is_active: true, city: "Hagen", action: "mieten" }
  ) {
    edges {
      node {
        immo_id
        url
        spider
        title
        location
        city
        zipcode
        rent_price
        warm_rent_price
        extra_charges_price
        rent_per_square_meter
        square_meter
        year_of_construction
        uptime_date
      }
    }
  }
}

Alle Kaufwohnungen in einer PLZ (Lübeck 23552)

Aktive Eigentumswohnungen in einer bestimmten Postleitzahl.

{
  all_appartments(
    order_by: "-uptime_date"
    per_page: 100
    page: 1
    filters: { is_active: true, zipcode_in: [23552], action: "kaufen" }
  ) {
    edges {
      node {
        immo_id
        url
        spider
        title
        location
        city
        state
        zipcode
        price
        price_per_square_meter
        square_meter
        year_of_construction
        uptime_date
      }
    }
  }
}

Unterbewertete Wohnungen finden

Aktive Kaufwohnungen, deren Angebotspreis laut SOM-Modell mindestens 10 % unter dem fairen Marktwert liegt – sortiert nach größter Abweichung.

{
  all_appartments(
    order_by: "som_model_percentage"
    per_page: 25
    filters: { is_active: true, action: "kaufen", city: "Leipzig", som_model_percentage_lt: -10 }
  ) {
    edges {
      node {
        immo_id
        url
        title
        price
        som_model_price
        som_model_percentage
        price_per_square_meter
      }
    }
  }
}

Cashflow-positive Kapitalanlagen

Kaufwohnungen mit positivem geschätzten Cashflow, sortiert nach Rendite (ROI). equity_percentage, interest und repayment passen die Finanzierungsannahmen an.

{
  all_appartments(
    order_by: "-roi"
    per_page: 25
    equity_percentage: 0.2
    interest: 0.035
    repayment: 0.02
    filters: { is_active: true, action: "kaufen", cashflow_gt: 0 }
  ) {
    edges {
      node {
        immo_id
        url
        title
        price
        rooms
        square_meter
        cashflow
        roi
        som_model_rent
      }
    }
  }
}

Immobilienbewertungs-API

Liefert eine sofortige Miet- und Kaufpreisschätzung für jede deutsche Adresse, basierend auf einem Self-Organizing-Map-Modell, das mit Live-Marktdaten trainiert wurde. Sende ein POST an /estimate mit den Objektdaten.

Anfrage-Body

FeldTypBeschreibung
typstringPflicht. "wohnung" (Wohnung) oder "haus" (Haus)
streetstringPflicht, mindestens 3 Zeichen. Ohne Straße wäre die Bewertung die des PLZ-Mittelpunkts, nicht die der Adresse; für eine Einschätzung ohne Adresse nutzen Sie /estimate/quick
postcodestringPflicht. 5-stellige deutsche Postleitzahl
citystringPflicht. Stadt
square_metersnumberPflicht. Wohnfläche in m²
roomsnumberOptional. Anzahl der Zimmer – erhöht die Genauigkeit
year_of_constructionnumberOptional. Baujahr – erhöht die Genauigkeit
property_typestringOptional. Objektart, z. B. "reihenhaus", "doppelhaushaelfte", "etagenwohnung". Filtert die Vergleichsobjekte. Liste unter GET /estimate/property-types
featuresobjectOptional. Ausstattung: balcony, terrace, basement, elevator, garden, kitchen, parking, new_building. Nur true grenzt die Vergleichsobjekte ein – false wird ignoriert, da ein fehlendes Merkmal im Inserat meist nur bedeutet, dass es nicht erwähnt wurde

Anfrage senden

curl https://www.somantic.net/api/estimate \
  -H "X-API-Key: som_live_DEIN_SCHLUESSEL" \
  -H "Content-Type: application/json" \
  -d '{
    "typ": "wohnung",
    "street": "Marienplatz 1",
    "postcode": "80331",
    "city": "München",
    "square_meters": 75,
    "rooms": 3,
    "year_of_construction": 1990
  }'

Beispielantwort

{
  "estimates": {
    "rent": 1650,             // geschätzte monatliche Kaltmiete (€)
    "price": 712500,          // geschätzter Kaufpreis (€)
    "price_range": {          // Quartilsband über die Vergleichsobjekte
      "low": 664000,
      "high": 758000
    },
    "rent_range": { "low": 1540, "high": 1760 },
    "price_per_square_meter": {
      "count": 46, "mean": 9500.0, "median": 9420.0,
      "p25": 8850.0, "p75": 10110.0, "min": 7200.0, "max": 12400.0
    },
    "rent_per_square_meter": { "count": 31, "mean": 22.0, "median": 21.8, ... },
    "similar_properties": [ ... ]
  },
  "confidence": {
    "price": "high",          // high | medium | low | none
    "rent": "medium",
    "sample_size": 46,        // Vergleichsobjekte nach Filterung
    "cluster_size": 118,      // Vergleichsobjekte vor Filterung
    "recency_window_months": 12,   // verwendetes Aktualitätsfenster
    "date_span": { "oldest": "2025-08-23", "newest": "2026-08-04" },
    "filters_applied": ["recency=12m", "property_type=etagenwohnung", "elevator"],
    "filters_skipped": ["garden"]   // hätte zu wenige Vergleichsobjekte übrig gelassen
  },
  "location": { "lat": 48.1374, "lon": 11.5755 },
  "typ": "wohnung",
  "property_type": "etagenwohnung"
}

Die Punktschätzungen price und rent sind der Mittelwert über die Vergleichsobjekte, price_range und rent_range das Quartilsband (25.–75. Perzentil). confidence macht transparent, worauf das Ergebnis beruht: wie viele Vergleichsobjekte übrig blieben, welche Filter angewendet wurden und welche übersprungen wurden, weil sonst zu wenige Vergleichsobjekte verblieben wären.

Vergleichsobjekte werden zusätzlich nach Aktualität eingegrenzt. Wir versuchen zuerst ein Fenster von 12 Monaten und weiten auf 24 bzw. 36 Monate aus, wenn sonst zu wenige Objekte übrig blieben. recency_window_months nennt das tatsächlich verwendete Fenster, date_span den Zeitraum der einbezogenen Inserate. Ist auch das weiteste Fenster zu dünn besetzt, rechnen wir über den gesamten Bestand und weisen das unter filters_skipped aus.

Grobe Ersteinschätzung

POST /estimate/quick liefert eine Quadratmeterpreis-Spanne für die Mikrolage – ohne Wohnfläche und ohne weitere Objektangaben. Gedacht für den ersten Schritt eines zweistufigen Bewertungsprozesses: Der Nutzer bestätigt seine Adresse und sieht sofort eine Einordnung, bevor er ein längeres Formular ausfüllt.

Statt des SOM-Modells aggregiert dieser Endpunkt die aktiven Inserate des PLZ-Gebiets. Reichen diese nicht aus, weitet er automatisch auf die Gemeinde aus – confidence.basis gibt an, welche Ebene verwendet wurde. Optional übergebene square_meters rechnen die Spanne zusätzlich in absolute Euro um.

FeldTypBeschreibung
typstringPflicht. "wohnung" oder "haus"
postcodestringPflicht. 5-stellige deutsche Postleitzahl
citystringOptional, aber empfohlen – ermöglicht die Ausweitung auf die Gemeinde
property_typestringOptional. Objektart wie bei /estimate
square_metersnumberOptional. Rechnet die €/m²-Spanne in absolute Euro um

Anfrage senden

curl https://www.somantic.net/api/estimate/quick \
  -H "X-API-Key: som_live_DEIN_SCHLUESSEL" \
  -H "Content-Type: application/json" \
  -d '{
    "typ": "wohnung",
    "postcode": "80331",
    "city": "München"
  }'

Beispielantwort

{
  "estimates": {
    "price_per_square_meter": {
      "count": 214, "mean": 9640.0, "median": 9500.0,
      "p25": 8400.0, "p75": 10800.0, "min": 5900.0, "max": 16200.0
    },
    "rent_per_square_meter": { "count": 96, "mean": 23.1, "median": 22.6, ... },
    "price_range": null,      // nur gesetzt, wenn square_meters übergeben wurde
    "rent_range": null
  },
  "confidence": {
    "price": "high",
    "rent": "medium",
    "sample_size": 310,       // ausgewertete Inserate
    "area_size": 310,
    "basis": "plz",           // "plz" oder "stadt" (automatisch ausgeweitet)
    "recency_window_months": 12,
    "date_span": { "oldest": "2025-09-02", "newest": "2026-08-11" },
    "filters_applied": ["recency=12m"],
    "filters_skipped": []
  },
  "area": { "postcode": "80331", "city": "München" },
  "typ": "wohnung",
  "property_type": null
}

Unterstützte Objektarten liefert GET /estimate/property-types, optional eingeschränkt über ?typ=haus bzw. ?typ=wohnung.

{
  "property_types": [
    { "id": "einfamilienhaus",   "label": "Einfamilienhaus",   "typ": "haus" },
    { "id": "doppelhaushaelfte", "label": "Doppelhaushälfte",  "typ": "haus" },
    { "id": "reihenhaus",        "label": "Reihenhaus",        "typ": "haus" },
    { "id": "zweifamilienhaus",  "label": "Zweifamilienhaus",  "typ": "haus" },
    { "id": "mehrfamilienhaus",  "label": "Mehrfamilienhaus",  "typ": "haus" },
    { "id": "etagenwohnung",     "label": "Etagenwohnung",     "typ": "wohnung" },
    { "id": "maisonette",        "label": "Maisonette",        "typ": "wohnung" },
    { "id": "penthouse",         "label": "Penthouse",         "typ": "wohnung" }
    // …
  ]
}

Fehler

Fehler verwenden Standard-HTTP-Statuscodes mit einem JSON-Body der Form { "detail": "…" }.

StatusBedeutung
400Ungültiger Anfrage-Body oder ungültige Parameter
402Abonnement inaktiv – Zahlungsdaten im Dashboard aktualisieren
403Fehlender, ungültiger oder widerrufener API-Schlüssel
429Monatliches Kontingent auf einer gedeckelten Stufe erreicht – zum Fortfahren upgraden
500Serverfehler – bitte erneut versuchen oder den Support kontaktieren