PageSourceSearch

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

html ipaddress.to collected 2026-10-02 01:09:03 UTC 106,756 bytes, 856 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.min.css?v=1.43.1">
40
41        
41<script type="application/ld+json">{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://ipaddress.to/#organization","name":"IPAddress.to","url":"https://ipaddress.to/","logo":"https://ipaddress.to/favicon/web-app-manifest-512x512.png"},{"@type":"WebSite","@id":"https://ipaddress.to/#website","url":"https://ipaddress.to/","name":"IPAddress.to","description":"Free IP address lookup, geolocation, DNS, WHOIS and network tools.","publisher":{"@id":"https://ipaddress.to/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://ipaddress.to/lookup/{search_term_string}"},"query-input":"required name=search_term_string"}},{"@type":"WebAPI","@id":"https://ipaddress.to/api/docs/#api","name":"IPAddress.to API","description":"Free REST API for IP geolocation, fraud scoring, WHOIS, DNS propagation, hostname resolution and email verification.","documentation":"https://ipaddress.to/api/docs/","termsOfService":"https://ipaddress.to/api/docs/#rate-limits","provider":{"@id":"https://ipaddress.to/#organization"},"offers":{"@type":"Offer","price":"0","priceCurrency":"USD"}},{"@type":"TechArticle","@id":"https://ipaddress.to/api/docs/#article","headline":"IPAddress.to API Documentation","description":"Complete reference for the free IPAddress.to REST API: IP geolocation, fraud score, WHOIS, DNS propagation, hostname resolution and email verification endpoints.","url":"https://ipaddress.to/api/docs/","author":{"@id":"https://ipaddress.to/#organization"},"publisher":{"@id":"https://ipaddress.to/#organization"},"proficiencyLevel":"Beginner","about":{"@id":"https://ipaddress.to/api/docs/#api"}},{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://ipaddress.to/"},{"@type":"ListItem","position":2,"name":"API Documentation","item":"https://ipaddress.to/api/docs/"}]}]}</script>
41
42</head>
43<body>
44            <a href="#swup" class="skip-link">Skip to content</a>
45
46    <div class="toast" id="toast" role="status" aria-live="polite">
47        <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="20 6 9 17 4 12"/></svg>
48        <span id="toastMsg">Copied to clipboard</span>
49    </div>
50
51        <header class="header">
52        <div class="header-bar">
53            <a href="/" class="logo">
54                <div class="logo-mark"><svg class="logo-img" width="22" height="22" viewBox="-37 0 512 512" role="img" aria-label="IPAddress.to logo"><path fill="#bddbff" d="M438.86 64c0-35.35-98.24-64-219.43-64S0 28.65 0 64s98.24 64 219.43 64 219.43-28.65 219.43-64z"/><path fill="#9bc9ff" d="M219.43 256c121.14 0 219.43-28.62 219.43-64V64c0 35.38-98.29 64-219.43 64S0 99.38 0 64v128c0 35.38 98.29 64 219.43 64z"/><path fill="#57a4ff" d="M219.43 384c121.14 0 219.43-28.62 219.43-64V192c0 35.38-98.29 64-219.43 64S0 227.38 0 192v128c0 35.38 98.29 64 219.43 64z"/><path fill="#2488ff" d="M438.86 320c0 35.38-98.29 64-219.43 64S0 355.38 0 320v128c0 35.38 98.29 64 219.43 64s219.43-28.62 219.43-64V320z"/></svg></div>
55                <span class="logo-text">IPAddress<span class="logo-suffix">.to</span></span>
56            </a>
57            <div class="header-right">
58                <nav class="header-nav" aria-label="Primary">
59                    <a href="/" class="header-link" data-nav><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><line x1="2" y1="12" x2="22" y2="12"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg>My IP</a>
60                    <a href="/lookup/" class="header-link" data-nav><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>Lookup</a>
61                    <a href="/dns/" class="header-link" data-nav><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="2" width="20" height="8" rx="2"/><rect x="2" y="14" width="20" height="8" rx="2"/><line x1="6" y1="6" x2="6.01" y2="6"/><line x1="6" y1="18" x2="6.01" y2="18"/></svg>DNS</a>
62                    <a href="/email/" class="header-link" data-nav><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="4" width="20" height="16" rx="2"/><path d="m22 7-10 5L2 7"/></svg>Email</a>
63                    <a href="/whois/" class="header-link" data-nav><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/></svg>WHOIS</a>
64                    <a href="/score/" class="header-link" data-nav><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/></svg>Score</a>
65                    <a href="/api/docs/" class="header-link" data-nav><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="16 18 22 12 16 6"/><polyline points="8 6 2 12 8 18"/></svg>API</a>
66                </nav>
67                <div class="header-auth">
68                    <button type="button" class="header-auth-btn auth-when-out" data-auth-open="login" aria-label="Log in"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4"/><polyline points="10 17 15 12 10 7"/><line x1="15" y1="12" x2="3" y2="12"/></svg><span>Log in</span></button>
69                    <button type="button" class="header-auth-btn header-auth-primary auth-when-out" data-auth-open="signup" aria-label="Sign up"><span>Sign up</span></button>
70                    <a href="/account/" class="header-auth-btn header-auth-user auth-when-in" data-nav title="Account &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="true">
268                                        <span class="method method-get">GET</span>
269                                        <span class="endpoint-path">/api/lookup/<span class="param">{ip_or_hostname}</span></span>
270                                        <span class="endpoint-desc">Geolocation, ASN &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">"Google LLC"</span>,
333    <span class="key">"domain"</span>: <span class="string">"google.com"</span>,
334    <span class="key">"type"</span>: <span class="string">"hosting"</span>,
335    <span class="key">"network"</span>: <span class="string">"8.8.8.0/24"</span>,
336    <span class="key">"source"</span>: <span class="string">"registry"</span>
337  },
338  <span class="key">"is_vpn"</span>: <span class="keyword">false</span>,
339  <span class="key">"is_proxy"</span>: <span class="keyword">false</span>,
340  <span class="key">"is_tor"</span>: <span class="keyword">false</span>,
341  <span class="key">"is_hosting"</span>: <span class="keyword">false</span>,
342  <span class="key">"is_private"</span>: <span class="keyword">false</span>,
343  <span class="key">"is_cgnat"</span>: <span class="keyword">false</span>,
344  <span class="key">"vpn_provider"</span>: <span class="keyword">null</span>,
345  <span class="key">"duration_ms"</span>: <span class="number">12</span>
346}</pre></div></div>                                        <p class="u-note endpoint-note"><code>company</code> is the organisation the address block is registered to, taken from the regional registry (RIR) and cached per netblock — for an address inside a cloud provider&rsquo;s range this is the tenant, not the provider. <code>company.source</code> is <code>registry</code> when the block comes from a registry record and <code>asn</code> when only the ASN name was available. <code>company.type</code> classifies the <em>network</em> (hosting / isp / business / education / government); <code>is_hosting</code> is the visitor-oriented flag and stays <code>false</code> for major providers&rsquo; own verified infrastructure (Google DNS, Cloudflare, …) even though their network type is hosting. Private, reserved and CGNAT addresses return the same shape with <code>is_private</code> / <code>is_cgnat</code> set and <code>location.country</code> = <code>Private/Reserved</code>.</p>
347                                    </div></div></div>
348                                </div>
349                            </div>
350                        </section>
351
352                        <!-- WHOIS -->
353                        <section class="docs-section" id="whois">
354                            <h2 class="docs-section-title">WHOIS</h2>
355                            <p class="docs-section-desc">Registration data for a domain or IP address, assembled from the authoritative registries and registrars. Domains return registrar, creation/expiry dates, status codes, nameservers and abuse contacts; IPs return network range, RIR and holder details. Subdomains are automatically stripped to the registrable root domain.</p>
356                            <div class="endpoints-grid">
357                                <div class="endpoint open">
358                                    <div class="endpoint-header" onclick="toggleEndpoint(this)" role="button" tabindex="0" aria-expanded="true">
359                                        <span class="method method-get">GET</span>
360                                        <span class="endpoint-path">/api/whois/<span class="param">{ip_or_domain}</span></span>
361                                        <span class="endpoint-desc">WHOIS registration data</span>
362                                        <span class="endpoint-toggle"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="6 9 12 15 18 9"/></svg></span>                                    </div>
363                                    <div class="endpoint-body"><div class="endpoint-body-inner"><div class="endpoint-body-content">
364                                        <div class="params-grid">
365                                            <div class="param-row"><div class="param-name">ip_or_domain <span class="param-tag param-required">required</span></div><div class="param-type">string</div><div class="param-desc">Domain name or IPv4/IPv6 address (e.g. <code>google.com</code>, <code>1.1.1.1</code>).</div></div>
366                                        </div>
367                                        <div class="u-mt-16 code-tabs"><button class="code-tab active" onclick="switchTab(this,'whois-curl')">cURL</button><button class="code-tab" onclick="switchTab(this,'whois-js')">JavaScript</button><button class="code-tab" onclick="switchTab(this,'whois-py')">Python</button><button class="code-tab" onclick="switchTab(this,'whois-php')">PHP</button><button class="code-tab" onclick="switchTab(this,'whois-cs')">C#</button><button class="code-tab" onclick="switchTab(this,'whois-go')">Go</button><button class="code-tab" onclick="switchTab(this,'whois-rb')">Ruby</button><button class="code-tab" onclick="switchTab(this,'whois-java')">Java</button><button class="code-tab" onclick="switchTab(this,'whois-perl')">Perl</button><button class="code-tab" onclick="switchTab(this,'whois-rust')">Rust</button></div><div id="whois-curl" class="code-example active"><div class="code-block"><div class="code-header"><span class="code-lang">cURL</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre>curl "https://ipaddress.to/api/whois/google.com"</pre></div></div></div><div id="whois-js" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">JavaScript</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">const</span> res = <span class="keyword">await</span> fetch(<span class="string">'https://ipaddress.to/api/whois/google.com'</span>);
368<span class="keyword">const</span> data = <span class="keyword">await</span> res.json();
369console.log(data);</pre></div></div></div><div id="whois-py" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Python</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">import</span> requests
370
371data = requests.get(<span class="string">'https://ipaddress.to/api/whois/google.com'</span>).json()
372print(data)</pre></div></div></div><div id="whois-php" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">PHP</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre>$data = json_decode(
373    file_get_contents(<span class="string">'https://ipaddress.to/api/whois/google.com'</span>),
374    <span class="keyword">true</span>
375);
376print_r($data);</pre></div></div></div><div id="whois-cs" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">C#</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">using</span> var client = <span class="keyword">new</span> HttpClient();
377<span class="keyword">var</span> json = <span class="keyword">await</span> client.GetStringAsync(<span class="string">"https://ipaddress.to/api/whois/google.com"</span>);
378Console.WriteLine(json);</pre></div></div></div><div id="whois-go" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Go</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre>resp, _ := http.Get(<span class="string">"https://ipaddress.to/api/whois/google.com"</span>)
379body, _ := io.ReadAll(resp.Body)
380fmt.Println(<span class="keyword">string</span>(body))</pre></div></div></div><div id="whois-rb" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Ruby</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">require</span> <span class="string">'net/http'</span>
381<span class="keyword">require</span> <span class="string">'json'</span>
382
383data = JSON.parse(Net::HTTP.get(URI(<span class="string">'https://ipaddress.to/api/whois/google.com'</span>)))
384puts data</pre></div></div></div><div id="whois-java" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Java</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre>HttpClient client = HttpClient.newHttpClient();
385HttpRequest req = HttpRequest.newBuilder()
386    .uri(URI.create(<span class="string">"https://ipaddress.to/api/whois/google.com"</span>)).build();
387String body = client.send(req, BodyHandlers.ofString()).body();
388System.out.println(body);</pre></div></div></div><div id="whois-perl" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Perl</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">
388use</span> LWP::Simple;
389<span class="keyword">use</span> JSON;
390
391<span class="keyword">my</span> $data = decode_json(get(<span class="string">'https://ipaddress.to/api/whois/google.com'</span>));
392print $data;</pre></div></div></div><div id="whois-rust" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Rust</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">let</span> body = reqwest::get(<span class="string">"https://ipaddress.to/api/whois/google.com"</span>)
393    .<span class="keyword">await</span>?.text().<span class="keyword">await</span>?;
394println!(<span class="string">"{}"</span>, body);</pre></div></div></div>                                        <div class="u-mt-16 code-block"><div class="code-header"><span class="code-lang">Response (domain, trimmed)</span></div><div class="code-content"><pre>{
395  <span class="key">"success"</span>: <span class="keyword">true</span>,
396  <span class="key">"query"</span>: <span class="string">"google.com"</span>,
397  <span class="key">"type"</span>: <span class="string">"domain"</span>,
398  <span class="key">"found"</span>: <span class="keyword">true</span>,
399  <span class="key">"parsed"</span>: {
400    <span class="key">"domain_name"</span>: <span class="string">"GOOGLE.COM"</span>,
401    <span class="key">"registrar"</span>: <span class="string">"MarkMonitor Inc."</span>,
402    <span class="key">"registrar_url"</span>: <span class="string">"https://rdap.markmonitor.com/rdap/domain/GOOGLE.COM"</span>,
403    <span class="key">"registrar_iana_id"</span>: <span class="string">"292"</span>,
404    <span class="key">"creation_date"</span>: <span class="string">"1997-09-15T04:00:00Z"</span>,
405    <span class="key">"expiry_date"</span>: <span class="string">"2028-09-14T04:00:00Z"</span>,
406    <span class="key">"updated_date"</span>: <span class="string">"2026-07-01T02:29:57Z"</span>,
407    <span class="key">"status"</span>: [<span class="string">"client delete prohibited"</span>, <span class="string">"client transfer prohibited"</span>], <span class="comment">// … 6 in total</span>
408    <span class="key">"nameservers"</span>: [<span class="string">"ns1.google.com"</span>, <span class="string">"ns2.google.com"</span>], <span class="comment">// … 4 in total</span>
409    <span class="key">"dnssec"</span>: <span class="string">"unsigned"</span>,
410    <span class="key">"abuse_email"</span>: <span class="string">"[email protected]"</span>,
411    <span class="key">"abuse_phone"</span>: <span class="string">"tel:+1.2086851750"</span>
412  },
413  <span class="key">"raw"</span>: <span class="string">"… full registry response as a string …"</span>,
414  <span class="key">"for_sale"</span>: { <span class="key">"rfc"</span>: <span class="string">"RFC 10023"</span>, <span class="key">"listed"</span>: <span class="keyword">false</span>, <span class="key">"checked"</span>: <span class="keyword">true</span>, <span class="key">"node"</span>: <span class="string">"_for-sale.google.com"</span>, <span class="key">"text"</span>: [], <span class="key">"uris"</span>: [], <span class="key">"prices"</span>: [], <span class="key">"codes"</span>: [] },
415  <span class="key">"source"</span>: <span class="string">"registry"</span>,
416  <span class="key">"duration_ms"</span>: <span class="number">342</span>
417}</pre></div></div>                                        <p class="u-note endpoint-note">The <code>raw</code> field contains the complete unparsed registry payload; <code>source</code> is always <code>registry</code>. For domains, <code>for_sale</code> reports the RFC 10023 <code>_for-sale</code> TXT node: <code>listed</code>, plus any <code>text</code>, <code>uris</code> (http, https, mailto, tel only), <code>prices</code> (currency + amount) and <code>codes</code> published by the holder. Prices are indicative only. The same object is returned by <code>/api/lookup</code> for hostnames, <code>/api/email</code> for domains and <code>/api/resolve</code>.</p>
418                                    </div></div></div>
419                                </div>
420                            </div>
421                        </section>
422
423                        <!-- Resolve -->
424                        <section class="docs-section" id="resolve">
425                            <h2 class="docs-section-title">Hostname Resolution</h2>
426                            <p class="docs-section-desc">Resolve a hostname to its A (IPv4), AAAA (IPv6) and CNAME records, with automatic reverse-DNS lookups for every resolved IP.</p>
427                            <div class="endpoints-grid">
428                                <div class="endpoint open">
429                                    <div class="endpoint-header" onclick="toggleEndpoint(this)" role="button" tabindex="0" aria-expanded="true">
430                                        <span class="method method-get">GET</span>
431                                        <span class="endpoint-path">/api/resolve/<span class="param">{hostname}</span></span>
432                                        <span class="endpoint-desc">A / AAAA / CNAME + reverse DNS</span>
433                                        <span class="endpoint-toggle"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="6 9 12 15 18 9"/></svg></span>                                    </div>
434                                    <div class="endpoint-body"><div class="endpoint-body-inner"><div class="endpoint-body-content">
435                                        <div class="params-grid">
436                                            <div class="param-row"><div class="param-name">hostname <span class="param-tag param-required">required</span></div><div class="param-type">string</div><div class="param-desc">Hostname to resolve (e.g. <code>github.com</code>).</div></div>
437                                        </div>
438                                        <div class="u-mt-16 code-tabs"><button class="code-tab active" onclick="switchTab(this,'resolve-curl')">cURL</button><button class="code-tab" onclick="switchTab(this,'resolve-js')">JavaScript</button><button class="code-tab" onclick="switchTab(this,'resolve-py')">Python</button><button class="code-tab" onclick="switchTab(this,'resolve-php')">PHP</button><button class="code-tab" onclick="switchTab(this,'resolve-cs')">C#</button><button class="code-tab" onclick="switchTab(this,'resolve-go')">Go</button><button class="code-tab" onclick="switchTab(this,'resolve-rb')">Ruby</button><button class="code-tab" onclick="switchTab(this,'resolve-java')">Java</button><button class="code-tab" onclick="switchTab(this,'resolve-perl')">Perl</button><button class="code-tab" onclick="switchTab(this,'resolve-rust')">Rust</button></div><div id="resolve-curl" class="code-example active"><div class="code-block"><div class="code-header"><span class="code-lang">cURL</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre>curl "https://ipaddress.to/api/resolve/github.com"</pre></div></div></div><div id="resolve-js" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">JavaScript</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">const</span> res = <span class="keyword">await</span> fetch(<span class="string">'https://ipaddress.to/api/resolve/github.com'</span>);
439<span class="keyword">const</span> data = <span class="keyword">await</span> res.json();
440console.log(data);</pre></div></div></div><div id="resolve-py" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Python</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">import</span> requests
441
442data = requests.get(<span class="string">'https://ipaddress.to/api/resolve/github.com'</span>).json()
443print(data)</pre></div></div></div><div id="resolve-php" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">PHP</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre>$data = json_decode(
444    file_get_contents(<span class="string">'https://ipaddress.to/api/resolve/github.com'</span>),
445    <span class="keyword">true</span>
446);
447print_r($data);</pre></div></div></div><div id="resolve-cs" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">C#</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">using</span> var client = <span class="keyword">new</span> HttpClient();
448<span class="keyword">var</span> json = <span class="keyword">await</span> client.GetStringAsync(<span class="string">"https://ipaddress.to/api/resolve/github.com"</span>);
449Console.WriteLine(json);</pre></div></div></div><div id="resolve-go" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Go</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre>resp, _ := http.Get(<span class="string">"https://ipaddress.to/api/resolve/github.com"</span>)
450body, _ := io.ReadAll(resp.Body)
451fmt.Println(<span class="keyword">string</span>(body))</pre></div></div></div><div id="resolve-rb" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Ruby</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">require</span> <span class="string">'net/http'</span>
452<span class="keyword">require</span> <span class="string">'json'</span>
453
454data = JSON.parse(Net::HTTP.get(URI(<span class="string">'https://ipaddress.to/api/resolve/github.com'</span>)))
455puts data</pre></div></div></div><div id="resolve-java" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Java</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre>HttpClient client = HttpClient.newHttpClient();
456HttpRequest req = HttpRequest.newBuilder()
457    .uri(URI.create(<span class="string">"https://ipaddress.to/api/resolve/github.com"</span>)).build();
458String body = client.send(req, BodyHandlers.ofString()).body();
459System.out.println(body);</pre></div></div></div><div id="resolve-perl" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Perl</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">
459use</span> LWP::Simple;
460<span class="keyword">use</span> JSON;
461
462<span class="keyword">my</span> $data = decode_json(get(<span class="string">'https://ipaddress.to/api/resolve/github.com'</span>));
463print $data;</pre></div></div></div><div id="resolve-rust" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Rust</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">let</span> body = reqwest::get(<span class="string">"https://ipaddress.to/api/resolve/github.com"</span>)
464    .<span class="keyword">await</span>?.text().<span class="keyword">await</span>?;
465println!(<span class="string">"{}"</span>, body);</pre></div></div></div>                                        <div class="u-mt-16 code-block"><div class="code-header"><span class="code-lang">Response</span></div><div class="code-content"><pre>{
466  <span class="key">"success"</span>: <span class="keyword">true</span>,
467  <span class="key">"hostname"</span>: <span class="string">"github.com"</span>,
468  <span class="key">"a"</span>: [<span class="string">"140.82.113.4"</span>],
469  <span class="key">"aaaa"</span>: [],
470  <span class="key">"cname"</span>: [],
471  <span class="key">"mx"</span>: [{ <span class="key">"host"</span>: <span class="string">"github-com.mail.protection.outlook.com"</span>, <span class="key">"priority"</span>: <span class="number">0</span> }],
472  <span class="key">"ns"</span>: [<span class="string">"dns1.p08.nsone.net"</span>, <span class="string">"dns2.p08.nsone.net"</span>],
473  <span class="key">"txt"</span>: [<span class="string">"v=spf1 ip4:192.30.252.0/22 include:_spf.google.com ~all"</span>],
474  <span class="key">"for_sale"</span>: { <span class="key">"rfc"</span>: <span class="string">"RFC 10023"</span>, <span class="key">"node"</span>: <span class="string">"_for-sale.github.com"</span> },
475  <span class="key">"reverse"</span>: {
476    <span class="key">"140.82.113.4"</span>: <span class="string">"lb-140-82-113-4-iad.github.com"</span>
477  },
478  <span class="key">"total_ips"</span>: <span class="number">1</span>,
479  <span class="key">"has_ipv4"</span>: <span class="keyword">true</span>,
480  <span class="key">"has_ipv6"</span>: <span class="keyword">false</span>,
481  <span class="key">"duration_ms"</span>: <span class="number">87</span>
482}</pre></div></div>                                    </div></div></div>
483                                </div>
484                            </div>
485                        </section>
486
487                        <!-- DNS propagation -->
488                        <section class="docs-section" id="dns">
489                            <h2 class="docs-section-title">DNS Propagation</h2>
490                            <p class="docs-section-desc">Query a DNS record against 32 public resolvers around the world and watch propagation in real time. Results are <strong>streamed as NDJSON</strong> — newline-delimited JSON, one object per line — so you can render each server's answer as it arrives. Pass <code>?server=IP</code> to query a single resolver and get one plain JSON object instead.</p>
491                            <div class="endpoints-grid">
492                                <div class="endpoint open">
493                                    <div class="endpoint-header" onclick="toggleEndpoint(this)" role="button" tabindex="0" aria-expanded="true">
494                                        <span class="method method-get">GET</span>
495                                        <span class="endpoint-path">/api/dns/<span class="param">{type}</span>/<span class="param">{domain}</span></span>
496                                        <span class="endpoint-desc">Propagation check across 32 global servers (NDJSON stream)</span>
497                                        <span class="endpoint-toggle"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="6 9 12 15 18 9"/></svg></span>                                    </div>
498                                    <div class="endpoint-body"><div class="endpoint-body-inner"><div class="endpoint-body-content">
499                                        <div class="params-grid">
500                                            <div class="param-row"><div class="param-name">type <span class="param-tag param-required">required</span></div><div class="param-type">string</div><div class="param-desc">Record type: <code>A</code>, <code>AAAA</code>, <code>CNAME</code>, <code>MX</code>, <code>NS</code>, <code>TXT</code>, <code>SOA</code>, <code>PTR</code>, <code>SRV</code>, <code>CAA</code> (case-insensitive).</div></div>
501                                            <div class="param-row"><div class="param-name">domain <span class="param-tag param-required">required</span></div><div class="param-type">string</div><div class="param-desc">Domain to query (e.g. <code>example.com</code>).</div></div>
502                                            <div class="param-row"><div class="param-name">server <span class="param-tag param-optional">optional</span></div><div class="param-type">string</div><div class="param-desc">Query one resolver only, e.g. <code>?server=8.8.8.8</code>. Returns a single JSON object instead of a stream.</div></div>
503                                        </div>
504                                        <div class="u-mt-16 code-tabs">
505                                            <button class="code-tab active" onclick="switchTab(this,'dns-curl')">cURL</button>
506                                            <button class="code-tab" onclick="switchTab(this,'dns-js')">JavaScript</button>
507                                            <button class="code-tab" onclick="switchTab(this,'dns-py')">Python</button>
508                                        </div>
509                                        <div id="dns-curl" class="code-example active"><div class="code-block"><div class="code-header"><span class="code-lang">cURL</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre>curl -N "https://ipaddress.to/api/dns/a/example.com"</pre></div></div></div>
510                                        <div id="dns-js" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">JavaScript</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">const</span> res = <span class="keyword">await</span> fetch(<span class="string">'https://ipaddress.to/api/dns/a/example.com'</span>);
511<span class="keyword">const</span> reader = res.body.getReader();
512<span class="comment">// read the stream — each line is one JSON object</span></pre></div></div></div>
513                                        <div id="dns-py" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Python</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">
513import</span> requests, json
514
515r = requests.get(<span class="string">'https://ipaddress.to/api/dns/a/example.com'</span>, stream=<span class="keyword">True</span>)
516<span class="keyword">for</span> line <span class="keyword">in</span> r.iter_lines():
517    print(json.loads(line))</pre></div></div></div>
518                                        <div class="u-mt-16 code-block"><div class="code-header"><span class="code-lang">Response — NDJSON stream (trimmed)</span></div><div class="code-content"><pre>{<span class="key">"type"</span>:<span class="string">"start"</span>,<span class="key">"domain"</span>:<span class="string">"example.com"</span>,<span class="key">"recordType"</span>:<span class="string">"A"</span>,<span class="key">"total"</span>:<span class="number">32</span>}
519{<span class="key">"type"</span>:<span class="string">"result"</span>,<span class="key">"index"</span>:<span class="number">0</span>,<span class="key">"result"</span>:{<span class="key">"status"</span>:<span class="string">"ok"</span>,<span class="key">"value"</span>:<span class="string">"104.20.23.154"</span>,<span class="key">"ttl"</span>:<span class="number">133</span>,<span class="key">"elapsed"</span>:<span class="number">71</span>,<span class="key">"raw"</span>:[{<span class="key">"name"</span>:<span class="string">"example.com"</span>,<span class="key">"ttl"</span>:<span class="number">133</span>,<span class="key">"class"</span>:<span class="string">"IN"</span>,<span class="key">"type"</span>:<span class="string">"A"</span>,<span class="key">"value"</span>:<span class="string">"104.20.23.154"</span>}]}}
520<span class="comment">// … one "result" line per server (32 total), in server-list order …</span>
521{<span class="key">"type"</span>:<span class="string">"done"</span>,<span class="key">"summary"</span>:{<span class="key">"successful"</span>:<span class="number">29</span>,<span class="key">"failed"</span>:<span class="number">3</span>,<span class="key">"total"</span>:<span class="number">32</span>}}</pre></div></div>                                        <p class="u-note endpoint-note">The stream opens with a <code>start</code> object, emits one <code>result</code> object per server (with <code>index</code>, answer <code>value</code>, <code>ttl</code>, latency <code>elapsed</code> in ms and the <code>raw</code> record set), and closes with a <code>done</code> summary.</p>
522                                        <div class="u-mt-16 code-block"><div class="code-header"><span class="code-lang">Response with ?server=8.8.8.8 (single JSON object)</span></div><div class="code-content"><pre>{
523  <span class="key">"success"</span>: <span class="keyword">true</span>,
524  <span class="key">"domain"</span>: <span class="string">"example.com"</span>,
525  <span class="key">"type"</span>: <span class="string">"A"</span>,
526  <span class="key">"server"</span>: { <span class="key">"ip"</span>: <span class="string">"8.8.8.8"</span>, <span class="key">"name"</span>: <span class="string">"New York"</span>, <span class="key">"country"</span>: <span class="string">"US"</span>, <span class="key">"provider"</span>: <span class="string">"Google"</span> },
527  <span class="key">"result"</span>: {
528    <span class="key">"status"</span>: <span class="string">"ok"</span>,
529    <span class="key">"value"</span>: <span class="string">"104.20.23.154"</span>,
530    <span class="key">"ttl"</span>: <span class="number">300</span>,
531    <span class="key">"elapsed"</span>: <span class="number">41</span>,
532    <span class="key">"raw"</span>: [
533      { <span class="key">"name"</span>: <span class="string">"example.com"</span>, <span class="key">"ttl"</span>: <span class="number">300</span>, <span class="key">"class"</span>: <span class="string">"IN"</span>, <span class="key">"type"</span>: <span class="string">"A"</span>, <span class="key">"value"</span>: <span class="string">"104.20.23.154"</span> },
534      { <span class="key">"name"</span>: <span class="string">"example.com"</span>, <span class="key">"ttl"</span>: <span class="number">300</span>, <span class="key">"class"</span>: <span class="string">"IN"</span>, <span class="key">"type"</span>: <span class="string">"A"</span>, <span class="key">"value"</span>: <span class="string">"172.66.147.243"</span> }
535    ]
536  }
537}</pre></div></div>                                    </div></div></div>
538                                </div>
539                            </div>
540                        </section>
541
542                        <!-- Score -->
543                        <section class="docs-section" id="score">
544                            <h2 class="docs-section-title">IP Fraud Score</h2>
545                            <p class="docs-section-desc">
545A 0–100 risk score built from threat blocklists, VPN/proxy/Tor detection, ASN classification, reverse-DNS heuristics and bot signals. <code>risk</code> is one of <code>low</code>, <code>medium</code>, <code>high</code> or <code>critical</code>, and <code>factors</code> explains exactly which signals moved the score. Known crawler IPs (Googlebot, Ahrefs, …) are verified via forward-confirmed reverse DNS and flagged rather than penalised.</p>
546                            <p class="docs-section-desc">The endpoint scores two different things depending on what you pass, reported back as <code>target_type</code>. An <strong>IP address</strong> (<code>target_type: "ip"</code>) is scored as a <em>visitor</em> — "is traffic from this address suspicious?" — so VPN/proxy/Tor, datacenter hosting, missing reverse DNS and crawler signals all count against it. A <strong>domain</strong> (<code>target_type: "domain"</code>) is resolved and scored as a <em>website</em> — "is this site dangerous?" — using only server-reputation signals (threat intel, bulletproof/shady hosting, bogons); being hosted in a datacenter or on a CDN is normal for a server and is not penalised. In domain mode the visitor-only categories in <code>score_breakdown</code> (<code>anonymity</code>, <code>infrastructure</code>, <code>bot</code>) are <code>null</code> — not evaluated, as opposed to <code>0</code> (evaluated and clean).</p>
547                            <p class="docs-section-desc">Threat-intel listings are weighted by feed reliability, de-duplicated across feeds that republish the same data, and discounted when a feed has stopped updating. On residential and mobile networks (<code>checks.is_isp</code> / <code>checks.is_mobile</code>), where one address is shared and reassigned among many people, non-critical listings are discounted further because they usually describe a previous holder. Tor exit relays (<code>tor_exit</code>) are scored as anonymised visitors; guard/middle relays (<code>tor_relay</code>) only forward Tor traffic and get a much smaller penalty. A VPN provider is only named in <code>vpn_provider</code> when the exact address is a listed endpoint; an address that merely shares a /24 with endpoints is reported as <code>checks.vpn_neighbor</code> with a small weight.</p>
548                            <div class="endpoints-grid">
549                                <div class="endpoint open">
550                                    <div class="endpoint-header" onclick="toggleEndpoint(this)" role="button" tabindex="0" aria-expanded="true">
551                                        <span class="method method-get">GET</span>
552                                        <span class="endpoint-path">/api/score/<span class="param">{ip_or_hostname}</span></span>
553                                        <span class="endpoint-desc">0–100 fraud / abuse risk score</span>
554                                        <span class="endpoint-toggle"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="6 9 12 15 18 9"/></svg></span>                                    </div>
555                                    <div class="endpoint-body"><div class="endpoint-body-inner"><div class="endpoint-body-content">
556                                        <div class="params-grid">
557                                            <div class="param-row"><div class="param-name">ip_or_hostname <span class="param-tag param-required">required</span></div><div class="param-type">string</div><div class="param-desc">IPv4/IPv6 address (scored as a visitor) or domain (resolved and scored as a website). Use <code>my</code> for your own IP.</div></div>
558                                        </div>
559                                        <div class="u-mt-16 code-tabs"><button class="code-tab active" onclick="switchTab(this,'score-curl')">cURL</button><button class="code-tab" onclick="switchTab(this,'score-js')">JavaScript</button><button class="code-tab" onclick="switchTab(this,'score-py')">Python</button><button class="code-tab" onclick="switchTab(this,'score-php')">PHP</button><button class="code-tab" onclick="switchTab(this,'score-cs')">C#</button><button class="code-tab" onclick="switchTab(this,'score-go')">Go</button><button class="code-tab" onclick="switchTab(this,'score-rb')">Ruby</button><button class="code-tab" onclick="switchTab(this,'score-java')">Java</button><button class="code-tab" onclick="switchTab(this,'score-perl')">Perl</button><button class="code-tab" onclick="switchTab(this,'score-rust')">Rust</button></div><div id="score-curl" class="code-example active"><div class="code-block"><div class="code-header"><span class="code-lang">cURL</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre>curl "https://ipaddress.to/api/score/8.8.8.8"</pre></div></div></div><div id="score-js" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">JavaScript</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">const</span> res = <span class="keyword">await</span> fetch(<span class="string">'https://ipaddress.to/api/score/8.8.8.8'</span>);
560<span class="keyword">const</span> data = <span class="keyword">await</span> res.json();
561console.log(data);</pre></div></div></div><div id="score-py" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Python</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">
561import</span> requests
562
563data = requests.get(<span class="string">'https://ipaddress.to/api/score/8.8.8.8'</span>).json()
564print(data)</pre></div></div></div><div id="score-php" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">PHP</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre>$data = json_decode(
565    file_get_contents(<span class="string">'https://ipaddress.to/api/score/8.8.8.8'</span>),
566    <span class="keyword">true</span>
567);
568print_r($data);</pre></div></div></div><div id="score-cs" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">C#</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">using</span> var client = <span class="keyword">new</span> HttpClient();
569<span class="keyword">var</span> json = <span class="keyword">await</span> client.GetStringAsync(<span class="string">"https://ipaddress.to/api/score/8.8.8.8"</span>);
570Console.WriteLine(json);</pre></div></div></div><div id="score-go" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Go</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre>resp, _ := http.Get(<span class="string">"https://ipaddress.to/api/score/8.8.8.8"</span>)
571body, _ := io.ReadAll(resp.Body)
572fmt.Println(<span class="keyword">string</span>(body))</pre></div></div></div><div id="score-rb" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Ruby</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">require</span> <span class="string">'net/http'</span>
573<span class="keyword">require</span> <span class="string">'json'</span>
574
575data = JSON.parse(Net::HTTP.get(URI(<span class="string">'https://ipaddress.to/api/score/8.8.8.8'</span>)))
576puts data</pre></div></div></div><div id="score-java" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Java</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre>HttpClient client = HttpClient.newHttpClient();
577HttpRequest req = HttpRequest.newBuilder()
578    .uri(URI.create(<span class="string">"https://ipaddress.to/api/score/8.8.8.8"</span>)).build();
579String body = client.send(req, BodyHandlers.ofString()).body();
580System.out.println(body);</pre></div></div></div><div id="score-perl" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Perl</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">
580use</span> LWP::Simple;
581<span class="keyword">use</span> JSON;
582
583<span class="keyword">my</span> $data = decode_json(get(<span class="string">'https://ipaddress.to/api/score/8.8.8.8'</span>));
584print $data;</pre></div></div></div><div id="score-rust" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Rust</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">let</span> body = reqwest::get(<span class="string">"https://ipaddress.to/api/score/8.8.8.8"</span>)
585    .<span class="keyword">await</span>?.text().<span class="keyword">await</span>?;
586println!(<span class="string">"{}"</span>, body);</pre></div></div></div>                                        <div class="u-mt-16 code-block"><div class="code-header"><span class="code-lang">Response (trimmed)</span></div><div class="code-content"><pre>{
587  <span class="key">"success"</span>: <span class="keyword">true</span>,
588  <span class="key">"ip"</span>: <span class="string">"8.8.8.8"</span>,
589  <span class="key">"target_type"</span>: <span class="string">"ip"</span>,
590  <span class="key">"score"</span>: <span class="number">3</span>,
591  <span class="key">"risk"</span>: <span class="string">"low"</span>,
592  <span class="key">"score_breakdown"</span>: { <span class="key">"threat"</span>: <span class="number">0</span>, <span class="key">"anonymity"</span>: <span class="number">0</span>, <span class="key">"infrastructure"</span>: <span class="number">25</span>, <span class="key">"reputation"</span>: <span class="number">0</span>, <span class="key">"bot"</span>: <span class="number">0</span> },
593  <span class="key">"vpn_provider"</span>: <span class="keyword">null</span>,
594  <span class="key">"rdns"</span>: <span class="string">"dns.google"</span>,
595  <span class="key">"ip_version"</span>: <span class="number">4</span>,
596  <span class="key">"location"</span>: { <span class="key">"country"</span>: <span class="string">"United States"</span>, <span class="key">"country_code"</span>: <span class="string">"US"</span>, <span class="key">"city"</span>: <span class="string">
596"Mountain View"</span> },
597  <span class="key">"asn"</span>: { <span class="key">"asn"</span>: <span class="number">15169</span>, <span class="key">"org"</span>: <span class="string">"Google LLC"</span> },
598  <span class="key">"company"</span>: { <span class="key">"name"</span>: <span class="string">"Google LLC"</span>, <span class="key">"type"</span>: <span class="string">"trusted"</span> },
599  <span class="key">"checks"</span>: {
600    <span class="key">"trusted_org"</span>: <span class="keyword">true</span>,
601    <span class="key">"has_rdns"</span>: <span class="keyword">true</span>,
602    <span class="key">"is_bot"</span>: <span class="keyword">false</span>,
603    <span class="key">"vpn_detected"</span>: <span class="keyword">false</span>,
604    <span class="key">"tor_exit"</span>: <span class="keyword">false</span>,
605    <span class="key">"tor_relay"</span>: <span class="keyword">false</span>,
606    <span class="key">"is_mobile"</span>: <span class="keyword">false</span>,
607    <span class="key">"commercial_proxy"</span>: <span class="keyword">false</span>,
608    <span class="key">"blocklist_listed"</span>: <span class="keyword">false</span>,
609    <span class="key">"blocklist_count"</span>: <span class="number">0</span>,
610    <span class="key">"hosting_asn"</span>: <span class="keyword">true</span>,
611    <span class="key">"asn_type"</span>: <span class="string">"hosting"</span>,
612    <span class="key">"high_risk_country"</span>: <span class="keyword">false</span>
613    <span class="comment">// … 26 checks in total (vpn_neighbor and vpn_provider appear only when detected)</span>
614  },
615  <span class="key">"factors"</span>: [
616    { <span class="key">"name"</span>: <span class="string">"Trusted Organization"</span>, <span class="key">"impact"</span>: <span class="string">"positive"</span>, <span class="key">"detail"</span>: <span class="string">"IP belongs to Google infrastructure (verified via ASN + rDNS)"</span> },
617    { <span class="key">"name"</span>: <span class="string">"Datacenter / Hosting"</span>, <span class="key">"impact"</span>: <span class="string">"medium"</span>, <span class="key">"detail"</span>: <span class="string">"AS15169 (Google LLC) is hosting/datacenter infrastructure"</span> }
618  ],
619  <span class="key">"duration_ms"</span>: <span class="number">60</span>
620}</pre></div></div>                                    </div></div></div>
621                                </div>
622                            </div>
623                        </section>
624
625                        <!-- Email -->
626                        <section class="docs-section" id="email">
627                            <h2 class="docs-section-title">Email Check</h2>
628                            <p class="docs-section-desc">Trust score (0–100, higher is better) for an email address or a domain. <strong>Deliverability</strong>: MX records that actually resolve (null MX and dangling MX are detected), the domain resolves, and — for an address — a live SMTP <code>RCPT TO</code> probe against the primary mail server reported in <code>checks.mailbox</code> as <code>deliverable</code>, <code>undeliverable</code>, <code>catch_all</code> (server accepts every address) or <code>unknown</code> (greylisted, blocked or timed out); no message is ever sent. <strong>Authentication</strong>: SPF policy strength (<code>spf_policy</code>: hardfail &gt; softfail &gt; redirect &gt; neutral &gt; open &gt; permissive; several records = <code>invalid</code>), DMARC <code>p=</code> policy with <code>pct</code> and organisational-domain inheritance for subdomains, and a DKIM key found under a common selector. <strong>Reputation</strong>: disposable providers (by name, or by delivering to a known disposable provider&rsquo;s mail server — <code>disposable_via_mx</code>), spam-associated domains, high-abuse TLDs, parked / for-sale domains and machine-generated local parts. Unregistered domains (<code>domain_exists: false</code>) are capped at 5. <code>normalized_email</code> strips <code>+tags</code> and, for Gmail, dots.</p>
629                            <div class="endpoints-grid">
630                                <div class="endpoint open">
631                                    <div class="endpoint-header" onclick="toggleEndpoint(this)" role="button" tabindex="0" aria-expanded="true">
632                                        <span class="method method-get">GET</span>
633                                        <span class="endpoint-path">/api/email/<span class="param">{email_or_domain}</span></span>
634                                        <span class="endpoint-desc">MX / SPF / DMARC / disposable score</span>
635                                        <span class="endpoint-toggle"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="6 9 12 15 18 9"/></svg></span>                                    </div>
636                                    <div class="endpoint-body"><div class="endpoint-body-inner"><div class="endpoint-body-content">
637                                        <div class="params-grid">
638                                            <div class="param-row"><div class="param-name">email_or_domain <span class="param-tag param-required">required</span></div><div class="param-type">string</div><div class="param-desc">Email address (e.g. <code>[email protected]</code>) or domain (e.g. <code>mailinator.com</code>). Omit entirely to get a random sample of known disposable domains.</div></div>
639                                        </div>
640                                        <div class="u-mt-16 code-tabs"><button class="code-tab active" onclick="switchTab(this,'email-curl')">cURL</button><button class="code-tab" onclick="switchTab(this,'email-js')">JavaScript</button><button class="code-tab" onclick="switchTab(this,'email-py')">Python</button><button class="code-tab" onclick="switchTab(this,'email-php')">PHP</button><button class="code-tab" onclick="switchTab(this,'email-cs')">C#</button><button class="code-tab" onclick="switchTab(this,'email-go')">Go</button><button class="code-tab" onclick="switchTab(this,'email-rb')">Ruby</button><button class="code-tab" onclick="switchTab(this,'email-java')">Java</button><button class="code-tab" onclick="switchTab(this,'email-perl')">Perl</button><button class="code-tab" onclick="switchTab(this,'email-rust')">Rust</button></div><div id="email-curl" class="code-example active"><div class="code-block"><div class="code-header"><span class="code-lang">cURL</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre>curl "https://ipaddress.to/api/email/[email protected]"</pre></div></div></div><div id="email-js" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">JavaScript</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">const</span> res = <span class="keyword">await</span> fetch(<span class="string">'https://ipaddress.to/api/email/[email protected]'</span>);
641<span class="keyword">const</span> data = <span class="keyword">await</span> res.json();
642console.log(data);</pre></div></div></div><div id="email-py" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Python</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">import</span> requests
643
644data = requests.get(<span class="string">'https://ipaddress.to/api/email/[email protected]'</span>).json()
645print(data)</pre></div></div></div><div id="email-php" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">PHP</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre>$data = json_decode(
646    file_get_contents(<span class="string">'https://ipaddress.to/api/email/[email protected]'</span>),
647    <span class="keyword">true</span>
648);
649print_r($data);</pre></div></div></div><div id="email-cs" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">C#</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">using</span> var client = <span class="keyword">new</span> HttpClient();
650<span class="keyword">var</span> json = <span class="keyword">await</span> client.GetStringAsync(<span class="string">"https://ipaddress.to/api/email/[email protected]"</span>);
651Console.WriteLine(json);</pre></div></div></div><div id="email-go" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Go</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre>resp, _ := http.Get(<span class="string">"https://ipaddress.to/api/email/[email protected]"</span>)
652body, _ := io.ReadAll(resp.Body)
653fmt.Println(<span class="keyword">string</span>(body))</pre></div></div></div><div id="email-rb" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Ruby</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">require</span> <span class="string">'net/http'</span>
654<span class="keyword">require</span> <span class="string">'json'</span>
655
656data = JSON.parse(Net::HTTP.get(URI(<span class="string">'https://ipaddress.to/api/email/[email protected]'</span>)))
657puts data</pre></div></div></div><div id="email-java" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Java</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre>HttpClient client = HttpClient.newHttpClient();
658HttpRequest req = HttpRequest.newBuilder()
659    .uri(URI.create(<span class="string">"https://ipaddress.to/api/email/[email protected]"</span>)).build();
660String body = client.send(req, BodyHandlers.ofString()).body();
661System.out.println(body);</pre></div></div></div><div id="email-perl" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Perl</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">
661use</span> LWP::Simple;
662<span class="keyword">use</span> JSON;
663
664<span class="keyword">my</span> $data = decode_json(get(<span class="string">'https://ipaddress.to/api/email/[email protected]'</span>));
665print $data;</pre></div></div></div><div id="email-rust" class="code-example"><div class="code-block"><div class="code-header"><span class="code-lang">Rust</span><button class="code-copy" onclick="copyCode(this)">Copy</button></div><div class="code-content"><pre><span class="keyword">let</span> body = reqwest::get(<span class="string">"https://ipaddress.to/api/email/[email protected]"</span>)
666    .<span class="keyword">await</span>?.text().<span class="keyword">await</span>?;
667println!(<span class="string">"{}"</span>, body);</pre></div></div></div>                                        <div class="u-mt-16 code-block"><div class="code-header"><span class="code-lang">Response (trimmed)</span></div><div class="code-content"><pre>{
668  <span class="key">"success"</span>: <span class="keyword">true</span>,
669  <span class="key">"query"</span>: <span class="string">"[email protected]"</span>,
670  <span class="key">"email"</span>: <span class="string">"[email protected]"</span>,
671  <span class="key">"domain"</span>: <span class="string">"gmail.com"</span>,
672  <span class="key">"target_type"</span>: <span class="string">"email"</span>,
673  <span class="key">"normalized_email"</span>: <span class="string">"[email protected]"</span>,
674  <span class="key">"apex_domain"</span>: <span class="string">"gmail.com"</span>,
675  <span class="key">"score"</span>: <span class="number">10</span>,
676  <span class="key">"rating"</span>: <span class="string">"high-risk"</span>,
677  <span class="key">"score_breakdown"</span>: { <span class="key">"deliverability"</span>: <span class="number">35</span>, <span class="key">"authentication"</span>: <span class="number">24</span>, <span class="key">"reputation"</span>: <span class="number">20</span> },
678  <span class="key">"checks"</span>: {
679    <span class="key">"domain_exists"</span>: <span class="keyword">true</span>,
680    <span class="key">"has_mx"</span>: <span class="keyword">true</span>,
681    <span class="key">"null_mx"</span>: <span class="keyword">false</span>,
682    <span class="key">"mx_hosts"</span>: [<span class="string">"gmail-smtp-in.l.google.com"</span>, <span class="string">"alt1.gmail-smtp-in.l.google.com"</span>],
683    <span class="key">"mx_resolves"</span>: <span class="keyword">true</span>,
684    <span class="key">"spf"</span>: <span class="keyword">true</span>,
685    <span class="key">"spf_policy"</span>: <span class="string">"redirect"</span>,
686    <span class="key">"spf_record"</span>: <span class="string">"v=spf1 redirect=_spf.google.com"</span>,
687    <span class="key">"dmarc"</span>: <span class="keyword">true</span>,
688    <span class="key">"dmarc_policy"</span>: <span class="string">"none"</span>,
689    <span class="key">"dmarc_pct"</span>: <span class="number">100</span>,
690    <span class="key">"dmarc_record"</span>: <span class="string">"v=DMARC1; p=none; sp=quarantine; rua=mailto:[email protected]"</span>,
691    <span class="key">"dmarc_inherited"</span>: <span class="keyword">false</span>,
692    <span class="key">"dkim"</span>: <span class="keyword">false</span>,
693    <span class="key">"dkim_selector"</span>: <span class="keyword">null</span>,
694    <span class="key">"resolves"</span>: <span class="keyword">true</span>,
695    <span class="key">"disposable"</span>: <span class="keyword">false</span>,
696    <span class="key">"disposable_via_mx"</span>: <span class="keyword">null</span>,
697    <span class="key">"role_based"</span>: <span class="keyword">true</span>,
698    <span class="key">"free_provider"</span>: <span class="keyword">true</span>,
699    <span class="key">"spam_listed"</span>: <span class="keyword">false</span>,
700    <span class="key">"abused_tld"</span>: <span class="keyword">false</span>,
701    <span class="key">"random_local"</span>: <span class="keyword">false</span>,
702    <span class="key">"subaddress"</span>: <span class="keyword">null</span>,
703    <span class="key">"parked"</span>: <span class="keyword">
703false</span>,
704    <span class="key">"mailbox"</span>: <span class="string">"undeliverable"</span>,
705    <span class="key">"smtp_code"</span>: <span class="number">550</span>,
706    <span class="key">"smtp_message"</span>: <span class="string">"5.1.1 The email account that you tried to reach does not exist."</span>,
707    <span class="key">"smtp_mx"</span>: <span class="string">"gmail-smtp-in.l.google.com"</span>
708  },
709  <span class="key">"is_disposable"</span>: <span class="keyword">false</span>,
710  <span class="key">"factors"</span>: [
711    { <span class="key">"name"</span>: <span class="string">"Mailbox Rejected"</span>, <span class="key">"impact"</span>: <span class="string">"negative"</span>, <span class="key">"detail"</span>: <span class="string">"The domain's mail server rejected this address (550 5.1.1 …) — the mailbox does not exist"</span> },
712    { <span class="key">"name"</span>: <span class="string">"Mail Server (MX)"</span>, <span class="key">"impact"</span>: <span class="string">"positive"</span>, <span class="key">"detail"</span>: <span class="string">"Domain has 5 MX records (gmail-smtp-in.l.google.com) — it can receive email"</span> },
713    { <span class="key">"name"</span>: <span class="string">"Role-based Address"</span>, <span class="key">"impact"</span>: <span class="string">"negative"</span>, <span class="key">"detail"</span>: <span class="string">"\"test@\" is a role/group mailbox, not an individual person"</span> }
714    <span class="comment">// … one entry per signal</span>
715  ],
716  <span class="key">"duration_ms"</span>: <span class="number">168</span>
717}</pre></div></div>                                    </div></div></div>
718                                </div>
719                            </div>
720                        </section>
721
722                        <!-- Discovery -->
723                        <section class="docs-section" id="discovery">
724                            <h2 class="docs-section-title">Discovery Endpoint</h2>
725                            <p class="docs-section-desc"><code>GET https://ipaddress.to/api/</code> returns a machine-readable index of every endpoint — handy for tooling and quick reference from the terminal. (Browsers requesting HTML are redirected to this page instead.)</p>
726                            <div class="u-mt-16 code-block"><div class="code-header"><span class="code-lang">GET /api/ (trimmed)</span></div><div class="code-content"><pre>{
727  <span class="key">"name"</span>: <span class="string">"IPAddress.to API"</span>,
728  <span class="key">"version"</span>: <span class="string">"1.1"</span>,
729  <span class="key">"docs"</span>: <span class="string">"https://ipaddress.to/api/docs/"</span>,
730  <span class="key">"endpoints"</span>: [
731    {
732      <span class="key">"path"</span>: <span class="string">"/api/lookup/{ip_or_hostname}"</span>,
733      <span class="key">"method"</span>: <span class="string">"GET"</span>,
734      <span class="key">"description"</span>: <span class="string">"Geolocation and network info for an IP address or hostname…"</span>,
735      <span class="key">"examples"</span>: [<span class="string">"/api/lookup/8.8.8.8"</span>, <span class="string">"/api/lookup/google.com"</span>, <span class="string">"/api/lookup/my"</span>]
736    }
737    <span class="comment">// … one entry per endpoint</span>
738  ]
739}</pre></div></div>                        </section>
740
741                        <!-- Errors & caching -->
742                        <section class="docs-section" id="errors">
743                            <h2 class="docs-section-title">Errors &amp; Caching</h2>
744                            <p class="docs-section-desc">Failed lookups return a JSON body with <code>success: false</code> and a human-readable <code>error</code> message — always branch on the <code>success</code> field rather than the HTTP status alone.</p>
745                            <div class="u-mt-16 code-block"><div class="code-header"><span class="code-lang">Error response</span></div><div class="code-content"><pre>{
746  <span class="key">"success"</span>: <span class="keyword">false</span>,
747  <span class="key">
747"error"</span>: <span class="string">"Could not resolve hostname: 999.1.1.1"</span>,
748  <span class="key">"query"</span>: <span class="string">"999.1.1.1"</span>,
749  <span class="key">"duration_ms"</span>: <span class="number">53</span>
750}</pre></div></div>                            <div class="docs-note"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><line x1="12" y1="16" x2="12" y2="12"/><line x1="12" y1="8" x2="12.01" y2="8"/></svg><span>Responses are cached server-side for a short window (about a minute for lookups) and carry matching <code>Cache-Control</code> headers; cached responses include <code>"cached": true</code>. If you need the same answer repeatedly, cache it on your side too.</span></div>
751                        </section>
752
753                        <!-- Rate limits -->
754                        <section class="docs-section" id="rate-limits">
755                            <h2 class="docs-section-title">Rate Limits &amp; Fair Use</h2>
756                            <p class="docs-section-desc">There are currently no hard per-key quotas — the API is free for reasonable, fair use. Please be a good citizen: cache results, avoid tight polling loops, and identify your application with a descriptive <code>User-Agent</code> header. Abusive traffic (bulk scraping, sustained high-volume automation) may be throttled or blocked at the edge without notice. Sending an <a href="#auth" data-no-swup>API key</a> with your requests lets us distinguish your traffic from anonymous noise — and is the path to higher limits if quotas are ever introduced. Need sustained high volume? <a href="/contact/">Get in touch</a>.</p>
757                        </section>
758
759                        <!-- Internal endpoints -->
760                        <section class="docs-section" id="internal">
761                            <h2 class="docs-section-title">Internal / Experimental Endpoints</h2>
762                            <p class="docs-section-desc">The browser proxy-detection widget on the <a href="/">homepage</a> is powered by three additional endpoints: <code>POST /api/detect/fingerprint</code> (HTTP-layer request fingerprint), <code>GET /api/detect/latency</code> (RTT probe) and <code>POST /api/detect/score</code> (combined proxy/VPN score from client + server signals). They are internal: request/response shapes are tightly coupled to the widget and may change at any time without notice — build against the stable endpoints above instead.</p>
763                        </section>
764
765                    </div>
766                </div>
767            </div>
768        </div>
769                <footer class="footer footer-v2">
770            <div class="footer-inner">
771                <div class="footer-hero">
772                    <div class="footer-hero-copy">
773                        <div class="footer-logo">
774                            <svg class="footer-logo-img" width="24" height="24" viewBox="-37 0 512 512" role="img" aria-label="IPAddress.to logo"><path fill="#bddbff" d="M438.86 64c0-35.35-98.24-64-219.43-64S0 28.65 0 64s98.24 64 219.43 64 219.43-28.65 219.43-64z"/><path fill="#9bc9ff" d="M219.43 256c121.14 0 219.43-28.62 219.43-64V64c0 35.38-98.29 64-219.43 64S0 99.38 0 64v128c0 35.38 98.29 64 219.43 64z"/><path fill="#57a4ff" d="M219.43 384c121.14 0 219.43-28.62 219.43-64V192c0 35.38-98.29 64-219.43 64S0 227.38 0 192v128c0 35.38 98.29 64 219.43 64z"/><path fill="#2488ff" d="M438.86 320c0 35.38-98.29 64-219.43 64S0 355.38 0 320v128c0 35.38 98.29 64 219.43 64s219.43-28.62 219.43-64V320z"/></svg>
775                            <span>IPAddress<span class="footer-logo-suffix">.to</span></span>
776                        </div>
777                        <p class="footer-statement">Network intelligence, <em>answered in-house.</em></p>
778                        <p class="footer-tagline">IP, DNS, WHOIS, email and fraud-score tools with a JSON endpoint behind every one. Our own data, no third-party lookups, no signup, no per-query bill.</p>
779                        <div class="footer-actions">
780                            <a href="/api/docs/" class="btn btn-accent" data-nav>API documentation</a>
781                            <a href="/account/" class="btn btn-secondary" data-nav>Get an API key</a>
782                        </div>
783                    </div>
784                    <div class="footer-live">
785                        <a href="/status/" class="footer-status is-degraded" data-nav data-footer-status>
786                            <i aria-hidden="true"></i>
787                            <span data-footer-status-label>Degraded performance</span>
788                            <small>Status &rarr;</small>
789                        </a>
790                        <div class="footer-metrics">
791                            <div><b data-stat="per_min">—</b><span>requests / min</span></div>
792                            <div><b data-stat="req_24h">173,589</b><span>requests · 24 h</span></div>
793                            <div><b data-stat="feeds">96</b><span>threat feeds</span></div>
794                        </div>
795                        <div class="footer-extensions">
796                            <a href="https://chromewebstore.google.com/detail/ipaddressto-lookup/jblhckhmjccldbdocmfnhpiggcacjppf" class="footer-ext-card" target="_blank" rel="noopener" aria-label="Install Chrome extension">
797                                <img src="/svg/chrome.svg?v2" alt="" width="20" height="20" loading="lazy" decoding="async">
798                                <span class="footer-ext-text"><span class="footer-ext-label">Get the</span><span class="footer-ext-name">Chrome extension</span></span>
799                            </a>
800                            <a href="https://addons.mozilla.org/en-US/firefox/addon/what-is-my-ip-tool/" class="footer-ext-card" target="_blank" rel="noopener" aria-label="Install Firefox addon">
801                                <img src="/svg/firefox.svg" alt="" width="20" height="20" loading="lazy" decoding="async">
802                                <span class="footer-ext-text"><span class="footer-ext-label">Get the</span><span class="footer-ext-name">Firefox addon</span></span>
803                            </a>
804                        </div>
805                    </div>
806                </div>
807
808                <div class="footer-cols">
809                    <div class="footer-col">
810                        <h3 class="footer-col-title">Tools</h3>
811                        <a href="/">My IP</a>
812                        <a href="/lookup/">Lookup</a>
813                        <a href="/dns/">DNS</a>
814                        <a href="/hostname/">Hostname</a>
815                        <a href="/email/">Email Check</a>
816                        <a href="/whois/">WHOIS</a>
817                        <a href="/resolve/">Resolve</a>
818                        <a href="/ip/">IP Details</a>
819                        <a href="/score/">Fraud Score</a>
820                    </div>
821                    <div class="footer-col">
822                        <h3 class="footer-col-title">Developers</h3>
823                        <a href="/api/docs/">API Docs</a>
824                        <a href="/account/">Account &amp; API Keys</a>
825                        <a href="/#playground">Playground</a>
826                        <a href="/status/">System Status</a>
827                        <a href="/#approach">How the score works</a>
828                    </div>
829                    <div class="footer-col">
830                        <h3 class="footer-col-title">Company</h3>
831                        <a href="/blog/">Blog</a>
832                        <a href="/status/">Status</a>
833                        <a href="/contact/">Contact</a>
834                        <a href="/terms/">Terms of Service</a>
835                        <a href="/privacy/">Privacy Policy</a>
836                    </div>
837                    <div class="footer-col">
838                        <h3 class="footer-col-title">More Tools</h3>
839                        <a href="https://onlinemicrophonetest.com/" target="_blank" rel="noopener">Online Microphone Test</a>
840                        <a href="https://onlinewebcamtest.com/" target="_blank" rel="noopener">Online Webcam Test</a>
841                    </div>
842                </div>
843
844                <div class="footer-bottom">
845                    <span class="footer-copy">&copy; 2026 IPAddress.to. All rights reserved.</span>
846                    <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>
847                </div>
848            </div>
849        </footer>
850    </main>
851                
851<script src="/js/Swup.umd.js" data-swup-ignore-script></script>
851
852    
852<script data-swup-ignore-script>window.__detectSrc="\/js\/detect.min.js?v=1.43.1";</script>
852
853    
853<script src="/js/app.min.js?v=1.43.1" data-swup-ignore-script></script>
vendor: 1 bytes, line 853
853
854<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"e3a8ced6585f46789d4a8c9e02dcc805","r":1,"spa":2}' crossorigin="anonymous"></script>
854
855</body>
856</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.