Desarrolladores

Servidor MCP y API de Keyio

Keyio tiene un servidor MCP: conecta Claude, ChatGPT, Cursor, VS Code o cualquier asistente compatible con MCP a tu cuenta y pregúntale por tus alquileres, apunta gastos y facturas, registra cobros de renta, abre incidencias de mantenimiento o prepara el registro de viajeros hablando. O usa la API REST para integrar Keyio con tus propias herramientas. Incluido en todos los planes.

¿No eres técnico? Mira qué puedes hacer con tu asistente de IA →

Conectar tu asistente de IA

Keyio es un servidor MCP remoto (Streamable HTTP) con inicio de sesión OAuth: el asistente descubre solo cómo autenticarse, tú inicias sesión en Keyio y eliges qué puede hacer. No hay que instalar nada ni copiar ninguna clave. La dirección es siempre la misma:

https://gokeyio.com/api/mcp

Claude (web, Desktop y móvil)

  1. En Claude, abre Personalizar → Conectores y pulsa «Añadir conector personalizado».
  2. Ponle de nombre «Keyio», pega la dirección de arriba y pulsa Añadir.
  3. Pulsa Conectar. Se abre Keyio: inicia sesión, elige si Claude solo puede consultar o también hacer cambios, y pulsa Permitir.

En un plan Team o Enterprise de Claude, un propietario de la organización añade el conector una vez en Ajustes de la organización → Conectores, y cada persona pulsa Conectar con su propia cuenta de Keyio.

Otros asistentes y editores

ChatGPT. Con el modo desarrollador activado (planes de pago): Ajustes → Aplicaciones y conectores → crear un conector con la dirección de Keyio y autenticación OAuth.

Claude Code. En el terminal, y después /mcp para iniciar sesión:

claude mcp add --transport http keyio https://gokeyio.com/api/mcp

Cursor. En Ajustes → Tools & MCP, o en ~/.cursor/mcp.json:

{ "mcpServers": { "keyio": { "url": "https://gokeyio.com/api/mcp" } } }

VS Code (GitHub Copilot). En .vscode/mcp.json o con «MCP: Add Server»:

{ "servers": { "keyio": { "type": "http", "url": "https://gokeyio.com/api/mcp" } } }

Cualquier otro cliente MCP. Añade un servidor remoto con la dirección de Keyio. Si el cliente sigue la especificación de autorización de MCP (OAuth 2.1 con registro dinámico de clientes), el inicio de sesión funciona igual.

Los menús cambian con cada versión de estas aplicaciones; si no encuentras la opción, busca «MCP» o «conector» en sus ajustes. Al conectar se abre Keyio para que inicies sesión y des permiso.

Solo lectura

El asistente consulta viviendas, alquileres, gastos y facturas, cobros, documentos, mantenimiento, informes fiscales y plantillas. No cambia nada ni ve los datos de tus huéspedes.

Lectura y escritura

Además crea, modifica y borra datos, ve y edita huéspedes y presenta el registro de viajeros ante SES.

Puedes pedirle

  • “¿Qué pisos tengo sin reservas el mes que viene?”
  • “Apunta una factura de agua de 120 € en Calle Mayor 3, con fecha de hoy.”
  • “Añade los huéspedes de la reserva que empieza el viernes.”
  • “Envía a SES el registro de esa reserva.”
  • “Archiva las facturas que tengo en el buzón de facturas.”
  • “Apunta que el inquilino de Calle Mayor 3 ha pagado la renta de octubre por transferencia.”
  • “¿Cuánto he ganado este año con mis alquileres, vivienda por vivienda?”
  • Presentar el registro ante SES es real y no se puede deshacer. El asistente solo lo hace cuando se lo pides, y solo en viviendas donde hayas activado el envío automático a SES en la app.
  • Las credenciales de SES no se pueden poner desde el asistente, para que tu contraseña nunca pase por un chat.
  • En claude.ai, Claude no puede pasar a Keyio un archivo que adjuntas en el chat. Para meter una factura, reenvíala al buzón de facturas de tu cuenta y pídele que la archive; en Claude Desktop o Claude Code sí puede adjuntar un archivo de tu ordenador.
  • Lo desconectas cuando quieras en Ajustes → Desarrollador → Aplicaciones conectadas; deja de tener acceso en su siguiente petición.

