FUVIHUBStrategic Intelligence
Public API reference · v1

/api/v1/* — referencia pública, sin humo

Esta es la lista real de endpoints, scopes y errores que shippeamos hoy. Si un endpoint está acá, existe en src/app/api/v1/**. Si no aparece, no existe — y no lo vamos a prometer.

Autenticación

Todas las llamadas a /api/v1/* van con un Bearer token (API key del workspace). Minteá tokens en /settings/api-keys.

curl -X POST https://app.fuvihub.com/api/v1/feedback \

  -H "Authorization: Bearer fb_live_xxxxxxxxxxxx" \

  -H "Content-Type: application/json" \

  -d '{"items":[{"externalId":"abc-1","source":"typeform","content":"..."}]}'

  • Header aceptado: Authorization: Bearer <key> o X-Api-Key: <key> (alias legacy).
  • Cada key tiene un tier técnico ( / / ) que determina rate limits y cuota de ingest. Ver §Rate limits.
  • Scopes son capability-based: cada endpoint pide un scope específico de la lista en §Scopes. Keys sin ese scope reciben 403.
  • Rotación: POST /settings/api-keys/:id/rotate (UI) o vía CLI. Grace window 24 h — la key vieja sigue válida.

Rate limits por tier

El tier de una key define dos cosas: rate por minuto y cuota mensual de ingest. Cada response incluye headers X-RateLimit-Limit, X-RateLimit-Remaining y X-RateLimit-Reset. En 429 llega Retry-After.

TierRate (request)Cuota mensualUso típico
Básica (1×)60 req/min · 1 req/s sostenido5.000 ingest / mesDev / staging / integraciones pequeñas. Incluido en Launch.
Intermedia (2×)120 req/min · 2 req/s sostenido25.000 ingest / mesIntegraciones productivas. Incluido en Operator + Strategic.
Avanzada (4×)240 req/min · 4 req/s sostenido100.000 ingest / mesIngest masivo + webhooks high-freq. Incluido en Strategic + Institutional.

Los números técnicos pueden ajustarse con acuerdo SLA en Institutional. Para upgrades temporarios, abrí ticket en enterprise@fuvihub.com.

Scopes (23 routed)

Al mintear una key, elegí solo los scopes que vayas a usar. El principio es least-privilege: keys de ingest no deberían poder leer reports, y viceversa.

ScopeEtiqueta UIDescripción
feedback:writeIngest structured signalsCreate signal records via POST /api/v1/feedback (compat endpoint name retained).
feedback:readRead signal recordsList structured signal records via GET /api/v1/feedback.
insights:readRead insightsList and retrieve generated intelligence insights.
alerts:readRead alertsList and retrieve prioritized alerts.
reports:readRead briefings / digestsList and retrieve strategic briefings (7d / 30d / 90d).
review:writeProcess curation queueCurate the classification and review queue.
schedules:readRead automation schedulesRead automation schedule configuration.
schedules:writeManage automation schedulesCreate, pause or delete automation schedules.
targets:readRead delivery endpointsRead configured delivery endpoints.
targets:writeManage delivery endpointsCreate, update or disable delivery endpoints.
billing:readRead plans & usageRead the workspace's usage snapshot and platform plan limits.
webhooks:readRead webhook subscriptionsList webhook subscriptions and their recent deliveries.
webhooks:writeManage webhook subscriptionsCreate, rotate, enable/disable, test and replay webhook subscriptions.
audiences:readRead audiences & segmentsList audiences and their criteria for dispatch segmentation.
audiences:writeManage audiences & segmentsCreate, update or archive audiences; rotate embed secrets.
embeds:readMint signed embed tokensMint a short-lived signed token to render a read-only audience snapshot.
packs:readDiscover vertical packsEnumerate the vertical packs (Voice / Radar / Commerce / Healthcare / Edu / Fintech / Retail / SaaS-SRE) available on this workspace.
intelligence:readRead intelligence briefsList and retrieve IntelligenceBrief rollups (Release 4 B).
intelligence:writeGenerate & publish intelligence briefsGenerate, draft, publish or archive an IntelligenceBrief.
policies:readRead the organization governance policyRead the single-source-of-truth OrganizationPolicy row (Release 4 G).
policies:writeUpdate the organization governance policyUpdate the organization governance policy (API key mint role, embed TTL ceiling, provisioning mode, brief publish role, …).
scim-groups:readRead SCIM group bindingsRead SCIM group bindings and member counts.
scim-groups:writeManage SCIM group bindingsCreate, update or archive SCIM group bindings (role and pack scoping).

Endpoints

Grupos por dominio. Click en el path para copiar. Todas las respuestas son JSON con envelope { data, meta, error }.

Ingest — escribir señales

Punto de entrada para pipelines externos (CRM, helpdesk, ETL). Idempotente por externalId. Alias de nombre legacy (feedback) preservado.

VerbPathScopeResumen
POST/api/v1/feedbackfeedback:writeInsertar 1..N señales. Batch up to 500 items/request.Responde 201 (todo OK) o 207 (aceptadas parciales). Rate limit por key: tier 1× = 60/min, 2× = 120/min, 4× = 240/min.
GET/api/v1/feedbackfeedback:readListar señales con filtros (source, createdAfter, cursor).

Insights & alertas — lectura de derivados

Rollups determinísticos computados por el motor de classify+insights. Todos los objetos traen confidence + evidence[].

VerbPathScopeResumen
GET/api/v1/insightsinsights:readListar insights con filtros (range, status, cursor).
GET/api/v1/alertsalerts:readAlertas priorizadas (severity ≥ configurada en pack).
GET/api/v1/scenariosinsights:readEscenarios de Radar con top opportunities + top risks.

Reports — briefs 7d/30d/90d

Briefings estratégicos generados por Intelligence Layer (determinísticos). Ver también /api/v1/intelligence/briefs.

VerbPathScopeResumen
GET/api/v1/reportsreports:readListar reports por rango temporal.
GET/api/v1/reports/:idreports:readRecuperar report específico con evidence[].
GET/api/v1/intelligence/briefsintelligence:readListar briefs v3 del workspace.
GET/api/v1/intelligence/briefs/:idintelligence:readRecuperar brief específico con signalIds citados.
POST/api/v1/intelligence/briefsintelligence:writeGenerar brief bajo demanda (rango + audiencia opcional).
PATCH/api/v1/intelligence/briefs/:idintelligence:writePublicar / archivar brief.

Review queue — curación

Queue de señales que quedaron en review (confidence < 0.7 o categoría ambigua).

VerbPathScopeResumen
POST/api/v1/reviewreview:writeDecisión (approve / reject / recategorize) sobre items.

Schedules — automatización

Schedules periódicos (digest, scanner, brief). Cada tick genera un JobRun auditado.

VerbPathScopeResumen
GET/api/v1/schedulesschedules:readListar schedules activos.
POST/api/v1/schedulesschedules:writeCrear schedule (cron + tipo + params).
GET/api/v1/schedules/:idschedules:readInspeccionar schedule con últimos JobRuns.
PATCH/api/v1/schedules/:idschedules:writePausar / reanudar / editar cron.
DELETE/api/v1/schedules/:idschedules:writeEliminar schedule (borra futuros JobRuns, preserva historia).

Delivery targets — canales salientes

Endpoints (email, slack, webhook) donde se despachan briefs y alertas.

VerbPathScopeResumen
GET/api/v1/targetstargets:readListar delivery targets.
POST/api/v1/targetstargets:writeCrear target (kind + config cifrada en reposo).
GET/api/v1/targets/:idtargets:readInspeccionar target con últimos eventos de entrega.
PATCH/api/v1/targets/:idtargets:writeEditar target (rotar secret, cambiar URL, habilitar/deshabilitar).
DELETE/api/v1/targets/:idtargets:writeArchivar target (no destructivo).

Audiences & embeds — segmentación + signed tokens

Audiencias con criteria + tokens firmados para embeber snapshots read-only en surfaces externas.

VerbPathScopeResumen
GET/api/v1/audiencesaudiences:readListar audiencias del workspace.
POST/api/v1/audiencesaudiences:writeCrear audiencia (criteria + embed settings).
GET/api/v1/audiences/:idaudiences:readDetalle de audiencia incluyendo criteria y embed secret status.
PATCH/api/v1/audiences/:idaudiences:writeEditar criteria, renombrar, archivar.
GET/api/v1/audiences/previewaudiences:readPreview del tamaño de una audiencia con criteria provisorios.
POST/api/v1/audiences/:id/embed-secretaudiences:writeRotar el secret HMAC del embed (grace window 24 h).
POST/api/v1/audiences/:id/embed-tokenembeds:readMint short-lived signed token para el embed.
POST/api/v1/embeds/eventsembeds:readRegistrar evento de uso del embed (para billing / telemetry).

Packs — discovery de verticales

Catalogo de los 8 packs verticales. Read-only.

VerbPathScopeResumen
GET/api/v1/packspacks:readEnumerar packs (voice/radar/commerce/fintech/healthcare/retail/edu/saas-sre).

Webhooks — subscriptions salientes

Subscripciones HMAC-firmadas a eventos del workspace. Delivery con reintentos + replay.

VerbPathScopeResumen
GET/api/v1/webhookswebhooks:readListar subscripciones del workspace.
POST/api/v1/webhookswebhooks:writeCrear subscripción (url + eventTypes[]).
GET/api/v1/webhooks/:idwebhooks:readDetalle de subscripción con scopes y health.
PATCH/api/v1/webhooks/:idwebhooks:writeEditar url, event types, enable/disable.
DELETE/api/v1/webhooks/:idwebhooks:writeRevocar subscripción (preserva historia de deliveries).
POST/api/v1/webhooks/:id/rotatewebhooks:writeRotar secret HMAC (grace window 24 h).
POST/api/v1/webhooks/:id/testwebhooks:writeDisparar evento de prueba (ping).
GET/api/v1/webhooks/:id/deliverieswebhooks:readPaginar deliveries recientes con status + response.
POST/api/v1/webhook-deliveries/:id/replaywebhooks:writeRe-ejecutar una delivery puntual (idempotente).

Governance — policies + SCIM groups

Gestión programática de la policy organizacional y de los bindings SCIM Group ↔ rol/packs.

VerbPathScopeResumen
GET/api/v1/policiespolicies:readLeer la policy (single row, versionada).
PATCH/api/v1/policiespolicies:writeActualizar policy (mint role, embed TTL, provisioning mode...).
GET/api/v1/scim-groupsscim-groups:readListar bindings SCIM Group → rol + packs.
POST/api/v1/scim-groupsscim-groups:writeCrear binding (groupExternalId → role).

Billing — usage snapshot

Read-only: snapshot de usage y plan del workspace (para dashboards internos).

VerbPathScopeResumen
GET/api/v1/usagebilling:readUsage actual del periodo + límites del plan.

Webhooks salientes

FUVIHUB emite eventos por HTTP POST firmados con HMAC-SHA256. El receptor verifica sin confiar en la red.

Headers entregados

  • X-Veil-Signature: `sha256=<hex>`. HMAC sobre el raw body con el secret de la subscripción.
  • X-Veil-Event-Id: identificador único; usalo para deduplicar.
  • X-Veil-Event-Type: ej. insight.created, alert.fired, brief.published.
  • X-Veil-Delivery-Attempt: número de intento (1..N). Reintentos con backoff exponencial, máx 5.

Verificación (Node.js)

import { createHmac, timingSafeEqual } from "node:crypto";

 

function verify(body, header, secret) {

const expected = createHmac("sha256", secret).update(body).digest("hex");

const received = header.replace(/^sha256=/, "");

const a = Buffer.from(expected, "hex");

const b = Buffer.from(received, "hex");

return a.length === b.length && timingSafeEqual(a, b);

}

Delivery guarantees

  • At-least-once: duplicá por X-Veil-Event-Id.
  • Timeout: 8 s (configurable vía PLATFORM_WEBHOOK_TIMEOUT_MS).
  • Reintentos: hasta 5 con backoff exponencial. Después queda dropped y es replay-ableable via POST /api/v1/webhook-deliveries/:id/replay.
  • Rotación de secret: grace window de 24 h. Durante ese tiempo ambos secrets son aceptados por el verificador.

Errores y códigos

Toda respuesta de error trae envelope { error: { code, message, details?, correlationId } }. El code es estable; la mensaje puede cambiar.

CodeHTTPSignificado
unauthorized401Bearer token ausente, inválido o revocado.
forbidden403Auth OK pero el scope requerido no está en la key.
not_found404Recurso no existe (o el actor no tiene visibilidad).
conflict409Duplicate externalId, versión stale, estado no permitido.
payload_too_large413Body > 1 MB (feedback) / > 128 KB (resto).
validation_failed422Body válido como JSON pero falla el schema Zod.
rate_limited429Sobre el rate de tu tier. Ver headers Retry-After + X-RateLimit-*.
quota_exceeded429Sobre el límite de ingestion del plan mensual.
internal_error500Bug del server. Queda en logs con correlationId.
method_not_allowed405Endpoint solo acepta otros verbos HTTP.

SDK y snippets

Hoy no publicamos un SDK como paquete npm — la API es lo suficientemente compacta para consumirla con fetch nativo. Si necesitás un SDK tipado, compartimos un cliente TypeScript interno bajo acuerdo en Strategic+ (pedílo a developers@fuvihub.com).

Ingestar un item

await fetch("https://app.fuvihub.com/api/v1/feedback", {
  method: "POST",
  headers: {
    Authorization: "Bearer " + API_KEY,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    items: [{
      externalId: "crm-123",
      source: "hubspot",
      content: "...",
      createdAt: new Date().toISOString(),
    }],
  }),
});

Leer briefs recientes

const res = await fetch(
  "https://app.fuvihub.com/api/v1/intelligence/briefs?range=7d",
  { headers: { Authorization: "Bearer " + API_KEY } },
);
const { data } = await res.json();
for (const brief of data) {
  console.log(brief.title, brief.confidence);
}

Algo no te cierra

Si un endpoint no responde como esperás, si falta algo que necesitás o si querés un scope nuevo — escribinos. Priorizamos pedidos con caso de uso real.