Un agente de Raíz habla con los contactos de tu organización, en llamadas telefónicas (voice) o en WhatsApp y el chat web (text). Esta guía crea un agente de texto con raiz.agents.create y luego lo lee, lo cambia y lo pone en un canal.
Antes de empezar
Necesitas una credencial de tu organización que tenga raiz:agents:write (consulta Autenticación). Los ejemplos leen una API key de ARBOL_API_KEY.
| Operación | Solicitud | Permisos (scopes), basta uno |
|---|---|---|
raiz.agents.create |
POST /v1/raiz/agents |
raiz:agents:write |
raiz.agents.get |
GET /v1/raiz/agents/{agentId} |
raiz:agents:read, raiz:agents:write |
raiz.agents.list |
GET /v1/raiz/agents |
raiz:agents:read, raiz:agents:write |
raiz.agents.update |
PATCH /v1/raiz/agents/{agentId} |
raiz:agents:write |
raiz.channels.update |
PATCH /v1/raiz/channels/{channelId} |
raiz:channels:write |
Cada una acepta una API key, un token de máquina o la sesión de una persona. Una API key necesita el scope entre los que se eligieron al crearla; el token de una persona cuenta solo hasta donde sus roles lo otorgan.
Crear el agente
Solo modality y name son obligatorios. Agrega instructions, language y timeZone para que el agente conozca su trabajo y hable en el idioma y la zona horaria correctos:
curl https://api.getarbol.com/v1/raiz/agents \
--request POST \
--header "Authorization: Bearer $ARBOL_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"modality": "text",
"name": "Recordatorios de citas",
"instructions": "Recuerdas a los pacientes de Example Clinic sus próximas citas y confirmas si van a asistir. Nunca das consejos médicos.",
"language": "es-CO",
"timeZone": "America/Bogota"
}'El cuerpo acepta solo los campos que declara su esquema; cualquier otro campo responde 400 INVALID_INPUT. Los opcionales:
| Campo | Significado |
|---|---|
instructions |
Qué hace el agente y cómo: su rol, lo que puede y no puede hacer, la información en la que se apoya. Hasta 100.000 caracteres. |
language |
Etiqueta de idioma BCP 47, como es-CO. |
timeZone |
Zona horaria IANA, como America/Bogota. |
firstMessage |
Agentes de voz: lo que dice el agente cuando se conecta una llamada. Los agentes de texto abren las conversaciones de WhatsApp con settings.greeting en su lugar. |
status |
active o paused. Un agente en pausa no responde nada ni hace llamadas. |
knowledgeDocumentIds |
Hasta 100 documentos de Conocimiento listos para consultar, de raiz.knowledge.list. |
integrationTools |
Hasta 200 pares de connectionId y tool: las herramientas de tus integraciones que el agente puede llamar. |
integrationSkills |
Agentes de texto: hasta 32 pares de connectionId y skill que publica una conexión. |
skills |
Hasta 32 procedimientos, solo para texto, de 256 KiB en total. |
settings |
Cómo se comporta el agente. Los ajustes de texto y de voz aplican solo a los agentes de esa modalidad. |
description |
Hasta 2000 caracteres. |
Una llamada exitosa responde 200 con el agente en data. La respuesta de abajo está abreviada: el objeto completo también lleva status, ready, settings, skills, integrationSkills y toolCount.
{
"success": true,
"data": {
"id": "agt_01jd8x5k2m7q9r3t6v8w0y4z1b",
"name": "Recordatorios de citas",
"modality": "text",
"version": 1,
"instructions": "Recuerdas a los pacientes de Example Clinic sus próximas citas y confirmas si van a asistir. Nunca das consejos médicos.",
"language": "es-CO",
"timeZone": "America/Bogota",
"firstMessage": null,
"description": null,
"synced": true,
"syncErrorCode": null,
"channelCount": 0,
"channels": [],
"knowledgeDocumentIds": [],
"integrationTools": [],
"createdAt": "2026-10-30T15:04:05Z",
"updatedAt": "2026-10-30T15:04:05Z"
},
"error": null,
"metadata": { "requestId": "3f6c2a8e-1b4d-4e7a-9c0f-5d2e8b1a7c64" }
}Guarda data.id: todas las demás operaciones sobre el agente lo reciben como agentId. Dos campos dicen en qué estado está el agente:
ready: si puede sostener conversaciones. Debe estaractivey tener instrucciones, y un agente de voz además debe estar publicado para llamadas.synced: si las llamadas ya usan la versión actual. Los agentes de voz se publican en segundo plano, así que revísalo después de cada cambio;syncErrorCodedice por qué falló la publicación. Siempre estrueen los agentes de texto.
Leerlo de nuevo
raiz.agents.get recibe agentId en la ruta de la URL y responde con la configuración completa del agente:
curl "https://api.getarbol.com/v1/raiz/agents/agt_01jd8x5k2m7q9r3t6v8w0y4z1b" \
--header "Authorization: Bearer $ARBOL_API_KEY"Para encontrar agentes, raiz.agents.list filtra por status, modality y q (el nombre, sin distinguir tildes ni mayúsculas), del más reciente al más antiguo:
curl "https://api.getarbol.com/v1/raiz/agents?modality=text&q=recordatorios" \
--header "Authorization: Bearer $ARBOL_API_KEY"Los agentes están en data.data, 25 por página por defecto; pasa data.pageInfo.nextCursor como cursor para la página siguiente. Consulta Paginación.
Actualizarlo
Indica agentId en la ruta y envía los campos que quieres cambiar y, como expectedVersion, la version que leíste:
curl https://api.getarbol.com/v1/raiz/agents/agt_01jd8x5k2m7q9r3t6v8w0y4z1b \
--request PATCH \
--header "Authorization: Bearer $ARBOL_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"expectedVersion": 1,
"instructions": "Recuerdas a los pacientes de Example Clinic sus próximas citas, confirmas si van a asistir y pasas al equipo las solicitudes de reprogramación. Nunca das consejos médicos."
}'- Los campos que omites se quedan como están, y
nullborra un campo que lo acepte. settings,integrationTools,integrationSkills,skillsyknowledgeDocumentIdsreemplazan el valor completo. Lee primero el agente y envía el valor nuevo completo; los ajustes que omitas vuelven a su valor por defecto.- Con
expectedVersion, el cambio se aplica solo si nadie cambió el agente desde que lo leíste. Si no, responde409 VERSION_CONFLICT: lee el agente de nuevo y vuelve a aplicar tu cambio. "status": "paused"hace que el agente deje de responder y de llamar.modalitysolo cambia mientras el agente no tenga canales ni una línea de voz publicada.
Ponerlo en un canal
Asigna el agente a un número de WhatsApp, un número de teléfono o un widget de chat web para que responda ahí. Encuentra el canal con raiz.channels.list y luego envía su id y el del agente a raiz.channels.update:
{
"channelId": "chn_01jd8x6b3c4d5e6f7g8h9j0k1m",
"agentId": "agt_01jd8x5k2m7q9r3t6v8w0y4z1b"
}La modalidad del agente debe corresponder al canal: texto para WhatsApp y chat web, voz para números de teléfono.
Errores
| Estado | Código | Qué hacer |
|---|---|---|
| 400 | INVALID_INPUT |
Corrige los campos de error.data.issues; cada path es un JSON Pointer a un campo rechazado. |
| 400 | AGENT_SKILLS_INVALID |
Las skills necesitan un agente de texto, nombres y rutas de recursos únicos, instrucciones no vacías y como máximo 256 KiB en total. |
| 403 | FORBIDDEN |
La credencial no tiene el scope que necesita la operación. |
| 409 | VERSION_CONFLICT |
Lee el agente de nuevo y vuelve a aplicar tu cambio. |
| 409 | AGENT_MODALITY_LOCKED |
El agente tiene canales o una línea de voz publicada. Crea un agente nuevo en su lugar. |
| 409 | EVAL_GATE_UNMET |
El agente tiene settings.evalGate activado: envía evalRunId, una ejecución de evaluación completada de exactamente este contenido en la que pasaron todos los casos. |
| 422 | INTEGRATION_TOOL_UNAVAILABLE, INTEGRATION_SKILL_UNAVAILABLE |
Una herramienta o skill no está en esa conexión, o Raíz no puede ejecutarla. Revisa account.connections.list. |
| 422 | KNOWLEDGE_DOCUMENT_UNAVAILABLE |
Un documento de Conocimiento no existe en esta organización. |
| 422 | AGENT_SETTINGS_INVALID |
Un ajuste no aplica a la modalidad del agente, o dos ajustes se contradicen. |
| 502 | OUTCOME_UNKNOWN |
Puede que el cambio se haya aplicado: lee el agente antes de repetirlo. |
Todo fallo lleva error.code, error.message, error.retryable y metadata.requestId. Consulta Respuestas y errores.