IntegraTec

Inicia sesion para continuar

IntegraTec v2.3.0

-
Clientes
-
Activos
-
Dispositivos
-
Tuneles VPN

Clientes

-
Peers
-
En linea
-
Fuera de linea

WireGuard Peers

-
Dispositivos
-
En linea
-
Fuera de linea
-
Sin verificar

Monitoreo de Salud

WhatsApp — Servicio de Notificaciones

Verificando...

Usuarios

Mi Cuenta

-
Dispositivos
-
API Keys
-
VPN
-
req/min
Informacion del plan
Cargando...
Notificaciones

Reciba alertas cuando un dispositivo se desconecte o vuelva en linea.

Zona horaria

Las fechas y horas se muestran en esta zona horaria.

Estado de dispositivos
Cargando...
Actividad reciente
Cargando...

Mis API Keys

Mis Tuneles VPN

Dashboard

Estado de Dispositivos
Cargando...
-
Accesos vigentes
-
Permanentes
-
Temporales
-
Expirados
Expiran en 48h
Cargando...
Ultimos accesos creados
Cargando...
BLOQUEO DE EMERGENCIA ACTIVO — Todas las puertas bloqueadas

Panel de Puertas

Cargando...

Mis Dispositivos

QR Access

Generar QR de Acceso

Cargando...
Enviar QR al visitante (opcional)

Registros QR

Cargando...

Reportes

Reporte de Accesos
Reporte de Personas

Kioscos y Telefonia

Tablets
Centrales PBX
Camaras
Aqui se prende o apaga cada funcion de la tablet: asi se arman los planes.
La tablet entra como un telefono mas de la central del cliente.
Una camara es un dispositivo mas, de tipo camera. Cuenta contra el limite de dispositivos del cliente.

Camaras

Tome la imagen del momento para procesarla con su propio OCR. Desde su sistema es GET /camaras/{id}/snapshot con su API Key.

Bodycams

Equipos
En vivo / Mi VMS
Mapa
Grabaciones
Oficiales
Rondas
Geocercas
Eventos
El telefono se empareja con un codigo de 8 caracteres que vence a los 10 minutos y sirve una sola vez.
La bodycam entra en su sistema de video como una camara mas. Aqui esta la configuracion ya escrita: se copia y se pega. Nosotros no reemplazamos su VMS.
El visor es el usuario con el que su VMS se conecta. La clave se muestra una sola vez.
La línea es el recorrido del día. Los círculos son las geocercas: azul punto de ronda, morado zona sin audio, gris sitio.
Cada grabacion trae su acta: el acta recalcula la huella del archivo en el momento de pedirla, asi que si un solo bit cambio, se nota.
El video sin oficial no sirve de prueba. El oficial abre turno en el telefono con su carne y su PIN.
Un punto sin visita no es una falta automatica: el oficial pudo estar atendiendo algo. Pero deja de ser invisible.
Un circulo con nombre. Punto de ronda alimenta el reporte; zona prohibida hace que el telefono calle el audio — el video sigue.

Bitácora de acciones

Quién cambió qué y cuándo. Solo acciones que modifican algo; el cuerpo se muestra con contraseñas, secretos, PIN e imágenes ya ocultos.

Documentacion del API

Abrir Swagger UI ↗
Todos los endpoints requieren autenticacion: Authorization: Bearer <api_key>
Base URL:

Compatibilidad por Modelo

Funciones disponibles por tipo de dispositivo

Cargando...

Nota: Esta tabla se genera desde los perfiles del sistema. Al registrar un dispositivo, la API detecta el modelo y habilita solo las funciones compatibles.

Conceptos Generales

