Permisos y errores
Concede el mínimo privilegio y gestiona todos los códigos de error estables de la API pública.
Concede el mínimo privilegio y gestiona todos los códigos de error estables de la API pública.
Cada operación de la API pública requiere un permiso (scope) explícito. Una credencial válida que no tenga ese permiso recibe 403 insufficient_scope; nunca se amplía de forma silenciosa a un acceso más amplio.
Referencia de permisos#
| Permiso (scope) | Permite |
|---|---|
account:read | Leer la cuenta autenticada, el plan, los derechos de uso y el resumen del monedero |
tickets:read | Leer los tickets de soporte y sus mensajes |
tickets:write | Actualizar tickets, asignar compañeros de equipo y añadir notas internas o respuestas a clientes |
team:read | Leer los miembros del equipo, las invitaciones pendientes y los eventos de auditoría permitidos |
team:write | Crear o revocar invitaciones y gestionar los roles de los miembros del equipo que no son propietarios |
integrations:read | Consultar las instalaciones y los repositorios autorizados de GitHub App |
integrations:write | Preparar cambios de integración y crear pull requests en borrador |
sites:read | Listar y obtener sitios |
sites:write | Crear, actualizar, publicar, despublicar y eliminar sitios |
agents:read | Leer la configuración del agente |
agents:write | Actualizar el comportamiento, el idioma, la voz y la configuración de incrustación del agente |
knowledge:read | Listar las fuentes de conocimiento y las preguntas frecuentes |
knowledge:write | Crear, actualizar y eliminar fuentes de conocimiento y preguntas frecuentes |
conversations:read | Listar conversaciones y obtener sus mensajes |
conversations:write | Tomar el control de una conversación: responder a un visitante en nombre del negocio, pausar el agente en ella y devolvérsela |
leads:read | Listar los leads capturados |
leads:write | Crear, actualizar, calificar y aceptar leads en el embudo de oportunidades |
pipeline:read | Leer etapas, cuentas, oportunidades, actividades, atribución y el estado de sincronización del CRM |
pipeline:write | Configurar etapas; crear o actualizar oportunidades y cuentas; importar o reintentar resultados del CRM |
analytics:read | Leer los eventos de analíticas del sitio |
connectors:read | Listar el estado de los conectores sin devolver secretos |
connectors:write | Crear, actualizar, activar, desactivar y eliminar conectores |
domains:read | Eliminado. Se mantiene solo por compatibilidad; todas las rutas /domains devuelven 409 porque no se ofrecen dominios personalizados |
domains:write | Eliminado. Se mantiene solo por compatibilidad; todas las rutas /domains devuelven 409 |
broadcasts:read | Listar difusiones y el estado de entrega |
broadcasts:write | Crear borradores y poner en cola el envío de una difusión |
notifications:read | Listar las notificaciones del propietario |
notifications:write | Marcar notificaciones como leídas o no leídas |
monetization:read | Listar los productos de monetización |
monetization:write | Crear, actualizar, activar, desactivar y eliminar productos |
usage:read | Leer los eventos de uso medido |
webhooks:read | Listar los endpoints de webhook y el estado de entrega |
webhooks:write | Crear y eliminar endpoints de webhook |
Usa permisos de lectura para los trabajos de generación de informes. Añade un permiso de escritura solo cuando la integración realice esa modificación. Por ejemplo, una exportación de leads normalmente necesita sites:read y leads:read, no sites:write ni agents:write.
Fallos de permisos#
{
"error": {
"code": "insufficient_scope",
"message": "The API key does not grant the required scope.",
"details": { "required": ["sites:write"] },
"request_id": "6c0b2f2e-..."
}
}Añade el permiso que falta a la clave en Ajustes → Desarrollador → Editar, o crea una clave de reemplazo y actualiza el secreto del servidor. Al editar se cambian en el mismo lugar el nombre y los permisos de la clave; su caducidad y su token no cambian. Las claves emitidas mediante OAuth no se pueden editar; vuelve a conectar la aplicación para cambiar lo que se le concedió.
Estructura del error#
Todos los errores de la API usan la misma estructura de nivel superior:
type ApiError = {
error: {
code: string;
message: string;
details?: unknown;
request_id: string;
};
};Basa tu lógica en error.code, no en el message en inglés. Los mensajes pueden mejorar sin que cambie la versión. Registra error.request_id y el encabezado de respuesta x-request-id junto con el nombre de la operación, el estado y el número de reintento, pero nunca registres el encabezado de autorización ni los secretos de la solicitud.
Referencia de estados y códigos#
| HTTP | Código estable | Significado | Respuesta habitual |
|---|---|---|---|
400 | invalid_request | La validación falló o un campo no es compatible | Corrige los campos indicados en details; no reintentes con los mismos datos |
400 | invalid_json | El cuerpo no es un objeto JSON o contiene JSON no válido | Serializa un único objeto JSON válido |
401 | authentication_required | Falta el encabezado Bearer | Adjunta una credencial desde el servidor |
401 | invalid_api_key | La clave no es válida, ha caducado, se ha revocado o su propietario ya no existe | Sustituye o rota la clave |
403 | subscription_required | El propietario no tiene un plan de pago activo | Restablece la suscripción antes de reintentar |
403 | insufficient_scope | La credencial no tiene el permiso de la operación | Crea una credencial de reemplazo con el mínimo privilegio |
403 | account_paused | El acceso a la API está en pausa para la cuenta | Reanuda el acceso a la API o contacta con el propietario de la cuenta |
404 | not_found | No se encontró el endpoint o el recurso propio | Verifica la ruta y el ID perteneciente al tenant |
409 | conflict | El estado actual del recurso impide la acción | Consulta el estado actual antes de reintentar |
413 | payload_too_large | El cuerpo JSON supera el límite de 256 KB por solicitud | Envía un cuerpo más pequeño; divide los contenidos grandes en varias solicitudes |
415 | invalid_request | El cuerpo de la modificación no es application/json | Envía Content-Type: application/json |
429 | rate_limit_exceeded | Se agotó el límite del plan de la clave para el período de un minuto | Espera el tiempo indicado en Retry-After y aplica jitter |
500 | internal_error | No se pudo completar la solicitud | Reintenta una operación segura o idempotente e informa del ID de solicitud |
503 | outcome_unknown | Es posible que una modificación se haya completado, pero no se pudo registrar su resultado; details.retryable es false | No reintentes. Consulta el recurso para ver si el cambio se realizó; la misma clave de idempotencia seguirá devolviendo este resultado |
Los recursos que no pertenecen a la cuenta del propietario de la credencial pueden devolver 404 en lugar de revelar si existe el ID de otro tenant.
Detalles de validación#
La validación de campos devuelve rutas que puedes mostrar junto a tus propios controles de formulario:
{
"error": {
"code": "invalid_request",
"message": "Request validation failed.",
"details": [
{ "path": "content.headline", "message": "String must contain at least 1 character(s)" }
],
"request_id": "6c0b2f2e-..."
}
}Los cuerpos de las modificaciones deben ser objetos JSON. Se rechazan las matrices, los cuerpos vacíos, los datos de formulario y el JSON enviado con un tipo de contenido de texto.
Decisiones de reintento#
- Reintenta
429después del número de segundos indicado enRetry-After. - Reintenta
500solo en lecturas seguras o en escrituras protegidas por la mismaIdempotency-Key. - Reintenta el
409de idempotencia en curso después de su encabezadoRetry-After: 2. - Nunca reintentes
503 outcome_unknowna ciegas. Comprueba primero el recurso; usa una nueva clave de idempotencia solo después de confirmar que el cambio no se realizó. - No reintentes
400,401,403,404,413ni un conflicto de estado hasta que cambie la causa.
Consulta Límites de frecuencia para conocer el comportamiento del backoff y la Referencia de la API para ver el permiso requerido en cada operación.