Open Source · MIT

Build on the
NatusAI OSINT platform

NatusAI OSINT aggregates aviation, maritime, seismic, conflict, cyber, and OSINT feeds onto a single GPU-rendered map — and exposes every one of them as a plain HTTP endpoint. This is the same API the dashboard runs on. There is no separate, privileged internal tier.

67
Endpoints
20+
Live feeds
0
Keys required
Guide

Overview

Every data point on the map is rendered through WebGL via MapLibre GL, which is what lets the interface hold thousands of concurrent entities at 60fps. The application is a Next.js app: the map and HUD run in the browser, and each live feed is normalised by a route under /api before it reaches the client.

That boundary is deliberate. Upstream sources disagree about formats, rate limits, and CORS policy, so the API layer absorbs those differences and hands back consistent JSON.

No credentials needed
Aviation, maritime, satellites, fires, earthquakes, weather, news, and CVE data all come from public keyless feeds. Keys only matter for the optional RECON scanner and for raising rate limits.
Guide

Quick Start

Every read endpoint is a plain GET returning JSON. Nothing below needs authentication — paste any of it into a terminal.

curl -s https://osint.natusai.com/api/flights | jq '.commercial_flights | length'

If you only need magnitudes rather than geometry, /api/stats is the right endpoint to poll — it collapses the heavy feeds into a handful of counters.

Aggregate counters
curl -s https://osint.natusai.com/api/stats
# { "stats": { "flights": 9241, "sats": 2043, "cctv": 2117,
#              "weather": 58, "nuclear": 191, "incidents": 412 },
#   "timestamp": "2026-07-29T12:00:00Z" }

The OSINT lookups each take one subject, so they compose cleanly in a pipeline:

Passive subdomain enumeration
curl -s "https://osint.natusai.com/api/osint/certs?domain=example.com" | jq -r '.subdomains[]'
Try before you write code
Every GET endpoint in the reference below has a Send request button that runs it against this instance and shows the live response.
Guide

Self-Hosting

NatusAI OSINT requires Node 22+ and access to the private repository. To run it locally:

Local development
git clone https://github.com/bogdan-toader/natusai-osint.git
cd natusai-osint
npm ci
npm run dev        # http://localhost:3000

For a production build, or to run the checks:

Build and test
npm run build && npm start
npm run lint
npm test           # vitest
npm run test:live  # includes tests that hit live upstream feeds

A Dockerfile and docker-compose.yml ship with the repository. The container always listens on port 3000 internally; OSIRIS_PORT controls the host port it is published on.

Docker
cp .env.example .env
docker compose up -d
Guide

Configuration

Copy .env.example to .env. Read that file before filling anything in — most of the keys it lists are reserved for future sources and are not consumed by the current code.

Read by the application

SCANNER_URL / SCANNER_KEY
Points at the separate RECON scanner backend. SCANNER_KEY must equal that backend’s OSIRIS_KEY. Leave both empty to disable RECON — /api/scanner then returns 503 by design.
SDK_INGEST_KEY
Shared secret for /api/sdk/ingest. The endpoint fails closed: while this is unset, ingestion is disabled and returns 503.
OSIRIS_TELEGRAM_CHANNELS
Comma-separated public Telegram channel names (no @) for the Telegram OSINT layer, overriding the curated default set.
OSIRIS_PORT
Host port the UI is published on. The container itself always listens on 3000.

Optional — higher rate limits only

FIRMS_API_KEY, OPENSKY_CLIENT_ID, OPENSKY_CLIENT_SECRET, N2YO_API_KEY, AIS_API_KEY. The public keyless feeds are used unless you extend the code to prefer these.

Secrets hygiene
Generate secrets with openssl rand -hex 32. Never commit a populated .env — only .env.example belongs in version control.
Guide

Interface Guide

The map fills the viewport and every control floats above it. Panels are toggles rather than destinations, so you can build up exactly the picture you need and drop the rest.

Layer Panel
The left rail. Switches individual feeds on and off, and carries the theme selector.
RECON Toolkit
DNS, WHOIS, certificate transparency, IP and ASN enrichment, breach checks, sanctions, CVE lookup, port scanning.
Intel Feed
A running stream of incoming events across every enabled feed.
Region Dossier
Double right-click the map for a composite summary of that location from every feed covering it.
Entity Graph
Link analysis, expanding one node at a time into its neighbours.
Status Bar
Community and docs links on the left, then a live ticker of prices and significant seismic events.
Guide

NatusAI & MCP

