Referencia de API REST
Referencia completa de endpoints para la API de gestión de ShieldAgent. URL base: https://api.shieldagent.io
Autenticación
Todos los endpoints (excepto los marcados como públicos) requieren un token Bearer JWT en el encabezado Authorization. Los tokens se obtienen a través de /auth/login o /auth/signup.
curl https://api.shieldagent.io/tenants \
-H 'Authorization: Bearer <your-jwt>' \
-H 'Content-Type: application/json'Formato de Error
Todas las respuestas de error siguen una estructura JSON consistente. Los errores de validación (400) incluyen detalles a nivel de campo a través de Zod.
{
"error": "Validation failed",
"message": "Invalid request body",
"issues": [
{ "path": ["name"], "message": "Required" },
{ "path": ["riskTier"], "message": "Invalid enum value" }
]
}Paginación
Los endpoints de lista que soportan paginación aceptan parámetros de consulta limit y offset y retornan un objeto pagination:
{
"data": [ ... ],
"pagination": {
"total": 142,
"limit": 50,
"offset": 0,
"hasMore": true
}
}Autenticación
/auth/signupRegistra un nuevo tenant y usuario administrador. Devuelve un JWT.
Limitado a 5 solicitudes por minuto.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| body | string | yes | User email address | |
| password | body | string | yes | Minimum 8 characters |
| tenantName | body | string | yes | Organization name |
{
"email": "admin@acme.com",
"password": "<your-password>",
"tenantName": "Acme Corp"
}{
"token": "eyJhbGciOiJIUzI1NiIs...",
"user": { "id": "u_01abc...", "email": "admin@acme.com", "role": "tenant_admin" },
"tenant": { "id": "t_01xyz...", "name": "Acme Corp" }
}/auth/loginAutentica con email y contraseña. Devuelve un JWT.
Limitado a 10 solicitudes por minuto. Devuelve 403 con el error SSORequired si la cuenta usa SSO.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| body | string | yes | User email address | |
| password | body | string | yes | User password |
{
"email": "admin@acme.com",
"password": "<your-password>"
}{
"token": "eyJhbGciOiJIUzI1NiIs...",
"user": { "id": "u_01abc...", "email": "admin@acme.com", "role": "tenant_admin" },
"tenant": { "id": "t_01xyz...", "name": "Acme Corp" }
}/auth/meObtiene el perfil del usuario actualmente autenticado.
{
"id": "u_01abc...",
"email": "admin@acme.com",
"role": "tenant_admin",
"createdAt": "2026-01-15T10:30:00.000Z",
"tenant": { "id": "t_01xyz...", "name": "Acme Corp" }
}/auth/refresh-entitlementsRenueva el JWT con el nivel de plan y derechos actuales.
{
"token": "eyJhbGciOiJIUzI1NiIs...",
"user": { "id": "u_01abc...", "email": "admin@acme.com", "role": "tenant_admin" },
"tenant": { "id": "t_01xyz...", "name": "Acme Corp" }
}Tenants
/tenantsCrea una nueva organización tenant.
tenant:write| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| name | body | string | yes | Tenant display name |
| planTier | body | string | no | One of: free, team, starter, pro, business, enterprise_cloud, enterprise_onprem. Defaults to free. |
| kmsKeyId | body | string | no | Optional KMS key for envelope encryption |
{
"name": "Acme Corp",
"planTier": "pro"
}{
"id": "t_01xyz...",
"name": "Acme Corp",
"planTier": "pro",
"createdAt": "2026-04-24T12:00:00.000Z"
}/tenantsLista tenants. Los administradores de plataforma ven todos; el resto solo ve su propio tenant.
tenant:read[
{
"id": "t_01xyz...",
"name": "Acme Corp",
"planTier": "pro",
"createdAt": "2026-04-24T12:00:00.000Z"
}
]/tenants/:tenantIdObtiene un único tenant por ID.
tenant:read| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| tenantId | path | uuid | yes | Tenant UUID |
/tenants/:tenantIdActualiza campos del tenant.
tenant:write| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| tenantId | path | uuid | yes | Tenant UUID |
| name | body | string | no | Updated tenant name |
| planTier | body | string | no | New plan tier |
| kmsKeyId | body | string | no | Updated KMS key ID |
/tenants/:tenantIdElimina un tenant y todos los datos asociados.
tenant:write| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| tenantId | path | uuid | yes | Tenant UUID |
{ "deleted": true, "id": "t_01xyz..." }Usuarios
/tenants/:tenantId/usersLista los usuarios de un tenant con sus asignaciones de rol.
user:read| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| tenantId | path | uuid | yes | Tenant UUID |
[
{
"id": "u_01abc...",
"email": "admin@acme.com",
"role": "tenant_admin",
"active": true,
"createdAt": "2026-01-15T10:30:00.000Z"
}
]/tenants/:tenantId/users/inviteInvita a un nuevo usuario al tenant.
user:write| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| tenantId | path | uuid | yes | Tenant UUID |
| body | string | yes | Email address of the user to invite | |
| password | body | string | yes | Initial password (min 8 characters) |
| role | body | string | no | One of: tenant_admin, security_operator, auditor, aiops_engineer, viewer. Default: viewer |
{
"email": "analyst@acme.com",
"password": "<your-password>",
"role": "security_operator"
}{
"id": "u_02def...",
"email": "analyst@acme.com",
"role": "security_operator",
"active": true,
"createdAt": "2026-04-24T14:00:00.000Z"
}/tenants/:tenantId/users/:userIdActualiza el rol o el estado activo de un usuario.
user:write| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| tenantId | path | uuid | yes | Tenant UUID |
| userId | path | uuid | yes | User UUID |
| role | body | string | no | New role assignment |
| active | body | boolean | no | Set false to deactivate |
/tenants/:tenantId/users/:userIdElimina a un usuario del tenant. Los usuarios no pueden eliminarse a sí mismos.
user:delete| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| tenantId | path | uuid | yes | Tenant UUID |
| userId | path | uuid | yes | User UUID |
/rolesLista todos los roles disponibles con sus permisos.
[
{
"id": "role_01...",
"name": "security_operator",
"scope": "tenant",
"description": "Can triage incidents, manage alert rules, view audit logs",
"isSystem": true,
"permissions": ["incident:triage", "alert:write", "audit:read"]
}
]Agentes
/tenants/:tenantId/agentsRegistra un nuevo agente de IA. Devuelve una clave de agente para la autenticación del proxy.
agent:write| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| tenantId | path | uuid | yes | Tenant UUID |
| name | body | string | yes | Agent display name |
| description | body | string | no | Agent purpose description |
| riskTier | body | string | no | Initial risk tier: low, medium, high, critical |
| shadowMode | body | boolean | no | Start in shadow mode (log only, never block). Default: false |
{
"name": "code-assistant",
"description": "GitHub PR review agent",
"riskTier": "medium"
}{
"id": "agt_01HXYZ...",
"name": "code-assistant",
"agentKey": "eyJ...",
"riskTier": "medium",
"shadowMode": false,
"createdAt": "2026-04-24T12:00:00.000Z"
}/tenants/:tenantId/agentsLista todos los agentes de un tenant.
agent:read| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| tenantId | path | uuid | yes | Tenant UUID |
/tenants/:tenantId/agents/:agentIdObtiene un único agente con su configuración completa.
agent:read| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| tenantId | path | uuid | yes | Tenant UUID |
| agentId | path | uuid | yes | Agent UUID |
/tenants/:tenantId/agents/:agentIdActualiza los metadatos del agente (name, description, shadowMode, riskTier).
agent:write| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| tenantId | path | uuid | yes | Tenant UUID |
| agentId | path | uuid | yes | Agent UUID |
| name | body | string | no | Updated agent name |
| description | body | string | no | Updated description |
| shadowMode | body | boolean | no | Toggle shadow mode |
| riskTier | body | string | no | Updated risk tier |
/tenants/:tenantId/agents/:agentIdDa de baja a un agente y revoca su clave.
agent:delete| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| tenantId | path | uuid | yes | Tenant UUID |
| agentId | path | uuid | yes | Agent UUID |
{ "deleted": true, "id": "agt_01HXYZ..." }/tenants/:tenantId/agents/:agentId/rotate-keyRota la clave de API del agente. La clave anterior se revoca de inmediato.
agent:write{
"agentKey": "eyJ_NEW...",
"rotatedAt": "2026-04-24T12:00:00.000Z"
}/tenants/:tenantId/agents/:agentId/security-configConfigura los ajustes de detección de seguridad por agente.
agent:write| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| injectionDetectionEnabled | body | boolean | no | Enable ML injection detection |
| dlpEnabled | body | boolean | no | Enable DLP scanning |
| excessiveAgencyEnabled | body | boolean | no | Enable excessive agency detection |
| toolDriftEnabled | body | boolean | no | Enable tool drift monitoring |
/tenants/:tenantId/agents/:agentId/baseline-configConfigura los parámetros de aprendizaje de la línea base.
agent:write| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| warmupDays | body | integer | no | Days before drift detection activates (default: 7) |
| sensitivityMultiplier | body | number | no | Drift sensitivity (0.5–3.0, default: 1.0) |
/tenants/:tenantId/agents/:agentId/lockSuspende a un agente. Todas las llamadas a herramientas se bloquearán hasta que se desbloquee.
agent:write| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| reason | body | string | no | Reason for suspension (written to audit trail) |
/tenants/:tenantId/agents/:agentId/unlockReincorpora a un agente suspendido.
agent:write/tenants/:tenantId/agents/:agentId/baselineReinicia la línea base de comportamiento de un agente. La puntuación de desviación se reinicia desde cero.
agent:write{ "reset": true, "agentId": "agt_01HXYZ..." }Políticas
/tenants/:tenantId/policiesCrea una regla de política para un tenant, agente o herramienta.
policy:write| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| tenantId | path | uuid | yes | Tenant UUID |
| agentId | body | uuid | no | Scope to a specific agent (omit for tenant-wide) |
| toolName | body | string | yes | Tool pattern to match (supports wildcards) |
| action | body | string | yes | allow, deny, or shadow |
| conditions | body | object | no | Optional condition object (method, path, param matchers) |
| priority | body | integer | no | Evaluation priority (lower = first). Default: 100. |
{
"agentId": "agt_01HXYZ...",
"toolName": "rest:stripe",
"action": "deny",
"conditions": { "method": "DELETE" }
}{
"id": "pol_01...",
"toolName": "rest:stripe",
"action": "deny",
"conditions": { "method": "DELETE" },
"createdAt": "2026-04-24T12:00:00.000Z"
}/tenants/:tenantId/policiesLista las políticas activas de un tenant, opcionalmente filtradas por agente.
policy:read| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| tenantId | path | uuid | yes | Tenant UUID |
| agentId | query | uuid | no | Filter by agent |
/tenants/:tenantId/policies/:policyIdObtiene una única política por ID.
policy:read/tenants/:tenantId/policies/:policyIdReemplaza una regla de política.
policy:write/tenants/:tenantId/policies/:policyIdActualiza parcialmente una regla de política.
policy:write/tenants/:tenantId/policies/:policyIdElimina una regla de política.
policy:delete{ "deleted": true, "id": "pol_01..." }/tenants/:tenantId/policies/evaluateSimulación (dry-run): evalúa las políticas frente a una llamada a herramienta hipotética sin escribir en el rastro de auditoría.
policy:read| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| agentId | body | uuid | no | Agent UUID to evaluate against |
| toolName | body | string | yes | Tool name to test |
| params | body | object | no | Tool parameters |
{
"decision": "deny",
"matchedPolicy": { "id": "pol_01...", "toolName": "rest:stripe", "action": "deny" },
"reason": "Matched deny rule for DELETE on rest:stripe"
}/tenants/:tenantId/policies/templatesLista las plantillas de política integradas disponibles.
policy:readPlantillas de Políticas
/policy-templatesLista todas las plantillas de política integradas disponibles.
policy:read[
{
"id": "pii-protection",
"name": "PII Protection",
"description": "Block tool calls that expose PII fields",
"policyCount": 4
}
]/policy-templates/:templateIdObtiene una única plantilla con todas las definiciones de política.
policy:read| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| templateId | path | string | yes | Template slug (e.g. pii-protection) |
/tenants/:tenantId/policy-templates/:templateId/applyAplica una plantilla — crea todas sus políticas en el tenant.
policy:write| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| tenantId | path | uuid | yes | Tenant UUID |
| templateId | path | string | yes | Template slug |
| agentId | body | uuid | no | Scope policies to a specific agent (omit for tenant-wide) |
{
"templateName": "pii-protection",
"policiesCreated": 4,
"policyIds": ["pol_01...", "pol_02...", "pol_03...", "pol_04..."]
}/tenants/:tenantId/policy-templates/:templateId/removeElimina todas las políticas que se aplicaron desde una plantilla.
policy:delete{ "removed": 4, "templateName": "pii-protection" }/tenants/:tenantId/policy-templates/appliedLista las plantillas que se han aplicado a este tenant.
policy:readIncidentes
/tenants/:tenantId/incidentsLista incidentes con filtrado por estado, severidad y agente.
incident:read| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| status | query | string | no | Filter: open, investigating, resolved |
| severity | query | string | no | Filter: low, medium, high, critical |
| agentId | query | uuid | no | Filter by agent |
| limit | query | integer | no | Max results (default 50, max 500) |
| offset | query | integer | no | Pagination offset |
/tenants/:tenantId/incidentsAbre un nuevo incidente manualmente.
incident:write| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| agentId | body | uuid | no | Related agent |
| title | body | string | yes | Incident title |
| severity | body | string | yes | low, medium, high, or critical |
| type | body | string | no | injection, drift, policy_violation, anomaly, or manual |
| data | body | object | no | Arbitrary incident context data |
{
"id": "inc_01...",
"title": "Prompt injection detected",
"severity": "critical",
"status": "open",
"createdAt": "2026-04-24T12:00:00.000Z"
}/tenants/:tenantId/incidents/:incidentIdObtiene un único incidente con el contexto de auditoría completo.
incident:read/tenants/:tenantId/incidents/:incidentIdActualiza el estado o la severidad de un incidente.
incident:triage| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| status | body | string | no | open, investigating, or resolved |
| severity | body | string | no | Updated severity |
| resolution | body | string | no | Resolution notes (required when status = resolved) |
/tenants/:tenantId/incidents/countObtiene el recuento de incidentes agrupado por estado y severidad.
incident:read{
"total": 42,
"byStatus": { "open": 12, "investigating": 5, "resolved": 25 },
"bySeverity": { "critical": 3, "high": 8, "medium": 18, "low": 13 }
}/tenants/:tenantId/incidents/:incidentId/auditLista los eventos de auditoría vinculados a un incidente.
incident:readRastro de Auditoría
/tenants/:tenantId/auditLista eventos de auditoría con filtrado, paginación y prueba de Merkle opcional.
audit:read| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| agentId | query | uuid | no | Filter by agent |
| tool | query | string | no | Filter by tool name |
| outcome | query | string | no | Filter: allow, block, shadow |
| from | query | ISO8601 | no | Start timestamp |
| to | query | ISO8601 | no | End timestamp |
| limit | query | integer | no | Max results (default 100, max 1000) |
| offset | query | integer | no | Pagination offset |
{
"data": [
{
"id": "evt_01...",
"agentId": "agt_01HXYZ...",
"tool": "read_file",
"outcome": "block",
"riskScore": 0.87,
"decision": "injection_detected",
"timestamp": "2026-04-24T12:00:00.000Z",
"merkleHash": "sha256:abc123..."
}
],
"pagination": { "total": 1420, "limit": 100, "offset": 0, "hasMore": true }
}/tenants/:tenantId/audit/:eventIdObtiene un único evento de auditoría con el payload completo y la prueba de Merkle.
audit:read/tenants/:tenantId/audit/verifyVerifica la integridad Merkle de un lote de eventos de auditoría.
audit:read| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| eventIds | body | uuid[] | yes | Array of event IDs to verify |
{
"verified": true,
"checkedCount": 50,
"tamperDetected": false
}/tenants/:tenantId/audit/exportTransmite eventos de auditoría como NDJSON para exportación masiva.
audit:readLa respuesta se transmite en streaming. Content-Type: application/x-ndjson. Sin paginación — devuelve todos los eventos de la ventana.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| from | query | ISO8601 | no | Start timestamp (required) |
| to | query | ISO8601 | no | End timestamp (required) |
| format | query | string | no | ndjson or json (default: ndjson) |
Puntuación de Riesgo
/tenants/:tenantId/risk/scoresObtiene las puntuaciones de riesgo actuales de todos los agentes de un tenant.
risk:read{
"data": [
{
"agentId": "agt_01HXYZ...",
"agentName": "code-assistant",
"currentScore": 0.67,
"tier": "high",
"trend": "increasing",
"updatedAt": "2026-04-24T14:23:00Z"
}
]
}/tenants/:tenantId/risk/scores/:agentIdObtiene la puntuación de riesgo detallada con desglose por componente para un agente específico.
risk:read{
"agentId": "agt_01HXYZ...",
"currentScore": 0.67,
"tier": "high",
"components": {
"injectionScore": 0.12,
"toolDriftScore": 0.71,
"excessiveAgencyScore": 0.55,
"anomalyScore": 0.84,
"policyViolationRate": 0.03
},
"trend": "increasing",
"trendDelta": 0.14,
"updatedAt": "2026-04-24T14:23:00Z"
}/tenants/:tenantId/risk/scores/:agentId/historyObtiene el historial de puntuación de riesgo de un agente (ventana móvil de 24h por defecto).
risk:read| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| window | query | string | no | Time window: 1h, 6h, 24h, 7d (default: 24h) |
/tenants/:tenantId/risk/scores/:agentId/recalculateFuerza un recálculo inmediato de la puntuación de riesgo de un agente.
risk:write{
"agentId": "agt_01HXYZ...",
"previousScore": 0.67,
"newScore": 0.54,
"recalculatedAt": "2026-04-24T14:30:00Z"
}/tenants/:tenantId/risk/configObtiene la configuración de aplicación de riesgo del tenant.
risk:read{
"monitorThreshold": "<your-threshold>",
"blockThreshold": "<your-threshold>",
"autoLockThreshold": "<your-threshold>",
"humanReviewThreshold": "<your-threshold>"
}/tenants/:tenantId/risk/configActualiza los umbrales de aplicación de riesgo del tenant.
risk:write| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| monitorThreshold | body | number | no | Score at which monitoring alerts trigger (0.0–1.0) |
| blockThreshold | body | number | no | Score at which auto-block activates (0.0–1.0) |
| autoLockThreshold | body | number | no | Score at which agent is suspended (0.0–1.0) |
| humanReviewThreshold | body | number | no | Score at which human review is required (0.0–1.0) |
/tenants/:tenantId/risk/baselines/:agentIdObtiene la línea base de comportamiento de un agente.
risk:read/tenants/:tenantId/risk/baselines/:agentIdReinicia la línea base de comportamiento de un agente.
risk:write{ "reset": true, "agentId": "agt_01HXYZ..." }/tenants/:tenantId/risk/anomalies/analyzeEjecuta un análisis de anomalías sobre las últimas N horas de actividad del agente.
risk:read| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| agentId | body | uuid | no | Agent to analyze (omit for tenant-wide) |
| windowHours | body | integer | no | Lookback window (default: 24) |
{
"anomaliesDetected": true,
"results": [
{
"anomalyType": "tool_burst",
"anomalyScore": 0.91,
"explanation": "Agent called 47 tools in 60 seconds (4.2σ above baseline)"
}
]
}Cumplimiento
/tenants/:tenantId/compliance/checklistObtiene la postura de cumplimiento actual con análisis de brechas.
compliance:read/tenants/:tenantId/compliance/annex-iv/reportGenera un informe PDF del Anexo IV a partir del rastro de auditoría.
compliance:readLa respuesta se transmite en streaming. Content-Type: application/pdf. El PDF se genera a partir del rastro de auditoría inmutable con pruebas de integridad Merkle.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| periodStart | body | ISO8601 | yes | Report period start |
| periodEnd | body | ISO8601 | yes | Report period end |
| format | body | string | no | pdf or json (default: pdf) |
/tenants/:tenantId/compliance/reportsLista los informes de cumplimiento generados anteriormente.
compliance:read/tenants/:tenantId/compliance/snapshotsObtiene instantáneas de cumplimiento a lo largo del tiempo (para tendencias).
compliance:read| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| limit | query | integer | no | Max snapshots (default 30) |
/tenants/:tenantId/compliance/iso42001/gap-analysisAnálisis de brechas ISO 42001 frente al inventario de agentes.
compliance:read/tenants/:tenantId/compliance/nist-ai-rmf/gap-analysisAnálisis de brechas del NIST AI RMF (funciones Govern, Map, Measure, Manage).
compliance:read/tenants/:tenantId/compliance/regulatory-notificationsCrea un borrador de notificación de incidente regulatorio (Art. 73 de la Ley de IA de la UE).
compliance:write| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| incidentId | body | uuid | yes | Related incident UUID |
| notificationDeadline | body | ISO8601 | no | Regulatory deadline (auto-calculated from incident date if omitted) |
Alertas
/tenants/:tenantId/alerts/rulesLista las reglas de alerta.
alert:read/tenants/:tenantId/alerts/rulesCrea una regla de alerta.
alert:write| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| name | body | string | yes | Rule name |
| condition | body | string | yes | CEL condition expression (e.g. riskScore >= 0.70) |
| severity | body | string | yes | low, medium, high, or critical |
| channels | body | string[] | no | Delivery channels: webhook, email, slack |
| webhookUrl | body | string | no | Webhook delivery URL |
| agentId | body | uuid | no | Scope to a specific agent |
/tenants/:tenantId/alerts/rules/:ruleIdActualiza una regla de alerta.
alert:write/tenants/:tenantId/alerts/rules/:ruleIdElimina una regla de alerta.
alert:delete/tenants/:tenantId/alerts/eventsLista los eventos de alerta disparados.
alert:read| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| limit | query | integer | no | Max results (default 100, max 500) |
| from | query | ISO8601 | no | Start timestamp |
Servidores MCP
/tenants/:tenantId/mcp-serversRegistra un servidor MCP para escaneo y descubrimiento de herramientas.
mcp_server:write| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| name | body | string | yes | MCP server display name |
| url | body | string | yes | MCP server URL or stdio command |
| transport | body | string | no | http-sse or stdio (default: http-sse) |
| scanOnRegister | body | boolean | no | Run initial scan on registration (default: true) |
{
"id": "mcp_01...",
"name": "filesystem-server",
"url": "http://localhost:8080",
"transport": "http-sse",
"createdAt": "2026-04-24T12:00:00.000Z"
}/tenants/:tenantId/mcp-serversLista los servidores MCP registrados.
mcp_server:read/tenants/:tenantId/mcp-servers/:mcpServerIdObtiene un único servidor MCP con el inventario de herramientas.
mcp_server:read/tenants/:tenantId/mcp-servers/:mcpServerIdActualiza la configuración del servidor MCP.
mcp_server:write/tenants/:tenantId/mcp-servers/:mcpServerIdDa de baja a un servidor MCP.
mcp_server:delete{ "deleted": true, "id": "mcp_01..." }/tenants/:tenantId/mcp-servers/:mcpServerId/refresh-toolsRedescubre las herramientas del servidor MCP.
mcp_server:write{
"toolsDiscovered": 12,
"toolsAdded": 2,
"toolsRemoved": 0,
"refreshedAt": "2026-04-24T12:00:00.000Z"
}/tenants/:tenantId/mcp-servers/:mcpServerId/scanEjecuta un escaneo de seguridad sobre las herramientas del servidor MCP.
mcp_server:write{
"scanId": "scan_01...",
"status": "completed",
"vulnerabilities": 1,
"toolCount": 5,
"scanDuration": 1240
}/tenants/:tenantId/mcp-servers/:mcpServerId/scansObtiene el historial de escaneos de un servidor MCP.
mcp_server:read| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| limit | query | integer | no | Max results (default 20, max 100) |
/tenants/:tenantId/scansHistorial de escaneos a nivel de tenant en todos los servidores MCP.
mcp_server:read| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| limit | query | integer | no | Max results (default 50, max 200) |
Revisiones
Cola de revisión humana para llamadas de herramientas que requieren aprobación antes de ejecutarse.
/tenants/:tenantId/reviewsLista las revisiones pendientes con filtrado y paginación.
review:read| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| status | query | string | no | Filter: pending, approved, denied |
| agentId | query | uuid | no | Filter by agent |
| limit | query | integer | no | Max results (default 50, max 500) |
| offset | query | integer | no | Pagination offset |
/tenants/:tenantId/reviews/countObtiene el recuento de revisiones por estado.
review:read{ "pending": 5, "approved": 120, "denied": 8 }/tenants/:tenantId/reviews/:reviewIdObtiene una única revisión con el nombre del agente.
review:read/tenants/:tenantId/reviews/:reviewId/decideAprueba o deniega una revisión pendiente.
review:triage| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| decision | body | string | yes | approved or denied |
| comment | body | string | no | Optional reviewer comment |
{
"decision": "approved",
"comment": "Verified safe — one-time file access needed"
}Notificaciones
/tenants/:tenantId/notificationsLista las notificaciones dentro de la aplicación para el usuario actual.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| unreadOnly | query | boolean | no | Filter to unread only |
| limit | query | integer | no | Max results (default 50, max 200) |
/tenants/:tenantId/notifications/:id/readMarca una única notificación como leída.
/tenants/:tenantId/notifications/read-allMarca todas las notificaciones no leídas como leídas.
{ "marked": 12 }Pasaportes
Los Pasaportes de Agente proporcionan tarjetas de identidad verificables para agentes de IA. Requiere el plan Scale.
/tenants/:tenantId/agents/:agentId/passportObtiene el pasaporte de un agente con evaluación de riesgo, estado de cumplimiento y firma.
passport:readRequiere el derecho de la función agent_passport (plan Scale).
/tenants/:tenantId/agents/:agentId/passportActualiza los metadatos de visualización del pasaporte.
passport:write| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| displayName | body | string | no | Public display name |
| description | body | string | no | Public description |
| avatarUrl | body | string | no | Avatar image URL (SSRF-protected) |
| visibility | body | string | no | private, internal, or public |
/tenants/:tenantId/agents/:agentId/passport/refreshRecalcula y vuelve a firmar el pasaporte con los datos más recientes.
passport:write/tenants/:tenantId/agents/:agentId/passport/publishPublica el pasaporte para verificación externa.
passport:writePublicar como público requiere un rol elevado (security_manager, tenant_admin o platform_admin).
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| visibility | body | string | no | public or internal (default: internal) |
/tenants/:tenantId/agents/:agentId/passport/unpublishDespublica un pasaporte — establece la visibilidad como privada.
passport:write/public/passports/:tenantSlug/:agentSlugVer un pasaporte publicado (público, sin autenticación).
Limitado a 60 solicitudes por minuto por IP. Devuelve una respuesta en caché (max-age 300s).
/public/passports/:tenantSlug/:agentSlug/verifyVerifica la firma criptográfica de un pasaporte (público, sin autenticación).
{
"verified": true,
"valid": true,
"passportHash": "sha256:abc123...",
"signature": "base64:...",
"signedAt": "2026-04-24T12:00:00.000Z",
"keyId": "key_01...",
"publicKey": "-----BEGIN PUBLIC KEY-----..."
}/public/passports/:tenantSlug/:agentSlug/badge.svgRenderiza una insignia SVG incrustable para el agente (público, sin autenticación).
Limitado a 300 solicitudes por minuto por IP. Content-Type: image/svg+xml.
Facturación
/billing/statusNivel de plan actual y estado de la suscripción.
tenant:read{
"planTier": "pro",
"billingState": "active",
"hasStripeCustomer": true,
"hasSubscription": true
}/billing/entitlementsDerechos de funciones y límites del plan actual.
tenant:read{
"planTier": "pro",
"billingState": "active",
"entitlements": {
"maxAgents": 50,
"includedToolCalls": 100000,
"retentionDays": 365,
"features": ["agent_passport", "sso", "custom_policies"]
}
}/billing/usageUso del mes actual y límites del plan.
tenant:read{
"currentAgentCount": 12,
"maxAgents": 50,
"currentToolCalls": 45230,
"includedToolCalls": 100000,
"overageRate": 0.001,
"billingPeriodStart": "2026-04-01T00:00:00.000Z",
"billingPeriodEnd": "2026-04-30T23:59:59.999Z",
"retentionDays": 365
}/billing/checkoutCrea una sesión de Stripe Checkout para la mejora de plan.
tenant:write| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| tier | body | string | yes | Target plan: free, team, starter, pro, business |
| successPath | body | string | no | Redirect path after success |
| cancelPath | body | string | no | Redirect path on cancel |
{ "checkoutUrl": "https://checkout.stripe.com/c/pay_..." }/billing/portalCrea una sesión de Stripe Customer Portal para la gestión de la suscripción.
tenant:write{ "portalUrl": "https://billing.stripe.com/p/session_..." }Configuraciones de Exportación
Configura la exportación automatizada del rastro de auditoría a destinos S3, webhooks o syslog. Las credenciales se cifran en reposo (AES-256-GCM) y nunca se devuelven en las respuestas de la API.
/tenants/:tenantId/export-configsCrea una configuración de exportación.
export:write| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| name | body | string | yes | Config display name |
| destinationType | body | string | yes | s3, webhook, or syslog |
| config | body | object | yes | Destination-specific config (bucket, url, host, etc.) |
| credentials | body | object | no | Auth credentials (encrypted at rest, never returned) |
| filters | body | object | no | Event filters (agent, tool, outcome, etc.) |
| intervalSeconds | body | integer | no | Export interval (30–86400 seconds) |
| format | body | string | no | ndjson or json (default: ndjson) |
| enabled | body | boolean | no | Active on creation (default: true) |
{
"name": "S3 Audit Export",
"destinationType": "s3",
"config": {
"bucket": "acme-audit-logs",
"region": "eu-west-1",
"prefix": "shieldagent/"
},
"credentials": {
"accessKeyId": "AKIA...",
"secretAccessKey": "<your-aws-secret-key>"
},
"intervalSeconds": 300,
"format": "ndjson"
}/tenants/:tenantId/export-configsLista las configuraciones de exportación (credenciales ocultas).
export:read/tenants/:tenantId/export-configs/:configIdActualiza una configuración de exportación (actualización parcial, credenciales ocultas en la respuesta).
export:write/tenants/:tenantId/export-configs/:configIdElimina una configuración de exportación.
export:delete/tenants/:tenantId/export-configs/:configId/testPrueba la conexión del adaptador de exportación.
export:write{ "success": true, "latencyMs": 245 }API de Veredicto
Responsabilidad de aplicación
La API de Veredicto ejecuta el pipeline de seguridad completo de ShieldAgent y devuelve un veredicto. Tu código de servidor es responsable de aplicar ese veredicto — ShieldAgent no reenvía ni bloquea el tráfico directamente. Si tu código ignora un veredicto block, la llamada a la herramienta se ejecuta de todos modos. Todos los veredictos de escaneo se registran en el rastro de auditoría con source: "verdict_api"; la detección de anomalías puede marcar agentes con 100% de veredictos de bloqueo pero con ejecución de herramientas continua.
La API de Veredicto permite el escaneo del lado del servidor para clientes que poseen y operan su propio servidor de API o MCP (Posiciones de Despliegue 2 y 3). En lugar de enrutar el tráfico a través del proxy de ShieldAgent, tu servidor envía el payload de la solicitud a ShieldAgent, recibe un veredicto de seguridad y lo aplica localmente. La comunicación del agente con tu servidor no cambia — no se modifican mensajes MCP, no se añaden encabezados HTTP.
Modelo de autenticación — clave de API de tenant, no JWT de usuario
Los endpoints de la API de Veredicto se autentican con una clave de API con ámbito de tenant (token Bearer), no el JWT de usuario emitido por /auth/login. Trata esta clave como un secreto del lado del servidor — nunca la expongas a los clientes agentes.
URL base (servicio proxy): https://proxy.shieldagent.io
/tenants/:tenantId/scanEnvía una llamada a herramienta o solicitud de API para escaneo de seguridad. Devuelve un veredicto (allow / block / human_review). Tu servidor debe aplicar el veredicto — ShieldAgent no reenvía el tráfico.
Auth: Bearer <tenant-api-key>. Limitado por tenant y por agente. Se escribe un evento de auditoría en cada llamada con source: "verdict_api". Se ejecuta el mismo pipeline multietapa que el proxy en línea — se omite el reenvío.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| tenantId | path | string (uuid) | yes | Your tenant UUID |
| agentId | body | string (uuid) | no | ShieldAgent agent UUID. Optional — omit when your server cannot identify the caller (e.g. typical MCP server, which has no agent identity in the protocol). When provided the agent must belong to this tenant; cross-tenant IDs are rejected with 403. When omitted the pipeline runs with tenant-level policies only. |
| clientHint | body | string | no | MCP clientInfo.name or similar client software identifier (e.g. "Claude Desktop"). Used for best-effort agent matching when agentId is unavailable: if exactly one registered agent matches, per-agent policies apply; otherwise falls back to tenant-level. Ignored when agentId is provided. |
| toolName | body | string | yes | Name of the tool being called (e.g. "read_file", "api:POST:/payments") |
| params | body | object | yes | Tool call parameters as a JSON object |
| include_findings | body | boolean | no | Request detailed findings in the response. Requires the verdictDetailedFindings tenant permission flag (off by default — see Response Tiering below). Without permission this field is ignored. |
| context.transport | body | "mcp" | "rest" | "custom" | no | Transport protocol between agent and your server |
| context.sourceIp | body | string | no | IP address of the agent. Used for per-IP rate limiting. |
| context.sessionId | body | string | no | Session identifier. Used for excessive agency detection across calls in the same session. |
{
"agentId": "a1b2c3d4-0000-0000-0000-000000000001", // optional
"clientHint": "Claude Desktop", // optional
"toolName": "read_file",
"params": { "path": "/etc/passwd" },
"include_findings": false,
"context": {
"transport": "mcp",
"sourceIp": "10.0.1.5",
"sessionId": "sess-abc123"
}
}{
"action": "block", // "allow" | "block" | "human_review"
"reason": "Security threat detected",
"riskScore": 87,
"auditEventId": "evt-a1b2c3d4-0000-0000-0000-000000000001",
"reviewId": null // set when action is "human_review"
}Niveles de respuesta — include_findings: true + verdictDetailedFindings tenant permission
Los hallazgos detallados están desactivados por defecto. La respuesta predeterminada omite deliberadamente nombres de escáneres, patrones de detección y detalles de estrategia para prevenir ataques de evasión iterativa (refleja el modelo de hallazgos DLP). Habilitar solo para depuración o pruebas de integración.
{
"action": "block",
"reason": "Prompt injection detected in tool arguments",
"findings": [
{
"type": "injection",
"severity": "critical",
"detail": "Path traversal pattern detected",
"scanner": "regex"
}
],
"riskScore": 87,
"auditEventId": "evt-a1b2c3d4-...",
"reviewId": null
}Respuestas de error
Cuándo omitir agentId
| Escenario | agentId | Comportamiento del pipeline |
|---|---|---|
| Servidor MCP (típico) | omitir | Solo políticas a nivel de tenant. Opcionalmente pasar clientHint del handshake MCP clientInfo.name. |
| API HTTP con mapeo de autenticación de agente | proveer | Pipeline completo por agente: políticas, puntuación de riesgo, límites de tasa, línea base, herramientas aprobadas. |
| API HTTP sin mapeo de agente | omitir | Solo políticas a nivel de tenant. Los límites de tasa se aplican por tenant. |
/tenants/:tenantId/verdict-confirmationsInforma si un veredicto fue aplicado por tu servidor. Callback opcional que cierra el ciclo de auditoría. Los tenants que nunca llaman a este endpoint aparecen como 'enforcement unknown' en los informes de cumplimiento.
No es obligatorio — la confirmación de aplicación es voluntaria. Contribuye a la métrica Verdict Enforcement Rate de tu tenant. Llama después de ejecutar o rechazar la llamada a la herramienta, no antes.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| tenantId | path | string (uuid) | yes | Your tenant UUID |
| auditEventId | body | string (uuid) | yes | The auditEventId returned by POST /scan |
| executed | body | boolean | yes | true if the tool call was executed (verdict was "allow" or human review approved); false if it was rejected (verdict was "block" or human review denied) |
{
"auditEventId": "evt-a1b2c3d4-0000-0000-0000-000000000001",
"executed": false
}{ "recorded": true }Salud
/healthzSonda de liveness. Devuelve el estado del servicio y una marca de tiempo.
Excluido de la limitación de tasa. Úsalo para las sondas de liveness/readiness de Kubernetes.
{
"status": "ok",
"timestamp": "2026-04-24T12:00:00.000Z"
}Especificación OpenAPI
La especificación completa OpenAPI 3.1.0 está disponible para importar en Postman, Insomnia o cualquier herramienta compatible con OpenAPI. Consulta la página de Referencia OpenAPI para las URLs de especificación e instrucciones de generación de clientes.
# Serve Swagger UI locally
npx @redocly/cli preview-docs docs/openapi/shieldagent-api.yaml