Errores, Rate Limiting, Webhooks
Formato de errores
Todos los errores retornan JSON con el campo detail:
// HTTP 400/401/403/404/429/502 { "detail": "Descripcion del error" } // Codigos comunes: // 400 - Datos invalidos o IP publica no permitida // 401 - Token faltante o invalido // 403 - Sin permisos o limite del plan alcanzado // 404 - Recurso no encontrado // 429 - Rate limit excedido // 502 - Dispositivo no responde o error ISAPI
Rate Limiting
Cada cliente tiene un limite de requests por minuto (default: 120/min). Los headers de respuesta incluyen:
X-RateLimit-Limit: 120 // Max requests por minuto X-RateLimit-Remaining: 98 // Requests restantes // Si excedes el limite: // HTTP 429 Too Many Requests // { "detail": "Rate limit exceeded. Try again later." }
Verificacion de Webhooks
Cada webhook incluye una firma HMAC-SHA256 en el header X-Integratec-Signature. Verifica asi:
# Python - verificar firma del webhook: import hmac, hashlib, json def verify_webhook(secret, body_bytes, signature): expected = hmac.new( secret.encode(), body_bytes, hashlib.sha256 ).hexdigest() return hmac.compare_digest(expected, signature) # En tu endpoint: signature = request.headers["X-Integratec-Signature"] is_valid = verify_webhook(webhook_secret, request.body, signature)
Eventos disponibles para webhooks — use * para todos.
EventoCuándo llega
access.eventAlguien pasó un QR, una tarjeta o su huella por un lector. Es el que dice quién entró. Llega a los pocos segundos.
door.open / door.closeLa puerta se abrió o cerró por orden del API. No cuando alguien pasa una credencial — para eso es access.event.
person.created / person.deletedAlta o baja de una persona en un equipo.
device.online / device.offlineUn equipo volvió o dejó de responder.
kiosk.online / kiosk.offlineLa tablet volvió o dejó de latir.
kiosk.alertaEl kiosco reportó un problema.
kiosk.identificacionSe leyó una cédula en el kiosco.
bodycam.panicoEl oficial apretó el botón de pánico.
bodycam.turno_abierto / bodycam.turno_cerradoEl oficial abrió o cerró turno.
bodycam.vivo_caidoCon turno abierto dejó de llegar video.
bodycam.almacenamiento_llenoSe acabó el espacio de grabación.
bodycam.geocercaUna bodycam entró o salió de una geocerca.
Cómo llega un aviso
POST su-url
Content-Type: application/json
X-Integratec-Signature: <HMAC-SHA256 del cuerpo crudo, en hex, con su secret>

{
  "event": "access.event",
  "data": {
    "device_id": "847ba887", "device_name": "BIOMETRICO QR", "door_no": 1,
    "card_no": "22558814", "employee_no": "22558814", "person_name": "Juan Perez",
    "granted": true, "resultado": "aceptado",
    "device_time": "2026-09-18T16:12:13-06:00",
    "timestamp":   "2026-09-18 22:12:13",
    "recibido_en": "2026-09-18 22:12:15",
    "major": 5, "minor": 1, "serial": 78, "verify_mode": "cardOrFace"
  }
}
Tres horas, a propósito: device_time es la del equipo con su zona, timestamp es esa misma en UTC y es la hora del acceso, y recibido_en es cuándo la captamos. Use timestamp.
Conteste 2xx. Si no, se reintenta 3 veces más (1 s, 5 s y 30 s). El tiempo de espera es de 10 s.
Para probar: POST /webhooks/{id}/test manda un evento al instante, y GET /webhooks/{id}/deliveries muestra el historial de entregas.

Dispositivos

6 endpoints
POST/devices
Registrar un nuevo dispositivo de seguridad.
{ "name": "Biometrico Lobby", "device_type": "hikvision", "ip_address": "192.168.1.100", "port": 80, "username": "admin", "password": "TU_PASSWORD", "location": "Entrada principal" }
GET/devices
Listar todos los dispositivos registrados.
GET/devices/{device_id}
Obtener informacion de un dispositivo por ID.
GET/devices/{device_id}/status
Verificar si el dispositivo esta en linea. Retorna modelo, serial y firmware.
POST/devices/{device_id}/scan
Escanear las capacidades del dispositivo. Retorna que operaciones soporta (user_search, card_search, events_search, door_control, event_stream, card_create, qr, door_count). Importante: Controladoras (DS-K2600) no soportan busqueda de personas/eventos; biometricos (DS-K1T) soportan todo.
DELETE/devices/{device_id}
Eliminar un dispositivo del registro.

HikVision - Personas

