Volver API Documentation

NorthTec AI API

API REST para integrar asistentes de IA conversacionales con RAG, validación de identidad y widgets embebidos.

💬
Chat API
Streaming de respuestas en tiempo real con SSE. Soporta texto, imágenes y tools.
🔌
Widget API
Embebe un chat en tu sitio web. Sesiones temporales con soporte para operadores.
📚
RAG
Indexa documentos para que el asistente responda con tu información.
🔐
Admin API
Gestiona API keys, embed keys y configuración desde tu aplicación.

Base URL

https://prod.northtec.io
Ambiente URL
Production https://prod.northtec.io
Development http://localhost:8080

Authentication

La API utiliza diferentes métodos de autenticación según el tipo de endpoint.

Tipo Header Uso
API Key ntx-api-key: ntx_live_xxx Chat API principal
Embed Key ntx-embed-key: ntx_embed_xxx Widget init y stream
Session Token ntx-session-token: sess_xxx Widget (después de init)
Firebase Token Authorization: Bearer xxx Admin API
⚠️
Importante
Las API keys solo se muestran una vez al crearlas. Guárdalas de forma segura.

Chat API

Endpoints para conversaciones con el asistente de IA.

POST /chat/stream Chat con streaming

Envía un mensaje al asistente y recibe la respuesta en streaming via Server-Sent Events (SSE). Soporta texto, imágenes y ejecución de tools.

Authentication
🔑 Header: ntx-api-key
Request Body
Campo Tipo Descripción
message string Mensaje del usuario requerido*
imageUrl string URL de imagen requerido*
conversationId string ID de conversación existente opcional
uid string ID del usuario final opcional

* Al menos uno de message o imageUrl es requerido.

Ejemplo Request
{
  "message": "Hola, necesito información sobre seguros de vida",
  "conversationId": "conv_abc123"
}
SSE Events
start
Inicio del stream. Contiene conversationId y clientId.
{ "type": "start", "conversationId": "conv_abc123", "clientId": "client_xyz" }
delta
Fragmento de texto de la respuesta (streaming).
{ "type": "delta", "conversationId": "conv_abc123", "text": "Hola, " }
tool_result
Resultado de la ejecución de un tool.
{ "type": "tool_result", "name": "validate_identity", "call_id": "call_xxx", "output": {...} }
final
Respuesta completa del asistente.
{ "type": "final", "conversationId": "conv_abc123", "assistant": "Hola, ¿en qué puedo ayudarte?" }
done
Fin del stream.
{ "type": "done", "conversationId": "conv_abc123" }
error
Error durante el procesamiento.
{ "type": "error", "conversationId": "conv_abc123", "message": "internal_error" }
Response Codes
200 OK 401 Unauthorized 403 Domain not allowed
Ejemplo cURL
curl -X POST https://prod.northtec.io/chat/stream \
  -H "Content-Type: application/json" \
  -H "ntx-api-key: ntx_live_your_key_here" \
  -d '{"message": "Hola"}'
POST /chat/auth Upgrade nivel de verificación

Sube el nivel de verificación de una conversación después de validar la identidad del usuario.

Request Body
{
  "conversationId": "conv_abc123",
  "level": 2
}
Niveles de Verificación
NivelDescripción
0Sin verificación
1Verificación básica
2Identidad validada
3Verificación adicional

Widget API

Endpoints para el chat widget embebido en sitios web.

💡
Flujo de Widget
1. Init 2. Stream 3. Messages (opcional) 4. End
POST /chat/widget/init Iniciar sesión de widget

Inicializa una sesión de widget. Retorna un sessionToken que debe usarse en las siguientes llamadas. IMPORTANTE: El widget debe guardar y reutilizar el conversationId para evitar crear múltiples conversaciones.

Authentication
🔑 Header: ntx-embed-key
Request Body
{
  "conversationId": "conv_xyz789",  // IMPORTANTE: pasar si existe en localStorage
  "visitorId": "visitor_123",      // opcional
  "metadata": {                       // opcional
    "page": "/productos",
    "referrer": "google.com"
  }
}
Response
{
  "sessionToken": "sess_abc123xyz789",
  "expiresIn": 3600,
  "conversationId": "conv_xyz789abc",
  "config": {
    "environment": "production",
    "type": "chat_embed",
    "scope": ["chat", "read"]
  },
  "assistant": {
    "name": "Sofia",
    "greeting": "¡Hola! ¿En qué puedo ayudarte?"
  }
}
Rate Limiting
LímiteDefaultDescripción
Por minuto20Máximo requests por minuto por embed key
Por día1000Máximo requests por día por embed key
Conversaciones nuevas50/5minMáximo conversaciones nuevas en 5 minutos
Response Codes
200 OK 401 Invalid embed key 403 Domain not allowed / Key paused 429 Rate limit exceeded
Errores de Rate Limit
// 429 - Demasiados requests por minuto/día
{
  "error": "rate_limit_exceeded",
  "retryAfter": 300  // segundos para reintentar
}

