Cómo usan una zona los rastreadores y agentes IA, por categoría, bot y operador, más trampas, señales, MCP Shield y el catálogo.
Informes del Control de rastreo IA. El borde clasifica el tráfico automatizado (entrenamiento de IA, búsqueda IA, agentes IA a petición de usuarios, buscadores, automatización sin verificar, suplantaciones) y verifica los bots con el catálogo. Todas las rutas admiten cualquier rol, también tokens de zona. El comportamiento se configura en el bloque ai_agents de los ajustes de borde . Consulta AI Crawl Control .
# Ver el informe de agentes IA
GET /v1/orgs/{org}/zones/{zone}/ai-agents/report
Devuelve en una llamada el resumen, la serie temporal, los bots, las principales fuentes y los ajustes ai_agents de la zona (o de un nombre con host).
Rol necesario: readonly o superior.
# Parámetros
Nombre En Tipo Obligatorio Descripción orgruta string (uuid) Sí Id de la organización. Cada ruta comprueba que es la del token (si no, 404). zoneruta string (uuid) Sí Id de la zona (consulta Listar zonas ). rangeconsulta string No Periodo hasta ahora: 24h (por defecto), 7d o 30d; excluyente con since. Uno de 24h, 7d, 30d. sinceconsulta string (date-time) No RFC 3339. untilconsulta string (date-time) No RFC 3339, exclusivo; por defecto ahora. Rango máximo 31 días. hostconsulta string No Solo ese nombre. Como mucho 253 caracteres. categoryconsulta string No Solo esa categoría de tráfico. Uno de ai_training, ai_search, ai_user_agent, search_engine, unverified_automation, spoofed, human. botconsulta string No Id de un bot del catálogo (gptbot). Como mucho 253 caracteres. operatorconsulta string No Operador (OpenAI). Como mucho 64 caracteres.
# Respuesta
# Errores
Estado Descripción 400Petición mal formada (bad_request). 404No existe o el token no lo ve (not_found). 503No disponible ahora (unavailable); reinténtalo más tarde.
# Ejemplo
curl TypeScript Python
curl "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/zones/6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d/ai-agents/report" \
-H "Authorization: Bearer $OPENWAF_TOKEN" import { OpenWAF } from "./openwaf" ;
const owf = new OpenWAF({ baseUrl: "https://dash.openwaf.dev" }); // token de OPENWAF_TOKEN
const result = await owf.getAIAgentsReport({
zone: "6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d"
});from openwaf import OpenWAF
owf = OpenWAF(base_url="https://dash.openwaf.dev" ) # token de OPENWAF_TOKEN
result = owf.get_ai_agents_report(zone="6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d" )
200
{
"summary" : {
"since" : "2026-10-27T09:30:00Z" ,
"until" : "2026-10-27T09:30:00Z" ,
"prev_since" : "2026-10-27T09:30:00Z" ,
"prev_until" : "2026-10-27T09:30:00Z" ,
"requests" : 128 ,
"prev_requests" : 128 ,
"categories" : [
{
"category" : "ai_training" ,
"requests" : 128 ,
"prev_requests" : 128
}
],
"decisions" : [
{
"decision" : "example" ,
"enforced" : 0 ,
"would" : 0
}
],
"trap" : {
"injected" : 0 ,
"hits" : 128 ,
"prev_injected" : 0 ,
"prev_hits" : 128
}
},
"timeseries" : {
"step" : 0 ,
"points" : [
{}
]
},
"agents" : {
"rows" : [
{
"bot_id" : "948186e3-4508-48d6-a001-c683a3ec9626" ,
"name" : "example.com" ,
"operator" : "OpenAI" ,
"category" : "ai_training" ,
"requests" : 128 ,
"verified" : 0 ,
"unverified" : 0 ,
"spoofed" : 0 ,
"methods" : [
"POST"
],
"last_seen" : "2026-10-27T09:30:00Z"
}
]
},
"top" : {
"ip" : [
{
"value" : "4f1c2e9a7b3d" ,
"country_code" : "ES" ,
"asn" : 0 ,
"category" : "ai_training" ,
"requests" : 128
}
],
"fingerprint" : [
{
"value" : "4f1c2e9a7b3d" ,
"country_code" : "ES" ,
"asn" : 0 ,
"category" : "ai_training" ,
"requests" : 128
}
],
"asn" : [
{
"value" : "4f1c2e9a7b3d" ,
"country_code" : "ES" ,
"asn" : 0 ,
"category" : "ai_training" ,
"requests" : 128
}
]
},
"settings" : {
"enabled" : false ,
"mode" : "log" ,
"spoofed_challenge" : "log" ,
"template" : "search_ok_block_training" ,
"policy" : {
"ai_training" : "allow" ,
"ai_search" : "allow" ,
"ai_user_agent" : "allow" ,
"search_engine" : "allow" ,
"unverified_automation" : "allow" ,
"spoofed" : "allow" ,
"unverified_bot" : "allow" ,
"trap_hit" : "allow" ,
"secret_probe" : "allow" ,
"robots_violation" : "allow" ,
"agent_burst" : "allow"
},
"bot_overrides" : [
{
"bot_id" : "948186e3-4508-48d6-a001-c683a3ec9626" ,
"action" : "block"
}
],
"trap" : {
"enabled" : false
},
"tarpit" : {
"enabled" : false
},
"robots" : {
"enabled" : false ,
"content_signals" : {
"search" : "yes" ,
"ai_input" : "yes" ,
"ai_train" : "yes"
}
},
"markdown" : {
"enabled" : false
},
"block_response" : {
"status" : 403 ,
"message" : ""
},
"endpoints" : [
{
"path_prefix" : "/api/" ,
"methods" : [
"POST"
],
"max_body_bytes" : 0 ,
"rpm_per_ip" : 0 ,
"rpm_per_session" : 0 ,
"session_header" : "X-Session-Id" ,
"session_cookie" : "session" ,
"injection_action" : "log" ,
"limit_action" : "log" ,
"kind" : "mcp" ,
"mcp" : {}
}
]
},
"catalog_version" : "example"
}
# Ver la vista general del Control de rastreo IA
GET /v1/orgs/{org}/zones/{zone}/ai-agents/overview
Devuelve la vista general del Control de rastreo IA del panel, datos destacados, tarjetas con su serie y operadores.
Rol necesario: readonly o superior.
# Parámetros
Nombre En Tipo Obligatorio Descripción orgruta string (uuid) Sí Id de la organización. Cada ruta comprueba que es la del token (si no, 404). zoneruta string (uuid) Sí Id de la zona (consulta Listar zonas ). rangeconsulta string No Periodo hasta ahora: 24h (por defecto), 7d o 30d; excluyente con since. Uno de 24h, 7d, 30d. sinceconsulta string (date-time) No RFC 3339. untilconsulta string (date-time) No RFC 3339, exclusivo; por defecto ahora. Rango máximo 31 días. hostconsulta string No Solo ese nombre. Como mucho 253 caracteres. categoryconsulta string No Solo esa categoría de tráfico. Uno de ai_training, ai_search, ai_user_agent, search_engine, unverified_automation, spoofed, human. botconsulta string No Id de un bot del catálogo (gptbot). Como mucho 253 caracteres. operatorconsulta string No Operador (OpenAI). Como mucho 64 caracteres.
# Respuesta
Campo Tipo Descripción sincestring (date-time) untilstring (date-time) stepinteger tsarray de string (date-time) Fecha de la petición. factsobject facts.requestsinteger Peticiones. facts.prev_requestsinteger facts.status_4xxinteger facts.top_operator_htmlobject o null facts.top_pathobject o null facts.top_crawlerobject o null cardsobject cards.totalAiCard cards.allowedAiCard cards.failedAiCard operatorsarray de object operators[].operatorstring Empresa que opera el bot. operators[].crawlersarray de object operators[].allowedinteger operators[].prev_allowedinteger
# Errores
Estado Descripción 400Petición mal formada (bad_request). 404No existe o el token no lo ve (not_found). 503No disponible ahora (unavailable); reinténtalo más tarde.
# Ejemplo
curl TypeScript Python
curl "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/zones/6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d/ai-agents/overview" \
-H "Authorization: Bearer $OPENWAF_TOKEN" import { OpenWAF } from "./openwaf" ;
const owf = new OpenWAF({ baseUrl: "https://dash.openwaf.dev" }); // token de OPENWAF_TOKEN
const result = await owf.getAIAgentsOverview({
zone: "6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d"
});from openwaf import OpenWAF
owf = OpenWAF(base_url="https://dash.openwaf.dev" ) # token de OPENWAF_TOKEN
result = owf.get_ai_agents_overview(zone="6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d" )
200
{
"since" : "2026-10-27T09:30:00Z" ,
"until" : "2026-10-27T09:30:00Z" ,
"step" : 0 ,
"ts" : [
"2026-10-27T09:30:00Z"
],
"facts" : {
"requests" : 128 ,
"prev_requests" : 128 ,
"status_4xx" : 0 ,
"top_operator_html" : {},
"top_path" : {},
"top_crawler" : {}
},
"cards" : {
"total" : {
"value" : 0 ,
"prev" : 0 ,
"series" : [
0
]
},
"allowed" : {
"value" : 0 ,
"prev" : 0 ,
"series" : [
0
]
},
"failed" : {
"value" : 0 ,
"prev" : 0 ,
"series" : [
0
]
}
},
"operators" : [
{
"operator" : "OpenAI" ,
"crawlers" : [
{}
],
"allowed" : 0 ,
"prev_allowed" : 0
}
]
}
# Ver el resumen de agentes IA
GET /v1/orgs/{org}/zones/{zone}/ai-agents/summary
Cuenta las peticiones de la zona por categoría de tráfico y decisión, más la trampa, frente al periodo anterior.
Rol necesario: readonly o superior.
# Parámetros
Nombre En Tipo Obligatorio Descripción orgruta string (uuid) Sí Id de la organización. Cada ruta comprueba que es la del token (si no, 404). zoneruta string (uuid) Sí Id de la zona (consulta Listar zonas ). rangeconsulta string No Periodo hasta ahora: 24h (por defecto), 7d o 30d; excluyente con since. Uno de 24h, 7d, 30d. sinceconsulta string (date-time) No RFC 3339. untilconsulta string (date-time) No RFC 3339, exclusivo; por defecto ahora. Rango máximo 31 días. hostconsulta string No Solo ese nombre. Como mucho 253 caracteres. categoryconsulta string No Solo esa categoría de tráfico. Uno de ai_training, ai_search, ai_user_agent, search_engine, unverified_automation, spoofed, human. botconsulta string No Id de un bot del catálogo (gptbot). Como mucho 253 caracteres. operatorconsulta string No Operador (OpenAI). Como mucho 64 caracteres.
# Respuesta
Campo Tipo Descripción sincestring (date-time) untilstring (date-time) prev_sincestring (date-time) prev_untilstring (date-time) requestsinteger Peticiones. prev_requestsinteger categoriesarray de AiCount decisionsarray de object decisions[].decisionstring decisions[].enforcedinteger decisions[].wouldinteger Lo que se aplicaría en modo enforce. trapAiTrapSummary
# Errores
Estado Descripción 400Petición mal formada (bad_request). 404No existe o el token no lo ve (not_found). 503No disponible ahora (unavailable); reinténtalo más tarde.
# Ejemplo
curl TypeScript Python
curl "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/zones/6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d/ai-agents/summary" \
-H "Authorization: Bearer $OPENWAF_TOKEN" import { OpenWAF } from "./openwaf" ;
const owf = new OpenWAF({ baseUrl: "https://dash.openwaf.dev" }); // token de OPENWAF_TOKEN
const result = await owf.getAIAgentsSummary({
zone: "6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d"
});from openwaf import OpenWAF
owf = OpenWAF(base_url="https://dash.openwaf.dev" ) # token de OPENWAF_TOKEN
result = owf.get_ai_agents_summary(zone="6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d" )
200
{
"since" : "2026-10-27T09:30:00Z" ,
"until" : "2026-10-27T09:30:00Z" ,
"prev_since" : "2026-10-27T09:30:00Z" ,
"prev_until" : "2026-10-27T09:30:00Z" ,
"requests" : 128 ,
"prev_requests" : 128 ,
"categories" : [
{
"category" : "ai_training" ,
"requests" : 128 ,
"prev_requests" : 128
}
],
"decisions" : [
{
"decision" : "example" ,
"enforced" : 0 ,
"would" : 0
}
],
"trap" : {
"injected" : 0 ,
"hits" : 128 ,
"prev_injected" : 0 ,
"prev_hits" : 128
}
}
# Ver la serie temporal de agentes IA
GET /v1/orgs/{org}/zones/{zone}/ai-agents/timeseries
Devuelve las peticiones por categoría a lo largo del tiempo.
Rol necesario: readonly o superior.
# Parámetros
Nombre En Tipo Obligatorio Descripción orgruta string (uuid) Sí Id de la organización. Cada ruta comprueba que es la del token (si no, 404). zoneruta string (uuid) Sí Id de la zona (consulta Listar zonas ). rangeconsulta string No Periodo hasta ahora: 24h (por defecto), 7d o 30d; excluyente con since. Uno de 24h, 7d, 30d. sinceconsulta string (date-time) No RFC 3339. untilconsulta string (date-time) No RFC 3339, exclusivo; por defecto ahora. Rango máximo 31 días. hostconsulta string No Solo ese nombre. Como mucho 253 caracteres. categoryconsulta string No Solo esa categoría de tráfico. Uno de ai_training, ai_search, ai_user_agent, search_engine, unverified_automation, spoofed, human. botconsulta string No Id de un bot del catálogo (gptbot). Como mucho 253 caracteres. operatorconsulta string No Operador (OpenAI). Como mucho 64 caracteres. stepconsulta integer No Segundos por punto (0 = automático). Mínimo 0.
# Respuesta
Campo Tipo Descripción stepinteger pointsarray de object
# Errores
Estado Descripción 400Petición mal formada (bad_request). 404No existe o el token no lo ve (not_found). 503No disponible ahora (unavailable); reinténtalo más tarde.
# Ejemplo
curl TypeScript Python
curl "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/zones/6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d/ai-agents/timeseries" \
-H "Authorization: Bearer $OPENWAF_TOKEN" import { OpenWAF } from "./openwaf" ;
const owf = new OpenWAF({ baseUrl: "https://dash.openwaf.dev" }); // token de OPENWAF_TOKEN
const result = await owf.getAIAgentsTimeseries({
zone: "6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d"
});from openwaf import OpenWAF
owf = OpenWAF(base_url="https://dash.openwaf.dev" ) # token de OPENWAF_TOKEN
result = owf.get_ai_agents_timeseries(zone="6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d" )
200
{
"step" : 0 ,
"points" : [
{}
]
}
# Listar los bots vistos
GET /v1/orgs/{org}/zones/{zone}/ai-agents/agents
Lista los bots vistos en la zona, verificados, sin verificar y suplantados.
Rol necesario: readonly o superior.
# Parámetros
Nombre En Tipo Obligatorio Descripción orgruta string (uuid) Sí Id de la organización. Cada ruta comprueba que es la del token (si no, 404). zoneruta string (uuid) Sí Id de la zona (consulta Listar zonas ). rangeconsulta string No Periodo hasta ahora: 24h (por defecto), 7d o 30d; excluyente con since. Uno de 24h, 7d, 30d. sinceconsulta string (date-time) No RFC 3339. untilconsulta string (date-time) No RFC 3339, exclusivo; por defecto ahora. Rango máximo 31 días. hostconsulta string No Solo ese nombre. Como mucho 253 caracteres. categoryconsulta string No Solo esa categoría de tráfico. Uno de ai_training, ai_search, ai_user_agent, search_engine, unverified_automation, spoofed, human. botconsulta string No Id de un bot del catálogo (gptbot). Como mucho 253 caracteres. operatorconsulta string No Operador (OpenAI). Como mucho 64 caracteres.
# Respuesta
# Errores
Estado Descripción 400Petición mal formada (bad_request). 404No existe o el token no lo ve (not_found). 503No disponible ahora (unavailable); reinténtalo más tarde.
# Ejemplo
curl TypeScript Python
curl "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/zones/6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d/ai-agents/agents" \
-H "Authorization: Bearer $OPENWAF_TOKEN" import { OpenWAF } from "./openwaf" ;
const owf = new OpenWAF({ baseUrl: "https://dash.openwaf.dev" }); // token de OPENWAF_TOKEN
const result = await owf.getAIAgentsAgents({
zone: "6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d"
});from openwaf import OpenWAF
owf = OpenWAF(base_url="https://dash.openwaf.dev" ) # token de OPENWAF_TOKEN
result = owf.get_ai_agents_agents(zone="6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d" )
200
{
"rows" : [
{
"bot_id" : "948186e3-4508-48d6-a001-c683a3ec9626" ,
"name" : "example.com" ,
"operator" : "OpenAI" ,
"category" : "ai_training" ,
"requests" : 128 ,
"verified" : 0 ,
"unverified" : 0 ,
"spoofed" : 0 ,
"methods" : [
"POST"
],
"last_seen" : "2026-10-27T09:30:00Z"
}
]
}
# Ver las principales fuentes automatizadas
GET /v1/orgs/{org}/zones/{zone}/ai-agents/top
Devuelve las principales IP, huellas TLS y ASN del tráfico automatizado.
Rol necesario: readonly o superior.
# Parámetros
Nombre En Tipo Obligatorio Descripción orgruta string (uuid) Sí Id de la organización. Cada ruta comprueba que es la del token (si no, 404). zoneruta string (uuid) Sí Id de la zona (consulta Listar zonas ). rangeconsulta string No Periodo hasta ahora: 24h (por defecto), 7d o 30d; excluyente con since. Uno de 24h, 7d, 30d. sinceconsulta string (date-time) No RFC 3339. untilconsulta string (date-time) No RFC 3339, exclusivo; por defecto ahora. Rango máximo 31 días. hostconsulta string No Solo ese nombre. Como mucho 253 caracteres. categoryconsulta string No Solo esa categoría de tráfico. Uno de ai_training, ai_search, ai_user_agent, search_engine, unverified_automation, spoofed, human. botconsulta string No Id de un bot del catálogo (gptbot). Como mucho 253 caracteres. operatorconsulta string No Operador (OpenAI). Como mucho 64 caracteres. limitconsulta integer No Por defecto 10. Mínimo 0.
# Respuesta
# Errores
Estado Descripción 400Petición mal formada (bad_request). 404No existe o el token no lo ve (not_found). 503No disponible ahora (unavailable); reinténtalo más tarde.
# Ejemplo
curl TypeScript Python
curl "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/zones/6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d/ai-agents/top" \
-H "Authorization: Bearer $OPENWAF_TOKEN" import { OpenWAF } from "./openwaf" ;
const owf = new OpenWAF({ baseUrl: "https://dash.openwaf.dev" }); // token de OPENWAF_TOKEN
const result = await owf.getAIAgentsTop({
zone: "6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d"
});from openwaf import OpenWAF
owf = OpenWAF(base_url="https://dash.openwaf.dev" ) # token de OPENWAF_TOKEN
result = owf.get_ai_agents_top(zone="6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d" )
200
{
"ip" : [
{
"value" : "4f1c2e9a7b3d" ,
"country_code" : "ES" ,
"asn" : 0 ,
"category" : "ai_training" ,
"requests" : 128
}
],
"fingerprint" : [
{
"value" : "4f1c2e9a7b3d" ,
"country_code" : "ES" ,
"asn" : 0 ,
"category" : "ai_training" ,
"requests" : 128
}
],
"asn" : [
{
"value" : "4f1c2e9a7b3d" ,
"country_code" : "ES" ,
"asn" : 0 ,
"category" : "ai_training" ,
"requests" : 128
}
]
}
# Listar eventos IA notables
GET /v1/orgs/{org}/zones/{zone}/ai-agents/events
Lista los eventos notables (suplantaciones, caídas en la trampa, inyecciones, detecciones de MCP Shield…), del más reciente al más antiguo.
Rol necesario: readonly o superior.
# Parámetros
Nombre En Tipo Obligatorio Descripción orgruta string (uuid) Sí Id de la organización. Cada ruta comprueba que es la del token (si no, 404). zoneruta string (uuid) Sí Id de la zona (consulta Listar zonas ). rangeconsulta string No Periodo hasta ahora: 24h (por defecto), 7d o 30d; excluyente con since. Uno de 24h, 7d, 30d. sinceconsulta string (date-time) No RFC 3339. untilconsulta string (date-time) No RFC 3339, exclusivo; por defecto ahora. Rango máximo 31 días. hostconsulta string No Solo ese nombre. Como mucho 253 caracteres. categoryconsulta string No Solo esa categoría de tráfico. Uno de ai_training, ai_search, ai_user_agent, search_engine, unverified_automation, spoofed, human. botconsulta string No Id de un bot del catálogo (gptbot). Como mucho 253 caracteres. operatorconsulta string No Operador (OpenAI). Como mucho 64 caracteres. kindconsulta string No Tipos separados por comas (spoofed, trap_hit, injection, cost_limit, automation, wba_invalid, tarpit, blocked, secret_probe, robots_violation, agent_burst; MCP Shield: mcp_blocked_method, mcp_blocked_tool, mcp_injection_request, mcp_injection_response, mcp_dlp, mcp_rate_limited, mcp_invalid). cursorconsulta string No Cursor de la página siguiente (next_cursor de la respuesta anterior). limitconsulta integer No Por defecto 50, máximo 500. Mínimo 0.
# Respuesta
Campo Tipo Descripción itemsarray de AiEvent next_cursorstring
# Errores
Estado Descripción 400Petición mal formada (bad_request). 404No existe o el token no lo ve (not_found). 503No disponible ahora (unavailable); reinténtalo más tarde.
# Ejemplo
curl TypeScript Python
curl "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/zones/6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d/ai-agents/events?kind=spoofed,trap_hit" \
-H "Authorization: Bearer $OPENWAF_TOKEN" import { OpenWAF } from "./openwaf" ;
const owf = new OpenWAF({ baseUrl: "https://dash.openwaf.dev" }); // token de OPENWAF_TOKEN
const result = await owf.getAIAgentsEvents({
zone: "6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d" ,
kind: "spoofed,trap_hit"
});from openwaf import OpenWAF
owf = OpenWAF(base_url="https://dash.openwaf.dev" ) # token de OPENWAF_TOKEN
result = owf.get_ai_agents_events(zone="6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d" , kind="spoofed,trap_hit" )
200
{
"items" : [
{
"event_id" : "57c7c826-7db4-42c8-af1d-3ecdfe37182f" ,
"ts" : "2026-10-27T09:30:00Z" ,
"site_id" : 0 ,
"node_id" : "edge-node-1" ,
"host" : "www.example.com" ,
"kind" : "spoofed" ,
"category" : "ai_training" ,
"bot_id" : "948186e3-4508-48d6-a001-c683a3ec9626" ,
"verified" : false ,
"verify" : "" ,
"decision" : "example" ,
"enforced" : false ,
"ip" : "203.0.113.10" ,
"country_code" : "ES" ,
"asn" : 0 ,
"user_agent" : "Mozilla/5.0" ,
"tls_fingerprint" : "" ,
"method" : "GET" ,
"path" : "/checkout" ,
"status" : 0 ,
"signals" : [
"example"
],
"detections" : [
{}
],
"token_age_ms" : 0 ,
"mcp" : {
"method" : "GET" ,
"tool" : "search_docs" ,
"token_fp" : "example" ,
"blocked" : false
}
}
],
"next_cursor" : ""
}
# Ver las métricas de agentes IA
GET /v1/orgs/{org}/zones/{zone}/ai-agents/metrics
Devuelve métricas por grupo (rastreador, categoría, operador, nombre o tipo de contenido) con clases de estado y páginas más pedidas. format=csv descarga CSV en lugar de JSON.
Rol necesario: readonly o superior.
# Parámetros
Nombre En Tipo Obligatorio Descripción orgruta string (uuid) Sí Id de la organización. Cada ruta comprueba que es la del token (si no, 404). zoneruta string (uuid) Sí Id de la zona (consulta Listar zonas ). rangeconsulta string No Periodo hasta ahora: 24h (por defecto), 7d o 30d; excluyente con since. Uno de 24h, 7d, 30d. sinceconsulta string (date-time) No RFC 3339. untilconsulta string (date-time) No RFC 3339, exclusivo; por defecto ahora. Rango máximo 31 días. hostconsulta string No Solo ese nombre. Como mucho 253 caracteres. categoryconsulta string No Solo esa categoría de tráfico. Uno de ai_training, ai_search, ai_user_agent, search_engine, unverified_automation, spoofed, human. botconsulta string No Id de un bot del catálogo (gptbot). Como mucho 253 caracteres. operatorconsulta string No Operador (OpenAI). Como mucho 64 caracteres. statusconsulta string No Solo respuestas con esa clase de estado. Uno de all, 1xx, 2xx, 3xx, 4xx, 5xx. group_byconsulta string No Dimensión por la que agrupar. Uno de crawler, category, operator, host, content_type. offsetconsulta integer No Filas que saltar (paginación). Mínimo 0. limitconsulta integer No Por defecto 10, máximo 100. Mínimo 0. formatconsulta string No csv: descarga CSV en lugar de JSON. Uno de csv.
# Respuesta
Campo Tipo Descripción stepinteger tsarray de string (date-time) Fecha de la petición. statusstring group_bystring cardsobject requestsarray de AiSeries Peticiones. bytesarray de AiSeries status_classesarray de object content_typesarray de object top_pathsAiPathPage
# Errores
Estado Descripción 400Petición mal formada (bad_request). 404No existe o el token no lo ve (not_found). 503No disponible ahora (unavailable); reinténtalo más tarde.
# Ejemplo
curl TypeScript Python
curl "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/zones/6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d/ai-agents/metrics?group_by=operator" \
-H "Authorization: Bearer $OPENWAF_TOKEN" import { OpenWAF } from "./openwaf" ;
const owf = new OpenWAF({ baseUrl: "https://dash.openwaf.dev" }); // token de OPENWAF_TOKEN
const result = await owf.getAIAgentsMetrics({
zone: "6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d" ,
group_by: "operator"
});from openwaf import OpenWAF
owf = OpenWAF(base_url="https://dash.openwaf.dev" ) # token de OPENWAF_TOKEN
result = owf.get_ai_agents_metrics(zone="6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d" , group_by="operator" )
200
{
"step" : 0 ,
"ts" : [
"2026-10-27T09:30:00Z"
],
"status" : "example" ,
"group_by" : "example" ,
"cards" : {},
"requests" : [
{
"key" : "/pricing" ,
"label" : "AI training" ,
"total" : 128 ,
"series" : [
0
]
}
],
"bytes" : [
{
"key" : "/pricing" ,
"label" : "AI training" ,
"total" : 128 ,
"series" : [
0
]
}
],
"status_classes" : [
{}
],
"content_types" : [
{}
],
"top_paths" : {
"total" : 128 ,
"items" : [
{
"host" : "www.example.com" ,
"path" : "/checkout" ,
"bytes" : 0 ,
"requests" : 128 ,
"secret_probe" : false
}
]
}
}
# Listar rastreadores
GET /v1/orgs/{org}/zones/{zone}/ai-agents/crawlers
Lista los rastreadores del catálogo con sus peticiones, peticiones verificadas y suplantadas, ráfagas y acción efectiva.
Rol necesario: readonly o superior.
# Parámetros
Nombre En Tipo Obligatorio Descripción orgruta string (uuid) Sí Id de la organización. Cada ruta comprueba que es la del token (si no, 404). zoneruta string (uuid) Sí Id de la zona (consulta Listar zonas ). rangeconsulta string No Periodo hasta ahora: 24h (por defecto), 7d o 30d; excluyente con since. Uno de 24h, 7d, 30d. sinceconsulta string (date-time) No RFC 3339. untilconsulta string (date-time) No RFC 3339, exclusivo; por defecto ahora. Rango máximo 31 días. hostconsulta string No Solo ese nombre. Como mucho 253 caracteres. categoryconsulta string No Solo esa categoría de tráfico. Uno de ai_training, ai_search, ai_user_agent, search_engine, unverified_automation, spoofed, human. botconsulta string No Id de un bot del catálogo (gptbot). Como mucho 253 caracteres. operatorconsulta string No Operador (OpenAI). Como mucho 64 caracteres. inactiveconsulta string No 1: incluye los bots del catálogo sin tráfico. Uno de 1.
# Respuesta
Campo Tipo Descripción stepinteger tsarray de string (date-time) Fecha de la petición. rowsarray de object rows[].bot_idstring rows[].namestring Nombre. rows[].operatorstring Empresa que opera el bot. rows[].categorystring rows[].methodsarray de string rows[].bytesinteger rows[].requestsinteger Peticiones. rows[].allowedinteger rows[].unsuccessfulinteger rows[].seriesarray de integer rows[].verifiedinteger rows[].spoofedinteger rows[].unverifiedinteger rows[].burstsinteger Eventos agent_burst del bot. rows[].actionstring rows[].action_sourcestring override, category o unverified_bot.
# Errores
Estado Descripción 400Petición mal formada (bad_request). 404No existe o el token no lo ve (not_found). 503No disponible ahora (unavailable); reinténtalo más tarde.
# Ejemplo
curl TypeScript Python
curl "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/zones/6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d/ai-agents/crawlers" \
-H "Authorization: Bearer $OPENWAF_TOKEN" import { OpenWAF } from "./openwaf" ;
const owf = new OpenWAF({ baseUrl: "https://dash.openwaf.dev" }); // token de OPENWAF_TOKEN
const result = await owf.getAIAgentsCrawlers({
zone: "6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d"
});from openwaf import OpenWAF
owf = OpenWAF(base_url="https://dash.openwaf.dev" ) # token de OPENWAF_TOKEN
result = owf.get_ai_agents_crawlers(zone="6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d" )
200
{
"step" : 0 ,
"ts" : [
"2026-10-27T09:30:00Z"
],
"rows" : [
{
"bot_id" : "948186e3-4508-48d6-a001-c683a3ec9626" ,
"name" : "example.com" ,
"operator" : "OpenAI" ,
"category" : "ai_training" ,
"methods" : [
"POST"
],
"bytes" : 0 ,
"requests" : 128 ,
"allowed" : 0 ,
"unsuccessful" : 0 ,
"series" : [
0
],
"verified" : 0 ,
"spoofed" : 0 ,
"unverified" : 0 ,
"bursts" : 0 ,
"action" : "block" ,
"action_source" : "example"
}
]
}
# Listar quién suplanta a un bot
GET /v1/orgs/{org}/zones/{zone}/ai-agents/spoofers
Lista las IP y ASN que dijeron ser un bot sin pasar su verificación. bot es obligatorio.
Rol necesario: readonly o superior.
# Parámetros
Nombre En Tipo Obligatorio Descripción orgruta string (uuid) Sí Id de la organización. Cada ruta comprueba que es la del token (si no, 404). zoneruta string (uuid) Sí Id de la zona (consulta Listar zonas ). rangeconsulta string No Periodo hasta ahora: 24h (por defecto), 7d o 30d; excluyente con since. Uno de 24h, 7d, 30d. sinceconsulta string (date-time) No RFC 3339. untilconsulta string (date-time) No RFC 3339, exclusivo; por defecto ahora. Rango máximo 31 días. hostconsulta string No Solo ese nombre. Como mucho 253 caracteres. categoryconsulta string No Solo esa categoría de tráfico. Uno de ai_training, ai_search, ai_user_agent, search_engine, unverified_automation, spoofed, human. botconsulta string No Id de un bot del catálogo (gptbot). Como mucho 253 caracteres. operatorconsulta string No Operador (OpenAI). Como mucho 64 caracteres.
# Respuesta
Campo Tipo Descripción bot_idstring ipsarray de object ips[].valuestring ips[].country_codestring Código de país ISO 3166-1 alfa-2. ips[].asninteger Número de sistema autónomo. ips[].requestsinteger Peticiones. ips[].last_seenstring (date-time) asnsarray de object asns[].asninteger Número de sistema autónomo. asns[].country_codestring Código de país ISO 3166-1 alfa-2. asns[].requestsinteger Peticiones.
# Errores
Estado Descripción 400Petición mal formada (bad_request). 404No existe o el token no lo ve (not_found). 503No disponible ahora (unavailable); reinténtalo más tarde.
# Ejemplo
curl TypeScript Python
curl "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/zones/6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d/ai-agents/spoofers?bot=gptbot" \
-H "Authorization: Bearer $OPENWAF_TOKEN" import { OpenWAF } from "./openwaf" ;
const owf = new OpenWAF({ baseUrl: "https://dash.openwaf.dev" }); // token de OPENWAF_TOKEN
const result = await owf.getAIAgentsSpoofers({
zone: "6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d" ,
bot: "gptbot"
});from openwaf import OpenWAF
owf = OpenWAF(base_url="https://dash.openwaf.dev" ) # token de OPENWAF_TOKEN
result = owf.get_ai_agents_spoofers(zone="6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d" , bot="gptbot" )
200
{
"bot_id" : "948186e3-4508-48d6-a001-c683a3ec9626" ,
"ips" : [
{
"value" : "4f1c2e9a7b3d" ,
"country_code" : "ES" ,
"asn" : 0 ,
"requests" : 128 ,
"last_seen" : "2026-10-27T09:30:00Z"
}
],
"asns" : [
{
"asn" : 0 ,
"country_code" : "ES" ,
"requests" : 128
}
]
}
# Ver la optimización para IA
GET /v1/orgs/{org}/zones/{zone}/ai-agents/optimization
Devuelve las páginas que recupera la IA y la demanda de páginas que no existen. format=csv descarga CSV en lugar de JSON.
Rol necesario: readonly o superior.
# Parámetros
Nombre En Tipo Obligatorio Descripción orgruta string (uuid) Sí Id de la organización. Cada ruta comprueba que es la del token (si no, 404). zoneruta string (uuid) Sí Id de la zona (consulta Listar zonas ). rangeconsulta string No Periodo hasta ahora: 24h (por defecto), 7d o 30d; excluyente con since. Uno de 24h, 7d, 30d. sinceconsulta string (date-time) No RFC 3339. untilconsulta string (date-time) No RFC 3339, exclusivo; por defecto ahora. Rango máximo 31 días. hostconsulta string No Solo ese nombre. Como mucho 253 caracteres. categoryconsulta string No Solo esa categoría de tráfico. Uno de ai_training, ai_search, ai_user_agent, search_engine, unverified_automation, spoofed, human. botconsulta string No Id de un bot del catálogo (gptbot). Como mucho 253 caracteres. operatorconsulta string No Operador (OpenAI). Como mucho 64 caracteres. offsetconsulta integer No Filas que saltar (paginación). Mínimo 0. limitconsulta integer No Por defecto 10, máximo 100. Mínimo 0. formatconsulta string No csv: descarga CSV en lugar de JSON. Uno de csv.
# Respuesta
Campo Tipo Descripción cardsobject cards.retrievalsobject cards.demandobject top_pagesAiPathPage demandAiPathPage operatorsarray de object
# Errores
Estado Descripción 400Petición mal formada (bad_request). 404No existe o el token no lo ve (not_found). 503No disponible ahora (unavailable); reinténtalo más tarde.
# Ejemplo
curl TypeScript Python
curl "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/zones/6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d/ai-agents/optimization" \
-H "Authorization: Bearer $OPENWAF_TOKEN" import { OpenWAF } from "./openwaf" ;
const owf = new OpenWAF({ baseUrl: "https://dash.openwaf.dev" }); // token de OPENWAF_TOKEN
const result = await owf.getAIAgentsOptimization({
zone: "6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d"
});from openwaf import OpenWAF
owf = OpenWAF(base_url="https://dash.openwaf.dev" ) # token de OPENWAF_TOKEN
result = owf.get_ai_agents_optimization(zone="6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d" )
200
{
"cards" : {
"retrievals" : {
"value" : 0 ,
"prev" : 0
},
"demand" : {
"value" : 0 ,
"prev" : 0
}
},
"top_pages" : {
"total" : 128 ,
"items" : [
{
"host" : "www.example.com" ,
"path" : "/checkout" ,
"bytes" : 0 ,
"requests" : 128 ,
"secret_probe" : false
}
]
},
"demand" : {
"total" : 128 ,
"items" : [
{
"host" : "www.example.com" ,
"path" : "/checkout" ,
"bytes" : 0 ,
"requests" : 128 ,
"secret_probe" : false
}
]
},
"operators" : [
{}
]
}
# Ver las señales de robots.txt
GET /v1/orgs/{org}/zones/{zone}/ai-agents/signals
Devuelve las peticiones de robots.txt, los valores de Content-Signal servidos y los incumplimientos de sus reglas.
Rol necesario: readonly o superior.
# Parámetros
Nombre En Tipo Obligatorio Descripción orgruta string (uuid) Sí Id de la organización. Cada ruta comprueba que es la del token (si no, 404). zoneruta string (uuid) Sí Id de la zona (consulta Listar zonas ). rangeconsulta string No Periodo hasta ahora: 24h (por defecto), 7d o 30d; excluyente con since. Uno de 24h, 7d, 30d. sinceconsulta string (date-time) No RFC 3339. untilconsulta string (date-time) No RFC 3339, exclusivo; por defecto ahora. Rango máximo 31 días. hostconsulta string No Solo ese nombre. Como mucho 253 caracteres. categoryconsulta string No Solo esa categoría de tráfico. Uno de ai_training, ai_search, ai_user_agent, search_engine, unverified_automation, spoofed, human. botconsulta string No Id de un bot del catálogo (gptbot). Como mucho 253 caracteres. operatorconsulta string No Operador (OpenAI). Como mucho 64 caracteres.
# Respuesta
Campo Tipo Descripción robotsarray de object robots[].hoststring robots[].requestsinteger Peticiones. robots[].okinteger robots[].failedinteger robots[].last_statusinteger robots[].content_signalsboolean violationsarray de object violations[].bot_idstring violations[].namestring Nombre. violations[].operatorstring Empresa que opera el bot. violations[].categorystring violations[].hoststring violations[].pathstring violations[].requestsinteger Peticiones.
# Errores
Estado Descripción 400Petición mal formada (bad_request). 404No existe o el token no lo ve (not_found). 503No disponible ahora (unavailable); reinténtalo más tarde.
# Ejemplo
curl TypeScript Python
curl "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/zones/6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d/ai-agents/signals" \
-H "Authorization: Bearer $OPENWAF_TOKEN" import { OpenWAF } from "./openwaf" ;
const owf = new OpenWAF({ baseUrl: "https://dash.openwaf.dev" }); // token de OPENWAF_TOKEN
const result = await owf.getAIAgentsSignals({
zone: "6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d"
});from openwaf import OpenWAF
owf = OpenWAF(base_url="https://dash.openwaf.dev" ) # token de OPENWAF_TOKEN
result = owf.get_ai_agents_signals(zone="6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d" )
200
{
"robots" : [
{
"host" : "www.example.com" ,
"requests" : 128 ,
"ok" : 0 ,
"failed" : 0 ,
"last_status" : 0 ,
"content_signals" : false
}
],
"violations" : [
{
"bot_id" : "948186e3-4508-48d6-a001-c683a3ec9626" ,
"name" : "example.com" ,
"operator" : "OpenAI" ,
"category" : "ai_training" ,
"host" : "www.example.com" ,
"path" : "/checkout" ,
"requests" : 128
}
]
}
# Ver la actividad de la trampa
GET /v1/orgs/{org}/zones/{zone}/ai-agents/traps
Devuelve las inserciones de la trampa, quién la siguió y las ráfagas de agentes.
Rol necesario: readonly o superior.
# Parámetros
Nombre En Tipo Obligatorio Descripción orgruta string (uuid) Sí Id de la organización. Cada ruta comprueba que es la del token (si no, 404). zoneruta string (uuid) Sí Id de la zona (consulta Listar zonas ). rangeconsulta string No Periodo hasta ahora: 24h (por defecto), 7d o 30d; excluyente con since. Uno de 24h, 7d, 30d. sinceconsulta string (date-time) No RFC 3339. untilconsulta string (date-time) No RFC 3339, exclusivo; por defecto ahora. Rango máximo 31 días. hostconsulta string No Solo ese nombre. Como mucho 253 caracteres. categoryconsulta string No Solo esa categoría de tráfico. Uno de ai_training, ai_search, ai_user_agent, search_engine, unverified_automation, spoofed, human. botconsulta string No Id de un bot del catálogo (gptbot). Como mucho 253 caracteres. operatorconsulta string No Operador (OpenAI). Como mucho 64 caracteres.
# Respuesta
Campo Tipo Descripción injectedinteger hitsinteger prev_injectedinteger prev_hitsinteger burstsinteger prev_burstsinteger stepinteger tsarray de string (date-time) Fecha de la petición. seriesobject series.injectedarray de integer series.hitsarray de integer hittersarray de object hitters[].ipstring hitters[].country_codestring Código de país ISO 3166-1 alfa-2. hitters[].asninteger Número de sistema autónomo. hitters[].tls_fingerprintstring Huella TLS del cliente. hitters[].bot_idstring hitters[].hitsinteger hitters[].last_seenstring (date-time)
# Errores
Estado Descripción 400Petición mal formada (bad_request). 404No existe o el token no lo ve (not_found). 503No disponible ahora (unavailable); reinténtalo más tarde.
# Ejemplo
curl TypeScript Python
curl "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/zones/6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d/ai-agents/traps" \
-H "Authorization: Bearer $OPENWAF_TOKEN" import { OpenWAF } from "./openwaf" ;
const owf = new OpenWAF({ baseUrl: "https://dash.openwaf.dev" }); // token de OPENWAF_TOKEN
const result = await owf.getAIAgentsTraps({
zone: "6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d"
});from openwaf import OpenWAF
owf = OpenWAF(base_url="https://dash.openwaf.dev" ) # token de OPENWAF_TOKEN
result = owf.get_ai_agents_traps(zone="6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d" )
200
{
"injected" : 0 ,
"hits" : 128 ,
"prev_injected" : 0 ,
"prev_hits" : 128 ,
"bursts" : 0 ,
"prev_bursts" : 0 ,
"step" : 0 ,
"ts" : [
"2026-10-27T09:30:00Z"
],
"series" : {
"injected" : [
0
],
"hits" : [
0
]
},
"hitters" : [
{
"ip" : "203.0.113.10" ,
"country_code" : "ES" ,
"asn" : 0 ,
"tls_fingerprint" : "" ,
"bot_id" : "948186e3-4508-48d6-a001-c683a3ec9626" ,
"hits" : 128 ,
"last_seen" : "2026-10-27T09:30:00Z"
}
]
}
# Listar ráfagas de agentes
GET /v1/orgs/{org}/zones/{zone}/ai-agents/bursts
Lista las ráfagas compuestas de agentes en modo código (agent_burst), los clientes con su explicación, los bots y las detecciones.
Rol necesario: readonly o superior.
# Parámetros
Nombre En Tipo Obligatorio Descripción orgruta string (uuid) Sí Id de la organización. Cada ruta comprueba que es la del token (si no, 404). zoneruta string (uuid) Sí Id de la zona (consulta Listar zonas ). rangeconsulta string No Periodo hasta ahora: 24h (por defecto), 7d o 30d; excluyente con since. Uno de 24h, 7d, 30d. sinceconsulta string (date-time) No RFC 3339. untilconsulta string (date-time) No RFC 3339, exclusivo; por defecto ahora. Rango máximo 31 días. hostconsulta string No Solo ese nombre. Como mucho 253 caracteres. categoryconsulta string No Solo esa categoría de tráfico. Uno de ai_training, ai_search, ai_user_agent, search_engine, unverified_automation, spoofed, human. botconsulta string No Id de un bot del catálogo (gptbot). Como mucho 253 caracteres. operatorconsulta string No Operador (OpenAI). Como mucho 64 caracteres.
# Respuesta
Campo Tipo Descripción burstsinteger prev_burstsinteger clientsarray de object Como mucho 50 elementos. clients[].ipstring clients[].country_codestring Código de país ISO 3166-1 alfa-2. clients[].asninteger Número de sistema autónomo. clients[].tls_fingerprintstring Huella TLS del cliente. clients[].bot_idstring clients[].burstsinteger clients[].last_seenstring (date-time) clients[].explanationsarray de string Etiquetas de detección (distinct_endpoints=23/10s, id_walk=…, pagination=…). Como mucho 3 elementos. crawlersarray de object crawlers[].bot_idstring crawlers[].namestring Nombre. crawlers[].operatorstring Empresa que opera el bot. crawlers[].burstsinteger detectionsarray de object detections[].idstring Id. detections[].labelstring detections[].countinteger
# Errores
Estado Descripción 400Petición mal formada (bad_request). 404No existe o el token no lo ve (not_found). 503No disponible ahora (unavailable); reinténtalo más tarde.
# Ejemplo
curl TypeScript Python
curl "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/zones/6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d/ai-agents/bursts" \
-H "Authorization: Bearer $OPENWAF_TOKEN" import { OpenWAF } from "./openwaf" ;
const owf = new OpenWAF({ baseUrl: "https://dash.openwaf.dev" }); // token de OPENWAF_TOKEN
const result = await owf.getAIAgentsBursts({
zone: "6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d"
});from openwaf import OpenWAF
owf = OpenWAF(base_url="https://dash.openwaf.dev" ) # token de OPENWAF_TOKEN
result = owf.get_ai_agents_bursts(zone="6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d" )
200
{
"bursts" : 0 ,
"prev_bursts" : 0 ,
"clients" : [
{
"ip" : "203.0.113.10" ,
"country_code" : "ES" ,
"asn" : 0 ,
"tls_fingerprint" : "" ,
"bot_id" : "948186e3-4508-48d6-a001-c683a3ec9626" ,
"bursts" : 0 ,
"last_seen" : "2026-10-27T09:30:00Z" ,
"explanations" : []
}
],
"crawlers" : [
{
"bot_id" : "948186e3-4508-48d6-a001-c683a3ec9626" ,
"name" : "example.com" ,
"operator" : "OpenAI" ,
"bursts" : 0
}
],
"detections" : [
{
"id" : "example" ,
"label" : "AI training" ,
"count" : 128
}
]
}
# Ver la actividad de los endpoints IA
GET /v1/orgs/{org}/zones/{zone}/ai-agents/endpoints
Devuelve la actividad de los endpoints IA del sitio, inyecciones, límites y bloqueos.
Rol necesario: readonly o superior.
# Parámetros
Nombre En Tipo Obligatorio Descripción orgruta string (uuid) Sí Id de la organización. Cada ruta comprueba que es la del token (si no, 404). zoneruta string (uuid) Sí Id de la zona (consulta Listar zonas ). rangeconsulta string No Periodo hasta ahora: 24h (por defecto), 7d o 30d; excluyente con since. Uno de 24h, 7d, 30d. sinceconsulta string (date-time) No RFC 3339. untilconsulta string (date-time) No RFC 3339, exclusivo; por defecto ahora. Rango máximo 31 días. hostconsulta string No Solo ese nombre. Como mucho 253 caracteres. categoryconsulta string No Solo esa categoría de tráfico. Uno de ai_training, ai_search, ai_user_agent, search_engine, unverified_automation, spoofed, human. botconsulta string No Id de un bot del catálogo (gptbot). Como mucho 253 caracteres. operatorconsulta string No Operador (OpenAI). Como mucho 64 caracteres.
# Respuesta
Campo Tipo Descripción rowsarray de object rows[].path_prefixstring rows[].requestsinteger Peticiones. rows[].injectionsinteger rows[].limitedinteger rows[].blockedinteger rows[].would_blockinteger detectionsarray de object detections[].idstring Id. detections[].labelstring detections[].countinteger
# Errores
Estado Descripción 400Petición mal formada (bad_request). 404No existe o el token no lo ve (not_found). 503No disponible ahora (unavailable); reinténtalo más tarde.
# Ejemplo
curl TypeScript Python
curl "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/zones/6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d/ai-agents/endpoints" \
-H "Authorization: Bearer $OPENWAF_TOKEN" import { OpenWAF } from "./openwaf" ;
const owf = new OpenWAF({ baseUrl: "https://dash.openwaf.dev" }); // token de OPENWAF_TOKEN
const result = await owf.getAIAgentsEndpoints({
zone: "6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d"
});from openwaf import OpenWAF
owf = OpenWAF(base_url="https://dash.openwaf.dev" ) # token de OPENWAF_TOKEN
result = owf.get_ai_agents_endpoints(zone="6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d" )
200
{
"rows" : [
{
"path_prefix" : "/api/" ,
"requests" : 128 ,
"injections" : 0 ,
"limited" : 0 ,
"blocked" : 0 ,
"would_block" : 0
}
],
"detections" : [
{
"id" : "example" ,
"label" : "AI training" ,
"count" : 128
}
]
}
# Ver la actividad de MCP Shield
GET /v1/orgs/{org}/zones/{zone}/ai-agents/mcp
Devuelve la actividad de MCP Shield en los endpoints MCP del sitio, mensajes JSON-RPC, bloqueos, detecciones y tools. Consulta MCP Shield .
Rol necesario: readonly o superior.
# Parámetros
Nombre En Tipo Obligatorio Descripción orgruta string (uuid) Sí Id de la organización. Cada ruta comprueba que es la del token (si no, 404). zoneruta string (uuid) Sí Id de la zona (consulta Listar zonas ). rangeconsulta string No Periodo hasta ahora: 24h (por defecto), 7d o 30d; excluyente con since. Uno de 24h, 7d, 30d. sinceconsulta string (date-time) No RFC 3339. untilconsulta string (date-time) No RFC 3339, exclusivo; por defecto ahora. Rango máximo 31 días. hostconsulta string No Solo ese nombre. Como mucho 253 caracteres.
# Respuesta
Campo Tipo Descripción endpointsarray de object endpoints[].path_prefixstring endpoints[].requestsinteger Peticiones. endpoints[].messagesinteger endpoints[].blockedinteger endpoints[].detectionsinteger endpoints[].uninspectedinteger toolsarray de object tools[].path_prefixstring tools[].toolstring tools[].callsinteger tools[].blockedinteger tools[].detectionsinteger kindsarray de object kinds[].kindstring kinds[].countinteger detectionsarray de object detections[].idstring Id. detections[].labelstring detections[].countinteger
# Errores
Estado Descripción 400Petición mal formada (bad_request). 404No existe o el token no lo ve (not_found). 503No disponible ahora (unavailable); reinténtalo más tarde.
# Ejemplo
curl TypeScript Python
curl "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/zones/6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d/ai-agents/mcp" \
-H "Authorization: Bearer $OPENWAF_TOKEN" import { OpenWAF } from "./openwaf" ;
const owf = new OpenWAF({ baseUrl: "https://dash.openwaf.dev" }); // token de OPENWAF_TOKEN
const result = await owf.getAIAgentsMCP({
zone: "6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d"
});from openwaf import OpenWAF
owf = OpenWAF(base_url="https://dash.openwaf.dev" ) # token de OPENWAF_TOKEN
result = owf.get_ai_agents_mcp(zone="6f1d2c3b-8a4e-4b7d-9c21-5e3f7a8b9c0d" )
200
{
"endpoints" : [
{
"path_prefix" : "/api/" ,
"requests" : 128 ,
"messages" : 0 ,
"blocked" : 0 ,
"detections" : 0 ,
"uninspected" : 0
}
],
"tools" : [
{
"path_prefix" : "/api/" ,
"tool" : "search_docs" ,
"calls" : 0 ,
"blocked" : 0 ,
"detections" : 0
}
],
"kinds" : [
{
"kind" : "example" ,
"count" : 128
}
],
"detections" : [
{
"id" : "example" ,
"label" : "AI training" ,
"count" : 128
}
]
}
# Ver el catálogo de bots IA
GET /v1/orgs/{org}/ai-agents/catalog
Devuelve el catálogo de bots IA con el que verifica el borde, el operador, la categoría y los métodos de verificación de cada bot (rangos de IP publicados, DNS inverso, firmas Web Bot Auth), y el estado de cada fuente oficial. No incluye los rangos ni las claves.
Rol necesario: readonly o superior.
# Parámetros
Nombre En Tipo Obligatorio Descripción orgruta string (uuid) Sí Id de la organización. Cada ruta comprueba que es la del token (si no, 404).
# Respuesta
Campo Tipo Descripción versionstring Número de versión. botsarray de object bots[].idstring Id. bots[].namestring Nombre. bots[].operatorstring Empresa que opera el bot. bots[].categorystring Uno de ai_training, ai_search, ai_user_agent, search_engine. bots[].methodsarray de string Elementos: uno de ip, rdns, web_bot_auth. bots[].uaarray de string bots[].rdnsarray de string bots[].cidr_countinteger bots[].signature_agentsarray de string sourcesarray de object sources[].idstring Id. sources[].urlstring sources[].fetched_atstring (date-time) o null sources[].okboolean sources[].errorstring sources[].itemsinteger sources[].baselineboolean Sin descarga guardada: se usan los datos incluidos.
# Errores
Estado Descripción 503No disponible ahora (unavailable); reinténtalo más tarde.
# Ejemplo
curl TypeScript Python
curl "https://dash.openwaf.dev/v1/orgs/$OPENWAF_ORG/ai-agents/catalog" \
-H "Authorization: Bearer $OPENWAF_TOKEN" import { OpenWAF } from "./openwaf" ;
const owf = new OpenWAF({ baseUrl: "https://dash.openwaf.dev" }); // token de OPENWAF_TOKEN
const result = await owf.getAIBotCatalog();from openwaf import OpenWAF
owf = OpenWAF(base_url="https://dash.openwaf.dev" ) # token de OPENWAF_TOKEN
result = owf.get_ai_bot_catalog()
200
{
"version" : "example" ,
"bots" : [
{
"id" : "example" ,
"name" : "example.com" ,
"operator" : "OpenAI" ,
"category" : "ai_training" ,
"methods" : [
"POST"
],
"ua" : [
"example"
],
"rdns" : [
"example"
],
"cidr_count" : 128 ,
"signature_agents" : [
"example"
]
}
],
"sources" : [
{
"id" : "example" ,
"url" : "https://www.example.com/" ,
"fetched_at" : "2026-10-27T09:30:00Z" ,
"ok" : false ,
"error" : "" ,
"items" : 0 ,
"baseline" : false
}
]
}