Skip to main content
POST
/
api
/
v2
/
agent
/
{agentId}
/
chat
curl -X POST https://app.horneross.com/api/v2/agent/ag_abc123/chat \
  -H "Authorization: Bearer sk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "¿Cuáles son los horarios de atención?",
    "conversationId": "conv_usuario_123",
    "contact": {
      "email": "cliente@ejemplo.com",
      "firstName": "María"
    }
  }'
{
  "answer": "Nuestros horarios de atención son de lunes a viernes de 9:00 a 18:00 horas.",
  "conversationId": "conv_usuario_123",
  "messageId": "msg_xyz789",
  "sources": [
    {
      "source": "FAQ - Horarios",
      "score": 0.95,
      "datasourceName": "Preguntas Frecuentes",
      "chunk": "Los horarios de atención al público son de lunes a viernes..."
    }
  ],
  "usage": {
    "promptTokens": 245,
    "completionTokens": 67,
    "totalTokens": 312
  },
  "metadata": {
    "model": "gpt-4o",
    "latency": 1234
  }
}
El endpoint de Chat es la forma principal de interactuar con tus agentes programáticamente.

Endpoint

POST /api/v2/agent/{agentId}/chat

Autenticación

Tipo de agenteAutenticación requerida
Agente privadoAuthorization: Bearer API_KEY
Agente públicoSolo visitorId en el body

Path Parameters

agentId
string
required
ID único del agente. Lo encontrás en el dashboard o en la URL del agente.

Headers

Authorization
string
required
Bearer token con tu API key. Formato: Bearer sk_live_xxx
Content-Type
string
required
Siempre application/json
Accept
string
Usar text/event-stream para respuestas en streaming

Request Body

query
string
required
Mensaje del usuario a enviar al agente.
conversationId
string
required
ID de la conversación. Usá el mismo ID para mantener el contexto entre mensajes.
visitorId
string
ID único del visitante/usuario. Requerido para agentes públicos.
streaming
boolean
default:"false"
Si es true, la respuesta se envía token por token via Server-Sent Events (SSE).
channel
string
default:"api"
Canal de origen del mensaje. Valores: api, website, whatsapp, widget, dashboard
contact
object
Datos del contacto para CRM.
filters
object
Filtros para limitar la búsqueda en datastores.
attachments
array
Archivos adjuntos al mensaje.
selectedModel
string
Override del modelo a usar. Valores: gpt-4o, gpt-4o-mini, claude-3-5-sonnet, gemini-1-5-pro
curl -X POST https://app.horneross.com/api/v2/agent/ag_abc123/chat \
  -H "Authorization: Bearer sk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "¿Cuáles son los horarios de atención?",
    "conversationId": "conv_usuario_123",
    "contact": {
      "email": "cliente@ejemplo.com",
      "firstName": "María"
    }
  }'

Response

answer
string
required
Respuesta generada por el agente.
conversationId
string
required
ID de la conversación (mismo que enviaste o uno nuevo si no existía).
messageId
string
required
ID único del mensaje generado.
sources
array
Fuentes de conocimiento utilizadas para generar la respuesta.
usage
object
Métricas de uso de tokens.
metadata
object
Información adicional sobre la respuesta.
{
  "answer": "Nuestros horarios de atención son de lunes a viernes de 9:00 a 18:00 horas.",
  "conversationId": "conv_usuario_123",
  "messageId": "msg_xyz789",
  "sources": [
    {
      "source": "FAQ - Horarios",
      "score": 0.95,
      "datasourceName": "Preguntas Frecuentes",
      "chunk": "Los horarios de atención al público son de lunes a viernes..."
    }
  ],
  "usage": {
    "promptTokens": 245,
    "completionTokens": 67,
    "totalTokens": 312
  },
  "metadata": {
    "model": "gpt-4o",
    "latency": 1234
  }
}

Streaming (SSE)

Para recibir la respuesta token por token en tiempo real, usá streaming: true:
const response = await fetch(
  'https://app.horneross.com/api/v2/agent/ag_abc123/chat',
  {
    method: 'POST',
    headers: {
      'Authorization': 'Bearer sk_live_xxx',
      'Content-Type': 'application/json',
      'Accept': 'text/event-stream',
    },
    body: JSON.stringify({
      query: 'Contame sobre tus productos',
      conversationId: 'conv_123',
      streaming: true
    }),
  }
);

const reader = response.body.getReader();
const decoder = new TextDecoder();

while (true) {
  const { done, value } = await reader.read();
  if (done) break;

  const chunk = decoder.decode(value);
  const lines = chunk.split('\n');

  for (const line of lines) {
    if (line.startsWith('data: ')) {
      const data = JSON.parse(line.slice(6));

      switch (data.type) {
        case 'token':
          process.stdout.write(data.value);
          break;
        case 'source':
          console.log('Fuente:', data.source);
          break;
        case 'done':
          console.log('\n--- Respuesta completa ---');
          break;
      }
    }
  }
}

Eventos SSE

EventoDescripción
tokenCada token de la respuesta
sourceFuente de conocimiento encontrada
tool_callHerramienta ejecutada por el agente
doneRespuesta completada
errorError durante el procesamiento

Agentes públicos (sin API key)

Para agentes con visibilidad pública, no necesitás API key pero sí visitorId:
curl -X POST https://app.horneross.com/api/v2/agent/ag_public123/chat \
  -H "Content-Type: application/json" \
  -d '{
    "query": "Hola, necesito ayuda",
    "conversationId": "conv_visitor_abc",
    "visitorId": "visitor_unique_id"
  }'

Listar conversaciones del agente

GET /api/v2/agent/{agentId}/conversations
visitorId
string
Filtrar por visitante. Requerido para agentes públicos.
limit
number
default:"10"
Cantidad de resultados. Máximo 50.
{
  "conversations": [
    {
      "id": "conv_abc123",
      "createdAt": "2024-01-21T10:00:00Z",
      "messagesCount": 5,
      "lastMessage": "Gracias por la ayuda",
      "status": "resolved"
    }
  ]
}

Errores comunes

CódigoErrorCausaSolución
401UNAUTHORIZEDAPI key inválidaVerificá tu API key en Settings → API Keys
404NOT_FOUNDAgent ID incorrectoVerificá el agentId en la URL del agente
400BAD_REQUESTFalta query o conversationIdIncluí los campos requeridos
429RATE_LIMIT_EXCEEDEDRate limit excedidoEsperá el tiempo indicado en retryAfter
500INTERNAL_ERRORError del servidorReintentá en unos segundos