Si el cliente admite cabeceras, también puedes usar una clave de API de Ajustes → Desarrollador en lugar de OAuth:

claude mcp add --transport http keyio https://gokeyio.com/api/mcp \
  --header "Authorization: Bearer kk_live_…"

Primeros pasos

  1. En Keyio, abre Ajustes → Desarrollador y crea una clave. Elige solo lectura salvo que tu programa tenga que hacer cambios. La clave se muestra una vez: guárdala como una contraseña.
  2. Envíala en cada petición en la cabecera Authorization.
curl https://gokeyio.com/api/v1/properties \
  -H "Authorization: Bearer kk_live_…"
  • URL base: https://gokeyio.com/api/v1
  • Peticiones y respuestas en JSON (Content-Type: application/json cuando hay cuerpo).
  • Fechas ISO YYYY-MM-DD. Importes en euros, como números.

Autenticación

Cada petición lleva Authorization: Bearer …. Hay dos maneras de conseguirlo:

Clave de API

Para tus propios scripts e integraciones. No caduca; la revocas en Ajustes → Desarrollador y deja de funcionar en la siguiente petición.

OAuth 2.1

Para una aplicación que se conecta en tu nombre, como Claude o ChatGPT. La aplicación te manda a Keyio, inicias sesión y eliges qué puede hacer; recibe un token de una hora que se renueva solo. Keyio sigue la especificación de autorización de MCP (2025-06-18).

Metadatos del recursohttps://gokeyio.com/.well-known/oauth-protected-resource/api/mcp
Metadatos del servidorhttps://gokeyio.com/.well-known/oauth-authorization-server
Registro de clientePOST https://gokeyio.com/api/oauth/register
Autorizaciónhttps://gokeyio.com/auth/oauth/authorize
TokenPOST https://gokeyio.com/api/oauth/token
RevocaciónPOST https://gokeyio.com/api/oauth/revoke
  • Solo clientes públicos (token_endpoint_auth_method: none), con PKCE S256 obligatorio.
  • Direcciones de vuelta https, o http en la interfaz local (localhost, 127.0.0.1) con cualquier puerto.
  • Los tokens de renovación rotan en cada uso y duran 90 días. Presentar uno ya usado revoca la conexión entera.
  • Ámbitos: keyio:read y keyio:write (incluye lectura). El usuario puede conceder menos de lo pedido.

Lectura (keyio:read)

Todos los GET, salvo los datos de huéspedes.

Lectura y escritura (keyio:write)

Todo: crear, modificar, borrar, huéspedes y presentar el registro ante SES.

Una clave o un token nunca da más acceso que el inicio de sesión de su dueño, y deja de funcionar si la cuenta se suspende o se borra.

Permisos

Eres…LeerAlquileres, gastos y huéspedesCambiar o borrar la vivienda
Propietario de la vivienda
Editor (compartida contigo)
Lector o colaborador de calendario

Los gastos (con sus facturas, los recurrentes y el buzón) necesitan un plan con gastos y las plantillas uno con contratos (todos salvo Cumplimiento); los cobros, el mantenimiento y los informes, un plan con esa función. Si no, la API responde 403. Las plantillas son solo tuyas y nunca se comparten.

Límites, páginas y errores

LímitePor minutoPor día
Todas las peticiones, por clave602.000
Escrituras y lecturas de huéspedes, por clave60500
Por dirección IP300—

Una escritura cuenta en los dos límites por clave. Por encima, la API responde 429 hasta que pasa la ventana. Los límites diarios son exactos; los de minuto se cuentan por servidor y son aproximados.

