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
/api/v1/camerasSearch the redistribution-cleared camera catalogue.
q— text match over name, city, country and sourcecountry— a full country name ("Japan") or ISO alpha-2 code ("JP")kind—video,snapshot,embedorlinknear=<lat>,<lng>orplace=<name>— radius search, nearest first;radius_kmdefaults to 50 (max 500)limit(default 20, max 100) andoffsetpaginate the filtered set
/api/v1/cameras/<id>One camera by id. A camera outside the cleared catalogue is a 404, exactly as if it didn't exist.
/api/v1/cameras/<id>/snapshotThe camera's current still: a 302 redirect to the snapshot URL the detail payload carries. Stream-only cameras answer 404 with the reason.
/api/v1/earthquakesThe 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).
/api/v1/usageYour 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:
| Plan | Requests / day | Burst / minute |
|---|---|---|
| Free | 100 | 10 |
| Lite | 1,000 | 30 |
| Pro (incl. VIP Pro Annual) | 5,000 | 60 |
| Ultra & legacy VIP Pro Annual | 25,000 | 120 |
| Enterprise | 100,000 | 300 |
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" }
}
}
}search_cameras— text, country and kind searchget_camera— one camera by idcameras_near— radius search around coordinates or a named placelatest_earthquakes— the USGS M2.5+ feed, last 24 hoursget_usage— the calling key's tier and remaining quota
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.