GeoMemo Dispatch
A REST API that returns news articles as JSON. Base URL https://dispatch.geomemo.ai/v1. All requests are GET over HTTPS. Times are UTC in ISO 8601. Every article comes with a link to the publisher and a summary written by us; we never return the article’s full text.
Coverage, stated plainly. 9,196 publications in 83 languages (measured 28 Sep 2026). Country and region tags and scores are strongest on geopolitical news; general news (sports, entertainment, domestic stories) carries a general category and fewer tags. The archive starts in Nov 2025.
Authentication
Send your key in the X-Api-Key header. Authorization: Bearer <key> and the apiKey query parameter also work; the header keeps keys out of logs. Keys start with gmd_live_. We store only a hash, so a lost key is replaced, not recovered.
curl https://dispatch.geomemo.ai/v1/top-headlines -H "X-Api-Key: gmd_live_..."Moving from newsapi.org
Change https://newsapi.org/v2 to https://dispatch.geomemo.ai/v1 and swap the key. The three endpoints, their main parameters and the article fields match. The differences:
descriptionandcontentboth hold our summary. We never return a slice of the article text.top-headlinesaccepts any publisher country code, not only us, plusregion.sortBy=popularitymaps to our score.- Extra fields sit in
article.geomemo. Ignore it and your code runs unchanged.
GET/v1/everything
Search every article we serve. Your plan sets how far back you can go.
| Parameter | Type | Description |
|---|---|---|
| q | string | Keywords. Quotes for phrases, OR, and - to exclude. Matched against the original title, the English title and the English summary, so English words find articles in every language. Max 500 characters. |
| searchIn | string | title, description, or both (default). |
| sources, domains, excludeDomains | csv | Source ids from /sources (up to 20), or publisher domains. |
| from, to | ISO date | Publication window. Your plan limits how far back it can reach. |
| language | csv | ISO 639-1 codes, e.g. ar,fa,tr,sw. |
| country | csv | ISO 3166 alpha-2. Countries the article is about. |
| sourceCountry | csv | ISO 3166 alpha-2. Where the publisher is based. |
| region | string | One of the 10 regions in /reference/regions. |
| category | csv | Display names, slugs (geopolitical-conflict, business-finance) or newsapi.org names (business, sports). See Categories and regions below. |
| relevance | string | geo for geopolitically relevant articles only, all (default). |
| minScore | 0 to 100 | Drop articles whose score is below this. Unscored articles are dropped too. |
| collapse | boolean | true returns one article per story. |
| sortBy | string | publishedAt (default), relevancy (needs q), score. significance and popularity are accepted as aliases for score. |
| page, pageSize | int | pageSize up to 100 (20 on Developer). Results beyond 10,000 are not paged; narrow the window instead. |
curl -G https://dispatch.geomemo.ai/v1/everything \
-H "X-Api-Key: $GEOMEMO_KEY" \
--data-urlencode 'q="grain corridor" OR "Black Sea shipping"' \
-d from=2026-09-20 -d relevance=geo -d collapse=true -d sortBy=scoreimport os, requests
r = requests.get("https://dispatch.geomemo.ai/v1/everything",
headers={"X-Api-Key": os.environ["GEOMEMO_KEY"]},
params={"q": '"grain corridor" OR "Black Sea shipping"',
"from": "2026-09-20", "relevance": "geo",
"collapse": "true", "sortBy": "score"})
for a in r.json()["articles"]:
print(a["geomemo"]["titleEn"], a["geomemo"]["language"], a["url"])const params = new URLSearchParams({
q: '"grain corridor" OR "Black Sea shipping"',
from: "2026-09-20", relevance: "geo", collapse: "true", sortBy: "score" });
const res = await fetch(`https://dispatch.geomemo.ai/v1/everything?${params}`,
{ headers: { "X-Api-Key": process.env.GEOMEMO_KEY } });
const data = await res.json();GET/v1/top-headlines
The highest-scoring geopolitically relevant stories of the last 48 hours, one article per story, highest score first. Filter by country (publisher country), region, category, language, sources or q. For more than 48 hours of a region, use /everything with region and relevance=geo.
curl -G https://dispatch.geomemo.ai/v1/top-headlines -H "X-Api-Key: $GEOMEMO_KEY" \
--data-urlencode region="Middle East" -d pageSize=5GET/v1/sources
Publications we collect from, with id, name, url, language, country, region, type and articles in the last 30 days. Filter by category, language, country or region. Also at /v1/top-headlines/sources for newsapi.org clients. The same list is browsable on the sources page.
{ "status": "ok", "sources": [ { "id": "example-dawn-com", "name": "Example Dawn",
"description": null, "url": "https://example.com", "category": null,
"language": "en", "country": "PK",
"geomemo": { "domain": "example.com", "region": "South Asia", "type": "news", "articles30d": 1840 } } ] }GET/v1/storiesGrowth, Business
One row per story: the lead article, how many articles and outlets covered it, in which languages, and when it was first and last seen. Filter by from (default three days ago), to, category, region, country and minSources; sortBy is size (default), recency or score (significance and popularity are accepted as aliases). Use /v1/stories/{id} for every article in a story.
{ "status": "ok", "stories": [ { "id": 551873, "size": 12, "sourceCount": 9,
"languages": ["el", "en", "zh", "tr"], "firstSeen": "2026-09-27T06:40:00Z",
"lastSeen": "2026-09-27T19:02:00Z", "maxScore": 68,
"lead": { /* article object */ } } ] }GET/v1/reference/{categories | regions | languages | countries}
The allowed values for filters, with article counts. These calls do not count against your quota, and neither does /v1/usage, which returns your plan, limits and what is left.
The article object
| Field | Description |
|---|---|
| source.id, source.name | Publication. |
| author | Byline when the publisher gives one. |
| title | Headline as published, in its original language. |
| description | Our English summary, up to 45 words, written by our models. Not the publisher's text. null when we have not summarised the article: you still get the headline, link and metadata. |
| url | Link to the article on the publisher's site. |
| urlToImage | The publisher's preview image URL, on their server. We do not copy or rehost images. |
| publishedAt | Publication time, or the time we fetched it when the publisher gives none (see geomemo.publishedAtSource). |
| content | Same as description, for newsapi.org compatibility. Never a slice of the article text. |
| geomemo.id | Stable article id. |
| geomemo.titleEn | English translation of the headline. |
| geomemo.language | ISO 639-1 language of the article. |
| geomemo.countries, region | Countries and region the article is about. |
| geomemo.sourceCountry | Where the publisher is based. Used by the country filter on /top-headlines. |
| geomemo.category, subCategory, categoryGroup | Topic; group is geo or general. |
| geomemo.relevance | geo or general. |
| geomemo.score | 0 to 100: GeoMemo's composite importance score. A model estimate, useful for ranking and filtering, not a fact. null on articles we have not scored. |
| geomemo.signals | The yes/no judgements behind the score, as booleans: geopoliticalSignificance, globalEconomicImpact, novelty, decisionMakerRelevance, analyticalDepth. null on articles we have not scored. |
| geomemo.story | id, role (parent or child), size. null when the article is in no story. |
| geomemo.publishedAtSource | publisher, or scraped when the publisher gave no date (or one more than an hour after we fetched it). |
Never returned: article text, the publisher’s own description, author email or social handles, embeddings, or internal status values. There is no article-level sentiment field, because we do not compute one.
Categories and regions
Pass category names exactly as written. /v1/reference/categories returns the live list with counts.
Geopolitical
- Geopolitical Conflict
- International Relations
- Geopolitical Politics
- Defense & Arms Transfers
- Cyber & Information Warfare
- Geopolitical Economics
- Global Markets
- Critical Tech & Minerals
- Climate & Humanitarian Crisis
General
- Sports
- Entertainment & Celebrity
- Business & Finance
- Technology
- Science
- Health
- Crime & Justice
- Domestic Politics & Policy
- Education
- Lifestyle & Culture
- Weather & Environment
- Accidents & Incidents
- General
Regions
- North America
- South America
- Europe
- Russia & Central Asia
- Middle East
- Africa
- South Asia
- East Asia
- Southeast Asia
- Oceania
Errors
{ "status": "error", "code": "rateLimited",
"message": "Starter allows 50,000 requests a month; resets 2026-10-01T00:00:00Z." }| HTTP | code | Meaning |
|---|---|---|
| 400 | parameterInvalid | A parameter is malformed, or is not one this endpoint accepts (a misspelling is refused, not ignored). The message names it. |
| 400 | maximumResultsReached | page times pageSize is over 10,000. Narrow the date window instead of paging deeper. |
| 401 | apiKeyMissing, apiKeyInvalid | No key, or a key we do not recognise or that was revoked. |
| 401 | apiKeyDisabled | The key is real, but the account is suspended or its email is not confirmed yet. |
| 402 | planUpgradeRequired | Your plan does not include this endpoint, page size or date range. The message names the plan that does. |
| 404 | notFound | Unknown path or story id. |
| 429 | rateLimited | Quota or burst limit reached. Wait for Retry-After seconds. |
| 503 | unavailable | We could not answer. Retry with backoff and check the status page. Status |
Rate limits
Each response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset (Unix seconds, UTC). Limits apply per account, shared across its keys. Monthly quotas reset at 00:00 UTC on the first of the month; daily ones at 00:00 UTC. At the limit you get HTTP 429 until the window resets; we do not bill overage. See pricingfor each plan’s numbers.
Client libraries
Official Python and JavaScript clients are planned for launch week, on GitHub under an MIT licence. Any newsapi.org client library also works by changing its base URL.
Using the data
Show the publisher’s name and link with every article. Do not use the API to fetch, store or republish the articles themselves. Summaries are written by our models and can be wrong; do not present them as the publisher’s words. Full rules are in the terms.
