Changelog
Changes to the API at /v1 and to what it detects, newest first. Fields are only ever added within /v1; a change that could break an integration is marked as such. The full request and response format is in the docs and the OpenAPI spec.
- Added
Self-check scores DNS leaks on datacenter connections
When you check your own connection from a datacenter address and your browser's DNS lookup comes from a home ISP in another country, the self-check now counts it as a VPN or proxy that leaks DNS (new signal dns_leak, weight 0.50). Public resolvers such as Google, Cloudflare and Quad9 never count.
- Added
Self-check spots VPN tunnels that exit on datacenter addresses
When your own device opened the connection but with a tunnel's packet size (as WireGuard, OpenVPN or IKEv2 set it) and it arrives from a datacenter address, the self-check now reads it as a VPN (new signal hosting_tunnel_mss, weight 0.50). Later lookups of that address remember it.
- Added
Self-check spots proxies on datacenter addresses
When you check your own connection from a datacenter address and the TCP connection was opened by a different operating system than your browser's, a proxy server re-opened it. That now reads as a proxy (new signal hosting_stack_mismatch, weight 0.60, sets is_proxy), and later lookups of that address remember it.
- Added
OpenAPI 3.1 spec at /openapi.json
The spec covers /v1/check, /v1/bulk-check, /v1/ip and /v1/health, with every response flag, rate-limit header and error status. It is built from the same field tables as the docs, so the two stay in step.
- Added
DNS leak test and /v1/dns-leak
A public DNS leak test page is live, backed by GET /v1/dns-leak, which returns the resolvers that asked for your test tokens with their network, country and hosting status. It reports a leak only when a resolver sits on an ISP network other than your connection's, so public resolvers such as Google or Quad9 are not flagged.
- Added
Typed crawler object on verified search and AI crawlers
Addresses inside a crawler operator's own published ranges now return a crawler object with name, operator and purpose (search, ai_training, ai_search, user_fetch, archive, seo, monitor, crawler or ai), alongside is_crawler. Nine more crawler and monitor range lists were added; the verdict is unchanged and a forged User-Agent gets nothing.
- Added
is_satellite flag
Addresses on satellite and in-flight Wi-Fi networks return is_satellite: true, in fast mode too. Round-trip and SYN checks are skipped on these links, because satellite TCP accelerators used to make real users look like proxies.
- Added
IKEv1/L2TP and SoftEther handshake detection
A new active probe recognises servers that speak only IKEv1 Main Mode, which covers L2TP/IPsec and SoftEther. The IKEv2 probe also now accepts notify-style replies, and a leak in the probe code that held sockets open was fixed.
- Added
More VPN exit coverage: CyberGhost, AirVPN and numbered fleets
About 65,000 CyberGhost server addresses, 185 AirVPN exit addresses (users leave from an address that differs from the entry list) and 632 servers across six more providers are now detected. The independent CyberGhost sample went from 92% to 100% in fast mode.
- Added
IP reputation page
A new /ip-reputation page explains the reputation field returned by /v1/check. Only abuse evidence blocklists an address; a non-clean verdict without abuse greylists it, and clean, CDN or public-DNS addresses are allowlisted.
- Fixed
CDN fronts and accept-everything hosts no longer read as tunnels
Several CDN and DDoS-protection networks, and hosts that answer every request, were read as VPN or proxy servers. They now read as hosting or clean, and free V2Ray fronts that resolve to shared reverse proxies no longer count as proxy exits. False positives on a 5,000-address top-website sample fell to 0.18%.
- Changed
Accuracy page refreshed
The full-depth benchmark was re-run on the 2,831-address corpus: all 1,722 commercial VPN servers detected and 4 of 951 ordinary addresses flagged as VPN. VPN Gate recall in fast mode measured 94 of 97 live servers.
- Incident
About 3 minutes of slow or failed responses, 12:42 to 12:45 UTC
An internal research job exhausted memory on the host and made the site and API unresponsive for about 3 minutes. Services did not restart and no data was lost; such jobs now run under a hard memory limit.
- Added
IPv4 and IPv6 rows in the self-check, via /v1/ip
GET /v1/ip returns the caller's own address and family, and is served on ipv4.iplogs.com (IPv4 only) and ipv6.iplogs.com (IPv6 only). The self-check page uses it to show both addresses.
- Changed
Full-depth checks roughly twice as fast
A full check now takes about 3.0 to 3.3 seconds instead of 6.5, with no detection lost. Fast mode is unchanged at microseconds.
- Added
Direct OpenVPN handshake on TCP/443 and TLS relay probe
Active probing now sends a real OpenVPN handshake on TCP 443, and recognises TLS relays (such as REALITY) that borrow a CDN-fronted site's certificate. Hosting addresses that answered a handshake are also remembered, so fast and bulk lookups benefit.
- Added
VPN brand certificates read the issuer
The brand-certificate probe now also matches private certificate authorities named after a VPN brand, which adds roughly 690 CyberGhost rack hosts and five more brands. Generic names containing "proxy" or a hoster's name no longer count.
- Fixed
Private Relay reads the same in every mode and in ip_info
iCloud Private Relay addresses now read suspicious and relay, never VPN, whichever network hosts the egress. ip_info.is_vpn also now matches the top-level is_vpn instead of showing true on a relay address.
- Fixed
CDN edges no longer read as VPN servers
Edge servers of several CDNs were detected as VPN or proxy servers. Edges are now recognised from the operators' published ranges, and 47 more edges stopped reading is_vpn.
- Changed
Self-checks stay on TCP
api.iplogs.com now tells browsers to stay off HTTP/3, so every browser self-check can be read for TLS fingerprint, handshake timing and connection details. Before, 16 to 28% arrived over HTTP/3 and could not be assessed.
- Added
ISP-proxy pools detected as is_proxy in fast and bulk mode
Pools of static ISP proxy addresses that our weekly checks confirm now return is_proxy with proxy_type isp in every mode, not only full checks. Mobile-carrier addresses are weighted lower, since carrier NAT shares one address among many people.
- Fixed
Guide snippets no longer trust proxy headers blindly
The Node.js and Python integration guides took the client IP from CF-Connecting-IP or X-Forwarded-For without checking who sent it, so a client could pick its own address. The guides now only trust those headers from your own proxy.
- Fixed
Placeholder cities for Pakistani addresses removed
Some Pakistani ISP blocks were shown at the ISP's registered head office in Islamabad. That placeholder city is no longer shown.
- Changed
A VPN handshake on a home or mobile line reads suspicious, not VPN
A single VPN handshake on a residential line is usually a router's own VPN server, so those addresses now read suspicious instead of is_vpn. This removed the home-broadband false positives from our benchmark.
- Added
Opera Mini and Turbo page proxies flagged as relays
Addresses of Opera's data-saving page proxies now match a browser_proxy signal and set is_relay. They read suspicious, not VPN.
- Added
Cloudflare WARP detection over IPv4 and IPv6
WARP is now recognised from Cloudflare's own published egress ranges, so it works in fast and bulk mode and for IPv6, where it was previously missed. ProtonVPN IPv6 servers were added at the same time.
- Added
proxy_type on /v1/check and bulk rows
Whenever is_proxy is true, proxy_type names the kind: residential, isp, public or datacenter. Tor and Private Relay keep their own flags and get no type.
- Fixed
Fewer false positives on Cloudflare and Google edge addresses
Cloudflare website ranges no longer read as WARP, and a Google load balancer that answers on every port no longer reads as a VPN. The full benchmark's false-positive rate moved from 0.9% to 0.6%.
- Added
is_tor, is_relay and is_hosting flags
/v1/check now splits the verdict by kind, so you can allow iCloud Private Relay or WARP while blocking VPNs. The flags are present in fast mode, and bulk rows include them when true.
- Added
last_seen on signals
signals[].last_seen (UTC) shows when our data last confirmed the address, such as the last refresh of the server list that contains it. It is omitted when unknown.
- Added
is_crawler for verified search and AI crawlers
Addresses inside the published ranges of Google, Bing, OpenAI, Apple, Perplexity, DuckDuckGo, Common Crawl and Anthropic crawlers return is_crawler and a zero-weight known_crawler signal. Verdicts are unchanged, so blocking suspicious addresses can now exempt search engines.
- Added
Recently listed servers: vpn_relay_recent
An address that was on a published VPN server list in the last days but is not in the latest copy now returns vpn_relay_recent, instead of reading clean. Weight decays with age.
- Fixed
Tor list survives a bad restart; retries after failure
After an API restart the Tor exit list could stay empty until the next hourly refresh, so some exits read vpn_likely instead of vpn_detected. Fetches now retry, either source alone is enough, and the last good list is kept.
- Changed
Docs corrected, six languages, status examples
The docs now state that timezone, language, webrtc_ip and user_agent are only used on a browser self-check, and ignored when an ip is supplied. Added tested examples in cURL, Node.js, Python, PHP, Go and Java, and a sample response per status code.
- Fixed
ASN pages and the ASN CSV no longer overclaim
ASN pages and /data/vpn-asns.csv used to say any address on certain hosting ASNs was a confirmed VPN exit. The vpn category now lists only operators that are VPN companies; busy hosting networks are labelled datacenter.
- Added
VPN provider coverage passes 100 providers
Server lists for 114 providers were connected by this date, up from 57 the day before, by reading each provider's own published lists and verified server names.
- Fixed
Public DNS servers briefly read as a VPN
For a short time 1.1.1.1, 8.8.8.8, 9.9.9.9 and similar public resolvers were returned as a VPN provider's servers, because a scraped page listed them. The data was removed and no list can ingest a public resolver any more.
- Added
Self-learned VPN exits: learned_vpn_exit
A hosting address caught relaying by our own self-checks, and named by no list, now returns learned_vpn_exit at 0.30 to 0.55, which reads suspicious and never vpn_detected. It is forgotten when a later self-check shows a direct connection and deleted 30 days after it was last seen.
- Changed
Redesigned iplogs.com is live
The new home, IP lookup, docs, bulk and blog pages replaced the old site, with the same URLs and canonical tags kept. Articles are published on a schedule, not backdated.
- Incident
About 2 minutes of 502 errors, 20:57 to 20:59 UTC
A faulty dashboard deploy left the site without a built front end and every page returned 502. It was restored from backup within about 2 minutes, and deploys now restore the previous build automatically if the new one fails.
- Changed
Rate limits and daily quota published
Limits are per client IP (IPv6 per /64): 60 requests per minute on /v1/check, a lower rate on bulk, and 1,000 full-depth lookups per UTC day. Past the daily quota the API still answers 200, in fast mode, and X-RateLimit-Limit/Remaining/Reset headers are returned on charged responses.