Exportación y fin del servicio
Todo lo de un titular, o de la cuenta entera, en un ZIP. Y cómo cerrar con un titular o con Kinapi sin dejar a nadie sin sus registros.
Por qué existe
El titular de un alojamiento debe conservar los partes de viajeros tres años desde el fin de la estancia (art. 5.3 del RD 933/2021). Cuando dejas de gestionar a un propietario, o cierras tu cuenta de Kinapi, ese titular tiene que poder llevárselo todo: los partes firmados, la constancia de que se comunicaron, los contratos y la evidencia de cada firma. La exportación lo reúne en un ZIP, por titular, por propiedades o de toda la cuenta.
Pedir una exportación
/exports| Campo | Tipo | Descripción |
|---|---|---|
ownerId | string | Las reservas de todas las propiedades de este propietario (id de /owners), también las de sus propiedades desactivadas y las que llegaron con un id de canal (channelListingIds). No se combina con listingIds. |
listingIds | string[] | O las reservas de estas propiedades (listingId). |
from | AAAA-MM-DD | Llegada desde (inclusive). |
to | AAAA-MM-DD | Llegada hasta (inclusive). |
Un cuerpo vacío exporta todas las reservas de la cuenta. El máximo son 3000 reservas por exportación; por encima, la exportación falla con el motivo en error y hay que partirla por fechas.
curl -X POST https://api.kinapi.es/api/v1/exports \
-H "ocp-apim-subscription-key: TU_API_KEY" \
-H "content-type: application/json" \
-d '{ "ownerId": "a1b2c3d4-…" }'Responde 202 en el acto con el objeto exportación en pending. El ZIP se genera en segundo plano: cada reserva son varios PDF que se crean en ese momento.
{
"id": "3f6c1e2a-…",
"status": "pending",
"description": "Propietario Gestora Costa SL",
"scope": { "ownerId": "a1b2c3d4-…", "listingIds": null, "from": null, "to": null },
"requestedBy": "api",
"createdAt": "2026-10-14T09:00:00.000Z",
"finishedAt": null,
"expiresAt": null,
"bookings": null,
"files": null,
"bytes": null,
"error": null
}El objeto exportación
| Campo | Tipo | Descripción |
|---|---|---|
id | string | Id de la exportación. |
status | string | pending, processing, ready, failed o expired (tabla de abajo). |
description | string | Qué se exporta, en castellano: «Propietario Gestora Costa SL, llegadas del 01/01/2025 al 31/12/2025». |
scope | objeto | { ownerId, listingIds, from, to } tal como se pidió; null lo que no se filtró. |
requestedBy | string | El correo del usuario del panel que la pidió, o api. |
createdAt | ISO 8601 | Cuándo se pidió. |
finishedAt | ISO 8601 | null | Cuándo terminó, lista o fallida. |
expiresAt | ISO 8601 | null | Hasta cuándo se puede descargar el ZIP. |
bookings | integer | null | Reservas incluidas, cuando está lista. |
files | integer | null | Ficheros dentro del ZIP, cuando está lista. |
bytes | integer | null | Tamaño del ZIP, cuando está lista. |
error | string | null | Por qué falló, en castellano. |
| Campo | Tipo | Descripción |
|---|---|---|
pending | estado | Pedida, en cola. |
processing | estado | Generándose. |
ready | estado | Lista: se descarga en …/download hasta expiresAt. |
failed | estado | No se pudo generar; error dice por qué. Pide otra. |
expired | estado | El ZIP se borró siete días después de estar listo. Pide otra. |
Saber cuándo está lista
Sin polling: al terminar, Kinapi emite el webhook export.ready o export.failed (ver Webhooks). Si no usas webhooks, consulta GET /exports/{id} cada pocos minutos.
{
"event": "export.ready",
"timestamp": "2026-10-14T09:03:12.000Z",
"livemode": true,
"data": {
"exportId": "3f6c1e2a-…",
"description": "Propietario Gestora Costa SL",
"bookings": 412,
"bytes": 184503112,
"expiresAt": "2026-10-21T09:03:12.000Z"
}
}export.failed lleva exportId, description y error.
Listar y consultar exportaciones
/exportsLas exportaciones de la cuenta, la más reciente primero (hasta 50), en results. Cada una se guarda 30 días; el ZIP, solo siete.
/exports/{id}El objeto exportación, con su estado actual.
Descargar el ZIP
/exports/{id}/downloadcurl -OJ https://api.kinapi.es/api/v1/exports/3f6c1e2a-…/download \ -H "ocp-apim-subscription-key: TU_API_KEY"
| Campo | Tipo | Descripción |
|---|---|---|
200 | application/zip | El ZIP, en streaming, con content-disposition kinapi-registros-<fecha>-<id>.zip. |
409 not_ready | error | Todavía se está generando, o falló (details lleva el motivo). |
410 expired | error | El ZIP ya se borró: caduca siete días después de estar listo. Pide otra exportación. |
404 | error | No hay ninguna exportación con ese id en tu cuenta. |
Qué hay en el ZIP
LEEME.txt
reservas.csv
huespedes.csv
comunicaciones-ses.csv
reservas/
2026-08-14_R-2026-0412/
reserva.json
partes/parte-1.pdf
partes/parte-2.pdf
justificante-ses.pdf
contrato.pdf
evidencia/<id>.json
evidencia/<id>.tsr| Campo | Tipo | Descripción |
|---|---|---|
LEEME.txt | texto | Qué contiene el ZIP, cómo verificar un sello de tiempo y cuánto tiempo conservarlo. |
reservas.csv | csv | Una fila por reserva: alojamiento, código de establecimiento, titular y su NIF, entrada, salida, viajeros, estado, fecha de firma del contrato y la carpeta con sus documentos. |
huespedes.csv | csv | Una fila por viajero, con los datos del parte. |
comunicaciones-ses.csv | csv | Una fila por viajero y envío a SES.HOSPEDAJES: lote, entorno, fecha, resultado, código de comunicación o error, y la anulación si la hubo. |
reserva.json | json | La reserva, sus huéspedes, sus envíos a SES y la evidencia de firma, exactamente como los devuelve la API. |
partes/parte-N.pdf | El parte de cada viajero, con su firma. Es el documento que hay que conservar tres años y exhibir si lo piden. | |
justificante-ses.pdf | El justificante de comunicación de la reserva (ver SES Hospedajes), cuando hubo algún envío. | |
contrato.pdf | El contrato firmado con su página de evidencias, cuando lo hay. | |
evidencia/<id>.json · .tsr | json · tsr | Por cada contrato firmado, el registro de evidencia y su sello de tiempo RFC 3161. |
Cada reserva tiene su carpeta en reservas/<llegada>_<reservationId>/. Los CSV van separados por punto y coma y con BOM, que es lo que abre bien Excel en castellano, y están protegidos contra la inyección de fórmulas: una celda que empieza por =, +, - o @ lleva un apóstrofo delante.
El sello de tiempo se verifica sin depender de Kinapi, con OpenSSL (más detalle en Contratos):
cd reservas/2026-08-14_R-2026-0412 openssl ts -verify -digest $(shasum -a 256 contrato.pdf | cut -d' ' -f1) \ -in evidencia/EVIDENCE_ID.tsr -CAfile /etc/ssl/cert.pem
El ZIP contiene datos personales de los viajeros. Guárdalo con las medidas que exige el RGPD, entrégalo solo al titular y elimínalo cuando venza su plazo de conservación.
Desde el panel
En Configuración → Exportar datos eliges toda la cuenta o un propietario, y opcionalmente un rango de llegadas; la página se actualiza sola mientras se genera. En Propietarios, el icono de descarga de cada fila abre esa misma página con el titular ya elegido. Las exportaciones del panel y las de la API son las mismas: salen en los dos listados.
Dar de baja a un titular
Cuando dejas de gestionar a un propietario, en Propietarios pulsa Dar de baja al titular (el icono de su fila). Es un asistente del panel —no hay endpoint— con cuatro pasos. Cada uno se puede hacer por separado, pero en este orden:
- Cancelar sus reservas futuras (llegada de hoy en adelante). Si no, Kinapi seguiría invitando a esos huéspedes y comunicando sus partes. Cancelar anula ante el Ministerio lo que ya se hubiera comunicado.
- Generar su exportación, para entregársela. Incluye sus propiedades desactivadas.
- Desactivar sus propiedades. Las que no tienen ninguna reserva se borran; las demás conservan su historial.
- Suprimir sus datos. Exige el paso 1 hecho y escribir
SUPRIMIR. Se borran los datos personales de todas sus estancias —huéspedes, firmas, contratos y huésped principal— y la ficha del propietario.
Lo que la ley obliga a conservar —los partes de los últimos tres años— no se borra en el paso 4: queda bloqueado fuera de tu cuenta, sin acceso desde el panel ni la API, y se borra solo al cumplir sus tres años. Las reservas siguen apareciendo anonimizadas, para que tus listados y tu facturación cuadren: el check-in lleva entonces anonymizedAt y ya no tiene huéspedes, huésped principal ni ficheros. Una reserva cuyo parte está en camino al Ministerio se salta y se suprime en un intento posterior, cuando se haya confirmado.
El paso 4 no se puede deshacer. Exporta antes y comprueba que el titular tiene su copia.
Por API puedes preparar los pasos 1 y 2: GET /checkins?ownerId=…&from=AAAA-MM-DD lista sus reservas (también las de propiedades desactivadas), DELETE /checkins/{reservationId} cancela cada una (o la borra, si no dejó nada que conservar), y POST /exports con ownerId genera su ZIP.
Baja de la cuenta
Se pide en Configuración → Cuenta → Pedir la baja de la cuenta, y solo puede hacerlo un administrador. La cuenta se cierra en el acto y empieza un periodo de gracia de 30 días:
- No se comunican partes al Ministerio.
- Los huéspedes no reciben correos y sus enlaces de registro dejan de funcionar.
- La API responde
403 account_closingen todos los endpoints salvo/exports: puedes seguir sacando tus registros por API. - El panel solo muestra la pantalla de baja: reactivar la cuenta con un clic, o exportar los registros.
{
"error": "account_closing",
"details": "La baja de la cuenta está pedida y se hará efectiva el 2026-11-13. Hasta entonces la API solo permite exportar los registros (/exports); para volver a usarla, reactiva la cuenta desde el panel.",
"effectiveAt": "2026-11-13T09:00:00.000Z"
}Si reactivas dentro de esos 30 días, todo vuelve a funcionar sin haber perdido nada. Al vencer, la baja se ejecuta:
- Los partes de las estancias de los últimos tres años se conservan bloqueados —sin acceso de nadie, salvo requerimiento de una autoridad competente— y se borran al cumplir su plazo.
- Los contratos firmados y sus sellos de tiempo siguen tres años en el almacenamiento inmutable donde se archivaron.
- Todo lo demás se borra.
Antes de pedir la baja, exporta toda la cuenta (POST /exports con el cuerpo vacío). Durante el periodo de gracia también se puede, pero tras la baja definitiva nadie tendrá acceso a esos registros, ni tú ni el titular.
Qué caduca mientras la cuenta está activa
Kinapi no borra por su cuenta ningún registro de viajeros: los partes, contratos y justificantes siguen ahí mientras tengas la cuenta. Solo caduca esto:
| Campo | Tipo | Descripción |
|---|---|---|
Enlace de registro del huésped | 14 días | Desde la fecha de salida. Después responde 410; los datos que se registraron siguen en la reserva. |
Registro de entregas de webhooks | 30 días | El historial de intentos que ves en Configuración → Webhooks. |
ZIP de una exportación | 7 días | Desde que está lista. La ficha de la exportación se ve 30 días. |