NorthTec AI API
API REST para integrar asistentes de IA conversacionales con RAG, validación de identidad y widgets embebidos.
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 |
Chat API
Endpoints para conversaciones con el asistente de IA.
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.
ntx-api-key
| 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.
{
"message": "Hola, necesito información sobre seguros de vida",
"conversationId": "conv_abc123"
}
{ "type": "start", "conversationId": "conv_abc123", "clientId": "client_xyz" }
{ "type": "delta", "conversationId": "conv_abc123", "text": "Hola, " }
{ "type": "tool_result", "name": "validate_identity", "call_id": "call_xxx", "output": {...} }
{ "type": "final", "conversationId": "conv_abc123", "assistant": "Hola, ¿en qué puedo ayudarte?" }
{ "type": "done", "conversationId": "conv_abc123" }
{ "type": "error", "conversationId": "conv_abc123", "message": "internal_error" }
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"}'
Sube el nivel de verificación de una conversación después de validar la identidad del usuario.
{
"conversationId": "conv_abc123",
"level": 2
}
| Nivel | Descripción |
|---|---|
| 0 | Sin verificación |
| 1 | Verificación básica |
| 2 | Identidad validada |
| 3 | Verificación adicional |
Widget API
Endpoints para el chat widget embebido en sitios web.
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.
ntx-embed-key
{
"conversationId": "conv_xyz789", // IMPORTANTE: pasar si existe en localStorage
"visitorId": "visitor_123", // opcional
"metadata": { // opcional
"page": "/productos",
"referrer": "google.com"
}
}
{
"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?"
}
}
| Límite | Default | Descripción |
|---|---|---|
| Por minuto | 20 | Máximo requests por minuto por embed key |
| Por día | 1000 | Máximo requests por día por embed key |
| Conversaciones nuevas | 50/5min | Máximo conversaciones nuevas en 5 minutos |
// 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."
}
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.
Chat streaming para widget. Funciona igual que /chat/stream pero con autenticación de widget.
ntx-embed-key
ntx-session-token
{
"message": "Quiero información sobre sus productos",
"conversationId": "conv_xyz789abc"
}
Obtiene mensajes de una conversación. Útil para clientes que no soportan SSE o para detectar mensajes de operadores.
ntx-session-token
| Parámetro | Tipo | Descripció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 |
{
"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 | Descripción |
|---|---|
active | Conversación activa |
closed | Cerrada por el usuario |
resolved | Cerrada por operador |
Finaliza la sesión del widget. Puede incluir feedback y rating del usuario.
{
"conversationId": "conv_xyz789",
"reason": "resolved", // opcional
"rating": 5, // opcional (1-5)
"feedback": "Excelente atención" // opcional
}
{
"ok": true,
"conversationId": "conv_xyz789",
"durationMs": 125000,
"messagesCount": 8
}
Documents API
Endpoints para indexar y gestionar documentos para RAG.
Indexa un documento en Pinecone para búsqueda RAG. Soporta PDF, DOCX, TXT y Markdown.
Authorization: Bearer {firebaseToken}
ntx-api-key
| Campo | Tipo | Descripción |
|---|---|---|
file |
File | Archivo a indexar requerido |
type |
string | Nombre/tipo del documento requerido |
productId |
string | ID del producto asociado opcional |
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"
Elimina un documento indexado de Pinecone, Storage y Firestore.
{
"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
Crea una nueva API key. La key solo se muestra una vez en la respuesta.
{
"name": "Production Key",
"allowedDomains": ["example.com", "*.example.com"],
"persona": {
"role": "advisor", // assistant | advisor | support | sales
"tone": "friendly", // professional | friendly | casual
"assistantName": "Sofia"
}
}
{
"ok": true,
"apiKey": "ntx_live_abc123...", // ¡Solo se muestra una vez!
"keyId": "key_xyz789"
}
Lista todas las API keys del usuario autenticado.
{
"ok": true,
"keys": [
{
"id": "key_abc123",
"name": "Production Key",
"prefix": "ntx_live_abc1...",
"status": "active",
"createdAt": "2026-01-15T10:00:00.000Z"
}
]
}
Revoca una API key. Esta acción es irreversible.
{ "keyId": "key_abc123" }
Embed Keys
Keys para widgets embebidos. Incluyen rate limiting y protección anti-abuso.
Crea una nueva Embed Key con rate limits configurables.
{
"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?"
}
}
{
"embedKey": "ntx_emb_abc123...", // ¡Solo se muestra una vez!
"keyId": "emb_xyz789",
"last7": "...c123"
}
Lista todas las Embed Keys con estadísticas de uso.
{
"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
| Estado | Descripción | Acció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ón | Acció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 |
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.
Crea una nueva WhatsApp Key con credenciales de Meta Business.
{
"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"
}
}
{
"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"
}
URL:
https://prod.northtec.io/webhook/whatsappVerify Token: El
webhookVerifyToken retornado
Lista todas las WhatsApp Keys con estadísticas de uso.
{
"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
}
]
}
Envía un mensaje de prueba para verificar la configuración.
{
"keyId": "wa_abc123",
"testNumber": "50688887777" // Sin el +
}
Rate Limits WhatsApp
| Límite | Default | Descripción |
|---|---|---|
messagesPerMinute | 30 | Mensajes por minuto (global) |
messagesPerDay | 5000 | Mensajes por día (global) |
messagesPerUserPerMinute | 5 | Por número de teléfono/min |
messagesPerUserPerHour | 50 | Por número de teléfono/hora |
clients/{userId}/alerts
con tipo whatsapp_key_abuse y severidad high.
Utilities
Valida una cédula costarricense usando la API del TSE.
{ "cedula": "113030227" }
{
"ok": true,
"cedula": "113030227",
"nombre": "JUAN CARLOS",
"apellido1": "PEREZ",
"apellido2": "GONZALEZ"
}