// 429 - Demasiadas conversaciones nuevas
{
  "error": "too_many_conversations",
  "message": "Demasiadas conversaciones nuevas. Intenta de nuevo en 5 minutos.",
  "retryAfter": 300
}

// 403 - Embed key pausada por abuso
{
  "error": "embed_key_paused",
  "message": "Esta clave ha sido pausada por actividad sospechosa."
}
⚠️
Guarda el conversationId y sessionToken
Crítico: Guarda conversationId en localStorage y pásalo en cada llamada a /init. Si no lo pasas, se crea una conversación nueva cada vez, lo cual puede activar la protección anti-abuso.
POST /chat/widget/stream Chat streaming (widget)

Chat streaming para widget. Funciona igual que /chat/stream pero con autenticación de widget.

Authentication
🔑 ntx-embed-key
🎫 ntx-session-token
Request Body
{
  "message": "Quiero información sobre sus productos",
  "conversationId": "conv_xyz789abc"
}
GET /chat/widget/messages Obtener mensajes (polling)

Obtiene mensajes de una conversación. Útil para clientes que no soportan SSE o para detectar mensajes de operadores.

Authentication
🎫 Header: ntx-session-token
Query Parameters
ParámetroTipoDescripción
conversationId string ID de la conversación requerido
after number Timestamp en ms (solo mensajes después) opcional
limit number Máximo de mensajes (default: 50) opcional
Response
{
  "ok": true,
  "conversationId": "conv_xyz789",
  "manualMode": false,
  "status": "active",  // "active" | "closed" | "resolved"
  "messages": [
    {
      "role": "user",
      "text": "Hola",
      "createdAt": "2026-01-26T10:30:00.000Z"
    },
    {
      "role": "assistant",
      "text": "¡Hola! ¿En qué puedo ayudarte?",
      "createdAt": "2026-01-26T10:30:02.000Z"
    }
  ]
}
Status Values
StatusDescripción
activeConversación activa
closedCerrada por el usuario
resolvedCerrada por operador
POST /chat/widget/end Finalizar sesión de widget

Finaliza la sesión del widget. Puede incluir feedback y rating del usuario.

Request Body
{
  "conversationId": "conv_xyz789",
  "reason": "resolved",           // opcional
  "rating": 5,                       // opcional (1-5)
  "feedback": "Excelente atención"  // opcional
}
Response
{
  "ok": true,
  "conversationId": "conv_xyz789",
  "durationMs": 125000,
  "messagesCount": 8
}

Documents API

Endpoints para indexar y gestionar documentos para RAG.

POST /indexGeneral Indexar documento

Indexa un documento en Pinecone para búsqueda RAG. Soporta PDF, DOCX, TXT y Markdown.

Authentication
🔑 Authorization: Bearer {firebaseToken}
🔑 ntx-api-key
Request (multipart/form-data)
CampoTipoDescripción
file File Archivo a indexar requerido
type string Nombre/tipo del documento requerido
productId string ID del producto asociado opcional
Ejemplo cURL
curl -X POST https://prod.northtec.io/indexGeneral \
  -H "Authorization: Bearer {firebaseToken}" \
  -H "ntx-api-key: {apiKey}" \
  -F "file=@documento.pdf" \
  -F "type=manual-usuario"
DELETE /documents Eliminar documento

Elimina un documento indexado de Pinecone, Storage y Firestore.

Request Body
{
  "productId": "prod_123",
  "type": "manual-usuario"
}

Admin API

Endpoints para gestión de API keys y configuración. Requieren autenticación con Firebase ID Token.

API Keys

POST /api/keys/create Crear API Key

Crea una nueva API key. La key solo se muestra una vez en la respuesta.

Request Body
{
  "name": "Production Key",
  "allowedDomains": ["example.com", "*.example.com"],
  "persona": {
    "role": "advisor",      // assistant | advisor | support | sales
    "tone": "friendly",     // professional | friendly | casual
    "assistantName": "Sofia"
  }
}
Response
{
  "ok": true,
  "apiKey": "ntx_live_abc123...",  // ¡Solo se muestra una vez!
  "keyId": "key_xyz789"
}
GET /api/keys/list Listar API Keys

Lista todas las API keys del usuario autenticado.

Response
{
  "ok": true,
  "keys": [
    {
      "id": "key_abc123",
      "name": "Production Key",
      "prefix": "ntx_live_abc1...",
      "status": "active",
      "createdAt": "2026-01-15T10:00:00.000Z"
    }
  ]
}
POST /api/keys/revoke Revocar API Key

Revoca una API key. Esta acción es irreversible.

Request Body
{ "keyId": "key_abc123" }

Embed Keys

Keys para widgets embebidos. Incluyen rate limiting y protección anti-abuso.

POST /api/embed-keys/create Crear Embed Key

Crea una nueva Embed Key con rate limits configurables.

