Développeurs
Cherchez dans le catalogue, récupérez les statistiques de marché et l'intelligence de localisation, ou poussez votre propre inventaire. Du JSON sur HTTPS et une seule clé, avec des clients officiels pour six langages générés depuis l'API elle-même.
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_… ou X-API-Key. Les deux renvoient à la même organisation : utilisez celle que votre client HTTP gère le plus simplement.
Les quotas sont par organisation, pas par clé. Un 429 porte toujours Retry-After en secondes, un client n'a donc jamais à deviner un délai.
Les endpoints d'écriture ne touchent que l'inventaire publié par votre organisation. Une clé ne peut pas modifier des données de catalogue collectées sur un portail.
Récupérez le catalogue pour la recherche et l'analyse, ou poussez vos propres annonces et tenez-les à jour avec la même clé.
Architecture
Une requête n'atteint pas un portail. Elle atteint un catalogue déjà collecté, dédoublonné, géocodé et normalisé vers un schéma unique, si bien qu'un nombre de pièces allemand et une soumission directe reviennent sous la même forme.
Démarrage rapide
Créez une clé sur la page des clés, installez le client de votre langage et appelez un endpoint. Les clés ne sont affichées qu'une fois, à la création.
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
}
}Pagination par curseur : paginez jusqu'à ce que meta.has_more soit faux, plutôt que de compter des décalages sur un catalogue qui change pendant que vous le lisez.
/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" }
}Les agrégats sont calculés sur le catalogue que nous détenons, pas sur des prix de transaction. Ils décrivent les prix affichés.
Les clés sont des secrets. Appelez l'API depuis votre serveur, jamais depuis du code navigateur ou mobile : une clé livrée à un client est une clé publiée. Ne versionnez pas de clés. En cas de fuite, révoquez-la depuis la page des clés et écrivez à security@skautik.com.
Référence
Tout se trouve sous /v1 et renvoie du JSON. URL de base https://api.skautik.com. Les endpoints d'écriture n'agissent que sur l'inventaire publié par votre propre organisation.
| 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 endpoints affichés sur 48. Voir la référence complète, avec les paramètres, les corps de réponse et les cas d'erreur.
Le mettre en œuvre
Les deux choses que toute intégration rate. Les deux motifs ci-dessous méritent d'être copiés tels quels.
// 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));
}
}
}Limites
Les limites s'appliquent par organisation, toutes clés confondues : ajouter des clés n'ajoute pas de quota. Dépasser une limite renvoie 429 avec Retry-After en secondes.
Votre consommation par rapport à votre dotation figure sur la page des clés, et les quotas par offre sur la page entreprises.
Avant de construire
Rien ici n'est une raison de ne pas utiliser l'API. Ce sont les points qui mordent une intégration écrite sur des hypothèses optimistes.
Les annonces collectées sont revérifiées selon un calendrier. Affichez à vos utilisateurs la date de dernière confirmation plutôt que de laisser croire que le prix est celui de la seconde présente.
Les sources ne publient pas les mêmes choses. Traitez chaque champ facultatif comme facultatif, y compris la surface, le diagnostic énergétique et l'adresse complète.
Les agrégats et tout signal de prix décrivent les prix affichés dans notre catalogue. Ce ne sont pas des expertises et ils ne doivent pas servir à des décisions de crédit.
Lisez les informations sur la plateforme pour le détail des sources et de la fraîcheur, les conditions de l'API pour les règles de cache, d'attribution et de revente, et l<fairHousing>avis sur le logement équitable</fairHousing> si vous construisez quoi que ce soit qui diffuse ou cible des annonces de logement.