Reference
API IQ Suite
REST · JSON · HTTPS only · API Keys per tenant · Webhooks salientes con HMAC.
Base URL: https://www.iqsuite.lat/v1Quick start
En menos de 2 minutos podés hacer tu primera llamada. El flujo es:
- Iniciá sesión en tu portal y andá a
/cliente/integraciones - Click
Crear API Key, ponele un nombre y elegí los scopes - Copiá el valor que empieza con
iqs_live_...(se muestra una sola vez) - Probala:
curlcurl https://www.iqsuite.lat/v1/me \
-H "X-API-Key: iqs_live_TUKEYAQUI"Si todo está OK vas a recibir tu tenant context:
json{
"tenant": {
"id": "a9d9...",
"name": "IQ Suite Demo",
"slug": "demo",
"type": "BARRIO",
"status": "ACTIVE",
"products": ["IQ_ENTRY", "IQ_VISIT", "IQ_ACCESS"]
},
"api_key": {
"prefix": "iqs_live_xxx",
"scopes": ["visitors.read"],
"rate_limit_per_min": 60
}
}Autenticación
Todas las requests requieren el header X-API-Key: iqs_live_.... Las keys se crean por tenant y se asocian a un set de scopes que limitan qué pueden hacer.
Scopes disponibles
| Scope | Permite |
|---|---|
| * | Acceso completo (cuidado al darlo) |
| visitors.read | Listar y leer visitantes |
| visitors.write | Crear, modificar, revocar visitantes |
| access-logs.read | Leer log de accesos |
| devices.read | Listar dispositivos y su estado |
| devices.command | Enviar comandos remotos (abrir barrera, etc) |
| subscriptions.read | Leer planes activos del tenant |
| webhooks.read | Leer subscripciones de webhooks |
| webhooks.write | Crear/modificar webhooks |
Errores de auth
401 Missing X-API-Key header— falta el header401 Invalid API key— key inválida, revocada o expirada403 Missing scope: ...— la key no tiene el scope requerido
Códigos de error
Todas las respuestas non-2xx devuelven JSON con un campo { "error": "..." }.
| Código | Significado |
|---|---|
| 400 | Bad request — body inválido o faltan campos |
| 401 | Unauthorized — API key faltante, inválida o expirada |
| 403 | Forbidden — falta scope o el recurso no es del tenant |
| 404 | Not found — recurso inexistente |
| 409 | Conflict — ya existe (slug duplicado, etc) |
| 429 | Rate limit excedido (ver siguiente sección) |
| 500 | Error interno — reintentar con backoff |
Rate limits
Cada API Key tiene un límite configurable (default: 60 req/min). Cuando se excede, recibís HTTP 429 y debés esperar antes de reintentar.
Para clientes enterprise con alto volumen el límite puede subirse hasta 10000 req/min editando la key desde el panel.
Visitors
/v1/visitors/v1/visitorsListar (GET /v1/visitors)
Query params:
limit1–100, default 25offsetdefault 0statusPENDING | ACTIVE | USED | EXPIRED | REVOKEDsite_idfiltrar por sitioqbúsqueda por nombre/dni/emailfrom/torango de created_at (ISO date)
curlcurl "https://www.iqsuite.lat/v1/visitors?limit=10&status=ACTIVE" \
-H "X-API-Key: iqs_live_..."Crear (POST /v1/visitors)
Body:
json{
"visitor_name": "Juan Pérez", // requerido
"site_id": "uuid", // requerido
"qr_type": "SINGLE_USE", // SINGLE_USE | TIME_WINDOW | RECURRING | PERMANENT
"visitor_dni": "30123456", // opcional
"visitor_email": "juan@example.com", // opcional
"visitor_phone": "+5491155667788", // opcional
"company_name": "Proveedor X", // opcional
"destination": "Oficina 302", // opcional
"valid_from": "2026-04-26T10:00:00Z", // requerido si TIME_WINDOW/RECURRING
"valid_until": "2026-04-26T18:00:00Z" // requerido si TIME_WINDOW/RECURRING
}Respuesta 201:
json{
"data": {
"id": "uuid",
"qr_code": "uuid",
"visitor_name": "Juan Pérez",
"status": "ACTIVE",
"..." : "..."
},
"qr_url": "https://iqsuite.lat/v/<qr_code>"
}Side effect: dispara el webhook visitor.created a todos los endpoints suscriptos.
Access Logs
/v1/access-logsQuery params adicionales: event_type, method, visitor_id, user_id.
curlcurl "https://www.iqsuite.lat/v1/access-logs?from=2026-04-01&event_type=GRANTED" \
-H "X-API-Key: iqs_live_..."Devices
/v1/devicesStatus posibles: ONLINE, OFFLINE, ERROR, UNLINKED, PRE_PROVISIONED.
curlcurl "https://www.iqsuite.lat/v1/devices?status=ONLINE" \
-H "X-API-Key: iqs_live_..."Webhooks salientes
Configurá un endpoint HTTPS en tu sistema y suscribite a eventos. IQ Suite te enviará un POST cada vez que ocurra el evento, firmado con HMAC-SHA256 usando un secret per-suscripción.
Eventos disponibles
visitor.created,visitor.updated,visitor.revokedaccess.granted,access.denieddevice.online,device.offline,device.command.executedpayment.succeeded,payment.failedincident.created,incident.resolvedsubscription.created,subscription.cancelled
Headers que recibís
POST https://tu-endpoint.com/iq-webhooks
Content-Type: application/json
User-Agent: IQSuite-Webhooks/1.0
X-IQ-Event: visitor.created
X-IQ-Signature: sha256=abc123...
X-IQ-Delivery-Id: uuid-...
X-IQ-Timestamp: 2026-04-25T17:24:12.591ZVerificar la firma (Node.js)
javascriptimport crypto from 'crypto'
import express from 'express'
const app = express()
app.use(express.raw({ type: 'application/json' }))
app.post('/iq-webhooks', (req, res) => {
const signature = req.headers['x-iq-signature']
const expected = 'sha256=' + crypto
.createHmac('sha256', process.env.IQ_WEBHOOK_SECRET)
.update(req.body)
.digest('hex')
if (signature !== expected) {
return res.status(401).send('invalid signature')
}
const event = JSON.parse(req.body.toString())
console.log(event.event, event.data)
// Procesar el evento aquí (push to Slack, save in SAP, etc)
res.status(200).send('ok')
})Verificar la firma (Python)
pythonimport hmac, hashlib, os
from flask import Flask, request, abort
app = Flask(__name__)
@app.post('/iq-webhooks')
def webhook():
signature = request.headers.get('X-IQ-Signature', '')
expected = 'sha256=' + hmac.new(
os.environ['IQ_WEBHOOK_SECRET'].encode(),
request.data,
hashlib.sha256,
).hexdigest()
if not hmac.compare_digest(signature, expected):
abort(401)
event = request.get_json()
# Procesar event['event'], event['data']
return ('', 200)Política de retries
Si tu endpoint responde algo distinto de 2xx, IQ Suite reintenta con backoff exponencial:
Intento 1: inmediato
Intento 2: +1 minuto
Intento 3: +5 minutos
Intento 4: +30 minutos
Intento 5: +2 horas
Intento 6: +12 horas
→ después marca DEAD_LETTERTras 10 fallos consecutivos en una suscripción, ésta queda paused automáticamente y el cliente debe reactivarla manualmente desde el panel.
SDKs
Próximamente publicamos SDKs oficiales para los lenguajes más comunes. Mientras tanto, cualquier HTTP client funciona — la API es estándar REST.
- Node.js / TypeScript —
@iqsuite/sdk(Q3 2026) - Python —
iqsuite(Q3 2026) - Go —
github.com/iqsuite/go-sdk(Q4 2026) - PHP —
iqsuite/php-sdk(Q4 2026)
¿Necesitás algo no documentado?
Contactanos para integraciones custom (SAP, Workday, OAuth SSO, módulos enterprise).
dev@iqsuite.lat →