Request Body
{
  "name": "Chat Widget - Sitio Principal",
  "allowedDomains": ["example.com", "*.example.com"],
  "rateLimit": {
    "requestsPerMinute": 20,   // default: 20
    "requestsPerDay": 1000      // default: 1000
  },
  "persona": {
    "role": "assistant",
    "tone": "professional",
    "assistantName": "Sofia",
    "greeting": "¡Hola! ¿En qué puedo ayudarte?"
  }
}
Response
{
  "embedKey": "ntx_emb_abc123...",  // ¡Solo se muestra una vez!
  "keyId": "emb_xyz789",
  "last7": "...c123"
}
GET /api/embed-keys/list Listar Embed Keys

Lista todas las Embed Keys con estadísticas de uso.

Response
{
  "keys": [
    {
      "keyId": "emb_abc123",
      "name": "Chat Widget",
      "status": "active",           // "active" | "paused" | "revoked"
      "last7": "...abc123",
      "allowedDomains": ["example.com"],
      "rateLimit": {
        "requestsPerMinute": 20,
        "requestsPerDay": 1000
      },
      "usageCount": 1250,           // total de inits
      "conversationCount": 340,    // conversaciones únicas
      "lastUsedAt": "2026-01-26T10:30:00Z",
      "pauseReason": null,         // si está pausada, muestra razón
      "createdAt": "2026-01-15T..."
    }
  ]
}

Estados de Embed Key

EstadoDescripciónAcción
active Funcionando normalmente -
paused Pausada por abuso detectado Reactivar desde admin o POST /api/embed-keys/update
revoked Revocada permanentemente Crear una nueva

Protección Anti-Abuso

El sistema detecta patrones de abuso y toma acciones automáticas:

PatrónAcción
Excede rate limit por minuto Bloqueo temporal (5 minutos)
Excede rate limit por día Bloqueo hasta reset del día
+50 conversaciones nuevas en 5 min Strike #1: Bloqueo 5 min
3 strikes de abuso Pausa automática + Alerta al admin
💡
Alertas de Abuso
Cuando una key es pausada, se crea una alerta en clients/{userId}/alerts con tipo embed_key_abuse y severidad high.

WhatsApp Keys

Keys para integración con WhatsApp Business API. Incluyen rate limiting y protección anti-abuso.

POST /api/whatsapp-keys/create Crear WhatsApp Key

Crea una nueva WhatsApp Key con credenciales de Meta Business.

Request Body
{
  "name": "WhatsApp Principal",
  "phoneNumberId": "123456789012345",
  "businessAccountId": "987654321098765",
  "accessToken": "EAAxxxxxxxxxxxxxxx",
  "appSecret": "abc123def456ghi789",
  "rateLimit": {
    "messagesPerMinute": 30,     // default: 30
    "messagesPerDay": 5000,        // default: 5000
    "messagesPerUserPerMinute": 5, // default: 5
    "messagesPerUserPerHour": 50   // default: 50
  },
  "persona": {
    "role": "assistant",
    "tone": "friendly",
    "assistantName": "Sofia"
  }
}
Response
{
  "whatsappKey": "ntx_wa_abc123...",  // ¡Solo se muestra una vez!
  "keyId": "wa_xyz789",
  "last7": "...c123",
  "webhookVerifyToken": "abc123def456",  // Para configurar en Meta
  "webhookUrl": "https://prod.northtec.io/webhook/whatsapp"
}
⚠️
Configurar en Meta Business Suite
Después de crear la key, configura el webhook en Meta:
URL: https://prod.northtec.io/webhook/whatsapp
Verify Token: El webhookVerifyToken retornado
GET /api/whatsapp-keys/list Listar WhatsApp Keys

Lista todas las WhatsApp Keys con estadísticas de uso.

Response
{
  "keys": [
    {
      "keyId": "wa_abc123",
      "name": "WhatsApp Principal",
      "status": "active",
      "phoneNumberId": "123456789",
      "webhookVerifyToken": "abc123...",
      "webhookUrl": "https://prod.northtec.io/webhook/whatsapp",
      "rateLimit": { ... },
      "messageCount": 1250,
      "conversationCount": 89,
      "lastUsedAt": "2026-01-26T10:30:00Z",
      "pauseReason": null
    }
  ]
}
POST /api/whatsapp-keys/test Probar WhatsApp Key

Envía un mensaje de prueba para verificar la configuración.

Request Body
{
  "keyId": "wa_abc123",
  "testNumber": "50688887777"  // Sin el +
}

Rate Limits WhatsApp

LímiteDefaultDescripción
messagesPerMinute30Mensajes por minuto (global)
messagesPerDay5000Mensajes por día (global)
messagesPerUserPerMinute5Por número de teléfono/min
messagesPerUserPerHour50Por número de teléfono/hora
💡
Alertas de Abuso WhatsApp
Cuando una key es pausada, se crea una alerta en clients/{userId}/alerts con tipo whatsapp_key_abuse y severidad high.

Utilities

POST /api/client/cedula Validar cédula

Valida una cédula costarricense usando la API del TSE.

Request Body
{ "cedula": "113030227" }
Response
{
  "ok": true,
  "cedula": "113030227",
  "nombre": "JUAN CARLOS",
  "apellido1": "PEREZ",
  "apellido2": "GONZALEZ"
}