Task Interface
Un endpoint. Lenguaje natural. El agente se encarga de todo lo demás.
El cambio
Las integraciones tradicionales te obligan a aprender endpoints, mapear campos, versionar esquemas y gestionar cada caso límite. El Chat Agent Gateway sustituye todo eso por comunicación agéntica. Describe lo que necesitas. El propio agente de SOIS interpreta tu intención, negocia los detalles, ejecuta en tu espacio de trabajo y responde con el resultado. Esta es la vía de acceso para quienes llaman sin una IA propia. Si ya tienes un agente, conéctalo directamente a través del servidor MCP.
Sin conectores. Sin middleware. Sin capa de automatización de terceros.
Autenticación
Cada mensaje requiere dos credenciales:
| Cabecera | Valor | Qué hace |
|---|---|---|
Authorization |
Bearer <token> |
Demuestra quién eres |
X-Api-Key |
sois_... |
Controla tu presupuesto, tu webhook y la firma |
¿Por qué dos? Tu token demuestra tu identidad. Tu clave controla el gasto. Si solo una de las dos se filtra, es inútil sin la otra. Un usuario puede tener varias claves con presupuestos distintos para integraciones distintas.
Obtén ambas en Settings dentro de tu espacio de trabajo Sois AI.
Enviar un mensaje
POST /api/agent
Headers
Authorization: Bearer <your_token>
X-Api-Key: sois_...
Content-Type: application/json
Body
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
message |
string | Sí | Dile al agente lo que necesitas, en lenguaje natural, hasta 10.000 caracteres |
context.entity_type |
string | No | Pista: contact, task, document, inbox, etc. |
context.entity_id |
string | No | Un registro concreto con el que trabajar |
context.action |
string | No | Pista: create, update, search, summarize |
metadata |
object | No | Cualquier dato clave-valor adicional para el agente |
Ejemplo
curl -X POST "https://your-workspace.sois.ai/api/agent" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "X-Api-Key: sois_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"message": "Create a contact for John Smith at Acme Corp, [email protected], +44 7700 900000",
"context": { "entity_type": "contact", "action": "create" }
}'
Respuesta 202 Accepted
{
"conversation_uuid": "6cafd8ba-dd51-4411-808e-671d1dd59561",
"status": "accepted",
"message": "Your request has been queued."
}
Tu mensaje está en el gateway. El agente toma el control a partir de aquí.
Recibir la respuesta
Tienes dos opciones: esperar el webhook o consultar la conversación.
Opción 1: Webhook (recomendada)
Si tu clave tiene una response_url, el agente entrega el resultado directamente cuando termina: firmado, verificado, sin polling.
POST https://your-app.com/webhook
Content-Type: application/json
X-Signature: <hmac_sha256>
X-Conversation-UUID: 6cafd8ba-...
Resolved:
{
"conversation_uuid": "6cafd8ba-...",
"status": "resolved",
"response": "Contact created: John Smith, Acme Corp, [email protected], +44 7700 900000."
}
Failed:
{
"conversation_uuid": "6cafd8ba-...",
"status": "failed",
"error": "An error occurred while processing your request."
}
Opción 2: Consultar la conversación
GET /api/agent/{conversation_uuid}
Authorization: Bearer <your_token>
X-Api-Key: sois_...
Respuesta 200 OK:
{
"conversation_uuid": "6cafd8ba-...",
"status": "resolved",
"turns": [
{
"role": "user",
"payload": { "message": "Find all contacts from London" },
"timestamp": "2026-02-12T01:07:03+00:00"
},
{
"role": "agent",
"payload": {
"content": "I found 12 contacts based in London..."
},
"timestamp": "2026-02-12T01:07:13+00:00"
}
],
"webhook": {
"status": "delivered",
"delivered_at": "2026-02-12T01:07:14+00:00"
},
"resolved_at": "2026-02-12T01:07:13+00:00",
"expires_at": "2026-02-13T01:07:03+00:00",
"created_at": "2026-02-12T01:07:03+00:00"
}
Estados de la conversación
| Estado | Qué está pasando |
|---|---|
open |
En el gateway, esperando al agente |
processing |
El agente está trabajando en ello |
resolved |
Terminado, la respuesta está en el último turn |
failed |
No se pudo completar tras los reintentos |
Verificación de las firmas de webhook
Cada webhook se firma con HMAC-SHA256 usando el signing secret de tu clave. Verifica siempre antes de procesar.
Python:
import hmac, hashlib
expected = hmac.new(
key=your_signing_secret.encode(),
msg=raw_request_body.encode(),
digestmod=hashlib.sha256
).hexdigest()
assert expected == request.headers['X-Signature']
Node.js:
const crypto = require('crypto');
const expected = crypto
.createHmac('sha256', signingSecret)
.update(rawBody)
.digest('hex');
if (expected !== req.headers['x-signature']) {
throw new Error('Invalid signature');
}
PHP:
$expected = hash_hmac('sha256', $rawBody, $signingSecret);
if (!hash_equals($expected, $request->header('X-Signature'))) {
abort(403, 'Invalid signature');
}
Ejemplos de conversaciones
El agente tiene acceso completo a tu espacio de trabajo Sois AI. Aquí tienes algunas cosas que puedes pedir:
Buscar:
{ "message": "Find all contacts from London" }
Crear:
{
"message": "Create a contact: Jane Doe, CEO of Acme Corp, [email protected]",
"context": { "entity_type": "contact", "action": "create" }
}
Correo:
{
"message": "Send an email to [email protected] introducing our new product line",
"context": { "entity_type": "inbox", "action": "compose" }
}
Tareas:
{
"message": "Create a task: Research competitor pricing for Q1 2026",
"context": { "entity_type": "task", "action": "create" }
}
Resumir:
{
"message": "Give me a full summary of this contact",
"context": { "entity_type": "contact", "entity_id": "abc-123", "action": "summarize" }
}
Multipaso:
{ "message": "Find the Q1 report, summarise it, and email the summary to the sales team" }
El agente negocia la ambigüedad. Si necesita buscar antes de poder actuar, busca. Si coinciden varios registros, elige el mejor y te dice por qué. Sin esquemas rígidos, solo intención.
Gestión de claves
Gestiona tus claves desde Settings > API Keys en tu espacio de trabajo Sois AI, o de forma programática.
Crear una clave
POST /api/api-keys
{
"label": "My CRM Integration",
"response_url": "https://your-app.com/webhook",
"budget_usd_cents": 5000,
"budget_period": "monthly"
}
La respuesta incluye tu clave (mostrada una sola vez, cópiala de inmediato) y tu signing secret para la verificación de webhooks.
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
label |
string | No | Un nombre para esta clave |
response_url |
url | No | Dónde entregar las respuestas de webhook |
budget_usd_cents |
integer | No | Tope de gasto en céntimos de dólar |
budget_period |
string | No | daily, monthly o total |
Gestionar claves
| Método | Endpoint | Descripción |
|---|---|---|
GET |
/api/api-keys |
Listar todas tus claves |
POST |
/api/api-keys |
Crear una clave nueva |
GET |
/api/api-keys/{id} |
Detalles de la clave y estadísticas de uso |
PUT |
/api/api-keys/{id} |
Actualizar la etiqueta, la URL del webhook o el presupuesto |
DELETE |
/api/api-keys/{id} |
Revocar una clave |
Controles de presupuesto
Las integraciones tradicionales te limitan con tasas arbitrarias: 100 solicitudes por minuto, 10.000 al día. El Chat Agent Gateway usa dólares.
Define un presupuesto por clave. El agente cobra credits por acción. Tú decides cuánto vale cada integración.
| Campo | Descripción |
|---|---|
budget_usd_cents |
Tope en céntimos de dólar (p. ej. 5000 = 50 $). null = ilimitado. |
budget_period |
daily se reinicia a medianoche, monthly se reinicia el día 1, total nunca se reinicia |
Cuando se supera un presupuesto, los mensajes devuelven 429 con una explicación clara, no un código de error críptico.
Errores
Cada error sigue el mismo formato:
{
"error": {
"code": "ERROR_CODE",
"message": "A clear, human-readable explanation."
}
}
| HTTP | Código | Qué pasó |
|---|---|---|
| 401 | UNAUTHENTICATED |
Token de acceso ausente o inválido |
| 401 | INVALID_API_KEY |
Clave ausente o inválida |
| 403 | KEY_OWNER_MISMATCH |
La clave no te pertenece |
| 403 | KEY_REVOKED |
Esta clave ha sido revocada |
| 404 | NOT_FOUND |
Conversación no encontrada o caducada |
| 422 | - | Error de validación (consulta el mensaje) |
| 429 | BUDGET_EXCEEDED |
Tu presupuesto se ha agotado, recarga o espera al reinicio |
Límites
| Qué | Límite |
|---|---|
| Longitud del mensaje | 10.000 caracteres |
| Caducidad de la conversación | 24 horas |
| Presupuesto | Por clave, tú decides |