Cada listado (salvo huéspedes) devuelve una página: { "rentals": [...], "nextCursor": "…" }. Usa limit (1–200, 100 por defecto) y cursor con el nextCursor anterior; es null en la última página. Un cursor que ya no existe es un 400: vuelve a empezar.

En un PATCH, un objeto (sale, touristTax, energyCertificate…) se fusiona campo a campo con el guardado: lo que no envías se conserva. Una lista (owners, budgetLines, lines…) se sustituye entera. La respuesta es el registro tal como queda guardado.

Los archivos (facturas, documentos, fotos) van dentro del JSON: { "fileName": "factura.pdf", "mimeType": "application/pdf", "contentBase64": "…" }, hasta 10 MB; el tipo se comprueba por el contenido. Al leer uno recibes fileName, mimeType, size y un downloadUrl firmado que dura 15 minutos; con ?content=true, también contentBase64 (hasta 5 MB). Si el cliente no puede enviar el archivo, POST /upload-links (expenseId, propertyId o rentalId con document.name, o inbox: true) devuelve un enlace de un solo uso, 30 minutos y sin iniciar sesión, para que lo elijas desde el móvil.

400Cuerpo o parámetros no válidos. Incluye fieldErrors. Campos y parámetros desconocidos se rechazan. Un PATCH vacío también.
401Falta la clave o el token, no es válido, está revocado o caducado, o la cuenta está suspendida.
403Clave de solo lectura en una escritura, plan sin esa función, límite del plan alcanzado, o solo su autor puede borrar ese registro.
404No existe o no es tuyo; a propósito no se distingue.
409Choca con el estado del registro (ver cada recurso).
410/assets se retiró: { "error": "deprecated", "message": "…" }.
422Bien formada pero no se puede hacer (registro de viajeros).
429Límite superado.
500Error nuestro. Puedes repetir un GET; en una escritura, comprueba antes si se aplicó.
502SES no aceptó, o no respondió con claridad, un registro de viajeros.
{ "error": "Validation failed", "fieldErrors": { "date": ["Must be an ISO date (YYYY-MM-DD)"] } }

El orden de las comprobaciones: límite por IP → clave → límites por clave → clave de solo lectura → límite de escritura → plan → cuerpo → acceso al registro → estado del registro. Gana la primera que falla.

Referencia

Rutas relativas a https://gokeyio.com/api/v1. En negrita y con *, obligatorio al crear.

Viviendas

RutaPermisoRespuestas
GET/propertieslectura200 { properties, nextCursor }
GET/properties/{id}lectura200 { property } · 404
POST/propertieslectura y escritura201 { property } · 400 · 403
PATCH/properties/{id}lectura y escritura · propietario200 { property } · 400 · 404
DELETE/properties/{id}lectura y escritura · propietario200 · 404 · 409

Campos que puedes enviar

name *address *cadastralRef *cadastralValue *landValue *acquisitionDate *cadastralValueRevisedconstructionValueacquisitionCostsurfaceAreamainPurposesaletaxRegimenonResidentEUpaymentTrackingEnabledregistrationNumberarchivedcalendarEnabledcitycountrystateRegionamortizationStrategyenergyCertificatetouristTaxdefaultExtrascommunicationsbankAccountownersrepresentativesesCredentials
  • mainPurpose: long_term, short_term o sale (comprada para vender). sale es el seguimiento de compra-venta: etapa, precio objetivo, presupuesto por partidas, financiación, escrituras, plusvalía municipal y precio y fecha de venta.
  • taxRegime: es-individual, es-company o es-nonresident (con nonResidentEU si el propietario reside en la UE/EEE). paymentTrackingEnabled activa el seguimiento de cobros de los alquileres de la vivienda; hace falta para registrar cobros.
  • Nunca se devuelven las credenciales de SES, Mossos o Ertzaintza, los enlaces de calendario ni la configuración de compartir. El IBAN y los DNI de propietarios y representante solo los ven el propietario y los editores.
  • El envío automático a SES (sesAutoSend) y el compartir solo se cambian en la app. Crear respeta el límite de viviendas del plan (403).
  • Borrar se rechaza con 409 mientras haya alquileres o gastos; borra también sus documentos y el historial de checklists. No se puede deshacer.

