Sviluppatori
Cerca nel catalogo, estrai statistiche di mercato e intelligenza sulla posizione, oppure carica il tuo patrimonio. JSON su HTTPS e un'unica chiave, con client ufficiali per sei linguaggi generati dall'API stessa.
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_… oppure X-API-Key. Entrambi rimandano alla stessa organizzazione, quindi usa quello che il tuo client HTTP gestisce più facilmente.
Le quote sono per organizzazione, non per chiave. Un 429 porta sempre Retry-After in secondi, quindi un client non deve mai indovinare quanto aspettare.
Gli endpoint di scrittura toccano solo il patrimonio pubblicato dalla tua organizzazione. Una chiave non può modificare dati di catalogo raccolti da un portale.
Estrai il catalogo per ricerca e analisi, oppure carica i tuoi annunci e tienili aggiornati con la stessa chiave.
Architettura
Una richiesta non arriva a un portale. Arriva a un catalogo già raccolto, deduplicato, geocodificato e normalizzato in un unico schema, così un conteggio di locali tedesco e un invio diretto tornano indietro con la stessa forma.
Avvio rapido
Crea una chiave nella pagina delle chiavi, installa il client del tuo linguaggio e chiama un endpoint. Le chiavi vengono mostrate una sola volta, alla creazione.
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
}
}Paginazione a cursore: pagina finché meta.has_more non è falso, invece di contare scostamenti su un catalogo che cambia mentre lo leggi.
/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" }
}Gli aggregati sono calcolati dal catalogo che deteniamo, non da prezzi di compravendita. Descrivono i prezzi richiesti.
Le chiavi sono segreti. Chiama l'API dal tuo server, mai da codice browser o mobile: una chiave consegnata a un client è una chiave pubblicata. Non mettere le chiavi sotto controllo di versione. Se una trapela, revocala dalla pagina delle chiavi e scrivi a security@skautik.com.
Riferimento
Tutto sta sotto /v1 e restituisce JSON. URL di base https://api.skautik.com. Gli endpoint di scrittura agiscono solo sul patrimonio pubblicato dalla tua organizzazione.
| 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 |
Mostrati 8 endpoint su 48. Consulta il riferimento completo, con parametri, corpi di risposta e casi di errore.
Lavorarci
Le due cose che ogni integrazione sbaglia. Vale la pena copiare i due schemi qui sotto così come sono.
// 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));
}
}
}Limiti
I limiti si applicano per organizzazione su tutte le sue chiavi, quindi aggiungere chiavi non aggiunge quota. Superarne uno restituisce 429 con Retry-After in secondi.
Il consumo attuale rispetto alla tua dotazione è nella pagina delle chiavi, e le quote dei piani nella pagina per le aziende.
Prima di costruire
Niente di tutto questo è un motivo per non usare l'API. Sono le cose che mordono un'integrazione scritta su presupposti ottimistici.
Gli annunci raccolti vengono ricontrollati a intervalli programmati. Mostra ai tuoi utenti l'ora dell'ultima conferma invece di lasciar intendere che il prezzo sia quello di questo secondo.
Le fonti pubblicano cose diverse. Tratta ogni campo facoltativo come facoltativo, compresi superficie, classe energetica e indirizzo completo.
Gli aggregati e qualsiasi segnale di prezzo descrivono i prezzi richiesti nel nostro catalogo. Non sono perizie e non vanno usati per decisioni di credito.
Leggi le informative della piattaforma per i dettagli su fonti e aggiornamento, i termini dell'API per le regole su cache, attribuzione e rivendita, e l<fairHousing>avviso sulla casa senza discriminazioni</fairHousing> se stai costruendo qualcosa che pubblicizza o profila offerte abitative.