API-Referenz

Somantic API-Dokumentation

GraphQL- und REST-Endpunkte für deutsche Immobilien und sofortige Immobilienbewertungen – und ein MCP-Endpunkt, über den KI-Agenten direkt suchen. 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
Immobilien-API
POST
/graphql
Immobilienbewertungs-API
POST
/estimate
MCP für KI-Agenten
POST
/mcp/

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 inkl. 19 % MwSt.

StufeImmobilien-API / Mon.Bewertungs-API / Mon.MehrverbrauchAnf. / Sek.
FREE (kostenlos)5025—2
STARTER4004000,0101 € / Anf.5
GROWTH2.5002.0000,006 € / 0,0083 € / Anf.15
SCALE10.0008.0000,0048 € / Anf.40
BUSINESS30.00025.0000,0036 € / Anf.80

Immobilien-API (GraphQL)

Eine Meta-Suchmaschine als flexibler GraphQL-Endpunkt: Sie durchsucht die aktiven Inserate für Häuser und Wohnungen aus zahlreichen deutschen Portalen, damit Entwickler und Nutzer gezielt die passenden Objekte finden und zum Original-Inserat beim Anbieter gelangen. Jedes Inserat wird mit dem fairen Schätzwert unseres Bewertungsmodells (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.

Dasselbe Objekt wird häufig auf mehreren Portalen gleichzeitig inseriert. Die Suche zeigt jedes dieser Inserate als eigenen Treffer – mit eigener immo_id und dem Quellportal im Feld source –, damit du siehst, wo ein Objekt überall angeboten wird und zu welchem Preis. Willst du je Objekt nur einen Treffer, gruppiere nach dem Titel (kleingeschrieben, Leerzeichen zusammengefasst), square_meter, rooms und action und behalte das jüngste Inserat: Nach dieser Signatur fasst auch unsere Bewertung Mehrfach-Inserate zusammen. Der Preis gehört bewusst nicht dazu, weil Portale nach einer Preissenkung oft noch den alten zeigen.

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 (derzeit nur "-uptime_date", der Standard: zuletzt erfasste Inserate zuerst) sowie equity_percentage, interest und repayment zur Anpassung der Cashflow- und ROI-Berechnung. Die API liefert immer nur aktive Inserate: is_active ist stets true, auch wenn du etwas anderes angibst.

Aktualität. date (im MCP-Server last_seen) nennt, wann Somantic das Inserat zuletzt als online bestätigt hat. Nicht mehr bestätigte Inserate werden in der Regel nach 3 Tagen aus den Ergebnissen entfernt.

Keine Straße, keine Koordinaten. Die genaue Adresse eines angebotenen Objekts ist ein personenbezogenes Datum: Über sie lassen sich Eigentümer, Verkäufer oder Mieter identifizieren, und viele Inserenten veröffentlichen sie deshalb bewusst nicht. Die Lage eines Inserats geben Immobilien-API und MCP-Server daher nur über Postleitzahl und Ort an. Geografisch eingrenzen lässt sich die Suche trotzdem, mit zipcode_in, city oder lat_gt/lat_lt. Die genaue Lage steht, soweit der Inserent sie freigibt, im Original-Inserat.

Inserate sind Angebote Dritter. Jede Antwort trägt deshalb unter extensions.attribution die Nutzungsregel: Wer ein Inserat anzeigt, nennt das Quellportal (source) und verlinkt das Original (url).

Beispielabfrage

{
  all_appartments(
    filters: { city: "München", price_lt: 600000, square_meter_gt: 50 }
    per_page: 5
    order_by: "-uptime_date"
  ) {
    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
urlStringLink zum Original-Inserat; dort stehen Beschreibung und Fotos
sourceStringKennung des Quellportals
typStringObjektart: "wohnung" oder "haus"
actionStringVermarktungsart: "kaufen" oder "mieten"
currencyStringWährung (i. d. R. EUR)
dateDateTimeZeitpunkt, zu dem Somantic das Inserat zuletzt erfasst oder aktualisiert hat
uptime_dateDateTimeZeitpunkt der Ersterfassung durch Somantic; bei einigen Quellen das Online-Datum laut Portal, sofern angegeben

Standort

FeldTypBeschreibung
cityStringStadt
zipcodeIntPostleitzahl
stateStringBundesland
locationStringNormalisierter Standort-Slug (z. B. bl-bayern)

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 (€)
current_rentFloatNur Kaufangebote: aktuelle monatliche Kaltmiete des Mieters (€), aus dem Inseratstext gelesen (Jahresangaben ÷ 12). null, wenn das Inserat keine nennt; befüllt für neu erfasste und geänderte Inserate
parking_lot_priceFloatStellplatzpreis (€)
maintenance_priceFloatHausgeld / Instandhaltung (€); derzeit nicht befüllt
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 geändert hat, seit das Inserat erstmals gefunden wurde
price_has_increasedBooleanOb der Preis zuletzt gestiegen ist
price_below_market_valueBooleanLiegt der Angebotspreis unter dem Modellwert

Modellwerte

FeldTypBeschreibung
som_model_priceFloatFairer Kaufpreis-Schätzwert des Bewertungsmodells (€)
som_model_rentFloatFairer Miet-Schätzwert des Bewertungsmodells (€)
som_model_percentageFloatAbweichung des Angebotspreises vom Modellwert (%); negativ = unter Markt
renovation_estimateRenovationEstimateKI-Renovierungsschätzung: { items { item, cost, description }, total_cost, summary }; nur vorhanden, wenn auf somantic.net eine Schätzung für das Inserat angefordert wurde

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_rentedBooleanNicht als bezugsfrei inseriert – das Gegenstück zu vacant, kein eigener Nachweis einer Vermietung. Für vermietete Objekte ist vacant = false das verlässlichere Signal
is_foreclosureBooleanZwangsversteigerung
is_erbbaurechtBooleanErbbaurecht
vacantBooleanLeerstehend / bezugsfrei
renovation_neededBooleanRenovierungsbedarf; abgeleitet aus Titel, Beschreibung und Zustandsangabe ("renovierungs-/sanierungs-/modernisierungsbedürftig", "-bedarf", "-stau", "-objekt", "Handwerkerobjekt", "Bastlerobjekt", "abbruchreif"; Verneinungen wie "kein Sanierungsstau" zählen nicht)
is_activeBooleanImmer true: die API liefert nur aktive Inserate

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

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
sourceStringKennung des Quellportals, wie im Feld source geliefert
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 & Modellwerte

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_activeBooleanOhne Wirkung: die API liefert immer nur aktive Inserate, auch bei immo_id_in
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_gtDateTimeErstmals erfasst vor / nach – für den täglichen Abruf neu eingegangener Inserate
date_lt / date_gtDateTimeZuletzt erfasst oder aktualisiert vor / nach – liefert auch bereits bekannte Inserate erneut
lat_gt / lat_lt / lon_gt / lon_ltFloatGeografische Eingrenzung (Bounding Box); die Grenzen werden auf ein Raster von 0,01° (ca. 1 km) gelegt

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

Die 10 zuletzt erfassten aktiven Eigentumswohnungen in Bayern.

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

Nächste Seite (Pagination)

Zum Blättern page erhöhen; per_page ist auf maximal 100 begrenzt. Neu erfasste Inserate schieben die Liste während des Blätterns weiter – für einen täglichen Abruf besser uptime_date_gt auf den Zeitpunkt des letzten Laufs setzen und nach immo_id zusammenführen.

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

Häuser zum Kauf in Baden-Württemberg

Die 20 zuletzt erfassten aktiven Häuser zum Kauf in Baden-Württemberg.

{
  all_houses(
    order_by: "-uptime_date"
    per_page: 20
    page: 1
    filters: { is_active: true, action: "kaufen", location: "bl-baden-wuerttemberg" }
  ) {
    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
        source
        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
        source
        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 Bewertungsmodell mindestens 10 % unter dem fairen Marktwert liegt.

{
  all_appartments(
    order_by: "-uptime_date"
    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. equity_percentage, interest und repayment passen die Finanzierungsannahmen an.

{
  all_appartments(
    order_by: "-uptime_date"
    per_page: 25
    equity_percentage: 0.2
    interest: 0.042
    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
      }
    }
  }
}

MCP für KI-Agenten

Über das Model Context Protocol (MCP) sucht ein KI-Agent – etwa in Claude, ChatGPT, Codex oder einer eigenen Anwendung – direkt über die Somantic-Suche, ohne dass du Abfragen selbst baust. Der Endpunkt ist https://www.somantic.net/api/mcp/ (Streamable HTTP, zustandslos; mit Schrägstrich am Ende). Die Liste der Tools ist ohne Anmeldung abrufbar. Jeder Tool-Aufruf braucht entweder die Anmeldung mit deinem Somantic-Konto (OAuth) oder einen API-Schlüssel und zählt als eine Anfrage in deinem API-Kontingent – die kostenlose Stufe reicht zum Ausprobieren (Preise).

ToolLiefert
search_listingsSuche nach aktuellen Inseraten: Ort (q), Kauf oder Miete, Wohnung oder Haus, Preis, Preis pro m², Preisänderung, Fläche, Zimmer, Baujahr, Rendite, Ausstattung, Renovierungsbedarf. Liefert Fakten, Somantic-Bewertung, source_url und last_seen, höchstens 50 je Seite.
get_listingEin einzelnes Inserat mit allen Fakten, der Somantic-Bewertung und dem Link zum Original.
estimate_valueKauf- und Mietwert einer beliebigen deutschen Adresse – auch ohne Inserat. Erwartet Straße, PLZ, Ort und Wohnfläche, optional Zimmer, Baujahr, Objektart, Ausstattung und ob das Objekt vermietet ist. Liefert Schätzwerte, Spannen, €/m² und eine Konfidenz; bei zu wenigen Vergleichsobjekten nur €/m² und Konfidenz. Wird gegen das Kontingent der Bewertungs-API gezählt, nicht gegen das der Immobilien-API.

Die Tools liefern Fakten, die Bewertung von Somantic (somantic_valuation_eur, price_vs_valuation_pct) und den Weg zum Angebot (source_portal, source_url) sowie mit last_seen, wann Somantic das Inserat zuletzt als online bestätigt hat. Keine Straße und keine Koordinaten (zum Schutz der Eigentümer und Bewohner, siehe Immobilien-API), keinen Text des Inserenten und keine Bilder. Zeigt dein Agent ein Inserat an, nennt er das Quellportal und verlinkt source_url; es gelten die API-Bedingungen in Ziffer 15 der AGB, für KI-Assistenten insbesondere Ziffer 15.5a.

Einrichtung

Mit der Anmeldung legt Somantic in deinem Entwickler-Dashboard den Schlüssel „KI-Assistent: …“ an, über den die Aufrufe laufen. Widerrufst du ihn dort, ist die Verbindung getrennt.

  • claude.ai (gilt auch für Claude Desktop und die Claude-App): am einfachsten über den Eintrag im Claude-Verzeichnis („Connect“), sonst Settings → Connectors → „Add custom connector“ mit der URL. Beim ersten Aufruf meldest du dich mit deinem Somantic-Konto an. Alternativ mit API-Schlüssel: „No sign-in“ wählen und unter „Request headers“ X-API-Key mit deinem Schlüssel eintragen – sofern dein Konto diesen Abschnitt anzeigt.
  • ChatGPT: am einfachsten über den Eintrag im ChatGPT-Verzeichnis („Install plugin“), sonst unter chatgpt.com/plugins über „+“ → „Add custom MCP server“ die URL eintragen, als Authentifizierung OAuth wählen und als Plugin anlegen. Im Chat dann mit „@“ auswählen; beim ersten Aufruf meldest du dich mit deinem Somantic-Konto an.

Claude Code

# Mit Anmeldung: danach in Claude Code /mcp → somantic → Authenticate
claude mcp add --transport http somantic https://www.somantic.net/api/mcp/

# Oder mit API-Schlüssel
claude mcp add --transport http somantic https://www.somantic.net/api/mcp/ \
  --header "X-API-Key: som_live_DEIN_SCHLUESSEL"

Claude Code (.mcp.json)

{
  "mcpServers": {
    "somantic": {
      "type": "http",
      "url": "https://www.somantic.net/api/mcp/",
      "headers": { "X-API-Key": "som_live_DEIN_SCHLUESSEL" }
    }
  }
}

Claude Desktop mit API-Schlüssel (claude_desktop_config.json, braucht Node.js)

{
  "mcpServers": {
    "somantic": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://www.somantic.net/api/mcp/",
               "--header", "X-API-Key:${SOMANTIC_API_KEY}"],
      "env": { "SOMANTIC_API_KEY": "som_live_DEIN_SCHLUESSEL" }
    }
  }
}

Codex CLI

# ~/.codex/config.toml
[mcp_servers.somantic]
url = "https://www.somantic.net/api/mcp/"
# Schlüssel aus der Umgebungsvariable SOMANTIC_API_KEY. Ohne diese Zeile
# meldest du dich mit `codex mcp login somantic` an.
bearer_token_env_var = "SOMANTIC_API_KEY"

Cursor und VS Code

// Cursor: ~/.cursor/mcp.json
{
  "mcpServers": {
    "somantic": {
      "url": "https://www.somantic.net/api/mcp/",
      "headers": { "X-API-Key": "som_live_DEIN_SCHLUESSEL" }
    }
  }
}

// VS Code: .vscode/mcp.json
{
  "servers": {
    "somantic": {
      "type": "http",
      "url": "https://www.somantic.net/api/mcp/",
      "headers": { "X-API-Key": "som_live_DEIN_SCHLUESSEL" }
    }
  }
}
// Ohne "headers" melden sich beide mit dem Somantic-Konto an.

Direkter Aufruf

curl https://www.somantic.net/api/mcp/ \
  -H "X-API-Key: som_live_DEIN_SCHLUESSEL" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc": "2.0", "id": 1, "method": "tools/call",
       "params": {"name": "search_listings",
                  "arguments": {"q": "Leipzig", "transaction": "kaufen",
                                "price_max": 300000, "price_below_market": true}}}'

Immobilienbewertungs-API

Liefert eine sofortige Miet- und Kaufpreisschätzung für jede deutsche Adresse – auf Basis echter Vergleichsangebote aus derselben Lage. Sende ein POST an /estimate mit den Objektdaten.

Mehrfach-Inserate zählen nur einmal. Dieselbe Wohnung steht oft gleichzeitig auf mehreren Portalen. Vor der Berechnung werden Vergleichsobjekte portalübergreifend zusammengefasst, sodass ein dreifach inseriertes Objekt den Schätzwert nicht dreifach beeinflusst. sample_size nennt die Zahl der tatsächlich verwendeten – also bereits bereinigten – Vergleichsobjekte.

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. Ausnahme Neubau: Ein Neubau wird nur mit Neubauten verglichen, jedes andere Objekt ohne sie (filters_applied: new_building=false). Als Neubau gilt new_building: true oder ein Baujahr aus den letzten 3 Jahren
rentedbooleanOptional. true bewertet das Objekt als vermietet und lässt bezugsfrei inserierte Kaufangebote aus dem Vergleich; false vergleicht nur mit ihnen. Mit Mieter erzielt dieselbe Wohnung meist deutlich weniger. Wirkt nur auf die Kaufseite. Ohne Angabe wird nicht gefiltert

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": [ ... ]   // Vergleichsobjekte; lat/lon auf ca. 1 km gerundet
  },
  "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.

similar_properties listet die Vergleichsobjekte. Ihre Koordinaten (lat, lon) sind auf zwei Nachkommastellen gerundet, also auf ein Raster von etwa 1 km, und geben nur die ungefähre Lage an; eine Straße enthalten sie nicht. Die genaue Lage eines Inserats gibt Somantic zum Schutz der Eigentümer und Bewohner nirgends heraus, siehe Immobilien-API. location ist dagegen der genaue Punkt der angefragten Adresse.

Zu dünne Datenlage liefert keine Zahl. Stützt sich eine Seite auf weniger als 5 Vergleichsobjekte, sind price und price_range bzw. rent und rent_range null. Die Statistik unter price_per_square_meter bzw. rent_per_square_meter und die confidence werden trotzdem geliefert, damit sichtbar bleibt, was gefunden wurde. Behandle beide Felder daher als optional.

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 ohne Zeitfenster 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 Bewertungsmodells 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