Errores de tu aplicación
Endpoints para que tu servidor informe de sus errores a UTILIA OS, los liste y consulte sus estadísticas, con los permisos analytics:errors:*.
Actualizado el . 4 min de lectura
Incluido en todos los planes. Ver precios
Con estos endpoints tu aplicación informa a UTILIA OS de los errores de su servidor, y luego los lista y consulta sus estadísticas. Cada error queda asociado a la aplicación que lo envía; los repetidos se agrupan en uno solo con un contador. Los ves también en la pestaña Errores de la aplicación.
Un error, de tu servidor a tu equipo
Participan: Tu servidor, UTILIA OS, Tu equipo.
De Tu servidor a UTILIA OS:
POST /api/external/v1/errors/report
Mensaje, módulo, gravedad y contexto.De UTILIA OS a Tu servidor:
hash y deduplicated (respuesta)
deduplicated: true si el error ya existía y solo sube su contador.De UTILIA OS a Tu servidor:
Aviso ERROR_REPORTED
Solo la primera vez que aparece un error.De UTILIA OS a Tu equipo:
El grupo aparece en la pestaña Errores
De Tu equipo a UTILIA OS:
Lo resuelve, lo silencia o abre un ticket
De UTILIA OS a Tu servidor:
Aviso ERROR_RESOLVED, ERROR_SILENCED…
Según lo que haya hecho tu equipo.
Autenticación, plan y permisos
Todas las peticiones llevan la cabecera X-Api-Key. El plan de tu
organización tiene que incluir el aplicativo Integraciones.
| Endpoint | Permiso de la API (scope) |
|---|---|
POST /external/v1/errors/report | analytics:errors:write |
GET /external/v1/errors | analytics:errors:read |
GET /external/v1/errors/stats | analytics:errors:read |
Sin el permiso, los endpoints responden 403 INSUFFICIENT_SCOPE con un
mensaje genérico que pide hablar con el administrador de la
organización. Se exige desde la primera llamada, sin periodo de gracia.
El catálogo completo y las reglas de concesión están en
Permisos de la API.
Informar de un error
/api/external/v1/errors/reportRegistra un error del servidor de tu aplicación. Permiso: analytics:errors:write.
Cuerpo
- messagestringobligatorio
- Mensaje del error (1-2000 caracteres)
- modulestringobligatorio
- Módulo o componente de origen (1-100 caracteres)
- severitystring
- Gravedad: critical, high, medium o low. Si no la indicas, low
- stackstring
- Traza de la pila del error (máximo 10.000 caracteres)
- filestring
- Archivo de origen (máximo 500 caracteres)
- linenumber
- Línea de origen
- functionstring
- Función de origen (máximo 200 caracteres)
- endpointstring
- Ruta de tu servidor donde ocurrió el error (máximo 500 caracteres)
- methodstring
- Método HTTP: GET, POST, PUT, PATCH o DELETE
- userIdstring
- Identificador del usuario afectado en tu aplicación (máximo 255 caracteres)
- requestIdstring
- Identificador de la petición, para seguirla
- contextobject
- Datos adicionales de contexto (JSON libre)
Si pones el código HTTP del fallo en context.httpStatus,
context.statusCode o context.errorCode, UTILIA OS lo usa para
clasificarlo: los 4xx (errores de negocio esperados) se descartan sin
registrarlos, y los 408, 502, 503 y 504 (cortes pasajeros) se registran
con gravedad low. En los dos casos la respuesta es correcta.
Respuesta
{
"success": true,
"hash": "a1b2c3d4e5f6...",
"deduplicated": false
}hash: identificador del error. Agrupa todas las veces que se repite el mismo error. Viene vacío si el error se ha descartado.deduplicated:truesi el error ya existía y solo ha subido su contador.
Ejemplos
curl -X POST 'https://os.utilia.ai/api/external/v1/errors/report' \
-H 'Content-Type: application/json' \
-H 'X-Api-Key: utl_xxx' \
-d '{
"message": "Connection timeout to payment gateway",
"module": "payment-processor",
"severity": "critical",
"stack": "Error: Connection timeout\n at PaymentGateway.charge (/app/src/payments.ts:45)",
"endpoint": "/api/payments/charge",
"method": "POST",
"context": {
"gatewayId": "stripe",
"orderId": "order-456"
}
}'Listar los errores
/api/external/v1/errorsErrores registrados de esta aplicación, con filtros opcionales. Permiso: analytics:errors:read.
Parámetros de consulta
- severitystring[]
- Filtra por gravedad: critical, high, medium o low (admite varias)
- modulestring
- Filtra por módulo de origen
- resolvedboolean
- Filtra por si están resueltos o no
- limitnumber
- Número de resultados (de 1 a 200, por defecto 50)
- offsetnumber
- Cuántos resultados saltar, para paginar
- fromstring
- Fecha ISO de inicio, sobre la última vez que ocurrió
- tostring
- Fecha ISO de fin, sobre la última vez que ocurrió
Respuesta
{
"errors": [
{
"id": "err_1",
"hash": "a1b2c3d4e5f6...",
"message": "Connection timeout to payment gateway",
"module": "payment-processor",
"severity": "critical",
"file": "/app/src/payments.ts",
"line": 45,
"endpoint": "/api/payments/charge",
"count": 12,
"firstOccurrence": "2026-02-25T10:00:00.000Z",
"lastOccurrence": "2026-02-27T14:30:00.000Z",
"resolved": false,
"resolvedAt": null
}
],
"pagination": {
"total": 42,
"limit": 50,
"offset": 0
}
}Ejemplos
curl 'https://os.utilia.ai/api/external/v1/errors?severity=critical&severity=high&resolved=false&limit=20' \
-H 'X-Api-Key: utl_xxx'Estadísticas de errores
/api/external/v1/errors/statsEstadísticas agregadas de los errores de esta aplicación. Permiso: analytics:errors:read.
Respuesta
{
"total": 156,
"unresolved": 42,
"bySeverity": {
"critical": 5,
"high": 18,
"medium": 12,
"low": 7
},
"byModule": {
"payment-processor": 15,
"auth": 8,
"api-gateway": 19
},
"topErrors": [
{
"hash": "a1b2c3d4e5f6...",
"message": "Connection timeout to payment gateway",
"count": 34,
"severity": "critical"
}
]
}topErrors: los 10 errores sin resolver que más se repiten.
Ejemplos
curl 'https://os.utilia.ai/api/external/v1/errors/stats' \
-H 'X-Api-Key: utl_xxx'Errores frecuentes
400: cuerpo no válido (messageomodulevacíos,severityno admitida).401: falta la clave de API, no es válida o no es de una aplicación externa.403: falta el permisoanalytics:errors:*, la aplicación está desactivada, el origen no está permitido (CORS) o el plan no incluye Integraciones.429: se ha superado el límite por hora de la clave. La respuesta trae la cabeceraRetry-After.
Envía x-request-id en cada petición para poder seguirla en los registros.
Siguiente paso
Para los errores que se producen en el navegador de tus usuarios (SDK, widget o tu propia interfaz) usa Errores del navegador. Para revisarlos, resolverlos o convertirlos en ticket, abre la pestaña Errores de la aplicación.