The NatusAI assistant uses your own model key and works two ways. Assist is a conversation (press O): ask in words, typed or spoken, and NatusAI works the map for you. It flies to the place you name, switches the layers on, searches what is live (flights, military aircraft, ships, ports and chokepoints, earthquakes, fires, weather, disaster alerts, news, cameras, satellites), marks what it finds in cyan with the area it searched, and lists it in cards you can click through. It reads the markets, opens panels, and starts forecasts. Each step shows what it did as it does it; choose Navigate, Research or Forecast to steer it, or leave it on Auto.

Forecast is NatusAI OSINT's prediction engine. Ask it a question and it builds a world model from the live feeds (the actors, where they are, how they relate), assembles a deliberately diverse panel of simulated forecasters, and lets them debate over several rounds: each one gives a view, replies to the others, and updates. A report agent then writes a calibrated forecast with its drivers, scenarios, signposts to watch and the strongest dissent. The answer takes the shape the question asks for: a probability for a yes-or-no question, a share for each outcome when it asks which of several will happen, and an estimate with an 80% range when it asks how much. While it thinks, the analysis draws itself on the globe as arcs through the sky; every arc and point can be clicked to open exactly that piece of the research, and the camera follows the run until you take it.

Your own key
OpenAI, Anthropic, Google Gemini, OpenRouter, Groq, DeepSeek, xAI, Mistral or Qwen. The key stays in your browser and travels in a header with your requests; the server uses it for your run and never stores or logs it.
Cost
Quick: 6 agents × 2 rounds, about 16 model calls. Standard: 10 × 3, about 34. Deep: 16 × 4, about 68. Billed by your provider at its own rates.
Sharing
Every run has a link, /?oi=<id>, that replays the whole analysis on the globe for anyone who opens it. Runs are kept for three hours after they finish.
Steering
Whoever started a run holds its token: they alone can inject events into it or stop it. Anyone with a key can question the panel.
On the globe
Violet arcs are alignments and agreements, magenta are rivalries and disputes, indigo is everything in between; evidence from the feeds is a paler wash of its tone, and marching dashes are a panelist weighing an actor. All three colours are yours to set in the Style Studio (Map layers → NatusAI).
Workspace
Full screen (the expand button, with or without a forecast) opens the NatusAI workspace. On the left, the same Forecast / Assist switch as the panel: the ask form, then the verdict with the report or the execution trace (every step the engine took, timed, with what it produced); or the conversation. In the middle, four views on keys 1 to 4: the live globe; the research graph, after MiroFish, with every actor, panelist and cited source and every link between them, filters and a flow layout; the timeline, each panelist round by round under the pooled view; and sortable tables of every object. On the right, once there is a run, whatever is selected, as an object with its properties and links. Ctrl+K (⌘K) finds any object by name, and in Assist NatusAI can open the workspace, switch its view and open objects for you.
Research
Before the world model, NatusAI researches the question: recent news found for it (from GDELT and Wikipedia’s Current events, each with its link and, where the publisher serves it, what the article says), Wikipedia background, and the NatusAI OSINT feeds. The panel is anonymous: Agent 1, Agent 2 and so on, each known by a role, never a made-up name.
Sources
Every panelist backs each post with quotes from numbered sources: the research’s articles and background, items of the live feed, or passages the world model lifts word for word from your own data. Each quote says which way it moved that panelist’s number and why, and links to where it was published; the report shows the evidence that carried the panel, source by source. Each quote is checked against its source and marked verbatim or paraphrase; a post that quotes nothing is sent back once. In the research graph every quote is a dotted thread from the panelist to its source, and the report joins at the end with a thread to each source its drivers rest on, so any conclusion can be followed back to the words it came from.
Answers
Every run says what kind it is (binary, choice or number) and gives its answer in words, e.g. "62% YES", "Hold (55%)" or "86.4 USD per barrel (80–92)", alongside the figures.

From code, start a run, then follow it over Server-Sent Events or wait for it:

Forecast over the REST API
# Start: answers 202 with the run id, a watch link and a run token
curl -s -X POST https://osint.natusai.com/api/oi/runs \
  -H "Content-Type: application/json" \
  -H "X-OI-Provider: openai" \
  -H "X-OI-Key: $OPENAI_API_KEY" \
  -d '{"question": "Will the Fed cut rates at its next meeting?", "depth": "quick"}'

# Wait up to 55 s for the forecast (repeat until status is "done")
curl -s "https://osint.natusai.com/api/oi/runs/RUN_ID?wait=55"

