text/event-stream) that emits metadata, AI model information, streamed markdown content, and a final done signal.
Query parameters
The indicator of compromise to analyze. Supported types:
- IPv4 — e.g.,
1.2.3.4 - IPv6 — e.g.,
2001:4860:4860::8888 - Domain — e.g.,
malicious-domain.example - MD5 hash — 32 hex characters
- SHA1 hash — 40 hex characters
- SHA256 hash — 64 hex characters
400 error.The AI model ID to use for analysis. Must be one of the allowed model IDs listed below. If omitted or invalid, the server defaults to
openrouter/free.| Model ID | Label |
|---|---|
openrouter/auto | Default — OpenRouter (Auto) |
openrouter/free | OpenRouter (Free) — default |
liquid/lfm-2.5-1.2b-instruct-20260120:free | LiquidAI: LFM2.5-1.2B-Instruct (Free) |
stepfun/step-3.5-flash:free | StepFun: Step 3.5 Flash (Free) |
google/gemma-3-4b-it:free | Google: Gemma 3 4B (Free) |
Request headers
Your OpenRouter API key. Used to call the AI model. Falls back to the server’s
OPENROUTER_API_KEY environment variable if omitted. If neither is present, the AI analysis step fails and an error SSE event is emitted with errorType: "invalid_api_key".Your VirusTotal API key. Used to enrich IP, domain, and hash IoCs. Optional — if omitted, the server falls back to its own key, or skips VirusTotal and emits a warning.
Your AbuseIPDB API key. Used to enrich IP address IoCs. Optional.
Your PolySwarm API key. Used to enrich hash IoCs. Optional.
Response
Status:200 OKContent-Type:
text/event-streamConnection:
keep-alive
The response body is a stream of SSE events. The normal sequence is:
meta event and the stream continues. If a fatal error occurs mid-stream, an error event is emitted instead of done.
See SSE Events for the full schema of each event type.
Error responses
These errors are returned asapplication/json before the stream opens.
400 — Missing IoC parameter
400 — Missing IoC parameter
The
ioc query parameter was not included in the request.400 — Unknown IoC type
400 — Unknown IoC type
The value of
ioc did not match any supported format (IPv4, IPv6, domain, MD5, SHA1, SHA256).429 — Rate limit exceeded
429 — Rate limit exceeded
The requesting IP has exceeded the allowed request rate. The
retryAfterSeconds field tells you how long to wait before retrying. See Rate Limiting.500 — Internal error
500 — Internal error
An unexpected error occurred before or during stream initialization — for example, all CTI sources failed.