Alquileres

RutaPermisoRespuestas
GET/rentalslectura200 { rentals, nextCursor }
GET/rentals/{id}lectura200 { rental } · 404
POST/rentalslectura y escritura · propietario o editor201 { rental } · 400 · 404 · 409
PATCH/rentals/{id}lectura y escritura · propietario o editor200 { rental } · 400 · 404
DELETE/rentals/{id}lectura y escritura · propietario o editor200 · 404

Filtros del listado

  • propertyId — Solo los de esa vivienda (404 si no es tuya).
  • type — long o short.
  • from, to — Estancias que se solapan con ese rango.

Campos que puedes enviar

propertyId *startDate *contractStartDate *yearlyIncome *nameendDatetyperenterNamerenterAddressrenterscheckInTimecheckOutTimeadvancedPaymentremainingBalancepaymentPlanextrasdiscountAmountdiscountReasondiscountNoteextraChargesyearcontractCommissionscommissionTypedepositadjustmentsvariationsdepositEntriespaymentTrackingEnabled
  • renters acepta id, fullName, idNumber, address, phone y email, pero solo devuelve id y fullName. En un PATCH, un inquilino con id conocido conserva lo que no envías; una cadena vacía borra el campo; uno que falta en la lista se quita. renterAddress no se devuelve (es un domicilio).
  • Crear en una vivienda vendida da 409. propertyId no se puede cambiar.
  • Borrar elimina también pagos, notas, documentos y enlaces de firma, revoca el código de la cerradura y, si era una reserva vasca ya comunicada, deja el aviso de anularla en la Ertzaintza.

Gastos

Necesita un plan con gastos.

RutaPermisoRespuestas
GET/expenseslectura200 { expenses, nextCursor }
GET/expenses/{id}lectura200 { expense } · 404
POST/expenseslectura y escritura · propietario o editor201 { expense } · 400 · 404
PATCH/expenses/{id}lectura y escritura · propietario o editor200 { expense } · 400 · 404
DELETE/expenses/{id}lectura y escritura · propietario o editor200 · 404
GET/expenses/{id}/filelectura200 { file } · 404
PUT/expenses/{id}/filelectura y escritura · propietario o editor200 { expense } · 400 · 404
DELETE/expenses/{id}/filelectura y escritura · propietario o editor200 · 404
GET/recurring-expenseslectura200 { recurringExpenses, nextCursor }
PATCH/recurring-expenses/{id}lectura y escritura · propietario200 { recurringExpense } · 400 · 404
DELETE/recurring-expenses/{id}lectura y escritura · propietario200 · 404

Filtros del listado

  • propertyId — Solo los de esa vivienda.
  • year — Ejercicio, cuatro cifras.

Campos que puedes enviar