# Or watch it happen
curl -N https://osint.natusai.com/api/oi/runs/RUN_ID/events

The same engine is an MCP server at https://osint.natusai.com/api/mcp (Streamable HTTP). Give an agent the tools oi_predict, oi_get_run, oi_ask, oi_inject and oi_cancel, plus osiris_world_brief and osiris_markets, which are free and need no key. The model key is set once on the connection, as headers, so it never appears in the agent's conversation.

# ~/.hermes/config.yaml
mcp_servers:
  natusai:
    url: "https://osint.natusai.com/api/mcp"
    headers:
      X-OI-Provider: "anthropic"
      X-OI-Key: "sk-ant-..."
      X-OI-Model: "claude-haiku-4-5-20251001"
    timeout: 300
How long a forecast takes
One to five minutes, depending on depth and provider. oi_predict waits for it when the client accepts a streamed response, sending progress as each phase and round completes. Over plain JSON it waits about 80 seconds, then returns the run id to poll with oi_get_run and wait_seconds.

The method follows MiroFish, the open-source swarm-intelligence engine: seed a parallel world from real material, populate it with agents, let them interact while you inject variables, then hand the simulation to a report agent. NatusAI OSINT rebuilds that method natively for its own feeds and globe; no MiroFish code is used. A simulation, not a guarantee.

Guide

Keyboard Shortcuts

Press ? at any time inside the application to bring up this list.

FToggle fullscreen
SShare current view
LToggle layer panel
MToggle markets panel
IToggle intel feed
RReset to global view
?Show help
ESCClose panels / popups

In these docs, ⌘K (or /) opens search from anywhere on the page.

API Reference

Conventions

All routes live under /api on whatever origin serves the application. Reads are GET, writes are POST with a JSON body. Nothing requires authentication except /api/sdk/ingest and /api/github-webhook. NatusAI runs on a model key you bring, sent in the X-OI-Key header.

Errors
Failures return a non-2xx status with an `error` key, often alongside `detail` carrying the upstream message. Most routes proxy third parties, so treat upstream failure as normal — check response.ok before reading the body.
Caching
Routes set their own Cache-Control TTLs: typically 45–60s for fast-moving feeds, up to a day for static reference data. Polling faster than the TTL gains nothing but load. Where a route advertises refreshInterval, use it.
Rate limits
The three AI endpoints allow 5 requests per minute per IP and return 429 beyond that. Other routes are bounded indirectly by their upstream sources.
Timestamps
Every timestamp field is ISO 8601 in UTC.
Responsible use
The RECON scanner and /api/osint/sweep generate traffic against the targets you name. Only point them at infrastructure you own or have written authorisation to test. The remaining OSINT routes are passive and query third-party datasets rather than the subject itself.
API Reference

System

Liveness and aggregate counters. Safe to poll from monitoring.

API Reference

Aviation & Space

Aircraft, orbital objects, and heliophysics.

API Reference

Earth & Environment

Seismic, fire, atmospheric, and orbital-imagery feeds.

API Reference

Geopolitical

Conflict zones, frontlines, event streams, and country-level risk.

API Reference

Media & Markets

News aggregation, live broadcast streams, and financial instruments.

API Reference

Surveillance & Infrastructure

Camera networks, fixed infrastructure, maritime traffic, and tile/stream proxies.

API Reference

Cyber Threat

Vulnerability, attack, and malware telemetry.

API Reference

OSINT Toolkit

The lookup tools behind the RECON panel. Every route takes a single subject and returns a normalised result, so they compose well in scripts.

API Reference

Recon Scanner

Active scanning, delegated to a separate backend so the web tier never runs scans itself.

API Reference

Entity Graph

Link analysis over entities surfaced elsewhere in the platform.

API Reference

AI Analysis

Gemini-backed correlation over feed data you supply. All three are POST, all three are rate limited to 5 requests per minute per IP.

API Reference

NatusAI (Assist & Prediction)

NatusAI Assist, a model on your own key that works the map in conversation, and swarm-intelligence forecasting on live NatusAI OSINT intelligence: a simulated panel of AI forecasters debates a question over rounds, and a report agent writes a calibrated forecast. Your model key is sent in headers and never stored. Also served as an MCP server at /api/mcp; see NatusAI guide.

API Reference

Polybolos SDK

Push entities from an external platform into the Common Operating Picture, and stream the merged picture back out.

API Reference

Webhooks

Inbound hooks from external services.