WORLDEYE FOR DEVELOPERS

The live camera catalogue, as an API

Search tens of thousands of public cameras — the ones cleared for redistribution, with the operating agency credited on every record — and the USGS earthquake feed, from your own code or from an AI agent over MCP. Read-only, key-authenticated, with a free tier you can start on in under a minute.

Quickstart

1. Sign in and create a key in Account Settings → API keys. The key (it starts wek_) is shown once — store it somewhere safe. 2. Send it on every request, either as a bearer token or in the X-Api-Key header:

curl "https://worldeye.app/api/v1/cameras?country=Japan&limit=5" \
  -H "Authorization: Bearer wek_YOUR_KEY"

Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset headers for your plan's daily quota.

Endpoints

GET/api/v1/cameras

Search the redistribution-cleared camera catalogue.

  • q — text match over name, city, country and source
  • country — a full country name ("Japan") or ISO alpha-2 code ("JP")
  • kind — video, snapshot, embed or link
  • near=<lat>,<lng> or place=<name> — radius search, nearest first; radius_km defaults to 50 (max 500)
  • limit (default 20, max 100) and offset paginate the filtered set
GET/api/v1/cameras/<id>

One camera by id. A camera outside the cleared catalogue is a 404, exactly as if it didn't exist.

GET/api/v1/cameras/<id>/snapshot

The camera's current still: a 302 redirect to the snapshot URL the detail payload carries. Stream-only cameras answer 404 with the reason.

GET/api/v1/earthquakes

The site's earthquake layer: USGS magnitude 2.5+ events from the last 24 hours (US federal public-domain data). limit caps the list (max 500).

GET/api/v1/usage

Your key's plan tier, limits and today's usage. Checking usage does not consume quota.

The camera object

{
  "id": "…",
  "name": "…",
  "city": "…",
  "country": "…",
  "lat": 35.681,
  "lng": 139.767,
  "snapshotUrl": "https://worldeye.app/api/cctv/frame?id=…",   // null for stream-only cameras
  "watchUrl": "https://worldeye.app/?camera=…",                // opens the camera on the globe
  "attribution": "… via WorldEye",                // credit this agency
  "source": "…"
}

The API serves metadata, snapshots and deep links — watching a camera live happens on WorldEye, through its watchUrl. Every record carries the operating agency in attribution; keep that credit wherever you display the data.

Rate limits

Limits follow the key owner's WorldEye plan and reset at UTC midnight. One ladder, enforced identically on REST and MCP:

PlanRequests / dayBurst / minute
Free10010
Lite1,00030
Pro (incl. VIP Pro Annual)5,00060
Ultra & legacy VIP Pro Annual25,000120
Enterprise100,000300

Over the daily quota the API answers 429 daily_quota_exceeded; over the burst limit, 429 rate_limited — both with a Retry-After header. Errors everywhere share one shape: { "error": { "code", "message" } }.

MCP — for AI agents

The same catalogue is a Model Context Protocol server (Streamable HTTP) at https://worldeye.app/api/v1/mcp. Configure your MCP client with that URL and your key as a header — the key never travels as a tool argument:

{
  "mcpServers": {
    "worldeye": {
      "url": "https://worldeye.app/api/v1/mcp",
      "headers": { "Authorization": "Bearer wek_YOUR_KEY" }
    }
  }
}

Fair use

The catalogue only contains cameras whose operators clear them for redistribution, and a source can be withdrawn — when it is, its cameras leave the API at once. Credit each camera's listed source, don't re-present snapshots as a live video feed, and cache politely: responses are cacheable for a minute and snapshots change on the operator's schedule, not yours. Keys are per-user; a revoked key stops working immediately.