Importe
Bestand aus dem System hereinholen, das ihn ohnehin hält. Ein einmaliger Import erledigt eine Migration; eine Importquelle hält CRM und Skautik dauerhaft im Gleichlauf.
/v1/api/importsimports:writeEinen Import starten
Eine Datei hochladen, oder uns eine nennen, und verarbeiten lassen.
Nimmt einen Multipart-Upload oder eine URL, die wir holen. Zuerst läuft die Prüfung, und die ganze Datei wird abgelehnt, wenn sie sich nicht lesen lässt; einzelne fehlerhafte Datensätze werden gemeldet, ohne den Rest anzuhalten, sofern Sie nicht alles oder nichts verlangen.
Query-Parameter
| Name | Typ | Beschreibung |
|---|---|---|
formaterforderlich | enum | Format der gesendeten Datei. blm | csv | json | kyero | openimmo Beispiel: csv |
mode | enum | Incremental aktualisiert, was die Datei enthält, und lässt den Rest in Ruhe. Ein Full Sync zieht zusätzlich alles zurück, was darin fehlt, und ist deshalb nicht die Voreinstellung. incremental | full_sync Vorgabe: incrementalBeispiel: incremental |
source_id | string | Importquelle, zu der diese Übertragung gehört, wenn sie aus einem dauerhaften Anschluss statt aus einem einmaligen Upload kommt. Beispiel: src_immoscout |
dry_run | boolean | Lesen und melden, was sich ändern würde, ohne etwas zu schreiben. Bei einer neuen Zuordnung einmal lohnenswert. Beispiel: true |
filename | string | Ursprünglicher Dateiname, am Lauf festgehalten, damit ein Fehler auf die verursachende Datei zurückverfolgt werden kann. Beispiel: transfer-2026-08-12.zip |
confirm_shrink | boolean | Einen Vollabgleich zulassen, der einen großen Teil des Bestands der Quelle zurückziehen würde. Ohne dies werden die Rücknahmen einer Lieferung, die deutlich weniger Datensätze enthält als die Quelle derzeit führt, zurückgehalten und der Lauf als teilweise gemeldet, in der Annahme, dass der Export abgeschnitten war. Setzen Sie dies, wenn die Verringerung tatsächlich zutrifft. Beispiel: true |
Felder im Rumpf
| Name | Typ | Beschreibung |
|---|---|---|
file | binary | Die Nutzlast. Schließt url aus. Beispiel: listings.csv |
Header
| Name | Typ | Beschreibung |
|---|---|---|
Idempotency-Key | string | Verhindert, dass ein wiederholter Upload zweimal verarbeitet wird. Beispiel: a7f3c9e2-4b1d-4e8a-9c2f-1d3b5a7c9e01 |
Rumpf der Anfrage
curl -sS -X POST "https://api.skautik.com/v1/api/imports" \
-H "Authorization: Bearer $SKAUTIK_API_KEY" \
-H "Idempotency-Key: 9c1f-…" \
-F "format=openimmo" \
-F "mode=incremental" \
-F "file=@transfer-2026-08-12.zip"Antwort
{
"data": {
"id": "imp_5a91c0",
"status": "validating",
"format": "openimmo",
"mode": "incremental",
"dry_run": false,
"created_at": "2026-08-12T10:04:00Z"
}
}Bemerkenswerte Antworten
- 202
- Zur Verarbeitung angenommen. Abfragen oder auf import.completed warten.
- 415
- Die Nutzlast entspricht nicht dem angegebenen Format.
- 422
- Die Datei ließ sich lesen, aber kein Datensatz darin war brauchbar.
https://api.skautik.com/v1/api/imports
POST /v1/api/imports?format=csv&mode=incremental&source_id=src_immoscout&dry_run=true HTTP/1.1
Host: api.skautik.com
Authorization: Bearer sk_live_…
Content-Type: application/json
{
"file": "listings.csv"
}/v1/api/imports/{import_id}imports:writeEinen Import abrufen
Fortschritt, Zählungen und eine Zusammenfassung der Änderungen.
Pfadparameter
| Name | Typ | Beschreibung |
|---|---|---|
import_iderforderlich | string | Importkennung. Beispiel: imp_3d9b7e2145 |
Antwort
{
"data": {
"id": "imp_5a91c0",
"status": "completed",
"format": "openimmo",
"mode": "incremental",
"counts": {
"read": 214,
"created": 12,
"updated": 196,
"withdrawn": 3,
"unchanged": 0,
"failed": 3
},
"started_at": "2026-08-12T10:04:02Z",
"finished_at": "2026-08-12T10:05:41Z"
}
}https://api.skautik.com/v1/api/imports/{import_id}
GET /v1/api/imports/imp_3d9b7e2145 HTTP/1.1
Host: api.skautik.com
Authorization: Bearer sk_live_…/v1/api/imports/{import_id}/recordsimports:writeImportdatensätze auflisten
Ergebnis je Datensatz, einschließlich der Gründe für Fehlschläge.
Auf failed filtern ergibt die Arbeitsliste für eine Korrektur. Jeder Eintrag nennt die Quellkennung und die Zeile oder das Element, aus dem er stammt, ein Problem lässt sich also in Ihrem Export finden statt erraten.
Pfadparameter
| Name | Typ | Beschreibung |
|---|---|---|
import_iderforderlich | string | Importkennung. Beispiel: imp_3d9b7e2145 |
Antwort
{
"data": [
{
"external_id": "AG-4471-0812",
"property_id": "prop_8f2a41c9d0",
"outcome": "updated",
"changed": ["price", "status"]
},
{
"external_id": "AG-4471-0904",
"property_id": null,
"outcome": "failed",
"location": "immobilie[17]",
"errors": [
{ "field": "preise.kaufpreis", "code": "missing",
"detail": "A sale listing needs a price." }
]
}
],
"meta": { "has_more": false, "limit": 50 }
}https://api.skautik.com/v1/api/imports/{import_id}/records
GET /v1/api/imports/imp_3d9b7e2145/records HTTP/1.1
Host: api.skautik.com
Authorization: Bearer sk_live_…/v1/api/imports/formatsimports:writeAngenommene Formate und Spalten auflisten
Was ein Import tragen darf: die heute funktionierenden Formate, jede CSV-Spalte und die Grenzen.
Wird aus denselben Tabellen bedient, die der Parser liest, kann also nicht hinter dem zurückbleiben, was tatsächlich angenommen wird. Beim Bau der Anbindung einmal aufzurufen lohnt sich mehr, als die Spaltenliste von dieser Seite abzuschreiben.
Antwort
{
"data": {
"formats": ["blm", "csv", "json", "kyero", "openimmo"],
"csv_columns": [
"address_city", "address_country", "address_district", "address_number",
"address_postal_code", "address_province", "address_street",
"attic_sqm", "balcony_count", "balcony_terrace_sqm", "bathrooms",
"bedrooms", "cellar_sqm", "commission_amount", "commission_note",
"commission_payer", "commission_percent", "condition",
"construction_phase", "construction_type", "currency", "deposit",
"description", "description_fittings", "description_location",
"description_other", "energy_certificate_issued_at",
"energy_certificate_type", "energy_certificate_valid_until",
"energy_co2_emissions", "energy_consumption_kwh", "energy_demand_kwh",
"energy_includes_hot_water", "energy_label", "energy_primary_carrier",
"external_id", "floor", "flooring", "floors_in_building", "garden_sqm",
"half_bathrooms", "has_air_conditioning", "has_alarm_system",
"has_balcony", "has_cellar", "has_fireplace", "has_fitted_kitchen",
"has_garden", "has_guest_toilet", "has_lift", "has_pool", "has_sauna",
"has_solar_panels", "has_terrace", "heating_costs", "heating_type",
"is_barrier_free", "is_furnished", "is_leasehold",
"is_monument_protected", "kitchen_type", "latitude", "living_area_sqm",
"location_precision", "longitude", "office_area_sqm", "other_area_sqm",
"parking_included", "parking_space_count", "parking_type",
"plot_area_sqm", "price", "price_on_request", "price_period",
"property_subtype", "publish_address", "retail_area_sqm",
"service_charges", "status", "storage_area_sqm", "terrace_count",
"title", "total_area_sqm", "total_rent", "total_rooms",
"transaction_type", "type", "usable_area_sqm", "window_glazing",
"year_built", "year_renovated"
],
"limits": {
"max_records": 10000,
"max_bytes": 33554432,
"max_archive_records": 25000,
"max_archive_bytes": 536870912,
"required_field": "external_id"
},
"modes": ["incremental", "full_sync"]
}
}https://api.skautik.com/v1/api/imports/formats
GET /v1/api/imports/formats HTTP/1.1
Host: api.skautik.com
Authorization: Bearer sk_live_…/v1/api/importsimports:writeImporte auflisten
Importverlauf Ihrer Organisation.
https://api.skautik.com/v1/api/imports
GET /v1/api/imports HTTP/1.1
Host: api.skautik.com
Authorization: Bearer sk_live_…/v1/api/import-sourcesimports:writeImportquellen auflisten
Jeder dauerhafte Anschluss, den Ihre Organisation eingerichtet hat.
Zugangsdaten werden nie zurückgegeben. Eine abgeholte Quelle trägt die Anmeldung für Ihren eigenen Server oft in ihrer URL, die URL kommt deshalb ohne Passwort zurück.
Antwort
{
"data": [
{
"id": "src_1d77a0",
"name": "Head office CRM",
"format": "csv",
"delivery": {
"type": "fetch_url",
"url": "https://partner:***@feeds.example.com/stock.csv"
},
"schedule": "0 */4 * * *",
"deletion_policy": "explicit_only",
"active": true,
"last_delivery_at": "2026-08-13T12:00:04Z",
"next_expected_at": "2026-08-13T16:00:00Z",
"created_at": "2026-08-12T10:04:00Z"
}
]
}https://api.skautik.com/v1/api/import-sources
GET /v1/api/import-sources HTTP/1.1
Host: api.skautik.com
Authorization: Bearer sk_live_…/v1/api/import-sourcesimports:writeEine Importquelle anlegen
Ein dauerhafter Anschluss, der nach Plan importiert.
Einmal einrichten und nicht mehr daran denken. Eine Quelle hält Format, Übergabeweg, Feldzuordnung und Löschregel, und jeder Lauf dagegen erzeugt einen Import, den Sie ansehen können.
Felder im Rumpf
| Name | Typ | Beschreibung |
|---|---|---|
nameerforderlich | string | Ihre eigene Bezeichnung für den Anschluss. Beispiel: Nightly listing sync |
formaterforderlich | enum | Format, das diese Quelle liefert. Heute lesen nur csv und json; die übrigen sind im Schema benannt und werden hier abgelehnt, statt in einen Anschluss aufgenommen zu werden, der bei jedem Lauf scheitern würde. csv | json Beispiel: csv |
deliveryerforderlich | object | Wie die Daten ankommen. fetch_url holt nach Plan von einer URL, die Sie uns nennen; api_push heißt, dass Sie uns jede Lieferung senden. SFTP-Ablagen sind im Schema benannt und laufen noch nicht, danach zu fragen wird also abgelehnt, statt mit Zugangsdaten für einen Host beantwortet zu werden, der sie nie annähme. Beispiel: {"url": "https://example.com/hooks/skautik", "compression": "gzip"} |
schedule | string | Wie oft abgeholt wird, bei geholten Quellen. Cron-Ausdruck in UTC. Bei Ablagen und Pushes ohne Wirkung, da diese bei Ankunft laufen. Beispiel: 15 3 * * * |
mapping | object | Feldzuordnung, für Formate, die eine brauchen. Bei OpenImmo und RESO weglassen, die bereits vereinheitlicht sind. Beispiel: {"Objektnummer": "external_id", "Kaufpreis": "price", "Wohnflaeche": "living_area"} |
deletion_policy | enum | explicit_only beachtet ausschließlich Löschmarkierungen. absence_withdraws zieht zusätzlich alles zurück, was in einer vollständigen Lieferung fehlt, und sollte nur dort verwendet werden, wo das Format eine vollständige Aussage über den Bestand ist. explicit_only | absence_withdraws Vorgabe: explicit_onlyBeispiel: explicit_only |
Rumpf der Anfrage
{
"name": "Head office CRM",
"format": "csv",
"delivery": {
"type": "fetch_url",
"url": "https://feeds.example.com/stock.csv"
},
"schedule": "0 */4 * * *",
"deletion_policy": "explicit_only"
}Antwort
{
"data": {
"id": "src_1d77a0",
"name": "Head office CRM",
"format": "csv",
"delivery": {
"type": "fetch_url",
"url": "https://feeds.example.com/stock.csv"
},
"schedule": "0 */4 * * *",
"deletion_policy": "explicit_only",
"active": true,
"next_expected_at": "2026-08-12T12:00:00Z",
"created_at": "2026-08-12T10:04:00Z"
}
}https://api.skautik.com/v1/api/import-sources
POST /v1/api/import-sources HTTP/1.1
Host: api.skautik.com
Authorization: Bearer sk_live_…
Content-Type: application/json
{
"name": "Head office CRM",
"format": "csv",
"delivery": {
"type": "fetch_url",
"url": "https://feeds.example.com/stock.csv"
},
"schedule": "0 */4 * * *",
"deletion_policy": "explicit_only"
}/v1/api/import-sources/{source_id}imports:writeEine Importquelle abrufen
Konfiguration und Zustand der letzten Läufe.
Pfadparameter
| Name | Typ | Beschreibung |
|---|---|---|
source_iderforderlich | string | Quellkennung. Beispiel: src_immoscout |
https://api.skautik.com/v1/api/import-sources/{source_id}
GET /v1/api/import-sources/src_immoscout HTTP/1.1
Host: api.skautik.com
Authorization: Bearer sk_live_…/v1/api/import-sources/{source_id}imports:writeEine Importquelle ändern
Zuordnung, Zeitplan oder Löschregel ändern.
Pfadparameter
| Name | Typ | Beschreibung |
|---|---|---|
source_iderforderlich | string | Quellkennung. Beispiel: src_immoscout |
Rumpf der Anfrage
{
"schedule": "15 3 * * *",
"active": true,
"mapping": {
"Objektnummer": "external_id",
"Kaufpreis": "price"
}
}https://api.skautik.com/v1/api/import-sources/{source_id}
PATCH /v1/api/import-sources/src_immoscout HTTP/1.1
Host: api.skautik.com
Authorization: Bearer sk_live_…
Content-Type: application/json
{
"schedule": "15 3 * * *",
"active": true,
"mapping": {
"Objektnummer": "external_id",
"Kaufpreis": "price"
}
}/v1/api/import-sources/{source_id}imports:writeEine Importquelle löschen
Den Import aus diesem Anschluss beenden.
Eine Quelle zu löschen beendet künftige Läufe. Es zieht die von ihr angelegten Objekte nicht zurück; die bleiben bei Ihrer Organisation, bis Sie sie selbst zurückziehen.
Pfadparameter
| Name | Typ | Beschreibung |
|---|---|---|
source_iderforderlich | string | Quellkennung. Beispiel: src_immoscout |
https://api.skautik.com/v1/api/import-sources/{source_id}
DELETE /v1/api/import-sources/src_immoscout HTTP/1.1
Host: api.skautik.com
Authorization: Bearer sk_live_…