PageSourceSearch

https://ipaddress.to/api/docs/

html ipaddress.to collected 2026-09-24 14:27:51 UTC 99,539 bytes, 820 lines download raw bytes

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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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_&lt;40 hex chars&gt;</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 &amp; 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&rsquo;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&rsquo;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 &amp; 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 &amp; 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 &rarr;</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 &amp; 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">&copy; 2026 IPAddress.to. All rights reserved.</span>
811                    <span class="footer-fine">Built and hosted in-house &middot; Own geolocation, network and reputation data &middot; <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.