[gdelt-pulse]

Open API that continuously ingests GDELT's global news feed, clusters related articles into events, and exposes them through semantic search with rich entity metadata.

Try it

Hybrid search

Combine semantic vector search with keyword matching. Adjustable weighting lets you tune precision vs. recall. Filter results by location, person, organization, theme, source domain, or date range.

GET /api/search?q=...&location=...&clusters=true

Event clusters

Articles are automatically grouped into story clusters using vector similarity on embeddings. Browse clusters by recency, article count, or filter by entity and location to find trending events.

GET /api/clusters?sort=articles&theme=...

Rich metadata

Every article carries extracted themes, geolocated places with coordinates, persons, organizations, tone analysis scores, and source attribution — all parsed from the GDELT Global Knowledge Graph.

GET /api/articles?location=...&theme=...
Quick start
# Search clusters by topic
curl "/api/search?q=climate+policy&clusters=true&limit=5"

# Browse clusters with filters
curl "/api/clusters?sort=articles&location=Europe&limit=10"

# Filter articles by theme and location
curl "/api/articles?theme=ENV_CLIMATECHANGE&location=Europe"

# Higher rate limits with API key
curl -H "X-API-Key: gdp_..." \
  "/api/search?q=trade+war&clusters=true"
import requests

API = "/api"

data = requests.get(f"{API}/search", params={
    "q": "climate policy",
    "clusters": "true",
    "location": "Europe",
    "limit": 10,
}).json()

for c in data["clusters"]:
    cl = c["cluster"]
    print(f"{cl['representative_title']}  ({cl['article_count']} articles)")
const data = await fetch(
  "/api/search?q=climate+policy&clusters=true"
).then(r => r.json());

data.clusters.forEach(({ cluster }) =>
  console.log(`${cluster.representative_title} (${cluster.article_count})`)
);