Hacer peticiones con una clave
Dónde va la clave, cómo comprobar que funciona, qué rutas puedes llamar con ella y qué se comprueba en cada petición.
Actualizado el . 5 min de lectura
Incluido en todos los planes. Ver precios
Tu servidor envía la clave en cada petición y llama a las mismas rutas que usa la aplicación, en https://os.utilia.ai/api. Cada petición se comprueba de nuevo: si revocas la clave o cambias los permisos de su persona responsable, la petición siguiente ya lo nota. Si todavía no tienes la clave, empieza por Claves de API de la organización.
Dónde va la clave
Envía la clave en la cabecera Authorization, con Bearer delante, en cada petición:
Authorization: Bearer utk_…No vale en la dirección ni en la cabecera X-Api-Key: ahí no autentica. Y solo desde un servidor: si la petición lleva las cabeceras Origin o Sec-Fetch-Site, que pone un navegador, UTILIA OS la rechaza.
Comprobar que funciona
Para saber que la clave está bien puesta, pregúntale quién es:
/api/v2/organization-api-keys/currentDatos de la clave que llama: persona responsable, permisos efectivos, caducidad y cupo que le queda esta hora. Solo responde a una clave; con la sesión de una persona, 403 API_KEY_REQUIRED.
curl 'https://os.utilia.ai/api/v2/organization-api-keys/current' \
-H "Authorization: Bearer $UTILIA_API_KEY"Si la clave funciona, recibes un 200 como este:
{
"id": "cm2k8x0ab0001qz7f3d4e5f6g",
"name": "Cuadro de mando de ventas",
"keyPrefix": "utk_Ab12Cd34",
"responsibleUser": {
"id": "cm1z9y8xw0000ab12cd34ef56",
"firstName": "María",
"lastName": "García",
"email": "maria@tuempresa.com"
},
"permissionMode": "RESTRICTED",
"moduleAccess": ["crm:read", "finance:read"],
"effectivePermissions": [
{ "moduleKey": "crm", "label": "CRM", "read": true, "write": false },
{ "moduleKey": "finance", "label": "Finanzas", "read": true, "write": false }
],
"expiresAt": null,
"rateLimitPerHour": 1000,
"rateLimitRemaining": 998,
"rateLimitResetAt": "2026-10-21T11:00:00.000Z",
"usedPreviousKey": false,
"previousKeyExpiresAt": null
}- permissionMode'ALL' | 'READ_ONLY' | 'RESTRICTED'obligatorio
- Todos los permisos, Solo lectura o Restringido.
- moduleAccessstring[]obligatorio
- Solo con RESTRICTED: un acceso por módulo, 'modulo:read' o 'modulo:write'. Vacío en los otros dos modos.
- effectivePermissionsobject[]obligatorio
- Lo que la clave puede hacer hoy en cada módulo, después de cruzar los permisos de la persona, lo marcado en la clave y el plan.
- expiresAtstring | nullobligatorio
- Fecha de caducidad en ISO 8601, o null si no caduca.
- rateLimitRemainingnumber | nullobligatorio
- Peticiones que le quedan a la clave en la hora en curso; null si no se puede saber en ese momento.
- rateLimitResetAtstringobligatorio
- Cuándo se renueva el cupo: al empezar la hora siguiente.
- usedPreviousKeybooleanobligatorio
- true si la petición entró con la clave anterior de una renovación que todavía está en transición.
- previousKeyExpiresAtstring | nullobligatorio
- Hasta cuándo vale la clave anterior de una renovación en transición, o null si no hay ninguna.
Esta ruta cuenta como una petición más de tu cupo. Si expiresAt trae una fecha, apúntala: cómo te avisa UTILIA OS antes de que llegue está en Caducidad, renovación y revocación.
Llamar a las rutas de la aplicación
Con la clave llamas a las mismas rutas que usa la aplicación. Por ejemplo, con «CRM: leer» lees tus clientes y con «CRM: escribir» das de alta uno nuevo:
curl 'https://os.utilia.ai/api/crm/clients?limit=20' \
-H "Authorization: Bearer $UTILIA_API_KEY"
curl -X POST 'https://os.utilia.ai/api/crm/clients' \
-H "Authorization: Bearer $UTILIA_API_KEY" \
-H 'Content-Type: application/json' \
-d '{"name": "Talleres Rivera"}'El cliente nuevo queda creado por la persona responsable de la clave, y su organización sale siempre de la clave, nunca del cuerpo de la petición.
Ten en cuenta dos cosas al elegir rutas:
- Son las rutas de la aplicación y cambian con ella. No tienen la versión ni el contrato estable de la API externa (
/api/external/v1). Para saber qué ruta usa una pantalla, ábrela con las herramientas de desarrollo de tu navegador y mira la pestaña Red. - Los SDK oficiales de JavaScript y Python son clientes de la API externa y no sirven con esta clave. Usa cualquier cliente HTTP, como en los ejemplos.
Qué se comprueba en cada petición
Cada petición pasa unos controles en orden, y el primero que falla la corta con su código. Los cinco primeros miran la clave:
Lo que se comprueba de la clave
Cabeceras de la petición
¿Llega desde un servidor?
Una petición con Origin o Sec-Fetch-Site viene de un navegador.Si no: 403 API_KEY_BROWSER_NOT_ALLOWED.
Authorization: Bearer
¿La clave es válida?
Existe, no está revocada y no ha caducado. Durante una renovación vale también la anterior.Si no: 401 API_KEY_INVALID, API_KEY_REVOKED o API_KEY_EXPIRED.
¿Su responsable sigue activa?
La persona en cuyo nombre actúa la clave sigue activa en la organización.Si no: 403 API_KEY_RESPONSIBLE_INACTIVE.
Plan de la organización
¿Integraciones está en el plan?
Si no: 403 MODULE_NOT_ENABLED.
¿Le queda cupo esta hora?
Si no: 429 RATE_LIMIT_EXCEEDED, con Retry-After.
Si la clave pasa, los tres últimos miran la ruta que llamas y a la persona responsable, igual que harían con ella en la aplicación:
Lo que se comprueba de la ruta
¿La ruta admite claves?
Fuera quedan la gestión de cuentas, claves y ajustes y las conexiones en tiempo real.Si no: 403 API_KEY_ROUTE_NOT_AVAILABLE.
Permisos de la clave
¿La clave incluye el permiso?
Lo que marcaste al crearla. Una escritura necesita un permiso de escritura.Si no: 403 API_KEY_PERMISSION_NOT_GRANTED.
Permisos y plan
¿Lo puede hacer la persona?
Sus permisos, las filas que puede ver y el plan del módulo.Si no: 403 API_KEY_RESPONSIBLE_PERMISSION_MISSING o MODULE_NOT_ENABLED.
Nada se guarda en memoria entre peticiones: revocar una clave, dar de baja a su responsable o quitarle un permiso surte efecto en la petición siguiente. Qué permite cada modo y qué queda fuera de cualquier clave está en Permisos de una clave.
Errores de una petición
Todos llegan con la forma común de los errores: decide con errorCode y guarda requestId. Los de permisos añaden permissions, la lista de permisos que faltan.
| errorCode | HTTP | Qué pasa y qué hacer |
|---|---|---|
API_KEY_INVALID | 401 | La clave no existe o está mal copiada. Revisa que vaya entera tras Authorization: Bearer. |
API_KEY_REVOKED | 401 | Está revocada. Crea otra. |
API_KEY_EXPIRED | 401 | Ha caducado. Una clave caducada no se renueva: crea otra. |
API_KEY_UNAVAILABLE | 401 | UTILIA OS no ha podido comprobar la clave en ese momento. Reintenta pasados unos minutos. |
API_KEY_BROWSER_NOT_ALLOWED | 403 | La petición viene de un navegador. Llama desde tu servidor. |
API_KEY_RESPONSIBLE_INACTIVE | 403 | La persona responsable ya no está activa. Quien gestiona las claves tiene que nombrar a otra. |
API_KEY_ROUTE_NOT_AVAILABLE | 403 | Esa ruta no admite claves. Hazlo desde UTILIA OS. |
API_KEY_STREAMING_NOT_AVAILABLE | 403 | Las conexiones de eventos en tiempo real no admiten claves. |
API_KEY_PERMISSION_NOT_GRANTED | 403 | La clave no incluye ese permiso. Amplíala o usa otra que lo tenga. |
API_KEY_RESPONSIBLE_PERMISSION_MISSING | 403 | La persona responsable no tiene ese permiso. Se arregla en sus permisos, no en la clave. |
API_KEY_ACTION_REQUIRES_SESSION | 403 | La acción pide la verificación en dos pasos de una persona. Hazla desde UTILIA OS. |
MODULE_NOT_ENABLED | 403 | El plan no incluye Integraciones o el módulo de la ruta. Reintentar no lo arregla. |
CAPABILITY_NOT_ENABLED | 403 | El plan no incluye la capacidad que usa la ruta. |
FEATURE_COMING_SOON | 403 | La función está en «Próximamente». |
ORGANIZATION_RESTRICTED | 403 | La organización está en modo restringido: no salen exportaciones ni descargas masivas. |
TENANT_SUSPENDED, TENANT_CANCELLED | 403 | La organización está suspendida o dada de baja. |
RATE_LIMIT_EXCEEDED | 429 | Cupo por hora agotado o demasiadas claves no válidas desde tu IP. Espera lo que diga Retry-After. |
De todos ellos, solo merece la pena reintentar API_KEY_UNAVAILABLE y RATE_LIMIT_EXCEEDED, con espera. Los demás no cambian por repetir la petición.
Siguiente paso
Ponlo en práctica
Lo encontrarás en Claves de API. Para abrirlo, entra con tu cuenta de UTILIA OS.