5 endpoints
POST/hikvision/{device_id}/persons
Agregar una persona al dispositivo. Asigna acceso a puertas con rango de fechas.
CampoTipoDescripcion
employee_nostringID alfanumerico (1-32 chars, sin especiales)
namestringNombre de la persona
user_typestring"normal" | "visitor" | "blackList" (default: normal)
door_rightstringPuertas con acceso, ej: "1" o "1,2" (default: 1)
valid_beginstringInicio de vigencia ISO 8601 (default: 2026-01-01T00:00:00)
valid_endstringFin de vigencia ISO 8601 (default: 2036-12-31T23:59:59)
max_open_door_timeintMax aperturas (0=ilimitado, 1=una sola vez)
{ "employee_no": "EMP001", "name": "Juan Perez", "user_type": "normal", "door_right": "1,2,3,4", "valid_begin": "2026-01-01T00:00:00", "valid_end": "2027-12-31T23:59:59", "max_open_door_time": 0 } // door_right: "1" = puerta 1, "1,2,3,4" = puertas 1 a 4
GET/hikvision/{device_id}/persons
Buscar personas registradas. Parametros: offset, limit. Nota: No disponible en controladoras DS-K2600 (notSupport).
PUT/hikvision/{device_id}/persons/{employee_no}
Actualizar datos de una persona (nombre, tipo, vigencia, puertas).
{ "name": "Juan Perez Rodriguez", "valid_end": "2028-12-31T23:59:59" }
DELETE/hikvision/{device_id}/persons/{employee_no}
Eliminar una persona del dispositivo.
POST/hikvision/{device_id}/persons/purge-expired
Eliminar todas las personas cuya vigencia ha expirado.

HikVision - Rostros

7 endpoints
Para agregar un rostro: primero cree una biblioteca de rostros, luego agregue el rostro con imagen (URL o archivo).
GET/hikvision/{device_id}/face-libraries
Listar todas las bibliotecas de rostros del dispositivo.
POST/hikvision/{device_id}/face-libraries
Crear una biblioteca de rostros en el dispositivo.
{ "name": "Empleados", "face_lib_type": "blackFD" }
POST/hikvision/{device_id}/faces
Agregar un rostro usando una URL de imagen.
CampoTipoDescripcion
employee_nostringID del empleado (debe existir como persona)
namestringNombre de la persona
face_urlstringURL de la imagen del rostro (JPG/PNG)
fdidstringID de la biblioteca de rostros (default: "1")
face_lib_typestringTipo de biblioteca (default: "blackFD")
{ "employee_no": "EMP001", "name": "Juan Perez", "face_url": "https://ejemplo.com/fotos/juan.jpg", "fdid": "1", "face_lib_type": "blackFD" }
POST/hikvision/{device_id}/faces/upload
Agregar un rostro subiendo el archivo de imagen directamente (multipart/form-data).
# curl ejemplo: curl -X POST "{BASE_URL}/hikvision/{device_id}/faces/upload" \ -H "Authorization: Bearer {API_KEY}" \ -F "employee_no=EMP001" \ -F "name=Juan Perez" \ -F "image=@/ruta/foto.jpg"
POST/hikvision/{device_id}/faces/search
Buscar rostros en una biblioteca. Parametros: fdid, offset, limit.
PUT/hikvision/{device_id}/faces/{employee_no}
Actualizar un registro de rostro (nombre o imagen).
DELETE/hikvision/{device_id}/faces/{employee_no}
Eliminar un rostro del dispositivo.

HikVision - Tarjetas

3 endpoints
POST/hikvision/{device_id}/cards
Asignar una tarjeta a una persona.
CampoTipoDescripcion
employee_nostringID del empleado (debe existir como persona)
card_nostringNumero de tarjeta
card_typestring"normalCard" | "hijackCard" | "superCard" (default: normalCard)
{ "employee_no": "EMP001", "card_no": "1234567890", "card_type": "normalCard" }
GET/hikvision/{device_id}/cards
Buscar tarjetas registradas. Parametros: offset, limit.
DELETE/hikvision/{device_id}/cards/{card_no}
Eliminar una tarjeta del dispositivo.

HikVision - Puertas y Sistema

