Skip to main content
Live in preview. The /api/v2/intelligence/* endpoints and their MCP tools require the can_use_intelligence entitlement. Readings are labeled provisional while the baseline matures.

Atlas GPR

What it is

Atlas GPR answers one question: how geopolitically tense is this place right now, compared with its own normal? It is a deviation index. A reading of 100 means a place is running at its own typical level of geopolitical tension. 180 means 1.8× that level. Crucially, each place is measured against itself — never against a global average and never against a leaderboard — so the index is not dominated by the countries that simply generate the most news.

Why you should care

Raw counts are a trap. The United States and India produce enormous volumes of coded events every day because they are large, media-dense, and heavily covered; Chad does not. Rank countries by event volume and you rebuild a map of media attention, not of risk. Normalizing against a place’s own baseline removes that. A GPR spike in a quiet country is visible precisely because it is unusual there — which is the signal a monitoring desk actually wants, and the one raw volume buries.

What it is useful for

  • Monitoring and tripwires. “Tell me when this place moves materially above its own norm” is a well-posed query against a deviation index, and a meaningless one against raw counts.
  • A macro risk-premium input. Geopolitical risk indices are established inputs to oil, defense, and risk-premium models. Atlas GPR provides a multilingual, per-country, drill-through version.
  • Narrative triage. The Attention lens tells you what the world is preoccupied with; the Events lens tells you what actually happened. The gap between them is itself informative.
  • Evidence gathering. Every reading drills to the underlying narratives and coded events, so an index move becomes a reading list rather than an alert you have to go re-research.

Two lenses on the same question

Atlas GPR is served through two independent lenses, switchable on the page and via the variant parameter. Both lenses produce a tension_share in [0,1], normalized identically:
where baseline_mean is that place’s own average tension_share over the trailing ~90-day baseline window.

The Attention lens

Plain language: of all the news attention on this place, how much is about war, threats, and conflict? This is the lens most faithful to the original GPR.
Numerator = the total article count of the narratives whose headline is tension-bearing (matched against a war/threat keyword dictionary).Denominator = the total article count of all narratives for the place.
  • Inputs: the Stories primitive — GET /api/v2/stories. Each Story is a cluster of articles about one narrative and carries an article_count (its media footprint). A 300-article narrative counts 300× a single wire brief.
  • What counts as tension: a GPR-style keyword dictionary (war, strike, missile, sanction, blockade, incursion, …) applied to each narrative’s headline — the same idea as the Fed’s GPR, run over our multilingual stream.
  • Geography: country readings use narratives that name that country, exactly how the Fed builds GPRC. The world reading uses every narrative, so it is the most robust reading Atlas produces.

The Events lens

Plain language: of all the events we coded for this place, how much of the coded activity is conflict? Grounded in structured events, so you can drill from the index straight to incidents.
Numerator = the sum of event significance over tension-bearing coded events.Denominator = the sum of event significance over all coded events for the place.
The four components of the decomposition:
Do not correlate components against each other using tension_share. Threats, Acts, Material, and Verbal are shares of a common denominator, so they are compositional and will anti-correlate for purely mechanical reasons. In our own testing, a threats-versus-acts correlation on shares produced a spurious −0.17 that vanished to +0.03 when recomputed on event counts. Use the raw counts for any cross-component analysis.

Two constructions: construction=own_coverage and construction=world_corpus

Both are served. own_coverage is the default and is unchanged; world_corpus is the field’s reference construction, added as a parallel index rather than a replacement. They are named by their denominator, not by a version number — this endpoint already lives under /api/v2, so a v1/v2 value here would read as which API rather than which index.
Why the world corpus and not the place’s own coverage. Caldara–Iacoviello’s denominator is a seven-common-words query — a length/junk filter, meaning “all real articles” — and the Fed’s country-specific GPRC uses that same global denominator. GDELT’s own recommended normalization divides “By Mentioned Country” by total global articles. ICEWS tried per-country totals and reported that it failed. A per-place denominator is topic volume, not corpus size, and it lets the index move opposite to its own events: on 2026-07-16 Ukraine’s qualifying events went 8 → 15 while own_coverage printed its monthly low, because its non-qualifying coverage grew faster. Why fourteen days. Corpus normalization does not remove the weekday cycle. Two whole weeks contain each weekday exactly twice, so the artifact cancels by construction rather than by correction — measured day-of-week amplitude 35.0% → 3.7%. Why no severity weighting. Tested four ways. C&I’s own intensity-weighted AI-GPR correlates r = 0.97 with binary counts; fatalities exists only on conflict events, so 72% of qualifying events structurally cannot carry one; a fitted severity weight collapses to one free parameter (R² 0.949 on 14.24·acts + 5.03·threats); and Goldstein is documented magnitude-blind by both GDELT and ICEWS — “two riots, one with 10 people and one with 10,000, will both receive the same score.”
A world_corpus reading is a trailing 14-day state, not a same-day count. A trailing window is fullest on the days after a burst of events, so the series peaks a few days late. Never render a peak date as the date something happened.

How to read a reading

  • ×norm. 100 = normal for that place; 150 = 1.5× its usual; <100 = quieter than usual.
  • Bands. Subdued · Normal · Elevated · Surging · Extreme — anchored so the global top-decile of material conflict can never band as merely “Normal.”
  • NULL, not 0. Below the floor the reading is insufficient_data with an insufficient_reason. own_coverage’s floor is coverage events on the day (world 0 · continent 80 · region 40 · country 20); world_corpus’s is 100 qualifying events in the base window, and precision.base_events reports where a series sits relative to it whether or not it clears.
  • Fixed baseline. The reference window is frozen, not trailing. A rolling baseline re-anchors a country in sustained crisis to its own crisis, so the index decays toward 100 at the peak of what it exists to detect. Each re-freeze mints a new baseline_version; the old one stays readable.
  • A coder change is an instrument change. Baselines are frozen per coder generation and every reading is normalized against its own — baseline_coder_version tells you which. A series spanning a coder change is not one comparable series.
  • Provisional. Labeled provisional throughout; comparable only within a fixed methodology + coder version.

Status and honest limits

Country coverage is the binding constraint today. Measured over the 107 days from 2026-04-05 to 2026-07-20 across 206 countries:
  • Only 2 countries (United States, India) clear the per-country coverage floor on 90 or more days
  • Only 12 clear it on a majority of days; 162 never clear it once
  • The median country has 22 active days and about 25 events across the entire period
  • The top 10 countries account for 58.6% of all qualifying events
Every country below the floor is returned as insufficient_data, not as a number. Treat world and continent readings as usable and country readings as preview.

The floor reads one day, and the week is not flat

Two properties of the daily series shape what you can do with a country reading. The coverage floor is applied to a single day. A country producing a handful of events a day never clears it, even when a week of its events comfortably would — so insufficient_data on a given day means “not enough evidence that day”, not “nothing happened there”. Aggregate before you conclude. The corpus is not flat across the week. A Sunday carries far less news than a Wednesday, and a share measured over one day inherits that. Measured on the live series, the p90 band fires on 4.7–6.6% of Monday–Friday days but 20.0% of Sundays, and p98 on 7.1% of Sundays against a promised ~2%. A “Surging” reading is three to four times more likely on a Sunday for calendar reasons alone. Do not compare a weekend reading to a weekday one, and do not alert on a single day’s band without a day-of-week control. Both are properties of measuring over one day, and both dissolve under a whole-week window — the construction the original Caldara–Iacoviello GPR uses, and the direction this index is moving.
Some places return a reading with no band. A band is a promise about how often a reading is unusual — roughly a tenth of a place’s days above the ninth decile — and keeping that promise requires a reference distribution with spread in it. On 160 of 206 country series the frozen cut-points are either collapsed (every cut-point equal, so any non-zero reading would print as Extreme) or unreachable (the top band would require 100% of a place’s coverage to be tension-bearing). Those series return band: null with band_status: "degenerate_baseline".This is not a sample-size artifact — requiring n_obs >= 30 moves the count by two. The reading itself, tension_share and the coverage behind it are unaffected; check baseline.bands_usable to see which case a series is in.
Two further limits worth stating plainly:
  • History is short. Consistently coded events begin in March 2026, and the index itself starts 2026-04-05. Any time-series study of Atlas GPR is capped at a few months, which is not enough to establish predictive power. We are accruing history rather than claiming it.
  • Validation is concurrent, not predictive. Against the published GPR daily series, our Attention lens tracks moderately (roughly 0.5 on weekly movements) and the Events lens intentionally measures a different quantity — conflict intensity rather than media attention. We have not demonstrated that Atlas GPR forecasts market or macro outcomes, and we do not claim it.

What we are trying to do

The goal is a geopolitical risk index that is multilingual, per-country, drillable to evidence, and composable with asset and entity data — the things the classic GPR, by design, is not. The near-term roadmap is coverage and history, in that order: deepen per-country coverage until the floor stops suppressing most of the map, and accrue enough consistent history to replace the provisional baseline with a real one and publish splice factors.

How Atlas differs from the classic GPR

Frequently asked questions

No. Atlas GPR is inspired by the Caldara–Iacoviello GPR and built in the same spirit, but it is an independent index computed from GDELT Cloud’s own multilingual Stories and Events. We do not use or redistribute the Fed’s series.
Use Attention for the GPR-style “how preoccupied is the world” barometer, comparable to the classic index. Use Events for a grounded, drill-to-incident measure of coded conflict, or when you need to pivot from the index into the specific events driving it.
Below the coverage floor, Atlas withholds the reading rather than emit a misleading 0. Given the coverage reality above, this is the expected outcome for most countries today. Broaden to region or continent for a reliable reading.
Not on our evidence. We have shown concurrent tracking against the published GPR, not predictive power, and our history is too short to establish it. Treat Atlas GPR as a monitoring and evidence-gathering tool until a real backtest exists.

API

GET /api/v2/intelligence/gpr

Parameters include construction (own_coverage | world_corpus), level, geo, variant (attention | fullspectrum), component, window, and date_*. own_coverage returns the reading, band, tension_share, coverage and the baseline used; world_corpus returns gpr, corpus_share, world_events and a precision block carrying days_in_window and base_events. Either returns insufficient_data with a reason rather than a number. component is validated per lens: Attention publishes only all, and the GPR lens has no verbal/material, so an unsupported pair returns 400 INVALID_ENUM listing what that lens does have. Try it in the API Arena.

Atlas Posture

Preview. GET /api/v2/intelligence/posture is available on the Intelligence tier. Like the rest of Atlas the index is labeled provisional while its reference window is short, and the structural axis is the newest part. Response shape and coverage may still change.

What it is

Atlas Posture answers a different question from Atlas GPR, and the difference is the entire point.
  • GPR asks: how hot is this place running versus its own norm? A deviation.
  • Posture asks: what state is this place actually in? A condition.
A place can sit exactly at its own historical norm and still be in a severe condition. A war that has run for three years becomes that country’s normal, and a pure deviation index would report it as unremarkable — precisely when it matters most. So Posture never normalizes a country against its own past. Own-history comparison appears in exactly one field: the trend arrow. Posture is built on two axes that move on completely different clocks.

The two axes

Dynamic axis

Moves with events. Conflict & Security, Systemic Gravity, Markets & Economy, Flows & Contagion — computed from our own coded events over a rolling window. This is what changes week to week.

Structural axis

Moves with institutions. Governance, democracy, development, economy, and militarization — annual, lagged, and slow. This is the condition a shock lands on.
The distinction matters because the same shock produces very different outcomes depending on the ground it hits. A contested election in a consolidated democracy with strong rule of law is a news story; the same event in a factionalized partial democracy is a leading indicator of instability. The dynamic axis sees the event. The structural axis sees the ground.

Why you should care

Deviation indices systematically under-report chronic crises. This is the single most important thing Posture fixes. If your monitoring is built only on “what changed,” it will go quiet on Yemen, Myanmar, and Sudan exactly as those situations become entrenched — because entrenchment is the absence of change. Structural condition is the best available predictor of instability, and it is not in the news. The political-instability forecasting literature — most prominently the Political Instability Task Force — consistently finds regime characteristics, not event counts, to be the strongest predictors. That information is annual and public, and it is invisible to any pipeline that only reads today’s headlines. A condition index is comparable across places; a deviation index is not. “Which of the 40 countries I operate in is in the worst condition” is a well-posed question against Posture and an ill-posed one against GPR.

What it is useful for

  • Exposure screening. Rank an actual country footprint by condition rather than by news volume.
  • Chronic-crisis monitoring. Keep entrenched situations visible after they stop being novel.
  • Context for a GPR spike. The two indices are designed to be read together: GPR says something is happening, Posture says here is what it is happening to.
  • Due diligence and country risk memos. A decomposable score with named, citable inputs is defensible in a way a proprietary black-box rating is not.

How it is scored

The dynamic axis

A 0–100 composite of four pillars with fixed, published weights: Conflict & Security (0.35), Systemic Gravity (0.25), Markets & Economy (0.25), Flows & Contagion (0.15). Each pillar is the mean of its sub-indicators. Each sub-indicator is a share or per-event mass computed over a window — 30 days by default — by summing numerators and denominators across the window and dividing once, never by averaging daily figures. Fatality intensity is deliberately scored against absolute anchors on the scale the conflict-research field recognizes (25 deaths/year, 1,000 deaths/year), so a war reads as a war regardless of how the rest of the world is doing that quarter. Because our fatality counts come from our own conflict-event coding, they cover a broader set of deaths than battle-related-death datasets; the anchors are reference points, not a claim of equivalence. Every pillar is also computed twice more — split by whether an event’s actors are entirely internal to the country or span a border — giving an internal and external reading beside the headline.

The structural axis

Five dimensions, built from public annual indicators:
Governance and democracy are kept separate on purpose. The World Bank measures whether a state is effective; V-Dem measures whether it is democratic. These come apart constantly — China scores far better on governance effectiveness than on democracy, and collapsing them into one “institutions” number would erase exactly the distinction that predicts instability.

Absolute anchors, not a leaderboard

Every structural indicator is scored against fixed good/bad reference points on its own scale — not against the live field of other countries. This is a correctness requirement rather than a preference, and it is worth being explicit about why, because the first implementation got it wrong:
A cross-country percentile rank is zero-sum. Three consequences follow, all of them bad:
  1. Any world or regional aggregate is pinned near the middle by construction — the average country is always at the 50th percentile, so “the world’s structural condition” can never move and the number is tautological.
  2. A country’s score can only improve because another country deteriorated, which is not what anyone means by “did this country get better.”
  3. It is silently incommensurable with an axis scored against fixed references, so composing the two produces a number with no coherent interpretation.
Anchoring each indicator to fixed reference points fixes all three: a country’s score depends only on its own condition, and an aggregate becomes a real number that can move. With absolute anchors the GDP-weighted world scores 19.8 — decomposing into governance 29.5, democracy 37.8, development 8.9, economy 6.7, and militarization 16.3 — against Europe at 10.4. Under the old ranking approach that world number was, necessarily, about 50 no matter what was happening on Earth. Indicators whose meaningful range is multiplicative rather than additive — GDP per capita, for instance — are anchored on a log scale.

Status and honest limits

  • Structural inputs are annual and lagged. V-Dem v16 carries a 2025-03-10 vintage and World Bank indicators trail by one to two years. This axis describes standing condition and cannot move on the news. That is the design, not a defect — but it means Posture is not a real-time product on that axis.
  • Dynamic-axis coverage is limited by the same event history as GPR. Roughly 60 countries clear the dynamic coverage floor over a 30-day window; the rest return null.
  • A fifth pillar is deliberately unshipped. Narrative & Information is specified but not published: the inputs it needs do not exist at the density a daily country panel requires, and publishing it on what does exist would manufacture a number. Responses name it as deferred rather than quietly omitting it.
  • Point estimates only. V-Dem publishes uncertainty intervals for its expert-coded indices; we currently store the point estimate.
Face validation of the structural axis is behaving sensibly: Afghanistan (64.1), Venezuela (57.0), and Russia (53.2) score worst; Switzerland (0.1), Japan (2.1), and Norway (3.0) best. China’s split — 55 on governance against 95 on democracy-fragility — is exactly the divergence the separate dimensions exist to capture.

What we are trying to do

Posture is meant to be the answer to “your risk index went quiet on a country that is still on fire.” The end state is a decomposable, citable condition score for every country with adequate coverage, published beside GPR so a user can always ask both what changed and what is it changing on top of. The work between here and there is coverage on the dynamic axis, a public endpoint, and — eventually — treating the non-monotonic instability signal in regime type (the “anocracy in the middle” finding from the PITF literature) as a forecast feature rather than a condition score.

Influences and references

Political Instability Task Force — Goldstone et al. (2010)

“A Global Model for Forecasting Political Instability,” American Journal of Political Science 54(1). Found partial democracy with factionalism to be the single strongest predictor of instability, using a strikingly small set of variables. The reason Posture carries a democracy dimension at all.

Varieties of Democracy (V-Dem)

Coppedge et al., V-Dem Country-Year Dataset v16 (2026). Expert-coded democracy indices — electoral (polyarchy), liberal, civil liberties, and freedom of expression. Free to use with citation requested; we load v16 for 176 countries, 1990–2025.

Worldwide Governance Indicators — World Bank

Kaufmann & Kraay. Six governance dimensions as standardized scores. CC-BY-4.0.

Fragile States Index — Fund for Peace

A well-established country-condition index and a useful sanity check on face validity. Not ingested — an influence and a comparator only.