How It Works

You send one API call. ThreatMap fans out across 20+ sources in parallel, normalises the results into one schema, calculates a unified score, and returns one JSON. Here's what happens in those 500ms.

The flow

Your app                    ThreatMap                    Upstream sources
─────────                   ─────────                    ────────────────

POST /v1/ioc ──────────────► 1. Identify applicable
  value="8.8.8.8"              sources for this IOC type
                               (IP → AbuseIPDB, GreyNoise,
                               Shodan, Censys, VT, OTX...)

                              2. Check cache (Redis)
                                 hit? → return cached (5ms)
                                 miss? → continue

                              3. Fan out in parallel ──────► AbuseIPDB API
                                 (Promise.allSettled) ──────► GreyNoise API
                                 each call has its own ──────► Shodan API
                                 timeout + circuit breaker ──► Censys API
                                                            ► VirusTotal API
                                                            ► OTX API
                                                            ► + more

                              4. Collect results as they
                                 arrive. Failed/timed-out
                                 sources excluded (partial OK)

                              5. Normalise into one schema
                                 - map fields
                                 - reconcile scores
                                 - merge enrichment (ASN, geo)

                              6. Calculate ThreatMap Score
                                 weighted by source reliability

                              7. Cache result (15 min TTL)

  ◄────────────────────── return unified JSON
                              {
                                threatmap_score: 12,
                                sources: { abuseipdb: {...}, ... },
                                metadata: { latency_ms: 340 }
                              }

ThreatMap Score (0–100)

The score is a weighted average of every source's verdict. Sources are weighted by reliability:

Score rangeVerdictWhat it means
0–20CleanNo malicious signals from any source
21–40SuspiciousSome indicators, no strong consensus
41–70MaliciousMultiple sources agree, active threat
71–100CriticalHigh-confidence malicious, active campaign

Source weights are transparent — the sourcesobject in every response shows each source's contribution. Weights are reviewed quarterly.

Caching

Results are cached in three layers to reduce upstream costs and latency:

LayerTTLWhat
Edge (gateway)1–5 secBurst protection — same query from 5 agents in 1 second = 1 upstream call
Application (Redis)15–60 minPer-provider responses. IOC reputation: 15 min. Passive DNS: 60 min. WHOIS: 24h.
Persistent (RelataDB)18 monthsHistorical sightings — builds our own dataset over time

Enterprise can bypass cache with force_refresh=true.

BYOK routing

When you register a provider key via BYOK, ThreatMap routes calls to that provider through your key instead of ours. BYOK calls cost 0 credits.

Without BYOK:
  POST /v1/ioc → ThreatMap calls Shodan with OUR key → 2 credits

With BYOK (you registered your Shodan key):
  POST /v1/ioc → ThreatMap calls Shodan with YOUR key → 0 credits

BYOK also works for mixed routing — if you have a Shodan key but not a GreyNoise key, Shodan calls are free and GreyNoise calls use 2 credits.

Circuit breaker

Each upstream source has a circuit breaker. If a source fails repeatedly (5 consecutive errors or >50% error rate in 60 seconds), the circuit opens — calls to that source are short-circuited for 30 seconds. This prevents one slow provider from degrading the entire response.

Failed sources are excluded from the response (providers_failedin metadata) — you always get partial results.

MCP — how AI agents connect

The MCP server exposes every endpoint as a tool. Your AI agent (Claude, Cursor, Copilot) calls ThreatMap automatically when it encounters an IOC, CVE, or domain in conversation.

User: "Is 203.0.113.50 suspicious?"
       │
       ▼
Claude calls MCP tool: threatmap_ioc_lookup(value="203.0.113.50")
       │
       ▼
ThreatMap fans out → normalises → returns score: 87 (High)
       │
       ▼
Claude: "Yes — score 87/100. Known C2 node across 3 sources.
         Recommended action: block at perimeter."

Free tier uses a public read-only MCP server. Teams+ uses your API key for authed MCP. Enterprise gets per-team MCP endpoints with per-tool ACLs.