API — IP Crawl API<br>Check if your public IP address is exposed in IP Crawl's catalog.<br>GEThttps://ismycameraexposed.com/api/ipCopy<br>Response200 OK · application/json<br>foundbooleantrue if the requesting IP matches at least one row in the catalog, false otherwise — including when no IP could be resolved or the DB is cold (the endpoint degrades to "not found" rather than 500ing).<br>ipstring The IP resolved from cf-connecting-ip (then x-forwarded-for), echoed back so a caller can confirm which address was checked. "unknown" when no forwarded IP is present.<br>checkedAtnumber Server epoch-ms clock at the moment the lookup ran. Compare to Date.now() to detect a cached answer: near-zero is a fresh origin hit, up to ~300000ms (5 min) is the browser cache serving the prior answer.<br>Example response{<br>"found": false,<br>"ip": "203.0.113.42",<br>"checkedAt": 1783104000000
Check my IP<br>Bypass cache
Examples<br>curl https://ismycameraexposed.com/api/ip<br>// Hourly exposure monitor — alert me if my public IP shows up in the<br>// IP Crawl catalog. A flip from found:false → true means a webcam on<br>// my network just got exposed to the public internet (default creds on<br>// a new device, a misconfigured firewall, a forgotten port forward).<br>// Catching it within the hour means I can secure the camera before<br>// every other scanner on the internet indexes it.<br>const URL = 'https://ismycameraexposed.com/api/ip'<br>const HOUR_MS = 60 * 60 * 1000
let known = null // previous `found` value — only fire on a change
async function check() {<br>const res = await fetch(URL, { cache: 'default' })<br>if (!res.ok) return // network or server hiccup — try again next hour
const { found, ip, checkedAt } = await res.json()
if (Date.now() - checkedAt > 60_000) return
if (found !== known) {<br>if (found) console.warn(`[ipcrawl] ${ip} just appeared in the catalog`)<br>else console.log(`[ipcrawl] ${ip} is no longer listed`)<br>known = found
check() // run once immediately...<br>setInterval(check, HOUR_MS) // ...then every hour
Notes<br>This API is the programmatic surface of the "Is My Camera Exposed?" campaign, so it lives on that domain.<br>found reflects a match against the public catalog at request time. A camera that's already been secured drops off within the next scan cycle.<br>checkedAt is the server's epoch-ms clock when the lookup ran. Compare it to Date.now() to tell a fresh answer from a cached one: near-zero is a fresh origin hit, up to ~300000ms (5 min) is the browser cache serving the prior answer.