propertyId *type *amount *date *year *descriptionissuerNameissuerIdamortizationTypeamortizationDurationamortizationRaterepairCausedByTenantexclusiveToRentaloperationCategorybudgetLineIdinvoiceNumbertaxBasevatAmountuntaxedAmountwithholdingAmountlinesdueDaterecurrencefile
  • type es texto libre, pero usa una categoría de la app para que cuente en el informe fiscal: Seguro, Comunidad, Impuestos, Suministros, Conservación, Reparaciones, Mobiliario, Electrodomésticos, Intereses de Hipoteca, Formalización Contrato, Defensa Jurídica, Servicios Personales, Otros. IBI se guarda como Impuestos.
  • Un activo fijo (mueble, electrodoméstico) es un gasto Mobiliario o Electrodomésticos con amortizationType "investment". Las antiguas rutas /assets responden 410.
  • Desglose (sociedades): amount debería ser taxBase + vatAmount + untaxedAmount; la retención es informativa. La API guarda lo que envías sin comprobar las sumas. payment (lo pagado según la conciliación bancaria) es de solo lectura.
  • recurrence (solo al crear): { frequency: monthly | quarterly | yearly, nextDueDate, endDate }. Crea los periodos ya vencidos hasta hoy (120 como mucho) y un gasto recurrente que se copia cada día que toca; la respuesta añade recurring: { recurringExpenseId, backfilled, nextDueDate }. El gasto no guarda la recurrencia y un PATCH no la acepta (400): cámbiala o detenla en /recurring-expenses.
  • file (al crear) o PUT /expenses/{id}/file adjuntan la factura: PDF, JPEG, PNG, WebP o GIF; sustituir borra la anterior. DELETE del archivo deja el gasto.
  • /recurring-expenses: solo los tuyos (filtro propertyId). PATCH acepta type, description, issuerName, issuerId, frequency, nextDueDate, lastAmount, endDate (null la quita), active y operationCategory. DELETE deja de repetirlo; los gastos ya creados se quedan.

Buzón de facturas

Necesita un plan con gastos. Es del titular de la cuenta: las facturas que subes sin vivienda o reenvías por email esperan aquí hasta archivarlas como gasto.

RutaPermisoRespuestas
GET/inboxlectura200 { mailbox, items, nextCursor }
PUT/inbox/mailboxlectura y escritura · propietario200 { mailbox } · 409
GET/inbox/{id}lectura200 { item, file } · 404
POST/inbox/{id}/filelectura y escritura · propietario201 | 200 { expense } · 400 · 404 · 409
DELETE/inbox/{id}lectura y escritura · propietario200 · 404

Campos que puedes enviar

expenseIdexpenseallowedSenders
  • GET /inbox devuelve las facturas de la más antigua a la más nueva y el buzón: { available, address, accountEmail, allowedSenders }. PUT /inbox/mailbox lo activa (siempre la misma dirección) y acepta allowedSenders; 409 si el buzón no está disponible.
  • POST /inbox/{id}/file lleva uno de los dos: expenseId (adjunta la factura a ese gasto, 200) o expense (los mismos campos que POST /expenses, lo crea, 201). La factura sale del buzón. 409 si no tiene archivo.
  • La API no lee la factura con la IA de Keyio: la lee quien llama (tu programa o tu asistente) y decide la vivienda y los importes.

Documentos

De una vivienda (/properties/{id}/documents) o de un alquiler (/rentals/{id}/documents), con las mismas rutas.

RutaPermisoRespuestas
GET/properties/{id}/documentslectura200 { documents, nextCursor }
GET/rentals/{id}/documentslectura200 { documents, nextCursor }
GET…/documents/{docId}lectura200 { document, file } · 404
POST…/documentslectura y escritura · propietario o editor201 { document } · 400 · 404
PATCH…/documents/{docId}lectura y escritura · propietario o editor200 { document } · 400 · 404
DELETE…/documents/{docId}lectura y escritura · propietario o editor200 · 404 · 409

Campos que puedes enviar

name *descriptiondocumentTypevalidityDatepublishedToPortalfile *
  • documentType: contract, addendum, inventory, checkin_report, checkout_report, receipt, invoice, deposit, id_copy, insurance, deed, energy_certificate, habitability_certificate, tourist_license, house_rules, appliance_instructions, wifi_info u other. file: PDF, imágenes, Word, Excel u OpenDocument. Los de un alquiler se crean publicados.
  • Se devuelven con status (draft, published, archived, pending_signature, signed), hasFile y signing (cuántos firmantes y cuántos han firmado), nunca enlaces ni datos de los firmantes. El GET de uno añade file: en un contrato firmado, el PDF firmado.
  • PATCH: name, description, documentType, validityDate (null la quita) y publishedToPortal. Borrar se rechaza con 409 mientras esté pendiente de firma, y borra también sus archivos.

