1<!DOCTYPE html> 2<html lang="en" data-theme="dark"> 3<head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <title>Free IP Geolocation & Network API â Documentation | IPAddress.to</title> 7 8 <!-- The site is dark-only: data-theme="dark" is hardcoded on <html>, so no 9 bootstrap script is needed and there is nothing to flash. --> 10 <meta name="color-scheme" content="dark"> 11 <meta name="theme-color" content="#050d1c"> 12 13 <meta name="description" content="Free REST API for IP geolocation, fraud scoring, WHOIS, DNS propagation, hostname resolution and email verification. No API key required. Full reference with code samples in 10 languages."> 14 <meta name="keywords" content="IP API, geolocation API, free IP lookup API, WHOIS API, DNS API, fraud score API, email verification API, REST API documentation"> 15 <meta name="robots" content="index, follow"> 16 <link rel="canonical" href="https://ipaddress.to/api/docs/"> 17 18 <meta property="og:type" content="website"> 19 <meta property="og:site_name" content="IPAddress.to"> 20 <meta property="og:title" content="Free IP Geolocation & Network API â Documentation | IPAddress.to"> 21 <meta property="og:description" content="Free REST API for IP geolocation, fraud scoring, WHOIS, DNS propagation, hostname resolution and email verification. No API key required. Full reference with code samples in 10 languages."> 22 <meta property="og:url" content="https://ipaddress.to/api/docs/"> 23 <meta property="og:image" content="https://ipaddress.to/favicon/web-app-manifest-512x512.png"> 24 25 <meta name="twitter:card" content="summary"> 26 <meta name="twitter:title" content="Free IP Geolocation & Network API â Documentation | IPAddress.to"> 27 <meta name="twitter:description" content="Free REST API for IP geolocation, fraud scoring, WHOIS, DNS propagation, hostname resolution and email verification. No API key required. Full reference with code samples in 10 languages."> 28 <meta name="twitter:image" content="https://ipaddress.to/favicon/web-app-manifest-512x512.png"> 29 30 <link rel="icon" type="image/png" href="/favicon/favicon-96x96.png" sizes="96x96" /> 31 <link rel="icon" type="image/svg+xml" href="/favicon/favicon.svg" /> 32 <link rel="shortcut icon" href="/favicon.ico" /> 33 <link rel="apple-touch-icon" sizes="180x180" href="/favicon/apple-touch-icon.png" /> 34 <meta name="apple-mobile-web-app-title" content="IPAddress.to" /> 35 <link rel="manifest" href="/favicon/site.webmanifest" /> 36 37 <link rel="preload" href="/fonts/space-grotesk-700-latin.woff2" as="font" type="font/woff2" crossorigin> 38 39 <link rel="stylesheet" href="/css/shared.min.css?v=1.43.1"> 40 41
41<script type="application/ld+json">{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://ipaddress.to/#organization","name":"IPAddress.to","url":"https://ipaddress.to/","logo":"https://ipaddress.to/favicon/web-app-manifest-512x512.png"},{"@type":"WebSite","@id":"https://ipaddress.to/#website","url":"https://ipaddress.to/","name":"IPAddress.to","description":"Free IP address lookup, geolocation, DNS, WHOIS and network tools.","publisher":{"@id":"https://ipaddress.to/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://ipaddress.to/lookup/{search_term_string}"},"query-input":"required name=search_term_string"}},{"@type":"WebAPI","@id":"https://ipaddress.to/api/docs/#api","name":"IPAddress.to API","description":"Free REST API for IP geolocation, fraud scoring, WHOIS, DNS propagation, hostname resolution and email verification.","documentation":"https://ipaddress.to/api/docs/","termsOfService":"https://ipaddress.to/api/docs/#rate-limits","provider":{"@id":"https://ipaddress.to/#organization"},"offers":{"@type":"Offer","price":"0","priceCurrency":"USD"}},{"@type":"TechArticle","@id":"https://ipaddress.to/api/docs/#article","headline":"IPAddress.to API Documentation","description":"Complete reference for the free IPAddress.to REST API: IP geolocation, fraud score, WHOIS, DNS propagation, hostname resolution and email verification endpoints.","url":"https://ipaddress.to/api/docs/","author":{"@id":"https://ipaddress.to/#organization"},"publisher":{"@id":"https://ipaddress.to/#organization"},"proficiencyLevel":"Beginner","about":{"@id":"https://ipaddress.to/api/docs/#api"}},{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://ipaddress.to/"},{"@type":"ListItem","position":2,"name":"API Documentation","item":"https://ipaddress.to/api/docs/"}]}]}</script>
41 42</head> 43<body> 44 <a href="#swup" class="skip-link">Skip to content</a> 45 46 <div class="toast" id="toast" role="status" aria-live="polite"> 47 <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="20 6 9 17 4 12"/></svg> 48 <span id="toastMsg">Copied to clipboard</span> 49 </div> 50 51 <header class="header"> 52 <div class="header-bar"> 53 <a href="/" class="logo"> 54 <div class="logo-mark"><svg class="logo-img" width="22" height="22" viewBox="-37 0 512 512" role="img" aria-label="IPAddress.to logo"><path fill="#bddbff" d="M438.86 64c0-35.35-98.24-64-219.43-64S0 28.65 0 64s98.24 64 219.43 64 219.43-28.65 219.43-64z"/><path fill="#9bc9ff" d="M219.43 256c121.14 0 219.43-28.62 219.43-64V64c0 35.38-98.29 64-219.43 64S0 99.38 0 64v128c0 35.38 98.29 64 219.43 64z"/><path fill="#57a4ff" d="M219.43 384c121.14 0 219.43-28.62 219.43-64V192c0 35.38-98.29 64-219.43 64S0 227.38 0 192v128c0 35.38 98.29 64 219.43 64z"/><path fill="#2488ff" d="M438.86 320c0 35.38-98.29 64-219.43 64S0 355.38 0 320v128c0 35.38 98.29 64 219.43 64s219.43-28.62 219.43-64V320z"/></svg></div> 55 <span class="logo-text">IPAddress<span class="logo-suffix">.to</span></span> 56 </a> 57 <div class="header-right"> 58 <nav class="header-nav" aria-label="Primary"> 59 <a href="/" class="header-link" data-nav><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><line x1="2" y1="12" x2="22" y2="12"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg>My IP</a> 60 <a href="/lookup/" class="header-link" data-nav><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>Lookup</a> 61 <a href="/dns/" class="header-link" data-nav><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="2" width="20" height="8" rx="2"/><rect x="2" y="14" width="20" height="8" rx="2"/><line x1="6" y1="6" x2="6.01" y2="6"/><line x1="6" y1="18" x2="6.01" y2="18"/></svg>DNS</a> 62 <a href="/email/" class="header-link" data-nav><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="4" width="20" height="16" rx="2"/><path d="m22 7-10 5L2 7"/></svg>Email</a> 63 <a href="/whois/" class="header-link" data-nav><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/></svg>WHOIS</a> 64 <a href="/score/" class="header-link" data-nav><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/></svg>Score</a> 65 <a href="/api/docs/" class="header-link" data-nav><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="16 18 22 12 16 6"/><polyline points="8 6 2 12 8 18"/></svg>API</a> 66 </nav> 67 <div class="header-auth"> 68 <button type="button" class="header-auth-btn auth-when-out" data-auth-open="login" aria-label="Log in"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4"/><polyline points="10 17 15 12 10 7"/><line x1="15" y1="12" x2="3" y2="12"/></svg><span>Log in</span></button> 69 <button type="button" class="header-auth-btn header-auth-primary auth-when-out" data-auth-open="signup" aria-label="Sign up"><span>Sign up</span></button> 70 <a href="/account/" class="header-auth-btn header-auth-user auth-when-in" data-nav title="Account & API keys"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"/><circle cx="12" cy="7" r="4"/></svg><span>Account</span></a> 71 </div> 72 <button class="menu-btn" id="menuBtn" onclick="toggleMobileMenu()" aria-label="Menu"> 73 <svg class="icon-menu" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="3" y1="6" x2="21" y2="6"/><line x1="3" y1="12" x2="21" y2="12"/><line x1="3" y1="18" x2="21" y2="18"/></svg> 74 <svg class="icon-close" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg> 75 </button> 76 </div> 77 </div> 78 </header> 79 80 <div class="mobile-overlay" id="mobileOverlay" onclick="toggleMobileMenu()"></div> 81 82 <nav class="mobile-drawer" id="mobileDrawer" aria-label="Mobile"> 83 <div class="mobile-drawer-header">
84 <span class="mobile-drawer-title">Menu</span> 85 <button class="mobile-drawer-close" onclick="toggleMobileMenu()" aria-label="Close menu"> 86 <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg> 87 </button> 88 </div> 89 <div class="mobile-drawer-nav"> 90 <a href="/" class="mobile-nav-link" data-nav onclick="closeMobileMenu()"> 91 <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><line x1="2" y1="12" x2="22" y2="12"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg> 92 My IP </a> 93 <a href="/lookup/" class="mobile-nav-link" data-nav onclick="closeMobileMenu()"> 94 <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg> 95 Lookup </a> 96 <a href="/dns/" class="mobile-nav-link" data-nav onclick="closeMobileMenu()"> 97 <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="2" width="20" height="8" rx="2"/><rect x="2" y="14" width="20" height="8" rx="2"/><line x1="6" y1="6" x2="6.01" y2="6"/><line x1="6" y1="18" x2="6.01" y2="18"/></svg> 98 DNS Checker </a> 99 <a href="/email/" class="mobile-nav-link" data-nav onclick="closeMobileMenu()"> 100 <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="4" width="20" height="16" rx="2"/><path d="m22 7-10 5L2 7"/></svg> 101 Email Check </a> 102 <a href="/whois/" class="mobile-nav-link" data-nav onclick="closeMobileMenu()"> 103 <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/></svg> 104 WHOIS </a> 105 <a href="/score/" class="mobile-nav-link" data-nav onclick="closeMobileMenu()"> 106 <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/></svg> 107 Fraud Score </a> 108 <a href="/api/docs/" class="mobile-nav-link" data-nav onclick="closeMobileMenu()"> 109 <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="16 18 22 12 16 6"/><polyline points="8 6 2 12 8 18"/></svg> 110 API Docs </a> 111 <a href="/#playground" class="mobile-nav-link" onclick="closeMobileMenu()"> 112 <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polygon points="5 3 19 12 5 21 5 3"/></svg> 113 Playground </a> 114 <div class="mobile-auth"> 115 <button type="button" class="mobile-nav-link auth-when-out" data-auth-open="login"> 116 <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4"/><polyline points="10 17 15 12 10 7"/><line x1="15" y1="12" x2="3" y2="12"/></svg> 117 Log in 118 </button> 119 <button type="button" class="mobile-nav-link auth-when-out" data-auth-open="signup"> 120 <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><line x1="12" y1="8" x2="12" y2="16"/><line x1="8" y1="12" x2="16" y2="12"/></svg> 121 Sign up â free 122 </button> 123 <a href="/account/" class="mobile-nav-link auth-when-in" data-nav onclick="closeMobileMenu()"> 124 <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"/><circle cx="12" cy="7" r="4"/></svg> 125 Account & API keys 126 </a> 127 </div> 128 </div> 129 <div class="mobile-drawer-footer">
130 <span>IPAddress.to</span> 131 </div> 132 </nav> 133 134 <div class="auth-backdrop" id="authModal" role="dialog" aria-modal="true" aria-labelledby="authTitle" aria-hidden="true" data-tab="login"> 135 <div class="auth-dialog"> 136 <button type="button" class="auth-close" data-auth-close aria-label="Close"> 137 <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg> 138 </button> 139 <div class="auth-tabs" role="tablist"> 140 <button type="button" class="auth-tab on" role="tab" data-auth-tab="login">Log in</button> 141 <button type="button" class="auth-tab" role="tab" data-auth-tab="signup">Sign up</button> 142 </div> 143 <div class="auth-heading"> 144 <h2 id="authTitle"><span class="auth-title-login">Welcome back</span><span class="auth-title-signup">Create your account</span></h2> 145 <p><span class="auth-title-login">Log in to manage your API keys and see your usage.</span><span class="auth-title-signup">Free. Your first API key is generated instantly.</span></p> 146 </div> 147 <div class="contact-error auth-error" id="authError" role="alert" hidden></div> 148 149 <div class="auth-panes"> 150 <form class="contact-form auth-form" data-auth-form="login" method="post" action="/account/" novalidate> 151 <input type="hidden" name="_action" value="login"> 152 <input type="hidden" name="_csrf" value=""> 153 <div class="contact-field"> 154 <label for="am-li-email">Email</label> 155 <input type="email" id="am-li-email" name="email" required maxlength="190" autocomplete="email" placeholder="[email protected]"> 156 </div> 157 <div class="contact-field"> 158 <label for="am-li-pass">Password</label> 159 <input type="password" id="am-li-pass" name="password" required autocomplete="current-password" placeholder="Your password"> 160 </div> 161 <button type="submit" class="btn btn-primary contact-submit auth-submit">Log in</button> 162 <p class="auth-switch">New here? <button type="button" data-auth-tab="signup">Create a free account</button></p> 163 </form> 164 165 <form class="contact-form auth-form" data-auth-form="signup" method="post" action="/account/" novalidate aria-hidden="true" inert> 166 <input type="hidden" name="_action" value="signup"> 167 <input type="hidden" name="_csrf" value=""> 168 <div class="contact-field"> 169 <label for="am-su-email">Email</label> 170 <input type="email" id="am-su-email" name="email" required maxlength="190" autocomplete="email" placeholder="[email protected]"> 171 </div> 172 <div class="contact-field"> 173 <label for="am-su-pass">Password</label> 174 <input type="password" id="am-su-pass" name="password" required minlength="8" autocomplete="new-password" placeholder="At least 8 characters"> 175 </div> 176 <div class="contact-field"> 177 <label for="am-su-pass2">Confirm password</label> 178 <input type="password" id="am-su-pass2" name="password2" required minlength="8" autocomplete="new-password" placeholder="Repeat the password"> 179 </div> 180 <button type="submit" class="btn btn-primary contact-submit auth-submit">Create account</button> 181 <p class="auth-note">By signing up you agree to the <a href="/terms/">Terms of Service</a> and <a href="/privacy/">Privacy Policy</a>.</p> 182 <p class="auth-switch">Already have an account? <button type="button" data-auth-tab="login">Log in</button></p> 183 </form> 184 </div> 185 </div> 186 </div> 187 <main id="swup" class="transition-main"> 188 <div class="api-docs-page"> 189 <div class="container"> 190 191 <!-- ââ Hero âââââââââââââââââââââââââââââââââââââââââââââââ --> 192 <header class="docs-hero"> 193 <div class="ip-hero-glow" aria-hidden="true"></div> 194 <div class="u-center section-eyebrow">REST API</div> 195 <h1 class="docs-hero-title">API <em>Documentation</em></h1> 196 <p class="docs-hero-sub">One simple, fast REST API for IP geolocation, fraud scoring, WHOIS, DNS propagation, hostname resolution and email verification â all processed in-house, nothing shared with third parties.</p> 197 <div class="docs-badges">
198 <span class="docs-badge"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M20 6 9 17l-5-5"/></svg>No API key required</span> 199 <span class="docs-badge"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M20 6 9 17l-5-5"/></svg>Free for fair use</span> 200 <span class="docs-badge"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M20 6 9 17l-5-5"/></svg>CORS enabled</span> 201 <span class="docs-badge"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M20 6 9 17l-5-5"/></svg>JSON responses</span> 202 <span class="docs-badge"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M20 6 9 17l-5-5"/></svg>IPv4 & IPv6</span> 203 </div> 204 <div><span class="docs-baseurl"><span class="docs-baseurl-label">Base URL</span>https://ipaddress.to/api</span></div> 205 <div class="docs-quickstart"> 206 <div class="code-block"><div class="code-header"><span class="code-lang">Quick start</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre>curl "https://ipaddress.to/api/lookup/8.8.8.8"</pre></div></div> 207 </div> 208 </header> 209 210 <!-- ââ Layout: side nav + content âââââââââââââââââââââââââ --> 211 <div class="docs-layout"> 212 <aside class="docs-sidenav"> 213 <button type="button" class="docs-sidenav-toggle" onclick="this.parentElement.classList.toggle('open')">On this page <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="6 9 12 15 18 9"/></svg></button> 214 <div class="docs-sidenav-title">On this page</div> 215 <nav class="docs-sidenav-nav" aria-label="API documentation sections"> 216 <a class="docs-sidenav-link" href="#overview" data-no-swup>Overview</a> 217 <a class="docs-sidenav-link" href="#auth" data-no-swup>Accounts & API keys</a> 218 <div class="docs-sidenav-sep"></div> 219 <a class="docs-sidenav-link" href="#lookup" data-no-swup><span class="method method-get">GET</span>/lookup</a> 220 <a class="docs-sidenav-link" href="#whois" data-no-swup><span class="method method-get">GET</span>/whois</a> 221 <a class="docs-sidenav-link" href="#resolve" data-no-swup><span class="method method-get">GET</span>/resolve</a> 222 <a class="docs-sidenav-link" href="#dns" data-no-swup><span class="method method-get">GET</span>/dns</a> 223 <a class="docs-sidenav-link" href="#score" data-no-swup><span class="method method-get">GET</span>/score</a> 224 <a class="docs-sidenav-link" href="#email" data-no-swup><span class="method method-get">GET</span>/email</a> 225 <div class="docs-sidenav-sep"></div> 226 <a class="docs-sidenav-link" href="#discovery" data-no-swup>Discovery endpoint</a> 227 <a class="docs-sidenav-link" href="#errors" data-no-swup>Errors & caching</a> 228 <a class="docs-sidenav-link" href="#rate-limits" data-no-swup>Rate limits</a> 229 <a class="docs-sidenav-link" href="#internal" data-no-swup>Internal endpoints</a> 230 </nav> 231 </aside> 232 233 <div class="docs-content"> 234 235 <!-- Overview --> 236 <section class="docs-section" id="overview"> 237 <h2 class="docs-section-title">Overview</h2> 238 <p class="docs-section-desc">All endpoints are plain <code>GET</code> requests returning JSON over HTTPS â no authentication, tokens or signup. Every response includes a <code>success</code> boolean; most include <code>duration_ms</code> (server processing time) and a <code>cached</code>
238 flag when served from the short-lived server-side cache. All lookups run against our own local geolocation, ASN, VPN-provider and threat-intelligence databases, so your queries never leave our infrastructure.</p> 239 <div class="docs-facts"> 240 <div class="docs-fact"><div class="docs-fact-name">Base URL</div><div class="docs-fact-val">https://ipaddress.to/api</div></div> 241 <div class="docs-fact"><div class="docs-fact-name">Format</div><div class="docs-fact-val">JSON (UTF-8). <code>/api/dns</code> streams NDJSON â one JSON object per line.</div></div> 242 <div class="docs-fact"><div class="docs-fact-name">Auth</div><div class="docs-fact-val">None required â <a href="#auth" data-no-swup>optional free API keys</a> for usage tracking.</div></div> 243 <div class="docs-fact"><div class="docs-fact-name">CORS</div><div class="docs-fact-val"><code>Access-Control-Allow-Origin: *</code> â call it straight from the browser.</div></div> 244 <div class="docs-fact"><div class="docs-fact-name">IPv4 / IPv6</div><div class="docs-fact-val">Both fully supported on every endpoint.</div></div> 245 </div> 246 </section> 247 248 <!-- Accounts & API keys --> 249 <section class="docs-section" id="auth"> 250 <h2 class="docs-section-title">Accounts & API Keys</h2> 251 <p class="docs-section-desc">Every endpoint works without any credentials â keys are <strong>optional</strong>. Creating a free account at <a href="/account/">/account/</a> gives you API keys (format <code>ipa_<40 hex chars></code>; your first key is generated on signup, up to 5 active keys per account) so you can label integrations and see per-key request counts and last-used times on your account page. Keyed requests also make it possible for us to offer you higher limits than anonymous fair-use traffic if quotas are ever introduced.</p> 252 <p class="docs-section-desc">Pass the key with any request, either as a header or a query parameter:</p> 253 <div class="docs-facts"> 254 <div class="docs-fact"><div class="docs-fact-name">Header (preferred)</div><div class="docs-fact-val"><code>X-API-Key: ipa_your_key_here</code></div></div> 255 <div class="docs-fact"><div class="docs-fact-name">Query parameter</div><div class="docs-fact-val"><code>https://ipaddress.to/api/lookup/8.8.8.8?key=ipa_your_key_here</code></div></div> 256 <div class="docs-fact"><div class="docs-fact-name">Manage keys</div><div class="docs-fact-val">Create, label and revoke keys at <a href="/account/">ipaddress.to/account</a>. Revoked keys stop being counted immediately.</div></div> 257 </div> 258 <p class="docs-section-desc">Prefer the header in server-side code â query strings tend to end up in logs. An invalid or revoked key never causes an error; the request is simply treated as anonymous.</p> 259 </section> 260 261 <!-- Lookup --> 262 <section class="docs-section" id="lookup"> 263 <h2 class="docs-section-title">IP Lookup</h2> 264 <p class="docs-section-desc">Geolocation and network intelligence for any IP address or hostname: continent, country, region, city, coordinates, timezone, currency, ASN, the company the address block is registered to, plus connection flags (<code>is_vpn</code>, <code>is_proxy</code>, <code>is_tor</code>, <code>is_hosting</code>). Use <code>my</code> as the address to look up the calling IP.</p> 265 <div class="endpoints-grid"> 266 <div class="endpoint open"> 267 <div class="endpoint-header" onclick="toggleEndpoint(this)" role="button" tabindex="0" aria-expanded="true">
268 <span class="method method-get">GET</span> 269 <span class="endpoint-path">/api/lookup/<span class="param">{ip_or_hostname}</span></span> 270 <span class="endpoint-desc">Geolocation, ASN & connection flags</span> 271 <span class="endpoint-toggle"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="6 9 12 15 18 9"/></svg></span> </div> 272 <div class="endpoint-body"><div class="endpoint-body-inner"><div class="endpoint-body-content"> 273 <div class="params-grid"> 274 <div class="param-row"><div class="param-name">ip_or_hostname <span class="param-tag param-required">required</span></div><div class="param-type">string</div><div class="param-desc">IPv4/IPv6 address or hostname (e.g. <code>8.8.8.8</code>, <code>google.com</code>). Use <code>my</code> for your own IP.</div></div> 275 </div> 276 <div class="u-mt-16 code-tabs"><button class="code-tab active" onclick="switchTab(this,'lookup-curl')">cURL</button><button class="code-tab" onclick="switchTab(this,'lookup-js')">JavaScript</button><button class="code-tab" onclick="switchTab(this,'lookup-py')">Python</button><button class="code-tab" onclick="switchTab(this,'lookup-php')">PHP</button><button class="code-tab" onclick="switchTab(this,'lookup-cs')">C#</button><button class="code-tab" onclick="switchTab(this,'lookup-go')">Go</button><button class="code-tab" onclick="switchTab(this,'lookup-rb')">Ruby</button><button class="code-tab" onclick="switchTab(this,'lookup-java')">Java</button><button class="code-tab" onclick="switchTab(this,'lookup-perl')">Perl</button><button class="code-tab" onclick="switchTab(this,'lookup-rust')">Rust</button></div><div id="lookup-curl" class="code-example active"><div class="code-block"><div class="code-header"><span class="code-lang">cURL</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre>curl "https://ipaddress.to/api/lookup/8.8.8.8"</pre></div></div></div><div id="lookup-js" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">JavaScript</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">const</span> res = <span class="keyword">await</span> fetch(<span class="string">'https://ipaddress.to/api/lookup/8.8.8.8'</span>); 277<span class="keyword">const</span> data = <span class="keyword">await</span> res.json(); 278console.log(data);</pre></div></div></div><div id="lookup-py" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Python</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">import</span> requests 279 280data = requests.get(<span class="string">'https://ipaddress.to/api/lookup/8.8.8.8'</span>).json() 281print(data)</pre></div></div></div><div id="lookup-php" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">PHP</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre>$data = json_decode( 282 file_get_contents(<span class="string">'https://ipaddress.to/api/lookup/8.8.8.8'</span>), 283 <span class="keyword">true</span> 284); 285print_r($data);</pre></div></div></div><div id="lookup-cs" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">C#</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">using</span> var client = <span class="keyword">new</span> HttpClient(); 286<span class="keyword">var</span> json = <span class="keyword">await</span> client.GetStringAsync(<span class="string">"https://ipaddress.to/api/lookup/8.8.8.8"</span>); 287Console.WriteLine(json);</pre></div></div></div><div id="lookup-go" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Go</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre>resp, _ := http.Get(<span class="string">"https://ipaddress.to/api/lookup/8.8.8.8"</span>) 288body, _ := io.ReadAll(resp.Body) 289fmt.Println(<span class="keyword">string</span>(body))</pre></div></div></div><div id="lookup-rb" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Ruby</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">require</span> <span class="string">'net/http'</span> 290<span class="keyword">require</span> <span class="string">'json'</span> 291 292data = JSON.parse(Net::HTTP.get(URI(<span class="string">'https://ipaddress.to/api/lookup/8.8.8.8'</span>))) 293puts data</pre></div></div></div><div id="lookup-java" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Java</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre>HttpClient client = HttpClient.newHttpClient(); 294HttpRequest req = HttpRequest.newBuilder() 295 .uri(URI.create(<span class="string">"https://ipaddress.to/api/lookup/8.8.8.8"</span>)).build(); 296String body = client.send(req, BodyHandlers.ofString()).body(); 297System.out.println(body);</pre></div></div></div><div id="lookup-perl" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Perl</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">
297use</span> LWP::Simple; 298<span class="keyword">use</span> JSON; 299 300<span class="keyword">my</span> $data = decode_json(get(<span class="string">'https://ipaddress.to/api/lookup/8.8.8.8'</span>)); 301print $data;</pre></div></div></div><div id="lookup-rust" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Rust</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">let</span> body = reqwest::get(<span class="string">"https://ipaddress.to/api/lookup/8.8.8.8"</span>) 302 .<span class="keyword">await</span>?.text().<span class="keyword">await</span>?; 303println!(<span class="string">"{}"</span>, body);</pre></div></div></div> <div class="u-mt-16 code-block"><div class="code-header"><span class="code-lang">Response</span></div><div class="code-content"><pre>{ 304 <span class="key">"success"</span>: <span class="keyword">true</span>, 305 <span class="key">"ip"</span>: <span class="string">"8.8.8.8"</span>, 306 <span class="key">"type"</span>: <span class="string">"IPv4"</span>, 307 <span class="key">"rdns"</span>: <span class="string">"dns.google"</span>, 308 <span class="key">"location"</span>: { 309 <span class="key">"continent"</span>: <span class="string">"NA"</span>, 310 <span class="key">"continent_name"</span>: <span class="string">"North America"</span>, 311 <span class="key">"country"</span>: <span class="string">"United States"</span>, 312 <span class="key">"country_code"</span>: <span class="string">"US"</span>, 313 <span class="key">"state"</span>: <span class="string">"California"</span>, 314 <span class="key">"city"</span>: <span class="string">
314"Mountain View"</span>, 315 <span class="key">"latitude"</span>: <span class="number">37.422</span>, 316 <span class="key">"longitude"</span>: <span class="number">-122.085</span>, 317 <span class="key">"timezone"</span>: <span class="string">"America/Los_Angeles"</span>, 318 <span class="key">"is_eu_member"</span>: <span class="keyword">false</span>, 319 <span class="key">"calling_code"</span>: <span class="string">"1"</span>, 320 <span class="key">"capital"</span>: <span class="string">"Washington, D.C."</span>, 321 <span class="key">"languages"</span>: <span class="string">"English"</span>, 322 <span class="key">"country_tld"</span>: <span class="string">".us"</span>, 323 <span class="key">"currency"</span>: { <span class="key">"code"</span>: <span class="string">"USD"</span>, <span class="key">"name"</span>: <span class="string">"US Dollar"</span> } 324 }, 325 <span class="key">"asn"</span>: { 326 <span class="key">"asn"</span>: <span class="number">15169</span>, 327 <span class="key">"descr"</span>: <span class="string">"Google LLC"</span>, 328 <span class="key">"country"</span>: <span class="string">"US"</span>, 329 <span class="key">"org"</span>: <span class="string">"Google LLC"</span> 330 }, 331 <span class="key">"company"</span>: { 332 <span class="key">"name"</span>: <span class="string">"Google LLC"</span>, 333 <span class="key">"domain"</span>: <span class="string">"google.com"</span>, 334 <span class="key">"type"</span>: <span class="string">"hosting"</span>, 335 <span class="key">"network"</span>: <span class="string">"8.8.8.0/24"</span>, 336 <span class="key">"source"</span>: <span class="string">"registry"</span> 337 }, 338 <span class="key">"is_vpn"</span>: <span class="keyword">false</span>, 339 <span class="key">"is_proxy"</span>: <span class="keyword">false</span>, 340 <span class="key">"is_tor"</span>: <span class="keyword">false</span>, 341 <span class="key">"is_hosting"</span>: <span class="keyword">false</span>, 342 <span class="key">"is_private"</span>: <span class="keyword">false</span>, 343 <span class="key">"is_cgnat"</span>: <span class="keyword">false</span>, 344 <span class="key">"vpn_provider"</span>: <span class="keyword">null</span>, 345 <span class="key">"duration_ms"</span>: <span class="number">12</span> 346}</pre></div></div> <p class="u-note endpoint-note"><code>company</code> is the organisation the address block is registered to, taken from the regional registry (RIR) and cached per netblock â for an address inside a cloud provider’s range this is the tenant, not the provider. <code>company.source</code> is <code>registry</code> when the block comes from a registry record and <code>asn</code> when only the ASN name was available. <code>company.type</code> classifies the <em>network</em> (hosting / isp / business / education / government); <code>is_hosting</code> is the visitor-oriented flag and stays <code>false</code> for major providers’ own verified infrastructure (Google DNS, Cloudflare, â¦) even though their network type is hosting. Private, reserved and CGNAT addresses return the same shape with <code>is_private</code> / <code>is_cgnat</code> set and <code>location.country</code> = <code>Private/Reserved</code>.</p> 347 </div></div></div> 348 </div> 349 </div> 350 </section> 351 352 <!-- WHOIS --> 353 <section class="docs-section" id="whois"> 354 <h2 class="docs-section-title">WHOIS</h2> 355 <p class="docs-section-desc">Registration data for a domain or IP address, assembled from the authoritative registries and registrars. Domains return registrar, creation/expiry dates, status codes, nameservers and abuse contacts; IPs return network range, RIR and holder details. Subdomains are automatically stripped to the registrable root domain.</p> 356 <div class="endpoints-grid"> 357 <div class="endpoint open"> 358 <div class="endpoint-header" onclick="toggleEndpoint(this)" role="button" tabindex="0" aria-expanded="true">
359 <span class="method method-get">GET</span> 360 <span class="endpoint-path">/api/whois/<span class="param">{ip_or_domain}</span></span> 361 <span class="endpoint-desc">WHOIS registration data</span> 362 <span class="endpoint-toggle"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="6 9 12 15 18 9"/></svg></span> </div> 363 <div class="endpoint-body"><div class="endpoint-body-inner"><div class="endpoint-body-content"> 364 <div class="params-grid"> 365 <div class="param-row"><div class="param-name">ip_or_domain <span class="param-tag param-required">required</span></div><div class="param-type">string</div><div class="param-desc">Domain name or IPv4/IPv6 address (e.g. <code>google.com</code>, <code>1.1.1.1</code>).</div></div> 366 </div> 367 <div class="u-mt-16 code-tabs"><button class="code-tab active" onclick="switchTab(this,'whois-curl')">cURL</button><button class="code-tab" onclick="switchTab(this,'whois-js')">JavaScript</button><button class="code-tab" onclick="switchTab(this,'whois-py')">Python</button><button class="code-tab" onclick="switchTab(this,'whois-php')">PHP</button><button class="code-tab" onclick="switchTab(this,'whois-cs')">C#</button><button class="code-tab" onclick="switchTab(this,'whois-go')">Go</button><button class="code-tab" onclick="switchTab(this,'whois-rb')">Ruby</button><button class="code-tab" onclick="switchTab(this,'whois-java')">Java</button><button class="code-tab" onclick="switchTab(this,'whois-perl')">Perl</button><button class="code-tab" onclick="switchTab(this,'whois-rust')">Rust</button></div><div id="whois-curl" class="code-example active"><div class="code-block"><div class="code-header"><span class="code-lang">cURL</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre>curl "https://ipaddress.to/api/whois/google.com"</pre></div></div></div><div id="whois-js" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">JavaScript</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">const</span> res = <span class="keyword">await</span> fetch(<span class="string">'https://ipaddress.to/api/whois/google.com'</span>); 368<span class="keyword">const</span> data = <span class="keyword">await</span> res.json(); 369console.log(data);</pre></div></div></div><div id="whois-py" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Python</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">import</span> requests 370 371data = requests.get(<span class="string">'https://ipaddress.to/api/whois/google.com'</span>).json() 372print(data)</pre></div></div></div><div id="whois-php" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">PHP</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre>$data = json_decode( 373 file_get_contents(<span class="string">'https://ipaddress.to/api/whois/google.com'</span>), 374 <span class="keyword">true</span> 375); 376print_r($data);</pre></div></div></div><div id="whois-cs" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">C#</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">using</span> var client = <span class="keyword">new</span> HttpClient(); 377<span class="keyword">var</span> json = <span class="keyword">await</span> client.GetStringAsync(<span class="string">"https://ipaddress.to/api/whois/google.com"</span>); 378Console.WriteLine(json);</pre></div></div></div><div id="whois-go" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Go</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre>resp, _ := http.Get(<span class="string">"https://ipaddress.to/api/whois/google.com"</span>) 379body, _ := io.ReadAll(resp.Body) 380fmt.Println(<span class="keyword">string</span>(body))</pre></div></div></div><div id="whois-rb" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Ruby</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">require</span> <span class="string">'net/http'</span> 381<span class="keyword">require</span> <span class="string">'json'</span> 382 383data = JSON.parse(Net::HTTP.get(URI(<span class="string">'https://ipaddress.to/api/whois/google.com'</span>))) 384puts data</pre></div></div></div><div id="whois-java" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Java</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre>HttpClient client = HttpClient.newHttpClient(); 385HttpRequest req = HttpRequest.newBuilder() 386 .uri(URI.create(<span class="string">"https://ipaddress.to/api/whois/google.com"</span>)).build(); 387String body = client.send(req, BodyHandlers.ofString()).body(); 388System.out.println(body);</pre></div></div></div><div id="whois-perl" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Perl</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">
388use</span> LWP::Simple; 389<span class="keyword">use</span> JSON; 390 391<span class="keyword">my</span> $data = decode_json(get(<span class="string">'https://ipaddress.to/api/whois/google.com'</span>)); 392print $data;</pre></div></div></div><div id="whois-rust" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Rust</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">let</span> body = reqwest::get(<span class="string">"https://ipaddress.to/api/whois/google.com"</span>) 393 .<span class="keyword">await</span>?.text().<span class="keyword">await</span>?; 394println!(<span class="string">"{}"</span>, body);</pre></div></div></div> <div class="u-mt-16 code-block"><div class="code-header"><span class="code-lang">Response (domain, trimmed)</span></div><div class="code-content"><pre>{ 395 <span class="key">"success"</span>: <span class="keyword">true</span>, 396 <span class="key">"query"</span>: <span class="string">"google.com"</span>, 397 <span class="key">"type"</span>: <span class="string">"domain"</span>, 398 <span class="key">"found"</span>: <span class="keyword">true</span>, 399 <span class="key">"parsed"</span>: { 400 <span class="key">"domain_name"</span>: <span class="string">"GOOGLE.COM"</span>, 401 <span class="key">"registrar"</span>: <span class="string">"MarkMonitor Inc."</span>, 402 <span class="key">"registrar_url"</span>: <span class="string">"https://rdap.markmonitor.com/rdap/domain/GOOGLE.COM"</span>, 403 <span class="key">"registrar_iana_id"</span>: <span class="string">"292"</span>, 404 <span class="key">"creation_date"</span>: <span class="string">"1997-09-15T04:00:00Z"</span>, 405 <span class="key">"expiry_date"</span>: <span class="string">"2028-09-14T04:00:00Z"</span>, 406 <span class="key">"updated_date"</span>: <span class="string">"2026-07-01T02:29:57Z"</span>, 407 <span class="key">"status"</span>: [<span class="string">"client delete prohibited"</span>, <span class="string">"client transfer prohibited"</span>], <span class="comment">// ⦠6 in total</span> 408 <span class="key">"nameservers"</span>: [<span class="string">"ns1.google.com"</span>, <span class="string">"ns2.google.com"</span>], <span class="comment">// ⦠4 in total</span> 409 <span class="key">"dnssec"</span>: <span class="string">"unsigned"</span>, 410 <span class="key">"abuse_email"</span>: <span class="string">"[email protected]"</span>, 411 <span class="key">"abuse_phone"</span>: <span class="string">"tel:+1.2086851750"</span> 412 }, 413 <span class="key">"raw"</span>: <span class="string">"⦠full registry response as a string â¦"</span>, 414 <span class="key">"for_sale"</span>: { <span class="key">"rfc"</span>: <span class="string">"RFC 10023"</span>, <span class="key">"listed"</span>: <span class="keyword">false</span>, <span class="key">"checked"</span>: <span class="keyword">true</span>, <span class="key">"node"</span>: <span class="string">"_for-sale.google.com"</span>, <span class="key">"text"</span>: [], <span class="key">"uris"</span>: [], <span class="key">"prices"</span>: [], <span class="key">"codes"</span>: [] }, 415 <span class="key">"source"</span>: <span class="string">"registry"</span>, 416 <span class="key">"duration_ms"</span>: <span class="number">342</span> 417}</pre></div></div> <p class="u-note endpoint-note">The <code>raw</code> field contains the complete unparsed registry payload; <code>source</code> is always <code>registry</code>. For domains, <code>for_sale</code> reports the RFC 10023 <code>_for-sale</code> TXT node: <code>listed</code>, plus any <code>text</code>, <code>uris</code> (http, https, mailto, tel only), <code>prices</code> (currency + amount) and <code>codes</code> published by the holder. Prices are indicative only. The same object is returned by <code>/api/lookup</code> for hostnames, <code>/api/email</code> for domains and <code>/api/resolve</code>.</p> 418 </div></div></div> 419 </div> 420 </div> 421 </section> 422 423 <!-- Resolve --> 424 <section class="docs-section" id="resolve"> 425 <h2 class="docs-section-title">Hostname Resolution</h2> 426 <p class="docs-section-desc">Resolve a hostname to its A (IPv4), AAAA (IPv6) and CNAME records, with automatic reverse-DNS lookups for every resolved IP.</p> 427 <div class="endpoints-grid"> 428 <div class="endpoint open"> 429 <div class="endpoint-header" onclick="toggleEndpoint(this)" role="button" tabindex="0" aria-expanded="true">
430 <span class="method method-get">GET</span> 431 <span class="endpoint-path">/api/resolve/<span class="param">{hostname}</span></span> 432 <span class="endpoint-desc">A / AAAA / CNAME + reverse DNS</span> 433 <span class="endpoint-toggle"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="6 9 12 15 18 9"/></svg></span> </div> 434 <div class="endpoint-body"><div class="endpoint-body-inner"><div class="endpoint-body-content"> 435 <div class="params-grid"> 436 <div class="param-row"><div class="param-name">hostname <span class="param-tag param-required">required</span></div><div class="param-type">string</div><div class="param-desc">Hostname to resolve (e.g. <code>github.com</code>).</div></div> 437 </div> 438 <div class="u-mt-16 code-tabs"><button class="code-tab active" onclick="switchTab(this,'resolve-curl')">cURL</button><button class="code-tab" onclick="switchTab(this,'resolve-js')">JavaScript</button><button class="code-tab" onclick="switchTab(this,'resolve-py')">Python</button><button class="code-tab" onclick="switchTab(this,'resolve-php')">PHP</button><button class="code-tab" onclick="switchTab(this,'resolve-cs')">C#</button><button class="code-tab" onclick="switchTab(this,'resolve-go')">Go</button><button class="code-tab" onclick="switchTab(this,'resolve-rb')">Ruby</button><button class="code-tab" onclick="switchTab(this,'resolve-java')">Java</button><button class="code-tab" onclick="switchTab(this,'resolve-perl')">Perl</button><button class="code-tab" onclick="switchTab(this,'resolve-rust')">Rust</button></div><div id="resolve-curl" class="code-example active"><div class="code-block"><div class="code-header"><span class="code-lang">cURL</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre>curl "https://ipaddress.to/api/resolve/github.com"</pre></div></div></div><div id="resolve-js" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">JavaScript</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">const</span> res = <span class="keyword">await</span> fetch(<span class="string">'https://ipaddress.to/api/resolve/github.com'</span>); 439<span class="keyword">const</span> data = <span class="keyword">await</span> res.json(); 440console.log(data);</pre></div></div></div><div id="resolve-py" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Python</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">import</span> requests 441 442data = requests.get(<span class="string">'https://ipaddress.to/api/resolve/github.com'</span>).json() 443print(data)</pre></div></div></div><div id="resolve-php" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">PHP</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre>$data = json_decode( 444 file_get_contents(<span class="string">'https://ipaddress.to/api/resolve/github.com'</span>), 445 <span class="keyword">true</span> 446); 447print_r($data);</pre></div></div></div><div id="resolve-cs" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">C#</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">using</span> var client = <span class="keyword">new</span> HttpClient(); 448<span class="keyword">var</span> json = <span class="keyword">await</span> client.GetStringAsync(<span class="string">"https://ipaddress.to/api/resolve/github.com"</span>); 449Console.WriteLine(json);</pre></div></div></div><div id="resolve-go" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Go</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre>resp, _ := http.Get(<span class="string">"https://ipaddress.to/api/resolve/github.com"</span>) 450body, _ := io.ReadAll(resp.Body) 451fmt.Println(<span class="keyword">string</span>(body))</pre></div></div></div><div id="resolve-rb" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Ruby</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">require</span> <span class="string">'net/http'</span> 452<span class="keyword">require</span> <span class="string">'json'</span> 453 454data = JSON.parse(Net::HTTP.get(URI(<span class="string">'https://ipaddress.to/api/resolve/github.com'</span>))) 455puts data</pre></div></div></div><div id="resolve-java" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Java</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre>HttpClient client = HttpClient.newHttpClient(); 456HttpRequest req = HttpRequest.newBuilder() 457 .uri(URI.create(<span class="string">"https://ipaddress.to/api/resolve/github.com"</span>)).build(); 458String body = client.send(req, BodyHandlers.ofString()).body(); 459System.out.println(body);</pre></div></div></div><div id="resolve-perl" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Perl</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">
459use</span> LWP::Simple; 460<span class="keyword">use</span> JSON; 461 462<span class="keyword">my</span> $data = decode_json(get(<span class="string">'https://ipaddress.to/api/resolve/github.com'</span>)); 463print $data;</pre></div></div></div><div id="resolve-rust" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Rust</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">let</span> body = reqwest::get(<span class="string">"https://ipaddress.to/api/resolve/github.com"</span>) 464 .<span class="keyword">await</span>?.text().<span class="keyword">await</span>?; 465println!(<span class="string">"{}"</span>, body);</pre></div></div></div> <div class="u-mt-16 code-block"><div class="code-header"><span class="code-lang">Response</span></div><div class="code-content"><pre>{ 466 <span class="key">"success"</span>: <span class="keyword">true</span>, 467 <span class="key">"hostname"</span>: <span class="string">"github.com"</span>, 468 <span class="key">"a"</span>: [<span class="string">"140.82.113.4"</span>], 469 <span class="key">"aaaa"</span>: [], 470 <span class="key">"cname"</span>: [], 471 <span class="key">"mx"</span>: [{ <span class="key">"host"</span>: <span class="string">"github-com.mail.protection.outlook.com"</span>, <span class="key">"priority"</span>: <span class="number">0</span> }], 472 <span class="key">"ns"</span>: [<span class="string">"dns1.p08.nsone.net"</span>, <span class="string">"dns2.p08.nsone.net"</span>], 473 <span class="key">"txt"</span>: [<span class="string">"v=spf1 ip4:192.30.252.0/22 include:_spf.google.com ~all"</span>], 474 <span class="key">"for_sale"</span>: { <span class="key">"rfc"</span>: <span class="string">"RFC 10023"</span>, <span class="key">"node"</span>: <span class="string">"_for-sale.github.com"</span> }, 475 <span class="key">"reverse"</span>: { 476 <span class="key">"140.82.113.4"</span>: <span class="string">"lb-140-82-113-4-iad.github.com"</span> 477 }, 478 <span class="key">"total_ips"</span>: <span class="number">1</span>, 479 <span class="key">"has_ipv4"</span>: <span class="keyword">true</span>, 480 <span class="key">"has_ipv6"</span>: <span class="keyword">false</span>, 481 <span class="key">"duration_ms"</span>: <span class="number">87</span> 482}</pre></div></div> </div></div></div> 483 </div> 484 </div> 485 </section> 486 487 <!-- DNS propagation --> 488 <section class="docs-section" id="dns"> 489 <h2 class="docs-section-title">DNS Propagation</h2> 490 <p class="docs-section-desc">Query a DNS record against 32 public resolvers around the world and watch propagation in real time. Results are <strong>streamed as NDJSON</strong> â newline-delimited JSON, one object per line â so you can render each server's answer as it arrives. Pass <code>?server=IP</code> to query a single resolver and get one plain JSON object instead.</p> 491 <div class="endpoints-grid"> 492 <div class="endpoint open"> 493 <div class="endpoint-header" onclick="toggleEndpoint(this)" role="button" tabindex="0" aria-expanded="true"> 494 <span class="method method-get">GET</span> 495 <span class="endpoint-path">/api/dns/<span class="param">{type}</span>/<span class="param">{domain}</span></span> 496 <span class="endpoint-desc">Propagation check across 32 global servers (NDJSON stream)</span> 497 <span class="endpoint-toggle"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="6 9 12 15 18 9"/></svg></span> </div> 498 <div class="endpoint-body"><div class="endpoint-body-inner"><div class="endpoint-body-content"> 499 <div class="params-grid"> 500 <div class="param-row"><div class="param-name">type <span class="param-tag param-required">required</span></div><div class="param-type">string</div><div class="param-desc">Record type: <code>A</code>, <code>AAAA</code>, <code>CNAME</code>, <code>MX</code>, <code>NS</code>, <code>TXT</code>, <code>SOA</code>, <code>PTR</code>, <code>SRV</code>, <code>CAA</code> (case-insensitive).</div></div> 501 <div class="param-row"><div class="param-name">domain <span class="param-tag param-required">required</span></div><div class="param-type">string</div><div class="param-desc">Domain to query (e.g. <code>example.com</code>).</div></div> 502 <div class="param-row"><div class="param-name">server <span class="param-tag param-optional">optional</span></div><div class="param-type">string</div><div class="param-desc">Query one resolver only, e.g. <code>?server=8.8.8.8</code>. Returns a single JSON object instead of a stream.</div></div> 503 </div> 504 <div class="u-mt-16 code-tabs"> 505 <button class="code-tab active" onclick="switchTab(this,'dns-curl')">cURL</button> 506 <button class="code-tab" onclick="switchTab(this,'dns-js')">JavaScript</button> 507 <button class="code-tab" onclick="switchTab(this,'dns-py')">Python</button> 508 </div> 509 <div id="dns-curl" class="code-example active"><div class="code-block"><div class="code-header"><span class="code-lang">cURL</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre>curl -N "https://ipaddress.to/api/dns/a/example.com"</pre></div></div></div> 510 <div id="dns-js" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">JavaScript</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">const</span> res = <span class="keyword">await</span> fetch(<span class="string">'https://ipaddress.to/api/dns/a/example.com'</span>); 511<span class="keyword">const</span> reader = res.body.getReader(); 512<span class="comment">// read the stream â each line is one JSON object</span></pre></div></div></div> 513 <div id="dns-py" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Python</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">
513import</span> requests, json 514 515r = requests.get(<span class="string">'https://ipaddress.to/api/dns/a/example.com'</span>, stream=<span class="keyword">True</span>) 516<span class="keyword">for</span> line <span class="keyword">in</span> r.iter_lines(): 517 print(json.loads(line))</pre></div></div></div> 518 <div class="u-mt-16 code-block"><div class="code-header"><span class="code-lang">Response â NDJSON stream (trimmed)</span></div><div class="code-content"><pre>{<span class="key">"type"</span>:<span class="string">"start"</span>,<span class="key">"domain"</span>:<span class="string">"example.com"</span>,<span class="key">"recordType"</span>:<span class="string">"A"</span>,<span class="key">"total"</span>:<span class="number">32</span>} 519{<span class="key">"type"</span>:<span class="string">"result"</span>,<span class="key">"index"</span>:<span class="number">0</span>,<span class="key">"result"</span>:{<span class="key">"status"</span>:<span class="string">"ok"</span>,<span class="key">"value"</span>:<span class="string">"104.20.23.154"</span>,<span class="key">"ttl"</span>:<span class="number">133</span>,<span class="key">"elapsed"</span>:<span class="number">71</span>,<span class="key">"raw"</span>:[{<span class="key">"name"</span>:<span class="string">"example.com"</span>,<span class="key">"ttl"</span>:<span class="number">133</span>,<span class="key">"class"</span>:<span class="string">"IN"</span>,<span class="key">"type"</span>:<span class="string">"A"</span>,<span class="key">"value"</span>:<span class="string">"104.20.23.154"</span>}]}} 520<span class="comment">// ⦠one "result" line per server (32 total), in server-list order â¦</span> 521{<span class="key">"type"</span>:<span class="string">"done"</span>,<span class="key">"summary"</span>:{<span class="key">"successful"</span>:<span class="number">29</span>,<span class="key">"failed"</span>:<span class="number">3</span>,<span class="key">"total"</span>:<span class="number">32</span>}}</pre></div></div> <p class="u-note endpoint-note">The stream opens with a <code>start</code> object, emits one <code>result</code> object per server (with <code>index</code>, answer <code>value</code>, <code>ttl</code>, latency <code>elapsed</code> in ms and the <code>raw</code> record set), and closes with a <code>done</code> summary.</p> 522 <div class="u-mt-16 code-block"><div class="code-header"><span class="code-lang">Response with ?server=8.8.8.8 (single JSON object)</span></div><div class="code-content"><pre>{ 523 <span class="key">"success"</span>: <span class="keyword">true</span>, 524 <span class="key">"domain"</span>: <span class="string">"example.com"</span>, 525 <span class="key">"type"</span>: <span class="string">"A"</span>, 526 <span class="key">"server"</span>: { <span class="key">"ip"</span>: <span class="string">"8.8.8.8"</span>, <span class="key">"name"</span>: <span class="string">"New York"</span>, <span class="key">"country"</span>: <span class="string">"US"</span>, <span class="key">"provider"</span>: <span class="string">"Google"</span> }, 527 <span class="key">"result"</span>: { 528 <span class="key">"status"</span>: <span class="string">"ok"</span>, 529 <span class="key">"value"</span>: <span class="string">"104.20.23.154"</span>, 530 <span class="key">"ttl"</span>: <span class="number">300</span>, 531 <span class="key">"elapsed"</span>: <span class="number">41</span>, 532 <span class="key">"raw"</span>: [ 533 { <span class="key">"name"</span>: <span class="string">"example.com"</span>, <span class="key">"ttl"</span>: <span class="number">300</span>, <span class="key">"class"</span>: <span class="string">"IN"</span>, <span class="key">"type"</span>: <span class="string">"A"</span>, <span class="key">"value"</span>: <span class="string">"104.20.23.154"</span> }, 534 { <span class="key">"name"</span>: <span class="string">"example.com"</span>, <span class="key">"ttl"</span>: <span class="number">300</span>, <span class="key">"class"</span>: <span class="string">"IN"</span>, <span class="key">"type"</span>: <span class="string">"A"</span>, <span class="key">"value"</span>: <span class="string">"172.66.147.243"</span> } 535 ] 536 } 537}</pre></div></div> </div></div></div> 538 </div> 539 </div> 540 </section> 541 542 <!-- Score --> 543 <section class="docs-section" id="score"> 544 <h2 class="docs-section-title">IP Fraud Score</h2> 545 <p class="docs-section-desc">
545A 0â100 risk score built from threat blocklists, VPN/proxy/Tor detection, ASN classification, reverse-DNS heuristics and bot signals. <code>risk</code> is one of <code>low</code>, <code>medium</code>, <code>high</code> or <code>critical</code>, and <code>factors</code> explains exactly which signals moved the score. Known crawler IPs (Googlebot, Ahrefs, â¦) are verified via forward-confirmed reverse DNS and flagged rather than penalised.</p> 546 <p class="docs-section-desc">The endpoint scores two different things depending on what you pass, reported back as <code>target_type</code>. An <strong>IP address</strong> (<code>target_type: "ip"</code>) is scored as a <em>visitor</em> â "is traffic from this address suspicious?" â so VPN/proxy/Tor, datacenter hosting, missing reverse DNS and crawler signals all count against it. A <strong>domain</strong> (<code>target_type: "domain"</code>) is resolved and scored as a <em>website</em> â "is this site dangerous?" â using only server-reputation signals (threat intel, bulletproof/shady hosting, bogons); being hosted in a datacenter or on a CDN is normal for a server and is not penalised. In domain mode the visitor-only categories in <code>score_breakdown</code> (<code>anonymity</code>, <code>infrastructure</code>, <code>bot</code>) are <code>null</code> â not evaluated, as opposed to <code>0</code> (evaluated and clean).</p> 547 <p class="docs-section-desc">Threat-intel listings are weighted by feed reliability, de-duplicated across feeds that republish the same data, and discounted when a feed has stopped updating. On residential and mobile networks (<code>checks.is_isp</code> / <code>checks.is_mobile</code>), where one address is shared and reassigned among many people, non-critical listings are discounted further because they usually describe a previous holder. Tor exit relays (<code>tor_exit</code>) are scored as anonymised visitors; guard/middle relays (<code>tor_relay</code>) only forward Tor traffic and get a much smaller penalty. A VPN provider is only named in <code>vpn_provider</code> when the exact address is a listed endpoint; an address that merely shares a /24 with endpoints is reported as <code>checks.vpn_neighbor</code> with a small weight.</p> 548 <div class="endpoints-grid"> 549 <div class="endpoint open"> 550 <div class="endpoint-header" onclick="toggleEndpoint(this)" role="button" tabindex="0" aria-expanded="true"> 551 <span class="method method-get">GET</span> 552 <span class="endpoint-path">/api/score/<span class="param">{ip_or_hostname}</span></span> 553 <span class="endpoint-desc">0â100 fraud / abuse risk score</span> 554 <span class="endpoint-toggle"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="6 9 12 15 18 9"/></svg></span> </div> 555 <div class="endpoint-body"><div class="endpoint-body-inner"><div class="endpoint-body-content"> 556 <div class="params-grid"> 557 <div class="param-row"><div class="param-name">ip_or_hostname <span class="param-tag param-required">required</span></div><div class="param-type">string</div><div class="param-desc">IPv4/IPv6 address (scored as a visitor) or domain (resolved and scored as a website). Use <code>my</code> for your own IP.</div></div> 558 </div> 559 <div class="u-mt-16 code-tabs"><button class="code-tab active" onclick="switchTab(this,'score-curl')">cURL</button><button class="code-tab" onclick="switchTab(this,'score-js')">JavaScript</button><button class="code-tab" onclick="switchTab(this,'score-py')">Python</button><button class="code-tab" onclick="switchTab(this,'score-php')">PHP</button><button class="code-tab" onclick="switchTab(this,'score-cs')">C#</button><button class="code-tab" onclick="switchTab(this,'score-go')">Go</button><button class="code-tab" onclick="switchTab(this,'score-rb')">Ruby</button><button class="code-tab" onclick="switchTab(this,'score-java')">Java</button><button class="code-tab" onclick="switchTab(this,'score-perl')">Perl</button><button class="code-tab" onclick="switchTab(this,'score-rust')">Rust</button></div><div id="score-curl" class="code-example active"><div class="code-block"><div class="code-header"><span class="code-lang">cURL</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre>curl "https://ipaddress.to/api/score/8.8.8.8"</pre></div></div></div><div id="score-js" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">JavaScript</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">const</span> res = <span class="keyword">await</span> fetch(<span class="string">'https://ipaddress.to/api/score/8.8.8.8'</span>); 560<span class="keyword">const</span> data = <span class="keyword">await</span> res.json(); 561console.log(data);</pre></div></div></div><div id="score-py" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Python</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">
561import</span> requests 562 563data = requests.get(<span class="string">'https://ipaddress.to/api/score/8.8.8.8'</span>).json() 564print(data)</pre></div></div></div><div id="score-php" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">PHP</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre>$data = json_decode( 565 file_get_contents(<span class="string">'https://ipaddress.to/api/score/8.8.8.8'</span>), 566 <span class="keyword">true</span> 567); 568print_r($data);</pre></div></div></div><div id="score-cs" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">C#</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">using</span> var client = <span class="keyword">new</span> HttpClient(); 569<span class="keyword">var</span> json = <span class="keyword">await</span> client.GetStringAsync(<span class="string">"https://ipaddress.to/api/score/8.8.8.8"</span>); 570Console.WriteLine(json);</pre></div></div></div><div id="score-go" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Go</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre>resp, _ := http.Get(<span class="string">"https://ipaddress.to/api/score/8.8.8.8"</span>) 571body, _ := io.ReadAll(resp.Body) 572fmt.Println(<span class="keyword">string</span>(body))</pre></div></div></div><div id="score-rb" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Ruby</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">require</span> <span class="string">'net/http'</span> 573<span class="keyword">require</span> <span class="string">'json'</span> 574 575data = JSON.parse(Net::HTTP.get(URI(<span class="string">'https://ipaddress.to/api/score/8.8.8.8'</span>))) 576puts data</pre></div></div></div><div id="score-java" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Java</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre>HttpClient client = HttpClient.newHttpClient(); 577HttpRequest req = HttpRequest.newBuilder() 578 .uri(URI.create(<span class="string">"https://ipaddress.to/api/score/8.8.8.8"</span>)).build(); 579String body = client.send(req, BodyHandlers.ofString()).body(); 580System.out.println(body);</pre></div></div></div><div id="score-perl" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Perl</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">
580use</span> LWP::Simple; 581<span class="keyword">use</span> JSON; 582 583<span class="keyword">my</span> $data = decode_json(get(<span class="string">'https://ipaddress.to/api/score/8.8.8.8'</span>)); 584print $data;</pre></div></div></div><div id="score-rust" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Rust</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">let</span> body = reqwest::get(<span class="string">"https://ipaddress.to/api/score/8.8.8.8"</span>) 585 .<span class="keyword">await</span>?.text().<span class="keyword">await</span>?; 586println!(<span class="string">"{}"</span>, body);</pre></div></div></div> <div class="u-mt-16 code-block"><div class="code-header"><span class="code-lang">Response (trimmed)</span></div><div class="code-content"><pre>{ 587 <span class="key">"success"</span>: <span class="keyword">true</span>, 588 <span class="key">"ip"</span>: <span class="string">"8.8.8.8"</span>, 589 <span class="key">"target_type"</span>: <span class="string">"ip"</span>, 590 <span class="key">"score"</span>: <span class="number">3</span>, 591 <span class="key">"risk"</span>: <span class="string">"low"</span>, 592 <span class="key">"score_breakdown"</span>: { <span class="key">"threat"</span>: <span class="number">0</span>, <span class="key">"anonymity"</span>: <span class="number">0</span>, <span class="key">"infrastructure"</span>: <span class="number">25</span>, <span class="key">"reputation"</span>: <span class="number">0</span>, <span class="key">"bot"</span>: <span class="number">0</span> }, 593 <span class="key">"vpn_provider"</span>: <span class="keyword">null</span>, 594 <span class="key">"rdns"</span>: <span class="string">"dns.google"</span>, 595 <span class="key">"ip_version"</span>: <span class="number">4</span>, 596 <span class="key">"location"</span>: { <span class="key">"country"</span>: <span class="string">"United States"</span>, <span class="key">"country_code"</span>: <span class="string">"US"</span>, <span class="key">"city"</span>: <span class="string">
596"Mountain View"</span> }, 597 <span class="key">"asn"</span>: { <span class="key">"asn"</span>: <span class="number">15169</span>, <span class="key">"org"</span>: <span class="string">"Google LLC"</span> }, 598 <span class="key">"company"</span>: { <span class="key">"name"</span>: <span class="string">"Google LLC"</span>, <span class="key">"type"</span>: <span class="string">"trusted"</span> }, 599 <span class="key">"checks"</span>: { 600 <span class="key">"trusted_org"</span>: <span class="keyword">true</span>, 601 <span class="key">"has_rdns"</span>: <span class="keyword">true</span>, 602 <span class="key">"is_bot"</span>: <span class="keyword">false</span>, 603 <span class="key">"vpn_detected"</span>: <span class="keyword">false</span>, 604 <span class="key">"tor_exit"</span>: <span class="keyword">false</span>, 605 <span class="key">"tor_relay"</span>: <span class="keyword">false</span>, 606 <span class="key">"is_mobile"</span>: <span class="keyword">false</span>, 607 <span class="key">"commercial_proxy"</span>: <span class="keyword">false</span>, 608 <span class="key">"blocklist_listed"</span>: <span class="keyword">false</span>, 609 <span class="key">"blocklist_count"</span>: <span class="number">0</span>, 610 <span class="key">"hosting_asn"</span>: <span class="keyword">true</span>, 611 <span class="key">"asn_type"</span>: <span class="string">"hosting"</span>, 612 <span class="key">"high_risk_country"</span>: <span class="keyword">false</span> 613 <span class="comment">// ⦠26 checks in total (vpn_neighbor and vpn_provider appear only when detected)</span> 614 }, 615 <span class="key">"factors"</span>: [ 616 { <span class="key">"name"</span>: <span class="string">"Trusted Organization"</span>, <span class="key">"impact"</span>: <span class="string">"positive"</span>, <span class="key">"detail"</span>: <span class="string">"IP belongs to Google infrastructure (verified via ASN + rDNS)"</span> }, 617 { <span class="key">"name"</span>: <span class="string">"Datacenter / Hosting"</span>, <span class="key">"impact"</span>: <span class="string">"medium"</span>, <span class="key">"detail"</span>: <span class="string">"AS15169 (Google LLC) is hosting/datacenter infrastructure"</span> } 618 ], 619 <span class="key">"duration_ms"</span>: <span class="number">60</span> 620}</pre></div></div> </div></div></div> 621 </div> 622 </div> 623 </section> 624 625 <!-- Email --> 626 <section class="docs-section" id="email"> 627 <h2 class="docs-section-title">Email Check</h2> 628 <p class="docs-section-desc">Trust score (0â100, higher is better) for an email address or a domain. <strong>Deliverability</strong>: MX records that actually resolve (null MX and dangling MX are detected), the domain resolves, and â for an address â a live SMTP <code>RCPT TO</code> probe against the primary mail server reported in <code>checks.mailbox</code> as <code>deliverable</code>, <code>undeliverable</code>, <code>catch_all</code> (server accepts every address) or <code>unknown</code> (greylisted, blocked or timed out); no message is ever sent. <strong>Authentication</strong>: SPF policy strength (<code>spf_policy</code>: hardfail > softfail > redirect > neutral > open > permissive; several records = <code>invalid</code>), DMARC <code>p=</code> policy with <code>pct</code> and organisational-domain inheritance for subdomains, and a DKIM key found under a common selector. <strong>Reputation</strong>: disposable providers (by name, or by delivering to a known disposable provider’s mail server â <code>disposable_via_mx</code>), spam-associated domains, high-abuse TLDs, parked / for-sale domains and machine-generated local parts. Unregistered domains (<code>domain_exists: false</code>) are capped at 5. <code>normalized_email</code> strips <code>+tags</code> and, for Gmail, dots.</p> 629 <div class="endpoints-grid"> 630 <div class="endpoint open"> 631 <div class="endpoint-header" onclick="toggleEndpoint(this)" role="button" tabindex="0" aria-expanded="true">
632 <span class="method method-get">GET</span> 633 <span class="endpoint-path">/api/email/<span class="param">{email_or_domain}</span></span> 634 <span class="endpoint-desc">MX / SPF / DMARC / disposable score</span> 635 <span class="endpoint-toggle"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="6 9 12 15 18 9"/></svg></span> </div> 636 <div class="endpoint-body"><div class="endpoint-body-inner"><div class="endpoint-body-content"> 637 <div class="params-grid"> 638 <div class="param-row"><div class="param-name">email_or_domain <span class="param-tag param-required">required</span></div><div class="param-type">string</div><div class="param-desc">Email address (e.g. <code>[email protected]</code>) or domain (e.g. <code>mailinator.com</code>). Omit entirely to get a random sample of known disposable domains.</div></div> 639 </div> 640 <div class="u-mt-16 code-tabs"><button class="code-tab active" onclick="switchTab(this,'email-curl')">cURL</button><button class="code-tab" onclick="switchTab(this,'email-js')">JavaScript</button><button class="code-tab" onclick="switchTab(this,'email-py')">Python</button><button class="code-tab" onclick="switchTab(this,'email-php')">PHP</button><button class="code-tab" onclick="switchTab(this,'email-cs')">C#</button><button class="code-tab" onclick="switchTab(this,'email-go')">Go</button><button class="code-tab" onclick="switchTab(this,'email-rb')">Ruby</button><button class="code-tab" onclick="switchTab(this,'email-java')">Java</button><button class="code-tab" onclick="switchTab(this,'email-perl')">Perl</button><button class="code-tab" onclick="switchTab(this,'email-rust')">Rust</button></div><div id="email-curl" class="code-example active"><div class="code-block"><div class="code-header"><span class="code-lang">cURL</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre>curl "https://ipaddress.to/api/email/[email protected]"</pre></div></div></div><div id="email-js" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">JavaScript</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">const</span> res = <span class="keyword">await</span> fetch(<span class="string">'https://ipaddress.to/api/email/[email protected]'</span>); 641<span class="keyword">const</span> data = <span class="keyword">await</span> res.json(); 642console.log(data);</pre></div></div></div><div id="email-py" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Python</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">import</span> requests 643 644data = requests.get(<span class="string">'https://ipaddress.to/api/email/[email protected]'</span>).json() 645print(data)</pre></div></div></div><div id="email-php" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">PHP</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre>$data = json_decode( 646 file_get_contents(<span class="string">'https://ipaddress.to/api/email/[email protected]'</span>), 647 <span class="keyword">true</span> 648); 649print_r($data);</pre></div></div></div><div id="email-cs" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">C#</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">using</span> var client = <span class="keyword">new</span> HttpClient(); 650<span class="keyword">var</span> json = <span class="keyword">await</span> client.GetStringAsync(<span class="string">"https://ipaddress.to/api/email/[email protected]"</span>); 651Console.WriteLine(json);</pre></div></div></div><div id="email-go" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Go</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre>resp, _ := http.Get(<span class="string">"https://ipaddress.to/api/email/[email protected]"</span>) 652body, _ := io.ReadAll(resp.Body) 653fmt.Println(<span class="keyword">string</span>(body))</pre></div></div></div><div id="email-rb" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Ruby</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">require</span> <span class="string">'net/http'</span> 654<span class="keyword">require</span> <span class="string">'json'</span> 655 656data = JSON.parse(Net::HTTP.get(URI(<span class="string">'https://ipaddress.to/api/email/[email protected]'</span>))) 657puts data</pre></div></div></div><div id="email-java" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Java</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre>HttpClient client = HttpClient.newHttpClient(); 658HttpRequest req = HttpRequest.newBuilder() 659 .uri(URI.create(<span class="string">"https://ipaddress.to/api/email/[email protected]"</span>)).build(); 660String body = client.send(req, BodyHandlers.ofString()).body(); 661System.out.println(body);</pre></div></div></div><div id="email-perl" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Perl</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">
661use</span> LWP::Simple; 662<span class="keyword">use</span> JSON; 663 664<span class="keyword">my</span> $data = decode_json(get(<span class="string">'https://ipaddress.to/api/email/[email protected]'</span>)); 665print $data;</pre></div></div></div><div id="email-rust" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Rust</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">let</span> body = reqwest::get(<span class="string">"https://ipaddress.to/api/email/[email protected]"</span>) 666 .<span class="keyword">await</span>?.text().<span class="keyword">await</span>?; 667println!(<span class="string">"{}"</span>, body);</pre></div></div></div> <div class="u-mt-16 code-block"><div class="code-header"><span class="code-lang">Response (trimmed)</span></div><div class="code-content"><pre>{ 668 <span class="key">"success"</span>: <span class="keyword">true</span>, 669 <span class="key">"query"</span>: <span class="string">"[email protected]"</span>, 670 <span class="key">"email"</span>: <span class="string">"[email protected]"</span>, 671 <span class="key">"domain"</span>: <span class="string">"gmail.com"</span>, 672 <span class="key">"target_type"</span>: <span class="string">"email"</span>, 673 <span class="key">"normalized_email"</span>: <span class="string">"[email protected]"</span>, 674 <span class="key">"apex_domain"</span>: <span class="string">"gmail.com"</span>, 675 <span class="key">"score"</span>: <span class="number">10</span>, 676 <span class="key">"rating"</span>: <span class="string">"high-risk"</span>, 677 <span class="key">"score_breakdown"</span>: { <span class="key">"deliverability"</span>: <span class="number">35</span>, <span class="key">"authentication"</span>: <span class="number">24</span>, <span class="key">"reputation"</span>: <span class="number">20</span> }, 678 <span class="key">"checks"</span>: { 679 <span class="key">"domain_exists"</span>: <span class="keyword">true</span>, 680 <span class="key">"has_mx"</span>: <span class="keyword">true</span>, 681 <span class="key">"null_mx"</span>: <span class="keyword">false</span>, 682 <span class="key">"mx_hosts"</span>: [<span class="string">"gmail-smtp-in.l.google.com"</span>, <span class="string">"alt1.gmail-smtp-in.l.google.com"</span>], 683 <span class="key">"mx_resolves"</span>: <span class="keyword">true</span>, 684 <span class="key">"spf"</span>: <span class="keyword">true</span>, 685 <span class="key">"spf_policy"</span>: <span class="string">"redirect"</span>, 686 <span class="key">"spf_record"</span>: <span class="string">"v=spf1 redirect=_spf.google.com"</span>, 687 <span class="key">"dmarc"</span>: <span class="keyword">true</span>, 688 <span class="key">"dmarc_policy"</span>: <span class="string">"none"</span>, 689 <span class="key">"dmarc_pct"</span>: <span class="number">100</span>, 690 <span class="key">"dmarc_record"</span>: <span class="string">"v=DMARC1; p=none; sp=quarantine; rua=mailto:[email protected]"</span>, 691 <span class="key">"dmarc_inherited"</span>: <span class="keyword">false</span>, 692 <span class="key">"dkim"</span>: <span class="keyword">false</span>, 693 <span class="key">"dkim_selector"</span>: <span class="keyword">null</span>, 694 <span class="key">"resolves"</span>: <span class="keyword">true</span>, 695 <span class="key">"disposable"</span>: <span class="keyword">false</span>, 696 <span class="key">"disposable_via_mx"</span>: <span class="keyword">null</span>, 697 <span class="key">"role_based"</span>: <span class="keyword">true</span>, 698 <span class="key">"free_provider"</span>: <span class="keyword">true</span>, 699 <span class="key">"spam_listed"</span>: <span class="keyword">false</span>, 700 <span class="key">"abused_tld"</span>: <span class="keyword">false</span>, 701 <span class="key">"random_local"</span>: <span class="keyword">false</span>, 702 <span class="key">"subaddress"</span>: <span class="keyword">null</span>, 703 <span class="key">"parked"</span>: <span class="keyword">
703false</span>, 704 <span class="key">"mailbox"</span>: <span class="string">"undeliverable"</span>, 705 <span class="key">"smtp_code"</span>: <span class="number">550</span>, 706 <span class="key">"smtp_message"</span>: <span class="string">"5.1.1 The email account that you tried to reach does not exist."</span>, 707 <span class="key">"smtp_mx"</span>: <span class="string">"gmail-smtp-in.l.google.com"</span> 708 }, 709 <span class="key">"is_disposable"</span>: <span class="keyword">false</span>, 710 <span class="key">"factors"</span>: [ 711 { <span class="key">"name"</span>: <span class="string">"Mailbox Rejected"</span>, <span class="key">"impact"</span>: <span class="string">"negative"</span>, <span class="key">"detail"</span>: <span class="string">"The domain's mail server rejected this address (550 5.1.1 â¦) â the mailbox does not exist"</span> }, 712 { <span class="key">"name"</span>: <span class="string">"Mail Server (MX)"</span>, <span class="key">"impact"</span>: <span class="string">"positive"</span>, <span class="key">"detail"</span>: <span class="string">"Domain has 5 MX records (gmail-smtp-in.l.google.com) â it can receive email"</span> }, 713 { <span class="key">"name"</span>: <span class="string">"Role-based Address"</span>, <span class="key">"impact"</span>: <span class="string">"negative"</span>, <span class="key">"detail"</span>: <span class="string">"\"test@\" is a role/group mailbox, not an individual person"</span> } 714 <span class="comment">// ⦠one entry per signal</span> 715 ], 716 <span class="key">"duration_ms"</span>: <span class="number">168</span> 717}</pre></div></div> </div></div></div> 718 </div> 719 </div> 720 </section> 721 722 <!-- Discovery --> 723 <section class="docs-section" id="discovery"> 724 <h2 class="docs-section-title">Discovery Endpoint</h2> 725 <p class="docs-section-desc"><code>GET https://ipaddress.to/api/</code> returns a machine-readable index of every endpoint â handy for tooling and quick reference from the terminal. (Browsers requesting HTML are redirected to this page instead.)</p> 726 <div class="u-mt-16 code-block"><div class="code-header"><span class="code-lang">GET /api/ (trimmed)</span></div><div class="code-content"><pre>{ 727 <span class="key">"name"</span>: <span class="string">"IPAddress.to API"</span>, 728 <span class="key">"version"</span>: <span class="string">"1.1"</span>, 729 <span class="key">"docs"</span>: <span class="string">"https://ipaddress.to/api/docs/"</span>, 730 <span class="key">"endpoints"</span>: [ 731 { 732 <span class="key">"path"</span>: <span class="string">"/api/lookup/{ip_or_hostname}"</span>, 733 <span class="key">"method"</span>: <span class="string">"GET"</span>, 734 <span class="key">"description"</span>: <span class="string">"Geolocation and network info for an IP address or hostnameâ¦"</span>, 735 <span class="key">"examples"</span>: [<span class="string">"/api/lookup/8.8.8.8"</span>, <span class="string">"/api/lookup/google.com"</span>, <span class="string">"/api/lookup/my"</span>] 736 } 737 <span class="comment">// ⦠one entry per endpoint</span> 738 ] 739}</pre></div></div> </section> 740 741 <!-- Errors & caching --> 742 <section class="docs-section" id="errors"> 743 <h2 class="docs-section-title">Errors & Caching</h2> 744 <p class="docs-section-desc">Failed lookups return a JSON body with <code>success: false</code> and a human-readable <code>error</code> message â always branch on the <code>success</code> field rather than the HTTP status alone.</p> 745 <div class="u-mt-16 code-block"><div class="code-header"><span class="code-lang">Error response</span></div><div class="code-content"><pre>{ 746 <span class="key">"success"</span>: <span class="keyword">false</span>, 747 <span class="key">
747"error"</span>: <span class="string">"Could not resolve hostname: 999.1.1.1"</span>, 748 <span class="key">"query"</span>: <span class="string">"999.1.1.1"</span>, 749 <span class="key">"duration_ms"</span>: <span class="number">53</span> 750}</pre></div></div> <div class="docs-note"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><line x1="12" y1="16" x2="12" y2="12"/><line x1="12" y1="8" x2="12.01" y2="8"/></svg><span>Responses are cached server-side for a short window (about a minute for lookups) and carry matching <code>Cache-Control</code> headers; cached responses include <code>"cached": true</code>. If you need the same answer repeatedly, cache it on your side too.</span></div> 751 </section> 752 753 <!-- Rate limits --> 754 <section class="docs-section" id="rate-limits"> 755 <h2 class="docs-section-title">Rate Limits & Fair Use</h2> 756 <p class="docs-section-desc">There are currently no hard per-key quotas â the API is free for reasonable, fair use. Please be a good citizen: cache results, avoid tight polling loops, and identify your application with a descriptive <code>User-Agent</code> header. Abusive traffic (bulk scraping, sustained high-volume automation) may be throttled or blocked at the edge without notice. Sending an <a href="#auth" data-no-swup>API key</a> with your requests lets us distinguish your traffic from anonymous noise â and is the path to higher limits if quotas are ever introduced. Need sustained high volume? <a href="/contact/">Get in touch</a>.</p> 757 </section> 758 759 <!-- Internal endpoints --> 760 <section class="docs-section" id="internal"> 761 <h2 class="docs-section-title">Internal / Experimental Endpoints</h2> 762 <p class="docs-section-desc">The browser proxy-detection widget on the <a href="/">homepage</a> is powered by three additional endpoints: <code>POST /api/detect/fingerprint</code> (HTTP-layer request fingerprint), <code>GET /api/detect/latency</code> (RTT probe) and <code>POST /api/detect/score</code> (combined proxy/VPN score from client + server signals). They are internal: request/response shapes are tightly coupled to the widget and may change at any time without notice â build against the stable endpoints above instead.</p> 763 </section> 764 765 </div> 766 </div> 767 </div> 768 </div> 769 <footer class="footer footer-v2"> 770 <div class="footer-inner"> 771 <div class="footer-hero"> 772 <div class="footer-hero-copy"> 773 <div class="footer-logo"> 774 <svg class="footer-logo-img" width="24" height="24" viewBox="-37 0 512 512" role="img" aria-label="IPAddress.to logo"><path fill="#bddbff" d="M438.86 64c0-35.35-98.24-64-219.43-64S0 28.65 0 64s98.24 64 219.43 64 219.43-28.65 219.43-64z"/><path fill="#9bc9ff" d="M219.43 256c121.14 0 219.43-28.62 219.43-64V64c0 35.38-98.29 64-219.43 64S0 99.38 0 64v128c0 35.38 98.29 64 219.43 64z"/><path fill="#57a4ff" d="M219.43 384c121.14 0 219.43-28.62 219.43-64V192c0 35.38-98.29 64-219.43 64S0 227.38 0 192v128c0 35.38 98.29 64 219.43 64z"/><path fill="#2488ff" d="M438.86 320c0 35.38-98.29 64-219.43 64S0 355.38 0 320v128c0 35.38 98.29 64 219.43 64s219.43-28.62 219.43-64V320z"/></svg> 775 <span>IPAddress<span class="footer-logo-suffix">.to</span></span> 776 </div> 777 <p class="footer-statement">Network intelligence, <em>answered in-house.</em></p> 778 <p class="footer-tagline">IP, DNS, WHOIS, email and fraud-score tools with a JSON endpoint behind every one. Our own data, no third-party lookups, no signup, no per-query bill.</p> 779 <div class="footer-actions"> 780 <a href="/api/docs/" class="btn btn-accent" data-nav>API documentation</a> 781 <a href="/account/" class="btn btn-secondary" data-nav>Get an API key</a> 782 </div> 783 </div> 784 <div class="footer-live"> 785 <a href="/status/" class="footer-status is-degraded" data-nav data-footer-status> 786 <i aria-hidden="true"></i>
787 <span data-footer-status-label>Degraded performance</span> 788 <small>Status →</small> 789 </a> 790 <div class="footer-metrics"> 791 <div><b data-stat="per_min">â</b><span>requests / min</span></div> 792 <div><b data-stat="req_24h">173,589</b><span>requests · 24 h</span></div> 793 <div><b data-stat="feeds">96</b><span>threat feeds</span></div> 794 </div> 795 <div class="footer-extensions"> 796 <a href="https://chromewebstore.google.com/detail/ipaddressto-lookup/jblhckhmjccldbdocmfnhpiggcacjppf" class="footer-ext-card" target="_blank" rel="noopener" aria-label="Install Chrome extension"> 797 <img src="/svg/chrome.svg?v2" alt="" width="20" height="20" loading="lazy" decoding="async"> 798 <span class="footer-ext-text"><span class="footer-ext-label">Get the</span><span class="footer-ext-name">Chrome extension</span></span> 799 </a> 800 <a href="https://addons.mozilla.org/en-US/firefox/addon/what-is-my-ip-tool/" class="footer-ext-card" target="_blank" rel="noopener" aria-label="Install Firefox addon"> 801 <img src="/svg/firefox.svg" alt="" width="20" height="20" loading="lazy" decoding="async"> 802 <span class="footer-ext-text"><span class="footer-ext-label">Get the</span><span class="footer-ext-name">Firefox addon</span></span> 803 </a> 804 </div> 805 </div> 806 </div> 807 808 <div class="footer-cols"> 809 <div class="footer-col"> 810 <h3 class="footer-col-title">Tools</h3> 811 <a href="/">My IP</a> 812 <a href="/lookup/">Lookup</a> 813 <a href="/dns/">DNS</a> 814 <a href="/hostname/">Hostname</a> 815 <a href="/email/">Email Check</a> 816 <a href="/whois/">WHOIS</a> 817 <a href="/resolve/">Resolve</a> 818 <a href="/ip/">IP Details</a> 819 <a href="/score/">Fraud Score</a> 820 </div> 821 <div class="footer-col"> 822 <h3 class="footer-col-title">Developers</h3> 823 <a href="/api/docs/">API Docs</a> 824 <a href="/account/">Account & API Keys</a> 825 <a href="/#playground">Playground</a> 826 <a href="/status/">System Status</a> 827 <a href="/#approach">How the score works</a> 828 </div> 829 <div class="footer-col"> 830 <h3 class="footer-col-title">Company</h3> 831 <a href="/blog/">Blog</a> 832 <a href="/status/">Status</a> 833 <a href="/contact/">Contact</a> 834 <a href="/terms/">Terms of Service</a> 835 <a href="/privacy/">Privacy Policy</a> 836 </div> 837 <div class="footer-col"> 838 <h3 class="footer-col-title">More Tools</h3> 839 <a href="https://onlinemicrophonetest.com/" target="_blank" rel="noopener">Online Microphone Test</a> 840 <a href="https://onlinewebcamtest.com/" target="_blank" rel="noopener">Online Webcam Test</a> 841 </div> 842 </div> 843 844 <div class="footer-bottom"> 845 <span class="footer-copy">© 2026 IPAddress.to. All rights reserved.</span> 846 <span class="footer-fine">Built and hosted in-house · Own geolocation, network and reputation data · <b data-stat="feeds">96</b> threat-intel feeds</span> 847 </div> 848 </div> 849 </footer> 850 </main> 851
851<script src="/js/Swup.umd.js" data-swup-ignore-script></script>
851 852
852<script data-swup-ignore-script>window.__detectSrc="\/js\/detect.min.js?v=1.43.1";</script>
852 853
853<script src="/js/app.min.js?v=1.43.1" data-swup-ignore-script></script>
vendor: 1 bytes, line 853
853
854<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"e3a8ced6585f46789d4a8c9e02dcc805","r":1,"spa":2}' crossorigin="anonymous"></script>
854 855</body> 856</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.