https://sugra.ai with the x-api-key header are all it takes, and every endpoint is available on every plan.data; every response carries meta.data_time so each panel can display its own freshness. Steps 3 to 5 query GDELT live per request, so give those fetchers a short retry with backoff (details in step 3).{
"data": {
"total": 10,
"count": 2,
"items": [
{
"title": "My husband and I are retired. Our financial adviser, who is in his 30s, called us ‘you guyses.’ Is that unprofessional?",
"published": "2026-07-19T09:20:00Z",
"source": "marketwatch",
"region": "us",
"category": "business"
}
]
},
"meta": { "endpoint": "/api/v1/news/latest", "source": "news_rss" }
}description, link, and source_name fields truncated; meta is trimmed to endpoint and source in every excerpt on this page.) This is the Sugra News curated feed digest. Filter with region (us, europe, asia, and more) and category (news, business, tech, defense, ...), or swap in GET /api/v1/news/search?q=... to keyword-filter the same item shape for your theme.{
"data": {
"themes": [
{ "theme": "TAX_FNCACT", "count": 9114, "share": 0.0297 },
{ "theme": "CRISISLEX_CRISISLEXREC", "count": 4751, "share": 0.0155 },
{ "theme": "EPU_POLICY", "count": 4516, "share": 0.0147 }
],
"stale": false,
"partial": false
},
"meta": { "endpoint": "/api/v1/gdelt/themes/trending", "source": "gdelt_live" }
}total, window_end, and languages fields truncated.) Each entry is a GDELT GKG theme code with its mention count and share of all theme mentions in the window. Check stale and partial before rendering: they tell you whether the ingest window behind the aggregate is fresh and complete.{
"data": {
"timeline": [ {
"series": "Volume Intensity",
"data": [ { "date": "20260706T000000Z", "value": 11.4239 }, { "date": "20260719T000000Z", "value": 12.7094 } ]
} ]
},
"meta": { "endpoint": "/api/v1/gdelt/timeline", "source": "gdelt" }
}query_details field truncated, first and last points shown.) Volume Intensity is the share of all globally monitored coverage that matched your query, one point per day at this timespan; a broad theme like energy carries a high baseline (a 9.5 to 12.7 band over this window, ending at the top of it), and a sudden jump against that baseline is your dashboard's "story breaking" trigger. Note that /gdelt/timeline (both modes here) and /gdelt/articles in step 5 query GDELT live per request: under upstream load or rate limiting any of them can return 503 with "GDELT API unavailable", occasionally persisting for one query and mode while others succeed, so retry with backoff and keep the last good JSON on the panel until a refresh lands. Successful responses are cached for 10 minutes.{
"data": {
"timeline": [ {
"series": "Average Tone",
"data": [ { "date": "20260706T000000Z", "value": 0.3911 }, { "date": "20260719T000000Z", "value": 0.3133 } ]
} ]
},
"meta": { "endpoint": "/api/v1/gdelt/timeline", "source": "gdelt" }
}query_details truncated.) Same endpoint, mode=timelinetone: average document tone per day, negative meaning adverse coverage and positive meaning favorable. Plot it under the volume series from step 3 - rising volume combined with falling tone is the classic signature of an escalating negative story; over this window energy tone stayed mildly positive, dipping below zero only twice and only just (minimum -0.16 on 2026-07-12). The 503 caveat from step 3 applies here too, per query and mode: if one combination keeps failing, test another query before assuming a full outage.{
"data": {
"articles": [
{
"title": "Suriye ve Irak ABDde buluştu : 23 yıl sonra ilk - Son Dakika Enerji Haberleri",
"seendate": "20260719T091500Z",
"domain": "odatv.com",
"language": "Turkish",
"sourcecountry": "Turkey"
}
],
"count": 3
},
"meta": { "endpoint": "/api/v1/gdelt/articles", "source": "gdelt" }
}url, url_mobile, and socialimage fields truncated.) These are the articles behind the series - global coverage across 100+ languages and 250K+ sources, so expect language and sourcecountry far beyond English media, and expect keyword noise on a broad single-word query; add lang=en or country=US to narrow. The step 3 retry guidance applies here unchanged: this endpoint queries GDELT live per request and can return 503.{
"data": {
"symbol": "MSFT",
"company_name": "MICROSOFT CORP",
"sentiment": {
"latest_tone": 0.0799,
"average_tone": 0.1595,
"timeline": [ { "date": "20260706T000000Z", "value": 0.5979 }, { "date": "20260719T000000Z", "value": 0.0799 } ]
},
"attention": { "timeline": [], "first_party_article_count": 1 }
},
"meta": { "endpoint": "/api/v1/equities/MSFT/news-sentiment", "source": "sugra_news" }
}query, timespan, scale, former_names, recent_headlines, and note fields truncated.) The ticker is entity-linked through the SEC registrant name plus former names, then scored from GDELT tone and coverage volume alongside the first-party feed ingest. Here MSFT's latest tone sits at +0.08 against a +0.16 two-week average - neutral news flow, no badge change on the panel. The empty attention.timeline is the graceful-degradation case from step 3 caught live: the coverage-volume leg hit GDELT upstream throttling on this refresh while the tone leg filled, so treat an empty attention series as "retry after the 10-minute cache expires", not as zero coverage. Under sustained upstream throttling the degradation can go one step further: latest_tone and average_tone come back null with BOTH timelines empty (still HTTP 200) - the same advice applies, keep the last good panel state and retry after the cache window rather than rendering zeros. This is editorial news-flow sentiment, a screening signal rather than investment advice.429 / 503 retries cleanly.