Take an IPv4 or IPv6 address and get country, region, city, coordinates, timezone, ASN plus Whois/RDAP data (netname, organisation, abuse contact) back. Try it instantly without signup, or grab an API key.
Both address families with full location and ASN information.
No credit card required. Full geo + ASN data. Perfect for hobby projects and side-hustles.
10 req/minute · 5,000 req/day
Org name, netname, abuse contact — worldwide, cached for speed.
Manage your own keys and inspect usage — all in the portal.
Typical use-cases of our customers
Detect suspicious logins from unusual countries, block bot traffic from hosting networks by ASN, validate orders against the shipping address.
Restrict content to allowed countries (GDPR, licensing regions, sanctions like OFAC). With precise country/region detection — no over-blocking.
Show visitors prices in their local currency, route them to the right language variant, segment reports by geographic origin.
With Whois/RDAP data you find the abuse contact for any IP — perfect for spam reports, DDoS mitigation, and incident response.
From signup to your first lookup in 4 steps
Sign up for free with email. No credit card. Verification link in your inbox.
Create a key with one click in the portal. Put it in the X-API-Key header of your requests.
GET /v1/lookup/{ip} returns JSON with country, city, coordinates, ASN, provider. Sub-50ms response from EU datacenters.
For more volume: batch endpoint (up to 100 IPs/request) or plan upgrade. Whois/RDAP data is included in all plans.
What sets us apart from other providers
| GeoIPs | Typical competitor | |
|---|---|---|
| Free plan | 5,000 lookups / day | 1,000 / day or less |
| Whois / RDAP included | Yes, in all plans | Separate add-on |
| Batch lookups | Up to 100 IPs / request | Often single calls only |
| GDPR compliant | EU hosting (DE/AT) | Often US-hosted |
| Pricing model | Flat monthly rate | Pay-per-call can get expensive |
Every API response includes the flag emoji plus a direct SVG URL — ready to embed.
Examples
deusjpbrinchfrzaThe `flag` field carries the Unicode flag emoji. Renders natively in modern browsers, iOS, Android — no extra image assets.
The `flag_url` field points to a hosted SVG. Scales losslessly, perfect for PDFs, emails and older browsers without emoji font.
All ISO 3166-1 alpha-2 country codes available. URL pattern: /flags/<code>.svg (lowercase).
Free, Starter, Business, Enterprise — all get the same flag data at no extra cost.
Embed directly
<img src="https://geoips.info/flags/de.svg" alt="DE" width="32" height="24">
URL pattern: https://geoips.info/flags/<code>.svg
All endpoints require a valid API key in the X-API-Key header.
/v1/lookup/{ip}curl -H "X-API-Key: $KEY" https://api.geoips.info/v1/lookup/8.8.8.8{
"ip": "8.8.8.8",
"ip_version": 4,
"country_code": "US",
"country_name": "United States of America",
"flag": "🇺🇸",
"flag_url": "https://geoips.info/flags/us.svg",
"region": "California",
"city": "Mountain View",
"latitude": 37.40599,
"longitude": -122.07852,
"zip": "94043",
"timezone": "-08:00",
"asn": 15169,
"as": "Google LLC",
"cidr": "8.8.8.0/24"
}/v1/lookup/selfReturns geo information for your own client IP.
curl -H "X-API-Key: $KEY" https://api.geoips.info/v1/lookup/self/v1/lookup/batchUp to 100 IPs per call (your plan cap may be lower - see pricing). Body max 64 KB. Each IP counts as 1 lookup against your shared daily limit (single + batch share the same pool).
curl -X POST -H "X-API-Key: $KEY" -H "Content-Type: application/json" \
-d '{"ips":["1.1.1.1","2606:4700:4700::1111"]}' \
https://api.geoips.info/v1/lookup/batch{ "results": [ { "ip": "1.1.1.1", ... }, { "ip": "...", "ip_version": 6, ... } ] }/v1/lookup/:ip/whoisWhois/RDAP data for the IP (netname, organisation, abuse contact, country, ASN). Served from a cache populated across all 5 RIRs (RIPE/ARIN/APNIC/LACNIC/AFRINIC). First call for an unknown IP returns 202 Accepted + pending=true; the fetch runs in the background and data is available on the next request.
curl -H "X-API-Key: $KEY" https://api.geoips.info/v1/lookup/8.8.8.8/whois{
"ip": "8.8.8.8",
"cached": true,
"whois": {
"cidr": "8.8.8.0/24",
"netname": "GOOGLE",
"country": "US",
"flag": "🇺🇸",
"flag_url": "https://geoips.info/flags/us.svg",
"org_name": "Google LLC",
"abuse_email": "network-abuse@google.com",
"source": "arin",
"fetched_at": "2026-05-27T10:00:00Z"
}
}/v1/healthReachable without an API key. For uptime monitoring.
curl https://api.geoips.info/v1/health/v1/limitsEffective plan limits + currently remaining quota for the key — for self-throttling (clients/monitoring).
curl -H "X-API-Key: $KEY" https://api.geoips.info/v1/limits{
"plan": { "code": "hobby", "name": "Hobby" },
"rate_limit_per_min": 300,
"rate_limit_per_day": 1000000,
"max_ips_per_batch": 100,
"whois": { "enabled": true, "gating_mode": "all", "limit_per_day": 2000 },
"remaining": { "per_min": 287, "per_day": 999812 }
}Every error response has status (HTTP code), often error_code (stable machine-readable code) and error (short description). For rate limits the Retry-After header is set.
| HTTP | error_code | Meaning |
|---|---|---|
| 400 | invalid_ip | Invalid IP address in path (e.g. /v1/lookup/not-an-ip). |
| 400 | private_ip | Private/reserved IP range (10.x, 192.168.x, 127.x, ::1). |
| 400 | invalid_body | Body parse error on /v1/lookup/batch (empty IP list, more than 100 IPs in body, not JSON). |
| 400 | batch_too_large | Batch contains more IPs than your plan allows per call (max_ips_per_batch). Split the batch or upgrade your plan. |
| 401 | missing_api_key | X-API-Key header missing. |
| 401 | invalid_api_key | API key does not exist, is revoked, or user is disabled. |
| 413 | body_too_large | Batch body larger than 64 KB. Split into multiple batches. |
| 429 | rate_limit_per_minute | Per-minute rate limit reached (shared for single + batch). Retry-After header says how long to wait. |
| 429 | rate_limit_per_day | Daily limit exhausted (max IPs/day). Single + batch count against the same pool. Resets at the UTC hour configured for your plan. |
| 429 | whois_quota_exhausted | Daily whois quota exhausted (separate per-plan limit). Resets at the UTC hour configured for your plan. |
| 403 | whois_plan_required | Whois is a premium feature and not enabled for your current plan — upgrade to a paid plan. |
| 202 | pending | Not an error but an intermediate status: whois data for this IP is not cached yet, the RDAP fetch is running in the background. The response includes pending=true and retry_after (seconds) — wait the indicated time and retry, then the endpoint returns 200 with the full data. |
| 503 | maintenance_mode | Platform in maintenance mode. Response includes maintenance_message + retry_after_seconds — wait the indicated time and retry. |
| 503 | whois_disabled | Whois lookup is disabled by the administrator. |
| 500 | internal_error | Server error. Retry later or contact support. |
Yes. The Free plan gives you 5,000 lookups per day and 10 per minute, permanently free. No credit card needed. You only pay when you need more volume — paid plans start at €9 / month.
Country: ~99.8% accuracy. City: ~75% within a 50 km radius — industry standard. Data comes from MaxMind GeoLite2, updated weekly. Mobile carrier IPs (e.g. T-Mobile) have inherent imprecision — we return the region instead of the city in that case.
IPv4 and IPv6 are treated equally. Per lookup: country (ISO code + name), region, city, postal code, coordinates, timezone, ASN, AS name. With the Whois/RDAP endpoint additionally: CIDR block, netname, organisation, and abuse contact straight from the RIRs.
Yes, Whois is included in every plan from Free upwards. The data comes directly from the five regional internet registries (RIPE, ARIN, APNIC, LACNIC, AFRINIC) and is cached for 30 days — sub-millisecond response on second fetch.
Servers are in the EU (Germany and Austria). We log IP addresses short-term for anti-abuse only (90 days, then auto-deleted). DPA available on request. No tracking, no third-party data sharing.
You get HTTP 429 with a Retry-After header. The limit resets at a configurable UTC hour (default 00:00 UTC). Sub-limits (per minute, per day) are exposed via the X-RateLimit-Remaining response header.
Yes. POST /v1/lookup/batch accepts up to 100 IPs per request, max 64 KB body. Each IP counts as one lookup against your daily limit. Free has a cap of 10 IPs/batch, paid plans 50–100 — see Pricing.
Single lookup typically below 30 ms (P50) from EU. Batch with 100 IPs below 100 ms. We use in-memory cache + binary IP range indexes instead of classical DB queries — no cold-start spikes.