Cobros de renta

Necesita un plan con cobros y el seguimiento de cobros activado en la vivienda (paymentTrackingEnabled).

RutaPermisoRespuestas
GET/rentals/{id}/paymentslectura200 { trackingEnabled, charges, otherPayments } · 404
POST/rentals/{id}/paymentslectura y escritura · propietario o editor201 { payment } · 400 · 404 · 409
PATCH/rentals/{id}/payments/{paymentId}/entries/{entryId}lectura y escritura · propietario o editor200 { payment } · 400 · 404
DELETE/rentals/{id}/payments/{paymentId}/entries/{entryId}lectura y escritura · propietario o editor200 · 404
DELETE/rentals/{id}/payments/{paymentId}lectura y escritura · solo su autor200 · 403 · 404

Filtros del listado

  • year — Solo los cargos de ese año.

Campos que puedes enviar

yearmonthchargeTypeplanEntryIdamount *date *methodnotes
  • Cargos: en larga estancia, uno por mes hasta el mes que viene; en corta, la señal y el resto o los hitos de su paymentPlan. Cada uno trae chargeType (monthly_rent, advance, balance, installment), expectedAmount, receivedAmount, status (paid, partial, pending, due, late) y sus entries.
  • Para registrar un cobro, di qué cargo es con year + month, chargeType o planEntryId. Se suma a lo ya recibido: paid al llegar a lo esperado, partial antes. Si no queda claro qué cargo es, el 400 los lista. method: transfer (por defecto), cash, card, domiciliacion u other. 409 si el seguimiento de cobros está desactivado.
  • Un cobro concreto se corrige o se quita en …/entries/{entryId}; quitar el último borra el registro. Borrar el cargo entero solo lo puede hacer quien lo registró (403).

Notas del alquiler

El registro de comunicaciones del alquiler. Las notas no se editan.

RutaPermisoRespuestas
GET/rentals/{id}/noteslectura200 { notes, nextCursor }
POST/rentals/{id}/noteslectura y escritura · propietario o editor201 { note } · 400 · 404
DELETE/rentals/{id}/notes/{noteId}lectura y escritura · solo su autor200 · 403 · 404

Campos que puedes enviar

content *typecontactDirectionoccurredAt
  • content hasta 2.000 caracteres. type: note, call, email, whatsapp, letter, meeting u other; contactDirection: inbound u outbound. createdBy es el nombre de tu cuenta. Se listan de la más nueva a la más antigua; solo su autor la puede borrar.

Mantenimiento

Necesita un plan con mantenimiento.

RutaPermisoRespuestas
GET/maintenancelectura200 { maintenanceRequests, nextCursor }
GET/maintenance/{id}lectura200 { maintenanceRequest } · 404
POST/maintenancelectura y escritura · propietario o editor201 { maintenanceRequest } · 400 · 404
PATCH/maintenance/{id}lectura y escritura · propietario o editor200 { maintenanceRequest } · 400 · 404
DELETE/maintenance/{id}lectura y escritura · solo su autor200 · 403 · 404
POST/maintenance/{id}/photoslectura y escritura · propietario o editor201 { maintenanceRequest } · 400 · 404 · 409
GET/maintenance/{id}/photos/{n}lectura200 { file } · 404
DELETE/maintenance/{id}/photos/{n}lectura y escritura · propietario o editor200 { maintenanceRequest } · 404

Filtros del listado

  • propertyId — Solo las de esa vivienda.
  • status — open, acknowledged, in_progress, completed o cancelled.

Campos que puedes enviar

