Bootstrap
GET /api/bootstrap
Single round-trip hydration for the dashboard. Returns all bootstrap-registered Redis cache keys unwrapped from their seed envelopes in one response.
- Auth: browser origin OR
X-WorldMonitor-Key - Cache:
Cache-Control: public, max-age=30, s-maxage=30 - Shape:
{ earthquakes, outages, marketQuotes, commodityQuotes, imfMacro, bisPolicy, ... }— ~40+ top-level fields, each the unwrapped payload of one seeded domain.
Version
GET /api/version
Returns the latest GitHub Release of koala73/worldmonitor. Used by the desktop app to detect a newer published release and prompt the user to update. It is not the currently-deployed Vercel commit.
public, s-maxage=300, stale-while-revalidate=60, stale-if-error=3600. Returns 502 { "error": "upstream" } or 502 { "error": "fetch_failed" } when the GitHub API is unreachable.
Cache purge
POST /api/cache-purge
Internal. Invalidates Redis cache keys by explicit list or glob patterns.
- Auth:
Authorization: Bearer $RELAY_SHARED_SECRET(timing-safe compared). Anything else returns401. - Body (at least one of
keys/patternsrequired): - Limits: up to 20 explicit keys, up to 3 patterns (each must end in
*, bare*rejected), up to 200 deletions total, up to 5 SCAN iterations per pattern. - Safety: keys with prefixes
rl:/__are always skipped; patterns that would matchmilitary:bases:*,conflict:iran-events:*,conflict:ucdp-events:*(durable seeds) are skipped. - Non-production: on preview / development deploys, keys are auto-prefixed with
{env}:{git-sha}:so purges can’t affect production data. - Response:
Health
GET /api/health
Aggregated freshness report for all registered seed keys. Returns HEALTHY, WARNING (stale), or CRIT (missing / empty with emptyDataIsFailure).
Monitor via UptimeRobot / Better Stack — alert on any status other than HEALTHY.
GET /api/seed-health
Parallel registry for Railway-cron-driven seeders with their own cadence thresholds. Distinct from /api/health — both must be updated when cadence changes. See health endpoints.
POST /api/seed-contract-probe
Internal probe that validates each seed producer’s envelope shape matches its consumers. Returns violations if any consumer reads a field the producer no longer emits.
User preferences
GET /api/user-prefs
POST /api/user-prefs
Per-user dashboard preferences (layout, toggles, filters). Clerk bearer required. Backed by Convex.
API key cache invalidation
POST /api/invalidate-user-api-key-cache
Invalidates a user’s entitlement cache after a subscription change (Dodo webhook → Convex → this endpoint). Internal — requires RELAY_SHARED_SECRET.
Geo utilities
GET /api/geo?iso2=US
Returns country metadata: centroid, bbox, capital, ISO codes.
GET /api/reverse-geocode?lat=40.7&lon=-74.0
Reverse geocodes a lat/lon to the nearest country + city using the bundled coordinate dataset.
GET /api/data/city-coords?q=Tokyo
City name → coordinates lookup.
Utilities
GET /api/download?platform=<id>&variant=<id>
Redirects to the matching asset on the latest GitHub release of koala73/worldmonitor. Returns 302 to the asset URL on success, or 302 to releases/latest on any failure (unknown platform, no match, GitHub error).
platform (required, exact string):
| value | matches |
|---|---|
windows-exe | *_x64-setup.exe |
windows-msi | *_x64_en-US.msi |
macos-arm64 | *_aarch64.dmg |
macos-x64 | *_x64.dmg (excluding *setup*) |
linux-appimage | *_amd64.AppImage |
linux-appimage-arm64 | *_aarch64.AppImage |
variant (optional):
| value | filters asset name to |
|---|---|
full / world | worldmonitor |
tech | techmonitor |
finance | financemonitor |
s-maxage=300, stale-while-revalidate=60, stale-if-error=600).
