Importaciones
Trae inventario desde el sistema que ya lo tenga. Una importación puntual resuelve una migración; una fuente de importación mantiene un CRM y Skautik acompasados indefinidamente.
/v1/api/importsimports:writeIniciar una importación
Sube un archivo, o indícanos dónde está, y procésalo.
Acepta una subida multipart o una URL que recogemos nosotros. La validación se ejecuta primero y el archivo entero se rechaza si no se puede analizar; las fichas concretas que fallan se informan sin detener al resto, salvo que pidas todo o nada.
Parámetros de consulta
| Nombre | Tipo | Descripción |
|---|---|---|
formatobligatorio | enum | Formato del archivo que se envía. blm | csv | json | kyero | openimmo ejemplo: csv |
mode | enum | El modo incremental actualiza lo que contiene el archivo y deja el resto en paz. Una sincronización completa además retira todo lo que no aparezca en él, y por eso no es el modo por defecto. incremental | full_sync por defecto: incrementalejemplo: incremental |
source_id | string | Fuente de importación a la que pertenece esta transferencia, cuando viene de un conector permanente y no de una subida puntual. ejemplo: src_immoscout |
dry_run | boolean | Analiza e informa de lo que cambiaría sin escribir nada. Vale la pena hacerlo una vez con un mapeo nuevo. ejemplo: true |
filename | string | Nombre original del archivo, registrado en la ejecución para que un fallo se pueda rastrear hasta el archivo que lo causó. ejemplo: transfer-2026-08-12.zip |
confirm_shrink | boolean | Permitir una sincronización completa que retiraría una gran parte de la cartera de la fuente. Sin esto, una entrega con muchos menos registros de los que la fuente tiene actualmente ve sus retiradas retenidas y la ejecución se informa como parcial, suponiendo que la exportación estaba truncada. Actívelo cuando la reducción sea real. ejemplo: true |
Campos del cuerpo
| Nombre | Tipo | Descripción |
|---|---|---|
file | binary | El contenido. Mutuamente excluyente con url. ejemplo: listings.csv |
Cabeceras
| Nombre | Tipo | Descripción |
|---|---|---|
Idempotency-Key | string | Evita que una subida reintentada se procese dos veces. ejemplo: a7f3c9e2-4b1d-4e8a-9c2f-1d3b5a7c9e01 |
Cuerpo de la petición
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"Respuesta
{
"data": {
"id": "imp_5a91c0",
"status": "validating",
"format": "openimmo",
"mode": "incremental",
"dry_run": false,
"created_at": "2026-08-12T10:04:00Z"
}
}Respuestas destacadas
- 202
- Aceptado para su procesamiento. Consulta el estado o espera a import.completed.
- 415
- El contenido no es del formato declarado.
- 422
- El archivo se ha analizado, pero ninguna de sus fichas era utilizable.
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:writeObtener una importación
Progreso, recuentos y un resumen de lo que ha cambiado.
Parámetros de ruta
| Nombre | Tipo | Descripción |
|---|---|---|
import_idobligatorio | string | Identificador de la importación. ejemplo: imp_3d9b7e2145 |
Respuesta
{
"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:writeListar las fichas de una importación
Resultado ficha por ficha, incluido por qué han fallado las que hayan fallado.
Filtra por failed para obtener la lista de trabajo de una corrección. Cada entrada indica el identificador de origen y la línea o el elemento del que venía, así que un problema se puede localizar en tu exportación en lugar de adivinarlo.
Parámetros de ruta
| Nombre | Tipo | Descripción |
|---|---|---|
import_idobligatorio | string | Identificador de la importación. ejemplo: imp_3d9b7e2145 |
Respuesta
{
"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:writeListar formatos y columnas admitidos
Qué puede llevar una importación: los formatos que funcionan hoy, todas las columnas CSV y los límites.
Se sirve desde las mismas tablas que lee el analizador, así que no puede quedarse por detrás de lo que realmente se acepta. Vale la pena llamarlo una vez al construir la integración, en lugar de transcribir la lista de columnas de esta página.
Respuesta
{
"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:writeListar importaciones
Historial de importaciones de tu organización.
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:writeListar fuentes de importación
Todos los conectores permanentes que ha configurado tu organización.
Nunca se devuelven credenciales. Una fuente de tipo recogida suele llevar en su URL las credenciales de tu propio servidor, así que la URL vuelve con la contraseña eliminada.
Respuesta
{
"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:writeCrear una fuente de importación
Un conector permanente que importa de forma programada.
Se configura una vez y dejas de pensar en él. Una fuente contiene el formato, el método de entrega, el mapeo de campos y la política de borrado, y cada pasada sobre ella produce una importación que puedes inspeccionar.
Campos del cuerpo
| Nombre | Tipo | Descripción |
|---|---|---|
nameobligatorio | string | Tu propia etiqueta para el conector. ejemplo: Nightly listing sync |
formatobligatorio | enum | Formato que entrega esta fuente. Hoy solo se analizan csv y json; los demás aparecen nombrados en el esquema y se rechazan aquí, en lugar de aceptarse en un conector que fallaría en cada pasada. csv | json ejemplo: csv |
deliveryobligatorio | object | Cómo llegan los datos. fetch_url recoge de una URL que nos indicas de forma programada; api_push significa que nos envías tú cada entrega. Las entregas por SFTP aparecen nombradas en el esquema y todavía no funcionan, así que pedir una se rechaza en lugar de responderse con credenciales para un servidor que nunca las aceptaría. ejemplo: {"url": "https://example.com/hooks/skautik", "compression": "gzip"} |
schedule | string | Cada cuánto recoger, para las fuentes de tipo recogida. Expresión cron en UTC. Se ignora para entregas y envíos, que se ejecutan al llegar. ejemplo: 15 3 * * * |
mapping | object | Mapeo de campos, para los formatos que lo necesitan. Omítelo para OpenImmo y RESO, que ya están estandarizados. ejemplo: {"Objektnummer": "external_id", "Kaufpreis": "price", "Wohnflaeche": "living_area"} |
deletion_policy | enum | explicit_only respeta únicamente las marcas de borrado. absence_withdraws además retira todo lo que falte en una entrega completa, y solo debería usarse cuando el formato sea una declaración completa del stock. explicit_only | absence_withdraws por defecto: explicit_onlyejemplo: explicit_only |
Cuerpo de la petición
{
"name": "Head office CRM",
"format": "csv",
"delivery": {
"type": "fetch_url",
"url": "https://feeds.example.com/stock.csv"
},
"schedule": "0 */4 * * *",
"deletion_policy": "explicit_only"
}Respuesta
{
"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:writeObtener una fuente de importación
Configuración y salud de las pasadas recientes.
Parámetros de ruta
| Nombre | Tipo | Descripción |
|---|---|---|
source_idobligatorio | string | Identificador de la fuente. ejemplo: 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:writeActualizar una fuente de importación
Cambia el mapeo, la programación o la política de borrado.
Parámetros de ruta
| Nombre | Tipo | Descripción |
|---|---|---|
source_idobligatorio | string | Identificador de la fuente. ejemplo: src_immoscout |
Cuerpo de la petición
{
"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:writeEliminar una fuente de importación
Deja de importar desde este conector.
Eliminar una fuente detiene las pasadas futuras. No retira los inmuebles que creó, que siguen bajo tu organización hasta que los retires tú.
Parámetros de ruta
| Nombre | Tipo | Descripción |
|---|---|---|
source_idobligatorio | string | Identificador de la fuente. ejemplo: 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_…