Entwickler
Den Bestand durchsuchen, Marktstatistiken und Standortinformationen holen oder eigene Objekte einspielen. JSON über HTTPS und ein Schlüssel, mit offiziellen Clients für sechs Sprachen, erzeugt aus der API selbst.
GET /v1/api/properties?city=Berlin&district=Kreuzberg&postal_code=10999 HTTP/1.1
Host: api.skautik.com
Authorization: Bearer sk_live_…Authorization: Bearer sk_live_… oder X-API-Key. Beide führen zur selben Organisation, nehmen Sie also, was Ihr HTTP-Client am leichtesten macht.
Kontingente gelten je Organisation, nicht je Schlüssel. Eine 429 trägt immer Retry-After in Sekunden, ein Client muss eine Wartezeit also nie raten.
Schreibende Endpunkte berühren nur Bestand, den Ihre Organisation veröffentlicht hat. Ein Schlüssel kann keine von einem Portal erfassten Daten ändern.
Den Bestand für Suche und Auswertung lesen oder eigene Angebote einspielen und über denselben Schlüssel aktuell halten.
Architektur
Eine Anfrage trifft kein Portal. Sie trifft einen Bestand, der bereits erfasst, entdoppelt, verortet und in ein gemeinsames Schema überführt wurde, eine deutsche Zimmerzahl und eine Direkteinreichung kommen also in derselben Form zurück.
Schnellstart
Legen Sie auf der Schlüsselseite einen Schlüssel an, installieren Sie den Client für Ihre Sprache und rufen Sie einen Endpunkt auf. Schlüssel werden einmal bei der Erstellung gezeigt und danach nie wieder.
TypeScript
pnpm add @skautik/sdkC#
dotnet add package Skautik.SdkJava
com.skautik:skautik-sdk:1.0.0PHP
composer require skautik/sdkGo
go get github.com/skautikhq/skautik-sdk-goPython
pip install skautik-sdk/v1/api/properties?city=Berlin&limit=2Request
Authorization: Bearer sk_live_…
Accept: application/jsonResponse
{
"data": [
{ "id": "prop_8f2a41c9d0", "title": "Top-floor apartment…", "price": 42900000 },
{ "id": "prop_1b77e0a4f2", "title": "Garden flat…", "price": 38500000 }
],
"meta": {
"has_more": true,
"next_cursor": "eyJpZCI6InByb3BfMWI3N2UwYTRmMiJ9",
"limit": 50
}
}Cursor-Paging: Blättern Sie, bis meta.has_more false ist, statt Offsets gegen einen Bestand zu zählen, in den während des Lesens geschrieben wird.
/v1/api/markets/{city}/statisticsRequest
X-API-Key: sk_live_…Response
{
"data": {
"market_id": "berlin-de",
"interval": "month",
"series": [
{
"period": "2026-06",
"listing_count": 1211,
"median_price": 41000000,
"median_price_per_area": 554000,
"median_days_listed": 41
},
{
"period": "2026-07",
"listing_count": 1284,
"median_price": 41500000,
"median_price_per_area": 560000,
"median_days_listed": 38
}
]
},
"meta": { "computed_at": "2026-08-11T04:00:00Z" }
}Aggregate werden aus dem Bestand berechnet, den wir halten, nicht aus erzielten Preisen. Sie beschreiben Angebotsverhalten.
Schlüssel sind Geheimnisse. Rufen Sie die API von Ihrem Server aus auf, nie aus Browser- oder Mobil-Code: Ein an einen Client ausgelieferter Schlüssel ist ein veröffentlichter Schlüssel. Schlüssel gehören nicht ins Repository. Wenn einer leckt, widerrufen Sie ihn auf der Schlüsselseite und schreiben Sie an security@skautik.com.
Referenz
Alles liegt unter /v1 und liefert JSON. Basis-URL https://api.skautik.com. Schreibende Endpunkte wirken nur auf Bestand, den Ihre eigene Organisation veröffentlicht hat.
| Method | Endpoint | Description | Common parameters |
|---|---|---|---|
| GET | /v1/api/properties | Page through the catalogue with filters. | city, district, postal_code, type, transaction_type, status, external_id, min_price, max_price, min_living_area, min_bedrooms, limit, cursor, sort, expand, language |
| POST | /v1/api/properties/search | Semantic and geographic search that is too complex for a query string. | query, polygon, bounds, filters, limit |
| GET | /v1/api/properties/{property_id} | One property with its full attribute set. | property_id, expand, language |
| POST | /v1/api/properties | Publish a record from your own inventory. | Idempotency-Key, external_id, title, property_type, transaction_type, price, currency, address |
| GET | /v1/api/markets | Every market with coverage, and how deep that coverage runs. | |
| GET | /v1/api/markets/{city}/statistics | Supply and price series over time, by property type. | city, property_type, transaction_type, interval, since |
| POST | /v1/api/imports | Upload a file, or point us at one, and process it. | format, mode, source_id, dry_run, filename, confirm_shrink, file, Idempotency-Key |
| POST | /v1/api/webhooks | Register an HTTPS endpoint for a set of events. | url, events |
8 von 48 Endpunkten gezeigt. Zur vollständigen Referenz, mit Parametern, Antwortkörpern und Fehlerfällen.
In der Praxis
Die zwei Dinge, die jede Anbindung falsch macht. Beide Muster unten sind es wert, wörtlich übernommen zu werden.
// The client follows the cursor and stops when the API says to.
// Writing this loop by hand is where people stop on a short page,
// and a full page can still be the last one.
for await (const property of skautik.properties.listAll({ city: "Berlin" })) {
await upsert(property);
}import { ResponseError } from "@skautik/sdk";
async function withRetry<T>(call: () => Promise<T>, attempts = 5): Promise<T> {
for (let attempt = 0; ; attempt++) {
try {
return await call();
} catch (error) {
if (!(error instanceof ResponseError)) throw error;
const status = error.response.status;
if (status !== 429 && status < 500) throw error;
if (attempt === attempts - 1) throw error;
// A 429 says exactly how long to wait. Trust it over a guess, and
// add jitter so a fleet of workers does not all wake together.
const after = Number(error.response.headers.get("Retry-After") ?? 0);
const backoff = after > 0 ? after * 1000 : 2 ** attempt * 250;
await new Promise((r) => setTimeout(r, backoff + Math.random() * 250));
}
}
}Limits
Limits gelten je Organisation über alle ihre Schlüssel, mehr Schlüssel bringen also kein größeres Kontingent. Eine Überschreitung liefert 429 mit Retry-After in Sekunden.
Ihren aktuellen Verbrauch finden Sie auf der Schlüsselseite, die Tarifkontingente auf der Seite für Unternehmen.
Bevor Sie bauen
Nichts davon ist ein Grund, die API nicht zu nutzen. Es sind die Dinge, die eine auf optimistischen Annahmen gebaute Anbindung einholen werden.
Erfasste Angebote werden nach Plan erneut geprüft. Zeigen Sie Ihren Nutzern den Zeitpunkt der letzten Bestätigung, statt zu suggerieren, der Preis gelte in dieser Sekunde.
Quellen veröffentlichen Unterschiedliches. Behandeln Sie jedes optionale Feld als optional, auch Fläche, Energieklasse und vollständige Adresse.
Aggregate und jedes Preissignal beschreiben Angebotsverhalten in unserem Bestand. Sie sind keine Gutachten und dürfen nicht für Kreditentscheidungen verwendet werden.
Lesen Sie die Hinweise zur Plattform zu Quellen und Aktualität, die API-Bedingungen zu Zwischenspeicherung, Quellenangabe und Weiterverkauf, und den Hinweis zur Gleichbehandlung, wenn Sie etwas bauen, das Wohnraum bewirbt oder zielgerichtet ausspielt.