Developers
Search the catalogue, pull market statistics and location intelligence, or push your own inventory in. JSON over HTTPS and one key, with official clients for six languages generated from the API itself.
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_… or X-API-Key. Both resolve to the same organisation, so use whichever your HTTP client makes easiest.
Quotas are per organisation, not per key. A 429 always carries Retry-After in seconds, so a client never has to guess a backoff.
Write endpoints only touch inventory your organisation published. A key cannot modify catalogue data collected from a portal.
Pull the catalogue for search and analysis, or push your own listings in and keep them current through the same key.
Architecture
A request does not hit a portal. It hits a catalogue that has already been collected, deduplicated, geocoded, and normalised into one schema, so a German room count and a direct submission come back the same shape.
Quickstart
Create a key on the keys page, install the client for your language, and call an endpoint. Keys are shown once at creation and never again.
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 pagination: page until meta.has_more is false, rather than counting offsets against a catalogue that changes while you read it.
/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" }
}Aggregates are computed from the catalogue we hold, not from transacted prices. They describe asking behaviour.
Keys are secrets. Call the API from your server, never from browser or mobile code: a key shipped to a client is a key published. Do not commit keys. If one leaks, revoke it from the keys page and email security@skautik.com.
Reference
Everything sits under /v1 and returns JSON. Base URL https://api.skautik.com. Write endpoints act only on inventory your own organisation published.
| 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 of 48 endpoints shown. See the full reference, including parameters, response bodies, and error cases.
Working with it
The two things every integration gets wrong. Both patterns below are worth copying verbatim.
// 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 apply per organisation across all of its keys, so adding keys does not add quota. Exceeding one returns 429 with Retry-After in seconds.
Current usage against your allowance is on the keys page, and plan quotas are on the business page.
Before you build
Nothing here is a reason not to use the API. They are the things that will bite an integration written on optimistic assumptions.
Collected listings are re-checked on a schedule. Surface the last-confirmed time to your users rather than implying the price is current this second.
Sources publish different things. Treat every optional field as optional, including area, energy label, and full address.
Aggregates and any price signal describe asking behaviour in our catalogue. They are not appraisals and must not be used for lending decisions.
Read the platform disclosures for sourcing and refresh detail, the API terms for caching, attribution, and resale rules, and the fair housing notice if you are building anything that advertises or targets housing.