GeoMemo
SAT, OCT 17 · EDT
Documentation · v1

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:

  • description and content both hold our summary. We never return a slice of the article text.
  • top-headlines accepts any publisher country code, not only us, plus region.
  • sortBy=popularity maps 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.

ParameterTypeDescription
qstringKeywords. 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.
searchInstringtitle, description, or both (default).
sources, domains, excludeDomainscsvSource ids from /sources (up to 20), or publisher domains.
from, toISO datePublication window. Your plan limits how far back it can reach.
languagecsvISO 639-1 codes, e.g. ar,fa,tr,sw.
countrycsvISO 3166 alpha-2. Countries the article is about.
sourceCountrycsvISO 3166 alpha-2. Where the publisher is based.
regionstringOne of the 10 regions in /reference/regions.
categorycsvDisplay names, slugs (geopolitical-conflict, business-finance) or newsapi.org names (business, sports). See Categories and regions below.
relevancestringgeo for geopolitically relevant articles only, all (default).
minScore0 to 100Drop articles whose score is below this. Unscored articles are dropped too.
collapsebooleantrue returns one article per story.
sortBystringpublishedAt (default), relevancy (needs q), score. significance and popularity are accepted as aliases for score.
page, pageSizeintpageSize 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=score

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=5

GET/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

FieldDescription
source.id, source.namePublication.
authorByline when the publisher gives one.
titleHeadline as published, in its original language.
descriptionOur 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.
urlLink to the article on the publisher's site.
urlToImageThe publisher's preview image URL, on their server. We do not copy or rehost images.
publishedAtPublication time, or the time we fetched it when the publisher gives none (see geomemo.publishedAtSource).
contentSame as description, for newsapi.org compatibility. Never a slice of the article text.
geomemo.idStable article id.
geomemo.titleEnEnglish translation of the headline.
geomemo.languageISO 639-1 language of the article.
geomemo.countries, regionCountries and region the article is about.
geomemo.sourceCountryWhere the publisher is based. Used by the country filter on /top-headlines.
geomemo.category, subCategory, categoryGroupTopic; group is geo or general.
geomemo.relevancegeo or general.
geomemo.score0 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.signalsThe yes/no judgements behind the score, as booleans: geopoliticalSignificance, globalEconomicImpact, novelty, decisionMakerRelevance, analyticalDepth. null on articles we have not scored.
geomemo.storyid, role (parent or child), size. null when the article is in no story.
geomemo.publishedAtSourcepublisher, 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

categoryGroup: geo
  • Geopolitical Conflict
  • International Relations
  • Geopolitical Politics
  • Defense & Arms Transfers
  • Cyber & Information Warfare
  • Geopolitical Economics
  • Global Markets
  • Critical Tech & Minerals
  • Climate & Humanitarian Crisis

General

categoryGroup: general
  • Sports
  • Entertainment & Celebrity
  • Business & Finance
  • Technology
  • Science
  • Health
  • Crime & Justice
  • Domestic Politics & Policy
  • Education
  • Lifestyle & Culture
  • Weather & Environment
  • Accidents & Incidents
  • General

Regions

what the article is about
  • 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." }
HTTPcodeMeaning
400parameterInvalidA parameter is malformed, or is not one this endpoint accepts (a misspelling is refused, not ignored). The message names it.
400maximumResultsReachedpage times pageSize is over 10,000. Narrow the date window instead of paging deeper.
401apiKeyMissing, apiKeyInvalidNo key, or a key we do not recognise or that was revoked.
401apiKeyDisabledThe key is real, but the account is suspended or its email is not confirmed yet.
402planUpgradeRequiredYour plan does not include this endpoint, page size or date range. The message names the plan that does.
404notFoundUnknown path or story id.
429rateLimitedQuota or burst limit reached. Wait for Retry-After seconds.
503unavailableWe 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.