IP Lookup
Geolocation, network owner, VPN/proxy/Tor detection and a risk score for any IP
Read the docsDocumentation
In short
Beginner-friendly guides and a full reference for every Geoverio API: authentication, endpoints, response fields and working examples you can copy.
Last reviewed 11 September 2026
Never used an API before? Perfect — this guide assumes nothing. Follow three small steps below and you will make your first successful API call today. Promise.
Quickstart
Tick each step off as you go. No prior experience, no jargon, no credit card.
Pick an email and a password — that is the whole signup. No credit card, and the free tier is genuinely free.
Keys live inside projects, and a project needs a plan. Once you are signed in, choose a plan — the free tier counts — then open Dashboard → Projects, open a project and click Create key. You will get a long string that looks like this:
gv_live_xxxxxxxxxxxxxxxxxxxxxxxx
Think of it as a password for programs. When your code talks to Geoverio, the key proves the request came from you — so we know whose account to count it against and what it is allowed to do.
And just like a password: keep it secret. Don’t paste it in public chats, screenshots, or code you push to GitHub.
Pick the API you want and the language you like. Every API on the platform works exactly the same way — one key, one header, JSON back — so whichever you start with, you have learned all of them.
Returns the full intelligence report for one IPv4 or IPv6 address.
# Keep the key in the environment, not in your shell history:
# export GEOVERIO_API_KEY="gv_live_…"
curl --fail-with-body "https://ip.geoverio.com/v1/ip/8.8.8.8" \
-H "Authorization: Bearer $GEOVERIO_API_KEY"// Call this from your server, never from the browser:
// front-end JavaScript ships your key to every visitor.
const KEY = process.env.GEOVERIO_API_KEY;
async function main() {
const res = await fetch(
"https://ip.geoverio.com/v1/ip/8.8.8.8",
{ headers: { Authorization: `Bearer ${KEY}` } }
);
// Never parse the body before checking the status: an expired key answers
// 401 with a perfectly valid JSON envelope.
if (!res.ok) {
throw new Error(`HTTP ${res.status} — ${await res.text()}`);
}
console.log(await res.json());
}
main().catch((err) => {
console.error(err);
process.exitCode = 1;
});# pip install requests
import os, requests
url = "https://ip.geoverio.com/v1/ip/8.8.8.8"
headers = {"Authorization": "Bearer " + os.environ["GEOVERIO_API_KEY"]}
r = requests.get(url, headers=headers)
r.raise_for_status() # turns 4xx / 5xx into an exception instead of silent bad data
print(r.json())<?php
// Read the key from the server environment — never commit it.
$key = getenv('GEOVERIO_API_KEY');
$ch = curl_init("https://ip.geoverio.com/v1/ip/8.8.8.8");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer $key",
"Accept: application/json",
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);
if ($status < 200 || $status >= 300) {
fwrite(STDERR, "Request failed — HTTP $status: $body\n");
exit(1);
}
print_r(json_decode($body, true));Full reference for this API: IP Lookup documentation.
Returns the combined sales tax rate for a US address or 5-digit ZIP code.
# Keep the key in the environment, not in your shell history:
# export GEOVERIO_API_KEY="gv_live_…"
curl --fail-with-body "https://tax.geoverio.com/v1/tax?address=233%20S%20Wacker%20Dr%2C%20Chicago%2C%20IL%2060606" \
-H "Authorization: Bearer $GEOVERIO_API_KEY"// Call this from your server, never from the browser:
// front-end JavaScript ships your key to every visitor.
const KEY = process.env.GEOVERIO_API_KEY;
async function main() {
const res = await fetch(
"https://tax.geoverio.com/v1/tax?address=233%20S%20Wacker%20Dr%2C%20Chicago%2C%20IL%2060606",
{ headers: { Authorization: `Bearer ${KEY}` } }
);
// Never parse the body before checking the status: an expired key answers
// 401 with a perfectly valid JSON envelope.
if (!res.ok) {
throw new Error(`HTTP ${res.status} — ${await res.text()}`);
}
console.log(await res.json());
}
main().catch((err) => {
console.error(err);
process.exitCode = 1;
});# pip install requests
import os, requests
url = "https://tax.geoverio.com/v1/tax?address=233%20S%20Wacker%20Dr%2C%20Chicago%2C%20IL%2060606"
headers = {"Authorization": "Bearer " + os.environ["GEOVERIO_API_KEY"]}
r = requests.get(url, headers=headers)
r.raise_for_status() # turns 4xx / 5xx into an exception instead of silent bad data
print(r.json())<?php
// Read the key from the server environment — never commit it.
$key = getenv('GEOVERIO_API_KEY');
$ch = curl_init("https://tax.geoverio.com/v1/tax?address=233%20S%20Wacker%20Dr%2C%20Chicago%2C%20IL%2060606");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer $key",
"Accept: application/json",
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);
if ($status < 200 || $status >= 300) {
fwrite(STDERR, "Request failed — HTTP $status: $body\n");
exit(1);
}
print_r(json_decode($body, true));Full reference for this API: Sales Tax Finder documentation.
Returns ranked address suggestions for a partial query. Call it on every keystroke after the 2nd character.
# Keep the key in the environment, not in your shell history:
# export GEOVERIO_API_KEY="gv_live_…"
curl --fail-with-body "https://autocomplete.geoverio.com/v1/autocomplete?q=1600%20amph" \
-H "Authorization: Bearer $GEOVERIO_API_KEY"// Call this from your server, never from the browser:
// front-end JavaScript ships your key to every visitor.
const KEY = process.env.GEOVERIO_API_KEY;
async function main() {
const res = await fetch(
"https://autocomplete.geoverio.com/v1/autocomplete?q=1600%20amph",
{ headers: { Authorization: `Bearer ${KEY}` } }
);
// Never parse the body before checking the status: an expired key answers
// 401 with a perfectly valid JSON envelope.
if (!res.ok) {
throw new Error(`HTTP ${res.status} — ${await res.text()}`);
}
console.log(await res.json());
}
main().catch((err) => {
console.error(err);
process.exitCode = 1;
});# pip install requests
import os, requests
url = "https://autocomplete.geoverio.com/v1/autocomplete?q=1600%20amph"
headers = {"Authorization": "Bearer " + os.environ["GEOVERIO_API_KEY"]}
r = requests.get(url, headers=headers)
r.raise_for_status() # turns 4xx / 5xx into an exception instead of silent bad data
print(r.json())<?php
// Read the key from the server environment — never commit it.
$key = getenv('GEOVERIO_API_KEY');
$ch = curl_init("https://autocomplete.geoverio.com/v1/autocomplete?q=1600%20amph");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer $key",
"Accept: application/json",
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);
if ($status < 200 || $status >= 300) {
fwrite(STDERR, "Request failed — HTTP $status: $body\n");
exit(1);
}
print_r(json_decode($body, true));Full reference for this API: Address Autocomplete documentation.
The one-line version: what actually lands in the employee's account. Everything not supplied is defaulted, so this is an estimate - use POST /v1/paycheck for a real pay run.
# Keep the key in the environment, not in your shell history:
# export GEOVERIO_API_KEY="gv_live_…"
curl --fail-with-body "https://payroll.geoverio.com/v1/paycheck/quick?gross=5000" \
-H "Authorization: Bearer $GEOVERIO_API_KEY"// Call this from your server, never from the browser:
// front-end JavaScript ships your key to every visitor.
const KEY = process.env.GEOVERIO_API_KEY;
async function main() {
const res = await fetch(
"https://payroll.geoverio.com/v1/paycheck/quick?gross=5000",
{ headers: { Authorization: `Bearer ${KEY}` } }
);
// Never parse the body before checking the status: an expired key answers
// 401 with a perfectly valid JSON envelope.
if (!res.ok) {
throw new Error(`HTTP ${res.status} — ${await res.text()}`);
}
console.log(await res.json());
}
main().catch((err) => {
console.error(err);
process.exitCode = 1;
});# pip install requests
import os, requests
url = "https://payroll.geoverio.com/v1/paycheck/quick?gross=5000"
headers = {"Authorization": "Bearer " + os.environ["GEOVERIO_API_KEY"]}
r = requests.get(url, headers=headers)
r.raise_for_status() # turns 4xx / 5xx into an exception instead of silent bad data
print(r.json())<?php
// Read the key from the server environment — never commit it.
$key = getenv('GEOVERIO_API_KEY');
$ch = curl_init("https://payroll.geoverio.com/v1/paycheck/quick?gross=5000");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer $key",
"Accept: application/json",
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);
if ($status < 200 || $status >= 300) {
fwrite(STDERR, "Request failed — HTTP $status: $body\n");
exit(1);
}
print_r(json_decode($body, true));Full reference for this API: Payroll documentation.
Put the key from step 2 in an environment variable called
GEOVERIO_API_KEY — on macOS or Linux that is
export GEOVERIO_API_KEY="gv_live_…" — then run it.
That’s it. Really. Keeping the key in the environment rather than in the
code is what stops it ending up in your shell history or a git commit.
API catalog
Every API works the same way: one key, one Bearer header, clean JSON back. Choose one and dive in.
Geolocation, network owner, VPN/proxy/Tor detection and a risk score for any IP
Read the docsCore concepts
Every Geoverio API follows the same rules. Learn them once, use them everywhere.
Authorization: Bearer YOUR_API_KEY. That’s the entire auth story.X-RateLimit-* headers showing how many requests you have left, so your code is never surprised.404 or 429) plus a JSON body that explains how to fix it.detail field. The success shape is specific to each API — its reference page lists every field it returns.For AI assistants
If you are asking Claude, ChatGPT, Cursor or Copilot to build against Geoverio — a plugin, an integration, a checkout flow — point it at the files below instead of at these pages. They are the complete reference as plain Markdown: every endpoint, parameter, response field, error code and worked example, plus the mistakes that trip implementers up. Generated from the same specification this site renders, so they are never out of date.
/docs/<api>.md/docs/ip-lookup.md.
Add .md to any reference page URL.
Grab your free API key and turn the examples above into your own app.