propertyId *rentalIdtitle *descriptioncategoryurgencystatusassignedToestimatedCostactualCostnoteslinkedExpenseId
  • category: plumbing, electrical, hvac, appliance, structural, cleaning u other (por defecto); urgency: low, medium (por defecto), high o emergency; status empieza en open. notes hasta 2.000 caracteres. linkedExpenseId (solo PATCH) enlaza un gasto de la misma vivienda; null lo desenlaza. Al completarla se anota resolvedAt.
  • Hasta 5 fotos por incidencia (una imagen por POST; 409 al pasar de 5); n empieza en 1. Se devuelve photoCount, nunca enlaces a las fotos. Solo quien la creó la puede borrar (si no, cancélala); borrarla borra sus fotos.

Informes fiscales

Necesita un plan con informes. Son estimaciones y llevan siempre el aviso de revisarlas con tu asesor fiscal.

RutaPermisoRespuestas
GET/properties/{id}/tax-reportlectura200 { report } · 400 · 404
GET/reports/summarylectura200 { year, properties, totals, disclaimer } · 400

Filtros del listado

  • year — Obligatorio en los dos.
  • isRatePct — 15 o 25: tipo del Impuesto sobre Sociedades (informe de una vivienda de sociedad).
  • El informe de una vivienda trae regime (IRPF, IS o IRNR), owners con su ownershipPercentage, ocupación, ingresos, gastos por casilla, el detalle irpf (rendimiento neto, reducción por alquiler de vivienda, imputación de rentas), is o irnr, y result { deductions, netResult, estimatedTax }. Las cifras son del 100 % de la vivienda.
  • El resumen da, por vivienda con actividad ese año, ingresos, gastos deducibles, resultado neto e impuesto estimado, y los totales.

Plantillas de contrato

Necesita un plan con contratos. Son solo tuyas.

RutaPermisoRespuestas
GET/templateslectura200 { templates, nextCursor }
GET/templates/{id}lectura200 { template } · 404
POST/templateslectura y escritura201 { template } · 400
PATCH/templates/{id}lectura y escritura200 { template } · 400 · 404
DELETE/templates/{id}lectura y escritura200 · 404

Campos que puedes enviar

name *language *content *category
  • content es un documento TipTap: { "type": "doc", "content": [ … ] }, el mismo formato que el editor de la app. category: rental-contract, short-term-rental, rent-review, inventory, termination, addendum u other.

Registro de viajeros

  • Todas las rutas de huéspedes, también el GET, necesitan una clave de lectura y escritura y cuentan en el límite de escritura. Una clave de lectura no ve huéspedes.
  • Se devuelven enmascarados: las dos últimas cifras del documento, el año de nacimiento y si hay email y teléfono. Nunca el documento entero, la fecha de nacimiento, la dirección, el email ni el teléfono.
  • Cada huésped trae sesReady y missing: lo que falta para un registro válido. Puedes crearlo solo con nombre y apellido e ir completándolo.
  • Una vez presentado, o mientras se presenta, no se pueden cambiar (409).
RutaPermisoRespuestas
GET/rentals/{id}/guestslectura y escritura200 { registration, guests } · 404
POST/rentals/{id}/guestslectura y escritura · propietario o editor201 { guest } · 400 · 404 · 409
PATCH/rentals/{id}/guests/{guestId}lectura y escritura · propietario o editor200 { guest } · 400 · 404 · 409
DELETE/rentals/{id}/guests/{guestId}lectura y escritura · propietario o editor200 · 404 · 409
POST/rentals/{id}/guests/submitlectura y escritura · propietario o editor200 · 403 · 404 · 409 · 422 · 502
POST/rentals/{id}/guests/ses-statuslectura y escritura · propietario o editor200 · 404 · 409 · 422 · 502
POST/rentals/{id}/guests/ses-cancellectura y escritura · propietario o editor200 · 400 · 404 · 409 · 422 · 502
GET/rentals/{id}/libro-viajeroslectura y escritura · propietario o editor200 · 403 · 404
GET/properties/{id}/libro-viajeroslectura y escritura · propietario o editor200 · 400 · 403 · 404
GET/properties/{id}/ertzaintzalectura200 · 404
POST/rentals/{id}/ertzaintza/filelectura y escritura · propietario o editor200 · 404 · 422

