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

POST/exports
Body (todo opcional)
CampoTipoDescripción
ownerIdstringLas 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.
listingIdsstring[]O las reservas de estas propiedades (listingId).
fromAAAA-MM-DDLlegada desde (inclusive).
toAAAA-MM-DDLlegada 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 — todo lo de un propietario
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.

202 Accepted
{
  "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

Campos
CampoTipoDescripción
idstringId de la exportación.
statusstringpending, processing, ready, failed o expired (tabla de abajo).
descriptionstringQué se exporta, en castellano: «Propietario Gestora Costa SL, llegadas del 01/01/2025 al 31/12/2025».
scopeobjeto{ ownerId, listingIds, from, to } tal como se pidió; null lo que no se filtró.
requestedBystringEl correo del usuario del panel que la pidió, o api.
createdAtISO 8601Cuándo se pidió.
finishedAtISO 8601 | nullCuándo terminó, lista o fallida.
expiresAtISO 8601 | nullHasta cuándo se puede descargar el ZIP.
bookingsinteger | nullReservas incluidas, cuando está lista.
filesinteger | nullFicheros dentro del ZIP, cuando está lista.
bytesinteger | nullTamaño del ZIP, cuando está lista.
errorstring | nullPor qué falló, en castellano.
Estados (status)
CampoTipoDescripción
pendingestadoPedida, en cola.
processingestadoGenerándose.
readyestadoLista: se descarga en …/download hasta expiresAt.
failedestadoNo se pudo generar; error dice por qué. Pide otra.
expiredestadoEl 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.

POST a tu URL — export.ready
{
  "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

GET/exports

Las exportaciones de la cuenta, la más reciente primero (hasta 50), en results. Cada una se guarda 30 días; el ZIP, solo siete.

GET/exports/{id}

El objeto exportación, con su estado actual.

Descargar el ZIP

GET/exports/{id}/download
curl
curl -OJ https://api.kinapi.es/api/v1/exports/3f6c1e2a-…/download \
  -H "ocp-apim-subscription-key: TU_API_KEY"
Respuestas
CampoTipoDescripción
200application/zipEl ZIP, en streaming, con content-disposition kinapi-registros-<fecha>-<id>.zip.
409 not_readyerrorTodavía se está generando, o falló (details lleva el motivo).
410 expirederrorEl ZIP ya se borró: caduca siete días después de estar listo. Pide otra exportación.
404errorNo hay ninguna exportación con ese id en tu cuenta.

Qué hay en el ZIP

Estructura
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
Ficheros
CampoTipoDescripción
LEEME.txttextoQué contiene el ZIP, cómo verificar un sello de tiempo y cuánto tiempo conservarlo.
reservas.csvcsvUna 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.csvcsvUna fila por viajero, con los datos del parte.
comunicaciones-ses.csvcsvUna 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.jsonjsonLa reserva, sus huéspedes, sus envíos a SES y la evidencia de firma, exactamente como los devuelve la API.
partes/parte-N.pdfpdfEl parte de cada viajero, con su firma. Es el documento que hay que conservar tres años y exhibir si lo piden.
justificante-ses.pdfpdfEl justificante de comunicación de la reserva (ver SES Hospedajes), cuando hubo algún envío.
contrato.pdfpdfEl contrato firmado con su página de evidencias, cuando lo hay.
evidencia/<id>.json · .tsrjson · tsrPor 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):

Verificar un sello del ZIP
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:

  1. 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.
  2. Generar su exportación, para entregársela. Incluye sus propiedades desactivadas.
  3. Desactivar sus propiedades. Las que no tienen ninguna reserva se borran; las demás conservan su historial.
  4. 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_closing en 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.
403 Forbidden — baja pedida
{
  "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:

CampoTipoDescripción
Enlace de registro del huésped14 díasDesde la fecha de salida. Después responde 410; los datos que se registraron siguen en la reserva.
Registro de entregas de webhooks30 díasEl historial de intentos que ves en Configuración → Webhooks.
ZIP de una exportación7 díasDesde que está lista. La ficha de la exportación se ve 30 días.