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.css?v=1.40.0"> 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"><img src="/images/logo.svg" alt="IPAddress.to logo" width="22" height="22"></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"><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"><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="false">
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">"Netflix Streaming Services Inc."</span>, 333 <span class="key">"domain"</span>: <span class="string">"netflix.com"</span>, 334 <span class="key">"type"</span>: <span class="string">"business"</span>, 335 <span class="key">"network"</span>: <span class="string">"23.246.0.0/18"</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">"vpn_provider"</span>: <span class="keyword">null</span>, 343 <span class="key">"duration_ms"</span>: <span class="number">12</span> 344}</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>rdap</code> or <code>ripestat</code> when it comes from the registry, or <code>asn</code> when we only have the network operator’s name to go on. <code>asn.org</code> always names the operator itself.</p> 345 </div></div></div> 346 </div> 347 </div> 348 </section> 349 350 <!-- WHOIS --> 351 <section class="docs-section" id="whois"> 352 <h2 class="docs-section-title">WHOIS</h2> 353 <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> 354 <div class="endpoints-grid"> 355 <div class="endpoint open"> 356 <div class="endpoint-header" onclick="toggleEndpoint(this)" role="button" tabindex="0" aria-expanded="false"> 357 <span class="method method-get">GET</span> 358 <span class="endpoint-path">/api/whois/<span class="param">{ip_or_domain}</span></span> 359 <span class="endpoint-desc">WHOIS registration data</span> 360 <span class="endpoint-toggle">
360<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> 361 <div class="endpoint-body"><div class="endpoint-body-inner"><div class="endpoint-body-content"> 362 <div class="params-grid"> 363 <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> 364 </div> 365 <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>); 366<span class="keyword">const</span> data = <span class="keyword">await</span> res.json(); 367console.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 368 369data = requests.get(<span class="string">'https://ipaddress.to/api/whois/google.com'</span>).json() 370print(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( 371 file_get_contents(<span class="string">'https://ipaddress.to/api/whois/google.com'</span>), 372 <span class="keyword">true</span> 373); 374print_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(); 375<span class="keyword">var</span> json = <span class="keyword">await</span> client.GetStringAsync(<span class="string">"https://ipaddress.to/api/whois/google.com"</span>); 376Console.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>) 377body, _ := io.ReadAll(resp.Body) 378fmt.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> 379<span class="keyword">require</span> <span class="string">'json'</span> 380 381data = JSON.parse(Net::HTTP.get(URI(<span class="string">'https://ipaddress.to/api/whois/google.com'</span>))) 382puts 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(); 383HttpRequest req = HttpRequest.newBuilder() 384 .uri(URI.create(<span class="string">"https://ipaddress.to/api/whois/google.com"</span>)).build(); 385String body = client.send(req, BodyHandlers.ofString()).body(); 386System.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">
386use</span> LWP::Simple; 387<span class="keyword">use</span> JSON; 388 389<span class="keyword">my</span> $data = decode_json(get(<span class="string">'https://ipaddress.to/api/whois/google.com'</span>)); 390print $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>) 391 .<span class="keyword">await</span>?.text().<span class="keyword">await</span>?; 392println!(<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>{ 393 <span class="key">"success"</span>: <span class="keyword">true</span>, 394 <span class="key">"query"</span>: <span class="string">"google.com"</span>, 395 <span class="key">"type"</span>: <span class="string">"domain"</span>, 396 <span class="key">"found"</span>: <span class="keyword">true</span>, 397 <span class="key">"parsed"</span>: { 398 <span class="key">"domain_name"</span>: <span class="string">"GOOGLE.COM"</span>, 399 <span class="key">"registrar"</span>: <span class="string">"MarkMonitor Inc."</span>, 400 <span class="key">"registrar_url"</span>: <span class="string">"https://rdap.markmonitor.com/rdap/domain/GOOGLE.COM"</span>, 401 <span class="key">"registrar_iana_id"</span>: <span class="string">"292"</span>, 402 <span class="key">"creation_date"</span>: <span class="string">"1997-09-15T04:00:00Z"</span>, 403 <span class="key">"expiry_date"</span>: <span class="string">"2028-09-14T04:00:00Z"</span>, 404 <span class="key">"updated_date"</span>: <span class="string">"2026-07-01T02:29:57Z"</span>, 405 <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> 406 <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> 407 <span class="key">"dnssec"</span>: <span class="string">"unsigned"</span>, 408 <span class="key">"abuse_email"</span>: <span class="string">"[email protected]"</span>, 409 <span class="key">"abuse_phone"</span>: <span class="string">"tel:+1.2086851750"</span> 410 }, 411 <span class="key">"raw"</span>: <span class="string">"⦠full registry response as a string â¦"</span>, 412 <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>: [] }, 413 <span class="key">"source"</span>: <span class="string">"registry"</span>, 414 <span class="key">"duration_ms"</span>: <span class="number">342</span> 415}</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> 416 </div></div></div> 417 </div> 418 </div> 419 </section> 420 421 <!-- Resolve --> 422 <section class="docs-section" id="resolve"> 423 <h2 class="docs-section-title">Hostname Resolution</h2> 424 <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> 425 <div class="endpoints-grid"> 426 <div class="endpoint open"> 427 <div class="endpoint-header" onclick="toggleEndpoint(this)" role="button" tabindex="0" aria-expanded="false">
428 <span class="method method-get">GET</span> 429 <span class="endpoint-path">/api/resolve/<span class="param">{hostname}</span></span> 430 <span class="endpoint-desc">A / AAAA / CNAME + reverse DNS</span> 431 <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> 432 <div class="endpoint-body"><div class="endpoint-body-inner"><div class="endpoint-body-content"> 433 <div class="params-grid"> 434 <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> 435 </div> 436 <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>); 437<span class="keyword">const</span> data = <span class="keyword">await</span> res.json(); 438console.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 439 440data = requests.get(<span class="string">'https://ipaddress.to/api/resolve/github.com'</span>).json() 441print(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( 442 file_get_contents(<span class="string">'https://ipaddress.to/api/resolve/github.com'</span>), 443 <span class="keyword">true</span> 444); 445print_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(); 446<span class="keyword">var</span> json = <span class="keyword">await</span> client.GetStringAsync(<span class="string">"https://ipaddress.to/api/resolve/github.com"</span>); 447Console.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>) 448body, _ := io.ReadAll(resp.Body) 449fmt.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> 450<span class="keyword">require</span> <span class="string">'json'</span> 451 452data = JSON.parse(Net::HTTP.get(URI(<span class="string">'https://ipaddress.to/api/resolve/github.com'</span>))) 453puts 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(); 454HttpRequest req = HttpRequest.newBuilder() 455 .uri(URI.create(<span class="string">"https://ipaddress.to/api/resolve/github.com"</span>)).build(); 456String body = client.send(req, BodyHandlers.ofString()).body(); 457System.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">
457use</span> LWP::Simple; 458<span class="keyword">use</span> JSON; 459 460<span class="keyword">my</span> $data = decode_json(get(<span class="string">'https://ipaddress.to/api/resolve/github.com'</span>)); 461print $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>) 462 .<span class="keyword">await</span>?.text().<span class="keyword">await</span>?; 463println!(<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>{ 464 <span class="key">"success"</span>: <span class="keyword">true</span>, 465 <span class="key">"hostname"</span>: <span class="string">"github.com"</span>, 466 <span class="key">"a"</span>: [<span class="string">"140.82.113.4"</span>], 467 <span class="key">"aaaa"</span>: [], 468 <span class="key">"cname"</span>: [], 469 <span class="key">"reverse"</span>: { 470 <span class="key">"140.82.113.4"</span>: <span class="string">"lb-140-82-113-4-iad.github.com"</span> 471 }, 472 <span class="key">"total_ips"</span>: <span class="number">1</span>, 473 <span class="key">"has_ipv4"</span>: <span class="keyword">true</span>, 474 <span class="key">"has_ipv6"</span>: <span class="keyword">false</span>, 475 <span class="key">"duration_ms"</span>: <span class="number">87</span> 476}</pre></div></div> </div></div></div> 477 </div> 478 </div> 479 </section> 480 481 <!-- DNS propagation --> 482 <section class="docs-section" id="dns"> 483 <h2 class="docs-section-title">DNS Propagation</h2> 484 <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> 485 <div class="endpoints-grid"> 486 <div class="endpoint open"> 487 <div class="endpoint-header" onclick="toggleEndpoint(this)" role="button" tabindex="0" aria-expanded="false"> 488 <span class="method method-get">GET</span> 489 <span class="endpoint-path">/api/dns/<span class="param">{type}</span>/<span class="param">{domain}</span></span> 490 <span class="endpoint-desc">Propagation check across 32 global servers (NDJSON stream)</span> 491 <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> 492 <div class="endpoint-body"><div class="endpoint-body-inner"><div class="endpoint-body-content"> 493 <div class="params-grid"> 494 <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> 495 <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> 496 <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> 497 </div> 498 <div class="u-mt-16 code-tabs"> 499 <button class="code-tab active" onclick="switchTab(this,'dns-curl')">cURL</button> 500 <button class="code-tab" onclick="switchTab(this,'dns-js')">JavaScript</button> 501 <button class="code-tab" onclick="switchTab(this,'dns-py')">Python</button> 502 </div> 503 <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> 504 <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>); 505<span class="keyword">const</span> reader = res.body.getReader(); 506<span class="comment">// read the stream â each line is one JSON object</span></pre></div></div></div> 507 <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">
507import</span> requests, json 508 509r = requests.get(<span class="string">'https://ipaddress.to/api/dns/a/example.com'</span>, stream=<span class="keyword">True</span>) 510<span class="keyword">for</span> line <span class="keyword">in</span> r.iter_lines(): 511 print(json.loads(line))</pre></div></div></div> 512 <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>} 513{<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>}]}} 514<span class="comment">// ⦠one "result" line per server (32 total), in server-list order â¦</span> 515{<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> 516 <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>{ 517 <span class="key">"success"</span>: <span class="keyword">true</span>, 518 <span class="key">"domain"</span>: <span class="string">"example.com"</span>, 519 <span class="key">"type"</span>: <span class="string">"A"</span>, 520 <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> }, 521 <span class="key">"result"</span>: { 522 <span class="key">"status"</span>: <span class="string">"ok"</span>, 523 <span class="key">"value"</span>: <span class="string">"104.20.23.154"</span>, 524 <span class="key">"ttl"</span>: <span class="number">300</span>, 525 <span class="key">"elapsed"</span>: <span class="number">41</span>, 526 <span class="key">"raw"</span>: [ 527 { <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> }, 528 { <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> } 529 ] 530 } 531}</pre></div></div> </div></div></div> 532 </div> 533 </div> 534 </section> 535 536 <!-- Score --> 537 <section class="docs-section" id="score"> 538 <h2 class="docs-section-title">IP Fraud Score</h2> 539 <p class="docs-section-desc">
539A 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> 540 <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> 541 <div class="endpoints-grid"> 542 <div class="endpoint open"> 543 <div class="endpoint-header" onclick="toggleEndpoint(this)" role="button" tabindex="0" aria-expanded="false"> 544 <span class="method method-get">GET</span> 545 <span class="endpoint-path">/api/score/<span class="param">{ip_or_hostname}</span></span> 546 <span class="endpoint-desc">0â100 fraud / abuse risk score</span> 547 <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> 548 <div class="endpoint-body"><div class="endpoint-body-inner"><div class="endpoint-body-content"> 549 <div class="params-grid"> 550 <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> 551 </div> 552 <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>); 553<span class="keyword">const</span> data = <span class="keyword">await</span> res.json(); 554console.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">
554import</span> requests 555 556data = requests.get(<span class="string">'https://ipaddress.to/api/score/8.8.8.8'</span>).json() 557print(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( 558 file_get_contents(<span class="string">'https://ipaddress.to/api/score/8.8.8.8'</span>), 559 <span class="keyword">true</span> 560); 561print_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(); 562<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>); 563Console.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>) 564body, _ := io.ReadAll(resp.Body) 565fmt.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> 566<span class="keyword">require</span> <span class="string">'json'</span> 567 568data = JSON.parse(Net::HTTP.get(URI(<span class="string">'https://ipaddress.to/api/score/8.8.8.8'</span>))) 569puts 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(); 570HttpRequest req = HttpRequest.newBuilder() 571 .uri(URI.create(<span class="string">"https://ipaddress.to/api/score/8.8.8.8"</span>)).build(); 572String body = client.send(req, BodyHandlers.ofString()).body(); 573System.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">
573use</span> LWP::Simple; 574<span class="keyword">use</span> JSON; 575 576<span class="keyword">my</span> $data = decode_json(get(<span class="string">'https://ipaddress.to/api/score/8.8.8.8'</span>)); 577print $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>) 578 .<span class="keyword">await</span>?.text().<span class="keyword">await</span>?; 579println!(<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>{ 580 <span class="key">"success"</span>: <span class="keyword">true</span>, 581 <span class="key">"ip"</span>: <span class="string">"8.8.8.8"</span>, 582 <span class="key">"target_type"</span>: <span class="string">"ip"</span>, 583 <span class="key">"score"</span>: <span class="number">3</span>, 584 <span class="key">"risk"</span>: <span class="string">"low"</span>, 585 <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> }, 586 <span class="key">"vpn_provider"</span>: <span class="keyword">null</span>, 587 <span class="key">"rdns"</span>: <span class="string">"dns.google"</span>, 588 <span class="key">"ip_version"</span>: <span class="number">4</span>, 589 <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">
589"Mountain View"</span> }, 590 <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> }, 591 <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> }, 592 <span class="key">"checks"</span>: { 593 <span class="key">"trusted_org"</span>: <span class="keyword">true</span>, 594 <span class="key">"has_rdns"</span>: <span class="keyword">true</span>, 595 <span class="key">"is_bot"</span>: <span class="keyword">false</span>, 596 <span class="key">"vpn_detected"</span>: <span class="keyword">false</span>, 597 <span class="key">"tor_exit"</span>: <span class="keyword">false</span>, 598 <span class="key">"commercial_proxy"</span>: <span class="keyword">false</span>, 599 <span class="key">"blocklist_listed"</span>: <span class="keyword">false</span>, 600 <span class="key">"blocklist_count"</span>: <span class="number">0</span>, 601 <span class="key">"hosting_asn"</span>: <span class="keyword">true</span>, 602 <span class="key">"asn_type"</span>: <span class="string">"hosting"</span>, 603 <span class="key">"high_risk_country"</span>: <span class="keyword">false</span> 604 <span class="comment">// ⦠24 checks in total</span> 605 }, 606 <span class="key">"factors"</span>: [ 607 { <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> }, 608 { <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> } 609 ], 610 <span class="key">"duration_ms"</span>: <span class="number">60</span> 611}</pre></div></div> </div></div></div> 612 </div> 613 </div> 614 </section> 615 616 <!-- Email --> 617 <section class="docs-section" id="email"> 618 <h2 class="docs-section-title">Email Check</h2> 619 <p class="docs-section-desc">A 0â100 trust score for any email address or domain: MX records, SPF and DMARC policies, disposable/throwaway detection against a database of 200k+ burner domains, role-based mailbox detection and free-provider classification. Works with a bare domain too â omit the local part to score the domain itself.</p> 620 <div class="endpoints-grid"> 621 <div class="endpoint open"> 622 <div class="endpoint-header" onclick="toggleEndpoint(this)" role="button" tabindex="0" aria-expanded="false"> 623 <span class="method method-get">GET</span> 624 <span class="endpoint-path">/api/email/<span class="param">{email_or_domain}</span></span> 625 <span class="endpoint-desc">MX / SPF / DMARC / disposable score</span> 626 <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> 627 <div class="endpoint-body"><div class="endpoint-body-inner"><div class="endpoint-body-content"> 628 <div class="params-grid"> 629 <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>
629). Omit entirely to get a random sample of known disposable domains.</div></div> 630 </div> 631 <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>); 632<span class="keyword">const</span> data = <span class="keyword">await</span> res.json(); 633console.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 634 635data = requests.get(<span class="string">'https://ipaddress.to/api/email/[email protected]'</span>).json() 636print(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( 637 file_get_contents(<span class="string">'https://ipaddress.to/api/email/[email protected]'</span>), 638 <span class="keyword">true</span> 639); 640print_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(); 641<span class="keyword">var</span> json = <span class="keyword">await</span> client.GetStringAsync(<span class="string">"https://ipaddress.to/api/email/[email protected]"</span>); 642Console.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>) 643body, _ := io.ReadAll(resp.Body) 644fmt.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> 645<span class="keyword">require</span> <span class="string">'json'</span> 646 647data = JSON.parse(Net::HTTP.get(URI(<span class="string">'https://ipaddress.to/api/email/[email protected]'</span>))) 648puts 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(); 649HttpRequest req = HttpRequest.newBuilder() 650 .uri(URI.create(<span class="string">"https://ipaddress.to/api/email/[email protected]"</span>)).build(); 651String body = client.send(req, BodyHandlers.ofString()).body(); 652System.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">
652use</span> LWP::Simple; 653<span class="keyword">use</span> JSON; 654 655<span class="keyword">my</span> $data = decode_json(get(<span class="string">'https://ipaddress.to/api/email/[email protected]'</span>)); 656print $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>) 657 .<span class="keyword">await</span>?.text().<span class="keyword">await</span>?; 658println!(<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>{ 659 <span class="key">"success"</span>: <span class="keyword">true</span>, 660 <span class="key">"query"</span>: <span class="string">"[email protected]"</span>, 661 <span class="key">"email"</span>: <span class="string">"[email protected]"</span>, 662 <span class="key">"domain"</span>: <span class="string">"gmail.com"</span>, 663 <span class="key">"target_type"</span>: <span class="string">"email"</span>, 664 <span class="key">"score"</span>: <span class="number">90</span>, 665 <span class="key">"rating"</span>: <span class="string">"trusted"</span>, 666 <span class="key">"score_breakdown"</span>: { <span class="key">"deliverability"</span>: <span class="number">40</span>, <span class="key">"authentication"</span>: <span class="number">40</span>, <span class="key">"reputation"</span>: <span class="number">20</span> }, 667 <span class="key">"checks"</span>: { 668 <span class="key">"has_mx"</span>: <span class="keyword">true</span>, 669 <span class="key">"spf"</span>: <span class="keyword">true</span>, 670 <span class="key">"dmarc"</span>: <span class="keyword">true</span>, 671 <span class="key">"resolves"</span>: <span class="keyword">true</span>, 672 <span class="key">"disposable"</span>: <span class="keyword">false</span>, 673 <span class="key">"role_based"</span>: <span class="keyword">true</span>, 674 <span class="key">"free_provider"</span>: <span class="keyword">true</span> 675 }, 676 <span class="key">"is_disposable"</span>: <span class="keyword">false</span>, 677 <span class="key">"factors"</span>: [ 678 { <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 â it can receive email"</span> }, 679 { <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> } 680 <span class="comment">// ⦠one entry per signal</span> 681 ], 682 <span class="key">"duration_ms"</span>: <span class="number">168</span> 683}</pre></div></div> </div></div></div> 684 </div> 685 </div> 686 </section> 687 688 <!-- Discovery --> 689 <section class="docs-section" id="discovery"> 690 <h2 class="docs-section-title">Discovery Endpoint</h2> 691 <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> 692 <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>{ 693 <span class="key">"name"</span>: <span class="string">"IPAddress.to API"</span>, 694 <span class="key">"version"</span>: <span class="string">"1.1"</span>, 695 <span class="key">"docs"</span>: <span class="string">"https://ipaddress.to/api/docs/"</span>, 696 <span class="key">"endpoints"</span>: [ 697 {
698 <span class="key">"path"</span>: <span class="string">"/api/lookup/{ip_or_hostname}"</span>, 699 <span class="key">"method"</span>: <span class="string">"GET"</span>, 700 <span class="key">"description"</span>: <span class="string">"Geolocation and network info for an IP address or hostnameâ¦"</span>, 701 <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>] 702 } 703 <span class="comment">// ⦠one entry per endpoint</span> 704 ] 705}</pre></div></div> </section> 706 707 <!-- Errors & caching --> 708 <section class="docs-section" id="errors"> 709 <h2 class="docs-section-title">Errors & Caching</h2> 710 <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> 711 <div class="u-mt-16 code-block"><div class="code-header"><span class="code-lang">Error response</span></div><div class="code-content"><pre>{ 712 <span class="key">"success"</span>: <span class="keyword">false</span>, 713 <span class="key">"error"</span>: <span class="string">"Invalid IP or unresolvable hostname"</span>, 714 <span class="key">"query"</span>: <span class="string">"999.1.1.1"</span> 715}</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> 716 </section> 717 718 <!-- Rate limits --> 719 <section class="docs-section" id="rate-limits"> 720 <h2 class="docs-section-title">Rate Limits & Fair Use</h2> 721 <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> 722 </section> 723 724 <!-- Internal endpoints --> 725 <section class="docs-section" id="internal"> 726 <h2 class="docs-section-title">Internal / Experimental Endpoints</h2> 727 <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> 728 </section> 729 730 </div> 731 </div> 732 </div> 733 </div> 734 <footer class="footer footer-v2"> 735 <div class="footer-inner"> 736 <div class="footer-hero"> 737 <div class="footer-hero-copy"> 738 <div class="footer-logo"> 739 <img src="/images/logo.svg" class="footer-logo-img" alt="IPAddress.to logo" width="24" height="24">
740 <span>IPAddress<span class="footer-logo-suffix">.to</span></span> 741 </div> 742 <p class="footer-statement">Network intelligence, <em>answered in-house.</em></p> 743 <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> 744 <div class="footer-actions"> 745 <a href="/api/docs/" class="btn btn-accent" data-nav>API documentation</a> 746 <a href="/account/" class="btn btn-secondary" data-nav>Get an API key</a> 747 </div> 748 </div> 749 <div class="footer-live"> 750 <a href="/status/" class="footer-status is-operational" data-nav data-footer-status> 751 <i aria-hidden="true"></i> 752 <span data-footer-status-label>All systems operational</span> 753 <small>Status →</small> 754 </a> 755 <div class="footer-metrics"> 756 <div><b data-stat="per_min">â</b><span>requests / min</span></div> 757 <div><b data-stat="req_24h">â</b><span>requests · 24 h</span></div> 758 <div><b data-stat="feeds">96</b><span>threat feeds</span></div> 759 </div> 760 <div class="footer-extensions"> 761 <a href="https://chromewebstore.google.com/detail/ipaddressto-lookup/jblhckhmjccldbdocmfnhpiggcacjppf" class="footer-ext-card" target="_blank" rel="noopener" aria-label="Install Chrome extension"> 762 <img src="/svg/chrome.svg?v2" alt="" width="20" height="20" loading="lazy" decoding="async"> 763 <span class="footer-ext-text"><span class="footer-ext-label">Get the</span><span class="footer-ext-name">Chrome extension</span></span> 764 </a> 765 <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"> 766 <img src="/svg/firefox.svg" alt="" width="20" height="20" loading="lazy" decoding="async"> 767 <span class="footer-ext-text"><span class="footer-ext-label">Get the</span><span class="footer-ext-name">Firefox addon</span></span> 768 </a> 769 </div> 770 </div> 771 </div> 772 773 <div class="footer-cols"> 774 <div class="footer-col"> 775 <h3 class="footer-col-title">Tools</h3> 776 <a href="/">My IP</a> 777 <a href="/lookup/">Lookup</a> 778 <a href="/dns/">DNS</a> 779 <a href="/hostname/">Hostname</a> 780 <a href="/email/">Email Check</a> 781 <a href="/whois/">WHOIS</a> 782 <a href="/resolve/">Resolve</a> 783 <a href="/ip/">IP Details</a> 784 <a href="/score/">Fraud Score</a> 785 </div> 786 <div class="footer-col"> 787 <h3 class="footer-col-title">Developers</h3> 788 <a href="/api/docs/">API Docs</a> 789 <a href="/account/">Account & API Keys</a> 790 <a href="/#playground">Playground</a> 791 <a href="/status/">System Status</a> 792 <a href="/#approach">How the score works</a> 793 </div> 794 <div class="footer-col"> 795 <h3 class="footer-col-title">Company</h3> 796 <a href="/blog/">Blog</a> 797 <a href="/status/">Status</a> 798 <a href="/contact/">Contact</a> 799 <a href="/terms/">Terms of Service</a> 800 <a href="/privacy/">Privacy Policy</a> 801 </div> 802 <div class="footer-col"> 803 <h3 class="footer-col-title">More Tools</h3> 804 <a href="https://onlinemicrophonetest.com/" target="_blank" rel="noopener">Online Microphone Test</a> 805 <a href="https://onlinewebcamtest.com/" target="_blank" rel="noopener">Online Webcam Test</a> 806 </div> 807 </div> 808 809 <div class="footer-bottom">
810 <span class="footer-copy">© 2026 IPAddress.to. All rights reserved.</span> 811 <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> 812 </div> 813 </div> 814 </footer> 815 </main> 816
816<script src="/js/Swup.umd.js" data-swup-ignore-script></script>
816 817
817<script src="/js/app.js?v=1.40.0" data-swup-ignore-script></script>
vendor: 1 bytes, line 817
817
818<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>
818 819</body> 820</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.