5 endpoints
POST/hikvision/{device_id}/door
Abrir o cerrar una puerta de forma remota.
CampoTipoDescripcion
actionstring"open" | "close" | "alwaysOpen" | "alwaysClose"
door_nointNumero de puerta (default: 1)
// Abrir puerta 1: { "door_no": 1, "action": "open" } // Cerrar puerta 1: { "door_no": 1, "action": "close" }
GET/hikvision/{device_id}/door/{door_no}/params
Obtener configuracion de la puerta (nombre, tipo magnetico, duracion de apertura).
GET/hikvision/{device_id}/capabilities
Obtener capacidades generales del dispositivo (modelo, funciones soportadas, limites).
GET/hikvision/{device_id}/time
Obtener la hora y zona horaria del dispositivo.
GET/hikvision/{device_id}/access-control/capabilities
Capacidades de control de acceso: max usuarios, tarjetas, puertas, rostros soportados.

HikVision - Eventos

2 endpoints
POST/hikvision/{device_id}/events
Buscar eventos de acceso del dispositivo con filtros de fecha y tipo. Nota: No disponible en controladoras DS-K2600. Usar /events/stream como alternativa.
CampoTipoDescripcion
start_timestringFecha inicio ISO 8601 (ej: 2026-02-01T00:00:00)
end_timestringFecha fin ISO 8601
majorintTipo mayor: 0=todos, 1=alarma, 5=acceso (default: 0)
offsetintPaginacion: inicio (default: 0)
limitintPaginacion: cantidad (default: 100, max: 500)
{ "start_time": "2026-02-01T00:00:00", "end_time": "2026-02-28T23:59:59", "major": 5, "offset": 0, "limit": 100 }
GET/hikvision/{device_id}/events/stream
Leer alertas en tiempo real del dispositivo (streaming). Parametro: duration (segundos, 1-60, default: 10). Funciona en todos los dispositivos HikVision. Es la unica forma de obtener eventos en controladoras DS-K2600.

HikVision - QR Access

3 endpoints
POST/hikvision/multi/qr-access
Generar un QR de acceso y registrar la persona en multiples dispositivos a la vez. Usa door_right: "1,2,3,4" para acceso multi-puerta en controladoras.
CampoTipoDescripcion
device_idsstring[]Lista de IDs de dispositivos donde registrar
namestringNombre de la persona
valid_beginstringInicio de validez (ISO 8601)
valid_endstringFin de validez (ISO 8601)
door_rightstring"1" o "1,2,3,4" para multi-puerta (default: "1")
max_open_door_timeint0=ilimitado, 1=unico uso (default: 0)
access_typestring"single", "24h", "unlimited" (auto-derivado si se omite)
card_typestring"normalCard" (default) o "hijackCard" (coaccion: abre puerta + alarma silenciosa)
// QR normal { "device_ids": ["abc123", "def456"], "name": "Maria Lopez", "valid_begin": "2026-02-23T08:00:00", "valid_end": "2026-02-24T18:00:00", "door_right": "1,2,3,4", "max_open_door_time": 1 } // QR de COACCION (alarma silenciosa) { "device_ids": ["abc123"], "name": "Maria Lopez - Emergencia", "valid_begin": "2026-01-01T00:00:00", "valid_end": "2027-12-31T23:59:59", "door_right": "1", "card_type": "hijackCard" } // La puerta abre normalmente pero genera // evento alarma (major=1, minor=1028)
POST/hikvision/{device_id}/qr-access
Generar QR de acceso para un solo dispositivo. Mismos parametros que multi/qr-access (sin device_ids).
{ "name": "Visitante Juan", "valid_begin": "2026-02-23T08:00:00", "valid_end": "2026-02-23T18:00:00", "door_right": "1", "max_open_door_time": 1, "card_type": "normalCard" } // Retorna: { qr_base64, card_no, employee_no, ... } // card_type: "hijackCard" para codigo de coaccion
DELETE/hikvision/{device_id}/qr-access/{employee_no}
Revocar un acceso QR (elimina persona y tarjeta del dispositivo).

Codigo de Coaccion (hijackCard)

Cuando se usa card_type: "hijackCard", el QR funciona normalmente (abre la puerta) pero genera una alarma silenciosa en el controlador:

  • Evento de alarma: major=1, minor=1028 (Alarma de Coaccion)
  • La persona ingresa sin que el atacante sospeche
  • El evento se captura via alertStream y se almacena en la plataforma
  • Ideal para condominios: residente bajo amenaza presenta su QR de coaccion
  • La salida de alarma fisica (rele) se configura desde iVMS-4200 o la web del controlador

