Watchboard JSON API
Free, static JSON API served from GitHub Pages. No API key required. Data updates with every site build (typically within hours of new events).
Base URL
https://watchboard.dev/api/v1
All endpoints return JSON with Content-Type: application/json and CORS enabled
(Access-Control-Allow-Origin: *). Responses are cached for 1 hour with
stale-while-revalidate for 24 hours.
Endpoints
GET /trackers.json
List all trackers with metadata, status, last updated time, and day count.
curl -s https://watchboard.dev/api/v1/trackers.json | jq '.trackers[:2]' Response fields
generated— ISO timestamp of when the API was builtcount— total number of trackerstrackers[]— array of tracker summaries.slug— unique identifier (used in other endpoints).name— full display name.domain— topic category (conflict, governance, science, etc.).status— active or archived.lastUpdated— last data update timestamp.dayCount— days since tracker start date.breaking— true if tracker has breaking news
GET /trackers/{slug}.json
Full data for a single tracker: config, meta, KPIs, latest digest, and recent events.
curl -s https://watchboard.dev/api/v1/trackers/gaza-war.json | jq '.meta.heroHeadline' Response fields
config— tracker configuration (name, domain, region, tags, etc.)meta— current headline, subtitle, day count, breaking statuskpis[]— key performance indicators with values, colors, trendslatestDigest— most recent daily digest summaryrecentEvents[]— last 30 timeline eventseventCount— total number of events in the tracker
GET /breaking.json
All trackers currently flagged as having breaking news.
curl -s https://watchboard.dev/api/v1/breaking.json | jq '.items[].headline' GET /kpis/{slug}.json
Just the KPIs for a specific tracker — lightweight endpoint for dashboards.
curl -s https://watchboard.dev/api/v1/kpis/ukraine-war.json | jq '.kpis[] | .label + ": " + .value' GET /events/{slug}.json
Last 30 timeline events for a tracker, sorted newest first.
curl -s https://watchboard.dev/api/v1/events/iran-conflict.json | jq '.events[:3]' GET /search-index.json
Flattened index of all event titles across all trackers — designed for client-side search.
Each entry includes slug, id, title, date, and type.
curl -s https://watchboard.dev/api/v1/search-index.json | jq '.count' Usage Examples
JavaScript / Fetch
// Get all trackers with breaking news
const res = await fetch('https://watchboard.dev/api/v1/breaking.json');
const data = await res.json();
data.items.forEach(item => {
console.log(`🔴 ${item.name}: ${item.headline}`);
}); Python
import requests
# Get KPIs for a specific tracker
data = requests.get('https://watchboard.dev/api/v1/kpis/gaza-war.json').json()
for kpi in data['kpis']:
print(f"{kpi['label']}: {kpi['value']} ({kpi['color']})") Shell / jq
# List all active conflict trackers
curl -s https://watchboard.dev/api/v1/trackers.json | \
jq '[.trackers[] | select(.domain=="conflict")] | length' For AI Agents
If you're building an AI integration, we also provide an MCP server that wraps this API for seamless access from Claude, ChatGPT, and other LLM agents.
# Clone the repo and run the MCP server
git clone https://github.com/ArtemioPadilla/watchboard.git
cd watchboard/mcp && npm install && npm start Rate Limits & Caching
- No rate limits — it's static files on a CDN
- Data refreshes with every site deploy (usually 1–4 times daily)
- Responses include
Cache-Control: public, max-age=3600 - Use
generatedtimestamp in responses to check freshness
Terms
This API is free for any use — commercial, academic, personal, or AI training. Attribution appreciated but not required. Data is sourced from public reporting and may contain errors or contested claims — verify independently for critical applications.