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/mcpClaude (web, Desktop y móvil)
- En Claude, abre Personalizar → Conectores y pulsa «Añadir conector personalizado».
- Ponle de nombre «Keyio», pega la dirección de arriba y pulsa Añadir.
- 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/mcpCursor. 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
- 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.
- 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 recurso | https://gokeyio.com/.well-known/oauth-protected-resource/api/mcp |
| Metadatos del servidor | https://gokeyio.com/.well-known/oauth-authorization-server |
| Registro de cliente | POST https://gokeyio.com/api/oauth/register |
| Autorización | https://gokeyio.com/auth/oauth/authorize |
| Token | POST https://gokeyio.com/api/oauth/token |
| Revocación | POST 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… | Leer | Alquileres, gastos y huéspedes | Cambiar 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ímite | Por minuto | Por día |
|---|---|---|
| Todas las peticiones, por clave | 60 | 2.000 |
| Escrituras y lecturas de huéspedes, por clave | 60 | 500 |
| Por dirección IP | 300 | — |
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.
| 400 | Cuerpo o parámetros no válidos. Incluye fieldErrors. Campos y parámetros desconocidos se rechazan. Un PATCH vacío también. |
| 401 | Falta la clave o el token, no es válido, está revocado o caducado, o la cuenta está suspendida. |
| 403 | Clave de solo lectura en una escritura, plan sin esa función, límite del plan alcanzado, o solo su autor puede borrar ese registro. |
| 404 | No existe o no es tuyo; a propósito no se distingue. |
| 409 | Choca con el estado del registro (ver cada recurso). |
| 410 | /assets se retiró: { "error": "deprecated", "message": "…" }. |
| 422 | Bien formada pero no se puede hacer (registro de viajeros). |
| 429 | Límite superado. |
| 500 | Error nuestro. Puedes repetir un GET; en una escritura, comprueba antes si se aplicó. |
| 502 | SES 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
| Ruta | Permiso | Respuestas |
|---|---|---|
| GET/properties | lectura | 200 { properties, nextCursor } |
| GET/properties/{id} | lectura | 200 { property } · 404 |
| POST/properties | lectura y escritura | 201 { property } · 400 · 403 |
| PATCH/properties/{id} | lectura y escritura · propietario | 200 { property } · 400 · 404 |
| DELETE/properties/{id} | lectura y escritura · propietario | 200 · 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
| Ruta | Permiso | Respuestas |
|---|---|---|
| GET/rentals | lectura | 200 { rentals, nextCursor } |
| GET/rentals/{id} | lectura | 200 { rental } · 404 |
| POST/rentals | lectura y escritura · propietario o editor | 201 { rental } · 400 · 404 · 409 |
| PATCH/rentals/{id} | lectura y escritura · propietario o editor | 200 { rental } · 400 · 404 |
| DELETE/rentals/{id} | lectura y escritura · propietario o editor | 200 · 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.
| Ruta | Permiso | Respuestas |
|---|---|---|
| GET/expenses | lectura | 200 { expenses, nextCursor } |
| GET/expenses/{id} | lectura | 200 { expense } · 404 |
| POST/expenses | lectura y escritura · propietario o editor | 201 { expense } · 400 · 404 |
| PATCH/expenses/{id} | lectura y escritura · propietario o editor | 200 { expense } · 400 · 404 |
| DELETE/expenses/{id} | lectura y escritura · propietario o editor | 200 · 404 |
| GET/expenses/{id}/file | lectura | 200 { file } · 404 |
| PUT/expenses/{id}/file | lectura y escritura · propietario o editor | 200 { expense } · 400 · 404 |
| DELETE/expenses/{id}/file | lectura y escritura · propietario o editor | 200 · 404 |
| GET/recurring-expenses | lectura | 200 { recurringExpenses, nextCursor } |
| PATCH/recurring-expenses/{id} | lectura y escritura · propietario | 200 { recurringExpense } · 400 · 404 |
| DELETE/recurring-expenses/{id} | lectura y escritura · propietario | 200 · 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.
| Ruta | Permiso | Respuestas |
|---|---|---|
| GET/inbox | lectura | 200 { mailbox, items, nextCursor } |
| PUT/inbox/mailbox | lectura y escritura · propietario | 200 { mailbox } · 409 |
| GET/inbox/{id} | lectura | 200 { item, file } · 404 |
| POST/inbox/{id}/file | lectura y escritura · propietario | 201 | 200 { expense } · 400 · 404 · 409 |
| DELETE/inbox/{id} | lectura y escritura · propietario | 200 · 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.
| Ruta | Permiso | Respuestas |
|---|---|---|
| GET/properties/{id}/documents | lectura | 200 { documents, nextCursor } |
| GET/rentals/{id}/documents | lectura | 200 { documents, nextCursor } |
| GET…/documents/{docId} | lectura | 200 { document, file } · 404 |
| POST…/documents | lectura y escritura · propietario o editor | 201 { document } · 400 · 404 |
| PATCH…/documents/{docId} | lectura y escritura · propietario o editor | 200 { document } · 400 · 404 |
| DELETE…/documents/{docId} | lectura y escritura · propietario o editor | 200 · 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).
| Ruta | Permiso | Respuestas |
|---|---|---|
| GET/rentals/{id}/payments | lectura | 200 { trackingEnabled, charges, otherPayments } · 404 |
| POST/rentals/{id}/payments | lectura y escritura · propietario o editor | 201 { payment } · 400 · 404 · 409 |
| PATCH/rentals/{id}/payments/{paymentId}/entries/{entryId} | lectura y escritura · propietario o editor | 200 { payment } · 400 · 404 |
| DELETE/rentals/{id}/payments/{paymentId}/entries/{entryId} | lectura y escritura · propietario o editor | 200 · 404 |
| DELETE/rentals/{id}/payments/{paymentId} | lectura y escritura · solo su autor | 200 · 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.
| Ruta | Permiso | Respuestas |
|---|---|---|
| GET/rentals/{id}/notes | lectura | 200 { notes, nextCursor } |
| POST/rentals/{id}/notes | lectura y escritura · propietario o editor | 201 { note } · 400 · 404 |
| DELETE/rentals/{id}/notes/{noteId} | lectura y escritura · solo su autor | 200 · 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.
| Ruta | Permiso | Respuestas |
|---|---|---|
| GET/maintenance | lectura | 200 { maintenanceRequests, nextCursor } |
| GET/maintenance/{id} | lectura | 200 { maintenanceRequest } · 404 |
| POST/maintenance | lectura y escritura · propietario o editor | 201 { maintenanceRequest } · 400 · 404 |
| PATCH/maintenance/{id} | lectura y escritura · propietario o editor | 200 { maintenanceRequest } · 400 · 404 |
| DELETE/maintenance/{id} | lectura y escritura · solo su autor | 200 · 403 · 404 |
| POST/maintenance/{id}/photos | lectura y escritura · propietario o editor | 201 { maintenanceRequest } · 400 · 404 · 409 |
| GET/maintenance/{id}/photos/{n} | lectura | 200 { file } · 404 |
| DELETE/maintenance/{id}/photos/{n} | lectura y escritura · propietario o editor | 200 { 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.
| Ruta | Permiso | Respuestas |
|---|---|---|
| GET/properties/{id}/tax-report | lectura | 200 { report } · 400 · 404 |
| GET/reports/summary | lectura | 200 { 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.
| Ruta | Permiso | Respuestas |
|---|---|---|
| GET/templates | lectura | 200 { templates, nextCursor } |
| GET/templates/{id} | lectura | 200 { template } · 404 |
| POST/templates | lectura y escritura | 201 { template } · 400 |
| PATCH/templates/{id} | lectura y escritura | 200 { template } · 400 · 404 |
| DELETE/templates/{id} | lectura y escritura | 200 · 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).
| Ruta | Permiso | Respuestas |
|---|---|---|
| GET/rentals/{id}/guests | lectura y escritura | 200 { registration, guests } · 404 |
| POST/rentals/{id}/guests | lectura y escritura · propietario o editor | 201 { guest } · 400 · 404 · 409 |
| PATCH/rentals/{id}/guests/{guestId} | lectura y escritura · propietario o editor | 200 { guest } · 400 · 404 · 409 |
| DELETE/rentals/{id}/guests/{guestId} | lectura y escritura · propietario o editor | 200 · 404 · 409 |
| POST/rentals/{id}/guests/submit | lectura y escritura · propietario o editor | 200 · 403 · 404 · 409 · 422 · 502 |
| POST/rentals/{id}/guests/ses-status | lectura y escritura · propietario o editor | 200 · 404 · 409 · 422 · 502 |
| POST/rentals/{id}/guests/ses-cancel | lectura y escritura · propietario o editor | 200 · 400 · 404 · 409 · 422 · 502 |
| GET/rentals/{id}/libro-viajeros | lectura y escritura · propietario o editor | 200 · 403 · 404 |
| GET/properties/{id}/libro-viajeros | lectura y escritura · propietario o editor | 200 · 400 · 403 · 404 |
| GET/properties/{id}/ertzaintza | lectura | 200 · 404 |
| POST/rentals/{id}/ertzaintza/file | lectura y escritura · propietario o editor | 200 · 404 · 422 |
Campos de un huésped
firstName *lastName *secondSurnamedocTypedocIdsupportNumberdocIssueDatedocExpirationDatedobnationalitysexstreethouseNumberflatpostalCodecitymunicipalityCodeprovincecountryOfResidencephoneNumberemailisMinorNoDocparentIdrelationshipPOST /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).
| 200 | Presentado: { submitted: true, loteId, verification }. |
| 403 | El envío automático a SES no está activado. Actívalo en la app. |
| 409 | Ya presentado, o hay un envío en curso o uno reciente acabó sin respuesta clara. No reintentes: compruébalo en Keyio. |
| 422 | No 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 →