ZKTeco

6 endpoints
GET/zkteco/{device_id}/users
Listar todos los usuarios del dispositivo ZKTeco.
POST/zkteco/{device_id}/users
Agregar un usuario al dispositivo.
CampoTipoDescripcion
user_idstringID del usuario (ej: "EMP001")
namestringNombre del usuario
uidintUID interno (auto-asignado si vacio)
privilegeint0=Usuario, 2=Enroll, 6=Admin, 14=SuperAdmin (default: 0)
passwordstringContrasena (opcional)
cardintNumero de tarjeta (0=ninguna)
{ "user_id": "EMP001", "name": "Juan Perez", "privilege": 0 }
PUT/zkteco/{device_id}/users/{user_id}
Actualizar un usuario. Solo enviar campos a modificar.
{ "name": "Juan P. Rodriguez", "privilege": 6 }
DELETE/zkteco/{device_id}/users/{user_id}
Eliminar un usuario.
GET/zkteco/{device_id}/attendance
Obtener registros de asistencia/acceso.
POST/zkteco/{device_id}/door/unlock
Desbloquear la puerta del dispositivo.
{ "duration": 5 }

Reportes

3 endpoints
GET/reports/access
Obtener registros de acceso de todos los dispositivos del cliente.
Query ParamTipoDescripcion
from_datestringFecha inicio ISO 8601 (default: hoy 00:00)
to_datestringFecha fin ISO 8601 (default: ahora)
device_idstringFiltrar por dispositivo especifico
limitintMax registros (default: 500)
GET /reports/access?from_date=2026-02-01T00:00:00&to_date=2026-02-28T23:59:59&limit=100
GET/reports/access/csv
Descargar registros de acceso en formato CSV.
GET/reports/summary
Resumen rapido de la cuenta (dispositivos, eventos recientes).

Webhooks

5 endpoints
Los webhooks envian notificaciones HTTP a tu servidor cuando ocurren eventos (apertura de puerta, nuevo acceso, etc).
POST/webhooks
Registrar un webhook. Retorna el secret para verificar firmas (se muestra una sola vez).
CampoTipoDescripcion
urlstringURL HTTPS destino (no permite localhost ni IPs privadas)
eventsstring[]Eventos a suscribir (default: ["*"] = todos)
{ "url": "https://mi-servidor.com/webhook", "events": ["door.open", "access.event"] } // events: ["*"] para recibir todos
GET/webhooks
Listar mis webhooks.
PUT/webhooks/{webhook_id}
Actualizar un webhook (URL, eventos, estado).
DELETE/webhooks/{webhook_id}
Eliminar un webhook.
POST/webhooks/{webhook_id}/test
Enviar un evento de prueba al webhook.

Mi Cuenta (Self-Service)

7 endpoints
GET/account/info
Obtener perfil, limites del plan y uso actual.
POST/account/api-keys
Crear una API key nueva (la key completa se muestra una sola vez).
{ "name": "produccion" } // Retorna: { "id", "name", "key_prefix", "api_key", "is_active", "created_at" }
GET/account/api-keys
Listar mis API keys (sin mostrar el valor).
DELETE/account/api-keys/{key_id}
Revocar una API key.
PUT/account/devices/{device_id}
Actualizar nombre, IP, puerto, credenciales o ubicacion de un dispositivo. Solo enviar campos a modificar.
{ "name": "Biometrico Recepcion", "ip_address": "192.168.1.101", "location": "Recepcion" } // IP debe ser privada (10.x, 172.16-31.x, 192.168.x)
POST/account/peers
Solicitar un nuevo peer VPN (dentro del limite del plan). Retorna private key y config MikroTik una sola vez.
{ "name": "Oficina Central", "lan_subnet": "192.168.30.0/24" }
GET/account/peers
Listar mis peers VPN con estado en vivo.

QR (Generador standalone)

2 endpoints
POST/qr/generate
Generar una imagen QR como base64. No requiere autenticacion.
{ "code": "HELLO123", "size": 10 }
POST/qr/generate/image
Generar imagen QR como PNG directamente (Content-Type: image/png).