← Watchboard
PUBLIC API

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 built
  • count — total number of trackers
  • trackers[] — 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 status
  • kpis[] — key performance indicators with values, colors, trends
  • latestDigest — most recent daily digest summary
  • recentEvents[] — last 30 timeline events
  • eventCount — 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 generated timestamp 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.