API de administración de integraciones
Referencia de los endpoints de administración para dar de alta, configurar y vigilar las aplicaciones externas de tu organización; se llaman con la sesión de un usuario, no con X-Api-Key.
Actualizado el . 7 min de lectura
Incluido en todos los planes. Ver precios
Esta página es la referencia de la API de administración de
aplicaciones externas: los endpoints bajo /api/integrations/apps que
crean, configuran y vigilan las aplicaciones externas de tu
organización. Es la misma API que usa la pantalla Aplicaciones externas;
el recorrido por esa pantalla está en
Panel de aplicaciones externas.
No la confundas con la API externa
- API de administración (esta página): rutas bajo
/api/integrations/apps. Se autentica con el token de sesión de un usuario (Authorization: Bearer <token>) y exige los permisosEXTERNAL_APPS_*. La usa quien administra las integraciones de la organización. - API externa: rutas bajo
/api/external/v1/.... La usa la propia aplicación con su cabeceraX-Api-Keyy los permisos de la API que tenga concedidos.
Las versiones antiguas de esta página mostraban ejemplos con X-Api-Key: eran incorrectos. Con X-Api-Key y sin Authorization: Bearer, esta API responde 401.
Autenticación
Todos los endpoints exigen un token de sesión válido en la cabecera
Authorization, con el prefijo Bearer: el mismo que emite el inicio
de sesión en UTILIA OS. El plan de tu organización tiene que incluir el
aplicativo Integraciones.
Authorization: Bearer <token_de_sesion>Sin token, o con uno caducado, la respuesta es 401. Con un token
válido pero sin el permiso, 403. Se usa la sesión y no una clave de
aplicación porque esta API crea credenciales, regenera claves y concede
permisos sensibles: es justo lo que gestiona.
Permisos
Cada endpoint exige uno de estos cuatro permisos de Integraciones:
- EXTERNAL_APPS_VIEWpermiso
- Ver aplicaciones externas. Necesario para todas las lecturas: listado, detalle, cifras, métricas, avisos y facturación.
- EXTERNAL_APPS_CREATEpermiso
- Crear aplicaciones externas. Necesario para POST /api/integrations/apps.
- EXTERNAL_APPS_EDITpermiso
- Editar aplicaciones externas. Necesario para actualizar, regenerar claves, configurar avisos, permisos, OAuth y facturación.
- EXTERNAL_APPS_DELETEpermiso
- Desactivar aplicaciones externas. Necesario para DELETE /api/integrations/apps/:id, que desactiva sin borrar información.
Endpoints
Todas las rutas comparten el prefijo global /api. El recurso base es
/api/integrations/apps.
Gestión de apps
/api/integrations/appsCrear una nueva aplicación externa. Requiere EXTERNAL_APPS_CREATE.
/api/integrations/appsListar las aplicaciones externas. Acepta el parámetro de consulta includeInactive=true. Requiere EXTERNAL_APPS_VIEW.
/api/integrations/apps/:idObtener el detalle de una aplicación externa. Requiere EXTERNAL_APPS_VIEW.
/api/integrations/apps/:id/statsObtener estadísticas de la app. Requiere EXTERNAL_APPS_VIEW.
/api/integrations/apps/:id/usersListar usuarios externos de la app (paginado: page, limit). Requiere EXTERNAL_APPS_VIEW.
/api/integrations/apps/:idActualizar la configuración de la app. Requiere EXTERNAL_APPS_EDIT.
/api/integrations/apps/:id/toggle-activeActivar o desactivar la app. Requiere EXTERNAL_APPS_EDIT.
/api/integrations/apps/:idEliminar (desactivar) la aplicación externa. Requiere EXTERNAL_APPS_DELETE.
/api/integrations/apps/:id/regenerate-api-keyRegenerar la clave de API de la aplicación. Requiere EXTERNAL_APPS_EDIT.
Las claves se entregan una sola vez
El alta las devuelve en apiKeyPlainText y webhookSecretPlainText;
regenerate-api-key devuelve apiKeyPlainText y
regenerate-webhook-secret, webhookSecret. Guárdalas en ese momento:
si las pierdes, la única salida es regenerarlas, y la anterior deja de
servir.
Ninguna lectura devuelve claves. Desde el 5 de septiembre de 2026, ni el
listado ni el detalle traen la clave de firma de los avisos (ni cifrada):
solo webhookSecretConfigured, que dice si hay una puesta. De la clave
de API llegan el prefijo y los datos de uso, nunca su huella.
Permisos de la API
/api/integrations/apps/scopes/catalogCatálogo de permisos de la API; los que no cubre el plan llegan marcados con outOfPlan. Requiere EXTERNAL_APPS_VIEW.
/api/integrations/apps/:id/scopesSustituye la lista completa de permisos de la API de la aplicación. Requiere EXTERNAL_APPS_EDIT, y ser Super Administrador para añadir los protegidos.
El catálogo, las reglas de concesión, el recorte por plan (400 SCOPE_OUT_OF_PLAN), el bloqueo optimista y la auditoría están en Permisos de la API.
Avisos a tu servidor
/api/integrations/apps/:id/webhookActualizar los avisos: dirección, activación y eventos. Requiere EXTERNAL_APPS_EDIT.
/api/integrations/apps/:id/regenerate-webhook-secretRegenerar la clave de firma de los avisos. Requiere EXTERNAL_APPS_EDIT.
/api/integrations/apps/:id/webhook/testEnviar un aviso de prueba a la dirección configurada. Requiere EXTERNAL_APPS_EDIT.
/api/integrations/apps/:id/webhook-deliveriesHistorial de entregas de avisos, con filtros. Requiere EXTERNAL_APPS_VIEW.
/api/integrations/apps/:id/webhook-deliveries/:deliveryIdDetalle de una entrega. Requiere EXTERNAL_APPS_VIEW.
/api/integrations/apps/:id/webhook-deliveries/:deliveryId/retryReintentar una entrega. Responde 204 No Content. Requiere EXTERNAL_APPS_EDIT.
OAuth
/api/integrations/apps/:id/enable-oauthActivar OAuth en la aplicación. Requiere EXTERNAL_APPS_EDIT.
/api/integrations/apps/:id/oauthActualizar la configuración OAuth de la app. Requiere EXTERNAL_APPS_EDIT.
/api/integrations/apps/:id/oauthDatos OAuth de la aplicación. Requiere EXTERNAL_APPS_VIEW.
/api/integrations/apps/:id/disable-oauthDesactivar OAuth en la aplicación. Requiere EXTERNAL_APPS_EDIT.
Métricas
Todas aceptan el parámetro de consulta period (24h, 7d, 30d o 90d; por defecto, 24h), salvo /metrics/ai, que usa startDate y endDate. El detalle de las respuestas está en Métricas de la API.
/api/integrations/apps/:id/metricsResumen de métricas de la API. Requiere EXTERNAL_APPS_VIEW.
/api/integrations/apps/:id/metrics/requestsSerie temporal de peticiones. Requiere EXTERNAL_APPS_VIEW.
/api/integrations/apps/:id/metrics/latencySerie temporal de latencia (p50, p95, p99). Requiere EXTERNAL_APPS_VIEW.
/api/integrations/apps/:id/metrics/errorsDistribución de errores por código de estado. Requiere EXTERNAL_APPS_VIEW.
/api/integrations/apps/:id/metrics/endpointsTop de endpoints por volumen de peticiones. Requiere EXTERNAL_APPS_VIEW.
/api/integrations/apps/:id/metrics/webhooksTasa de éxito de los webhooks. Requiere EXTERNAL_APPS_VIEW.
/api/integrations/apps/:id/metrics/aiResumen del uso de IA generado por la aplicación externa. Acepta startDate y endDate. Requiere EXTERNAL_APPS_VIEW.
/metrics/ai solo devuelve el consumo dentro de tu organización: si la aplicación no existe o es de otra organización, responde 404.
Tope de coste de IA de la app
Estos dos endpoints gobiernan el tope mensual de coste de IA de una aplicación externa: cuánto puede gastar y cuánto lleva gastado este mes. Sirven para acotar el gasto de los agentes de IA que la aplicación gestiona en los canales del chat, así que además del permiso exigen la capacidad de agentes de canal (chat.channel_agents) en el plan; sin ella, la respuesta es un bloqueo de plan (CAPABILITY_NOT_ENABLED), no un error de permisos.
/api/integrations/apps/:id/ai-budgetTope mensual de coste de IA de la app y consumo del periodo. Requiere EXTERNAL_APPS_VIEW.
/api/integrations/apps/:id/ai-budgetAjustar el tope mensual de coste de IA de la app. Requiere EXTERNAL_APPS_EDIT.
Facturación y cobro por aplicación externa
Estos endpoints llevan, además del permiso, las puertas del plan del
aplicativo al que pertenece cada dato. Sin el aplicativo contratado responden
403 con errorCode: 'MODULE_NOT_ENABLED', que no se resuelve concediendo
permisos al usuario.
| Ruta | Aplicativos del plan | Capacidad | Permisos (todos) |
|---|---|---|---|
GET :id/invoices y :id/invoices/stats | Integraciones y Finanzas | — | EXTERNAL_APPS_VIEW e INVOICES_VIEW |
GET :id/payments y :id/payments/stats | Integraciones, Finanzas y Pagos con tarjeta (Stripe) | — | EXTERNAL_APPS_VIEW y PAYMENTS_VIEW |
GET :id/billing-config | Integraciones y Finanzas | — | EXTERNAL_APPS_VIEW |
PATCH :id/billing-config | Integraciones y Finanzas | — | EXTERNAL_APPS_EDIT |
GET :id/billing-summary | Integraciones y Finanzas | — | EXTERNAL_APPS_VIEW |
GET :id/subscriptions y :id/subscriptions/stats | Integraciones y Finanzas | Facturación recurrente | EXTERNAL_APPS_VIEW y RECURRING_INVOICES_VIEW |
POST :id/subscriptions/:subscriptionId/pause, /resume, /cancel | Integraciones y Finanzas | Facturación recurrente | EXTERNAL_APPS_EDIT y RECURRING_INVOICES_MANAGE |
GET :id/payment-authorizations y :id/autocharge-gaps | Integraciones, Finanzas y Pagos con tarjeta (Stripe) | Cobro automático | EXTERNAL_APPS_VIEW e INVOICES_AUTOCHARGE_VIEW |
POST :id/payment-authorizations/:authorizationId/revoke | Integraciones, Finanzas y Pagos con tarjeta (Stripe) | Cobro automático | EXTERNAL_APPS_EDIT e INVOICES_AUTOCHARGE_CANCEL |
POST :id/users/:userId/link-client | Integraciones y CRM | — | EXTERNAL_APPS_EDIT y CLIENTS_VIEW |
Los permisos de cada fila son una conjunción: hacen falta todos.
Desde el 5 de septiembre de 2026, :id/billing-config solo exige Integraciones y Finanzas, sin la pasarela: ese ajuste permite emitir facturas, que funciona sin Stripe (se factura por transferencia y el cobro se registra a mano). La pasarela gobierna los cobros: :id/payments*, :id/payment-authorizations* y los cobros con tarjeta. Sin ella, :id/billing-summary devuelve cardCharge y paymentAuthorization como out_of_plan, con el resto disponible.
/api/integrations/apps/:id/invoicesListar las facturas emitidas por la aplicación externa.
/api/integrations/apps/:id/invoices/statsEstadísticas agregadas de las facturas emitidas por la aplicación.
/api/integrations/apps/:id/paymentsListar los cobros procesados por la aplicación.
/api/integrations/apps/:id/payments/statsEstadísticas agregadas de los cobros procesados por la aplicación.
/api/integrations/apps/:id/billing-configConfiguración de facturación de la aplicación: si está activa, el tope por factura y si UTILIA OS envía las facturas por correo.
/api/integrations/apps/:id/billing-configActualizar la configuración de facturación. Activarla exige ser Super Administrador y un motivo de al menos 20 caracteres; apagarla no exige nada.
/api/integrations/apps/:id/billing-summaryResumen de facturación de la ficha: cifras del mes, estado real de la cuenta de cobro y la fila de capacidades con lo que la aplicación puede hacer de verdad.
Activar la facturación exige ser Super Administrador y un motivo
El cuerpo de PATCH :id/billing-config acepta billingEnabled,
billingMaxAmountCents, invoiceEmailsEnabled y reason. Poner
billingEnabled a verdadero responde 403 SUPER_ADMIN_REQUIRED_FOR_BILLING
si quien llama no es Super Administrador, y 422 REASON_REQUIRED_FOR_BILLING si el motivo tiene menos de veinte caracteres.
El motivo queda en el registro de auditoría junto con el cambio. Apagarla
no exige nada: es la forma rápida de cortar.
Suscripciones y autorizaciones de cobro por aplicación
/api/integrations/apps/:id/subscriptionsSuscripciones de los usuarios de la aplicación, con su estado, su próximo cobro y su cliente del CRM.
/api/integrations/apps/:id/subscriptions/statsCifras agregadas de las suscripciones de la aplicación.
/api/integrations/apps/:id/subscriptions/:subscriptionId/pausePausar una suscripción de la aplicación desde el panel.
/api/integrations/apps/:id/subscriptions/:subscriptionId/resumeReanudar una suscripción pausada. No acepta motivo: el motor interno no lo conserva.
/api/integrations/apps/:id/subscriptions/:subscriptionId/cancelDar de baja una suscripción de la aplicación.
/api/integrations/apps/:id/payment-authorizationsAutorizaciones de cobro de los usuarios de la aplicación, con la tarjeta, el alcance y el estado.
/api/integrations/apps/:id/autocharge-gapsCobros que hoy no saldrían: usuarios con cobro automático configurado a los que les falta autorización vigente o les caduca la tarjeta.
/api/integrations/apps/:id/payment-authorizations/:authorizationId/revokeRetirar una autorización de cobro desde el panel. Arrastra en cascada los cobros programados y el cobro automático de las suscripciones.
/api/integrations/apps/:id/users/:userId/link-clientVincular a mano un usuario de la aplicación con una ficha de cliente del CRM, cuando el puente automático no eligió la que corresponde.
GET /api/integrations/apps/:id/users incluye siempre el clientId de
cada usuario, y el bloque client con el nombre de la ficha solo si
quien llama tiene CLIENTS_VIEW. No se devuelve clientId: null a
quien no ve clientes, porque diría que el usuario no tiene ficha, y sería
falso.
Origen de las facturas en Finanzas
/api/finance/invoices/filters/external-appsAplicaciones externas que han emitido alguna factura visible para quien llama, para alimentar el filtro por origen de Finanzas. Requiere INVOICES_VIEW y EXTERNAL_APPS_VIEW.
El listado y el detalle de facturas de Finanzas devuelven además externalApp y
externalUser cuando la factura viene de una aplicación externa, y aceptan el
filtro externalAppId. Ambos bloques se recortan si quien llama no tiene
EXTERNAL_APPS_VIEW.
Crear una aplicación externa
En el cuerpo de POST /api/integrations/apps solo name y slug son
obligatorios.
- namestringobligatorio
- Nombre visible de la aplicación. Máximo 100 caracteres.
- slugstringobligatorio
- Identificador único. Solo minúsculas, números y guiones. Máximo 50 caracteres.
- descriptionstring
- Descripción libre de la aplicación.
- logoUrlstring (URL)
- Dirección del logotipo.
- websiteUrlstring (URL)
- Dirección de la web de la aplicación.
- allowBidirectionalboolean
- Permite la conversación en los dos sentidos (por ejemplo, en tickets).
- showAgentNamesboolean
- Muestra a los usuarios externos los nombres reales de las personas de soporte.
- customAgentNamestring
- Nombre genérico de las personas de soporte. Máximo 100 caracteres.
- aiTranscriptionEnabledboolean
- Activa la transcripción por IA.
- aiSuggestionsEnabledboolean
- Activa las sugerencias por IA.
- allowedOriginsstring[]
- Orígenes CORS permitidos para el widget o las llamadas desde el navegador. No se admite el comodín suelto.
- devProjectIdstring | null
- Vincula la aplicación a un proyecto de Gestión de proyectos.
- maxFileSizenumber (bytes)
- Tamaño máximo por archivo. Entre 1 KB (1024) y 100 MB (104857600).
- maxStorageBytesnumber (bytes)
- Almacenamiento máximo. Entre 1 MB (1048576) y 10 GB (10737418240).
Ejemplos
Los ejemplos usan la cabecera Authorization: Bearer <token>. Sustituye
$TOKEN por tu token de sesión.
Listar aplicaciones externas
curl -X GET 'https://os.utilia.ai/api/integrations/apps?includeInactive=true' \
-H 'Authorization: Bearer '"$TOKEN" \
-H 'Content-Type: application/json'Crear una aplicación externa
curl -X POST 'https://os.utilia.ai/api/integrations/apps' \
-H 'Authorization: Bearer '"$TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"name": "Mi integración",
"slug": "mi-integracion",
"description": "Sincroniza tickets con nuestro CRM externo",
"allowedOrigins": ["https://app.ejemplo.com"]
}'Regenerar la clave de API de una aplicación
curl -X POST 'https://os.utilia.ai/api/integrations/apps/APP_ID/regenerate-api-key' \
-H 'Authorization: Bearer '"$TOKEN" \
-H 'Content-Type: application/json'Errores comunes
- 400 Bad Requesterror
- Cuerpo no válido (por ejemplo, slug con caracteres no permitidos o tamaños fuera de rango).
- 401 Unauthorizederror
- Falta el token de sesión en Authorization, ha caducado o no es válido.
- 403 Forbiddenerror
- Falta el permiso EXTERNAL_APPS_* del endpoint, o el plan no incluye el aplicativo o la capacidad.
- 404 Not Founderror
- La aplicación indicada en :id no existe en tu organización.