Campos de un huésped

firstName *lastName *secondSurnamedocTypedocIdsupportNumberdocIssueDatedocExpirationDatedobnationalitysexstreethouseNumberflatpostalCodecitymunicipalityCodeprovincecountryOfResidencephoneNumberemailisMinorNoDocparentIdrelationship

POST /rentals/{id}/guests/submit presenta el registro ante SES.Hospedajes. Es una comunicación real a las autoridades y no se puede deshacer desde la API.

Solo funciona cuando:

  • El propietario ha activado el envío automático a SES en esa vivienda, en la app.
  • La vivienda comunica a SES. El País Vasco comunica a la Ertzaintza: la API da el fichero XML para su portal; Cataluña (Mossos) se presenta desde la app.
  • Tiene credenciales de SES, con establishmentCode y codigoArrendador.
  • Todos los huéspedes están completos (sesReady: true).
200Presentado: { submitted: true, loteId, verification }.
403El envío automático a SES no está activado. Actívalo en la app.
409Ya presentado, o hay un envío en curso o uno reciente acabó sin respuesta clara. No reintentes: compruébalo en Keyio.
422No se puede presentar: región, credenciales, sin huéspedes o huéspedes incompletos (la respuesta dice qué falta a cada uno). Corrige y vuelve a enviar.
502«No se ha presentado nada»: SES lo rechazó, corrige y repite. «Puede haberse aceptado o no»: no reintentes; durante 15 minutos se rechazan más intentos.

Solo corre un envío por alquiler a la vez, así que dos llamadas no pueden presentar el mismo registro dos veces. Nunca reintentes automáticamente tras un error o un tiempo de espera.

Registro de actividad

Cada llamada con una clave válida queda registrada con método, ruta, estado, IP y agente, durante 90 días, salvo las rechazadas por límite o por validación. La ves en Ajustes → Desarrollador → Actividad reciente.

Preguntas frecuentes

¿Keyio tiene un servidor MCP?

Sí. Keyio ofrece un servidor MCP remoto en https://gokeyio.com/api/mcp, con inicio de sesión OAuth, en todos los planes. Da a un asistente de IA acceso a tus viviendas, alquileres, gastos y sus facturas, buzón de facturas, cobros de renta, mantenimiento, notas, documentos, informes fiscales, plantillas de contrato y registro de viajeros, con los mismos permisos que tienes tú en la app.

¿Puedo usar Keyio con ChatGPT o con Claude?

Sí. En Claude se añade como conector personalizado y se pulsa Conectar; en ChatGPT, como conector en modo desarrollador. También funciona con Claude Code, Cursor, VS Code y otros clientes compatibles con MCP.

¿Qué puede hacer un asistente de IA con Keyio?

Con permiso de lectura, responder sobre tus viviendas, reservas, ingresos, gastos, cobros, mantenimiento y el resumen fiscal del año. Con permiso de escritura, además apuntar gastos con su factura, archivar las facturas del buzón, registrar cobros de renta, abrir incidencias, subir documentos, crear o cambiar alquileres, añadir huéspedes paso a paso y presentar el registro de viajeros ante SES.HOSPEDAJES cuando se lo pides.

¿Es seguro conectar un asistente de IA a mis datos?

Tú eliges en Keyio si puede solo consultar o también hacer cambios, y lo desconectas cuando quieras. Nunca ve más que tú, los datos de huéspedes salen enmascarados, las credenciales de SES no se pueden leer ni poner desde el asistente, y cada llamada queda registrada.

¿Cuánto cuesta la API o el servidor MCP?

Nada aparte: están incluidos en todos los planes de Keyio, también en el plan Cumplimiento.

¿Dudas o algo que no funciona como dice aquí? Escríbenos. Contacto →