Skip to main content
This page answers one question: how do I pull global incidents and risk signals into an internal app? World Monitor exposes them through a REST API, an MCP server, official SDKs and signed alert webhooks. Plans are self-serve. You sign up and create a key at worldmonitor.app/pro, with no sales call. There is no single “incident” endpoint today. Incidents come from the feeds below, each with its own record shape and retention. Pick the feed by the job: REST calls go to https://api.worldmonitor.app with an X-WorldMonitor-Key: wm_... header. See Authentication for keys and Rate limits for per-plan quotas.

The record each feed returns

Field names below are the JSON names the routes return. Unrest, news and history records link to the original report when the producer had one; UCDP events name their original source in text.

UCDP event (list-ucdp-events)

Unrest event (list-unrest-events)

A GDELT-derived row is a media signal, not a verified event. The route serves it with confidence: CONFIDENCE_LEVEL_LOW, an unspecified type and severity, and a summary that says the local event is not verified.

News cluster (get_news_clusters, MCP)

A cluster groups headlines from different outlets that report the same story. The REST digest returns the underlying headlines rather than clusters. Each item has title, source, link, publishedAt, threat, location and locationName when a place was extracted, importanceScore, corroborationCount and credibilityScore.

History record (get-intel-timeline, search-intel-history)

History records carry a country but no coordinates.

Filters

The list routes return the whole current snapshot in one response; there is no cursor pagination. The history routes set partial: true when a bounded read may have omitted older matches, and upstreamUnavailable: true when the store could not be reached. An empty list in that case is a failed read, not a quiet period.

Retention: how far back each feed goes

Checked against the code on October 17, 2026. To keep a longer record, poll the feeds and store the items yourself. De-duplicate history records on id, and unrest and UCDP rows on their producer id. A news cluster id can change when an earlier headline joins the cluster, so do not use it as a durable key.

Webhooks for new items

Alert rules push matching events to a webhook as they happen, or as daily, twice-daily or weekly digests. A rule filters by event type, severity (all, high, critical) and country. Each delivery is signed with HMAC-SHA256 in X-WM-Signature. You set up the webhook and rules in the dashboard’s notification settings, signed in with a paid plan. A real-time delivery carries eventType, severity, timestamp and a payload whose fields depend on the event type. Treat every payload field as optional. News alerts (rss_alert) carry title, source, link, publishedAt, importanceScore and corroborationCount. Conflict alerts (conflict_escalation) carry title and source, plus countryCode when the country resolved, and no link. Payloads carry no stable event id and no coordinates. The notifications reference has the envelope and a verification example.

Code

Python, with the official SDK:
The Go (client.Get, client.CallTool) and Ruby (client.get, client.call_tool) SDKs expose the same calls. From a shell, the npm CLI does the same:

Plans and price

These plans are self-serve with published prices on the pricing page. Checkout runs in the browser; you do not need to talk to sales.

Before you build

  • World Monitor aggregates published reports. It does not verify events on the ground, and a GDELT-derived row is a media signal.
  • Not every upstream source has completed a terms review. Check reuse terms before you redistribute data. The free get_sources MCP tool lists each outlet’s tier and review status.
  • There is no published availability SLA.
  • Planned work: a cursor-paginated history endpoint with longer retention is tracked in issue #4276 and issue #5745.