API Documentation
IP geolocation, enrichment, and network intelligence. Authenticate with an API key and start querying.
Your key is stored in your browser's localStorage and never sent to our servers except in API requests.
Authentication
All API requests require an API key passed via the X-API-Key header.
curl -H "X-API-Key: mih_live_a1b2c3d4e5f6..." \ https://www.myiphelp.com/api/v1/ipdata/lookup/8.8.8.8
There are two key types:
- Live keys (
mih_live_) — count against your monthly quota and rate limits. - Test keys (
mih_test_) — return realistic sample data, unlimited, no quota impact. Use for development and integration testing.
Generate keys at Account → API → Keys.
Base URL
https://www.myiphelp.com/api/v1/ipdata
All endpoint paths below are relative to this base URL.
IP Lookup
Full geolocation and enrichment data for a single IP address.
GET /lookup/{ip}
Parameters
| ip | path | Required | IPv4 or IPv6 address |
Enter your API key above to send requests.
Example Response
{
"success": true,
"data": {
"ip": "8.8.8.8",
"country": "United States",
"country_code": "US",
"state": "California",
"state_code": "CA",
"city": "Mountain View",
"geoname_id": 5375480,
"latitude": 37.419,
"longitude": -122.057,
"timezone": "America/Los_Angeles",
"continent": "North America",
"continent_code": "NA",
"isp": "Google LLC",
"asn": 15169,
"asn_name": "GOOGLE",
"organization": "Google LLC",
"hostname": "dns.google",
"is_vpn": false,
"is_tor_exit": false,
"is_proxy": false,
"is_relay": false,
"is_anonymous": false,
"is_datacenter": true,
"is_eu": false,
"country_flag": "\ud83c\uddfa\ud83c\uddf8",
"country_tld": ".us",
"currency_name": "United States dollar",
...
}
}
Lookup Own IP
Look up the geolocation of the requesting server's IP address. Returns the same data as IP Lookup.
GET /lookup/me
Enter your API key above to send requests.
Bulk Lookup
Look up multiple IP addresses in a single request. Requires Pro or Business plan.
POST /lookup/bulk
Parameters
| ips | body | Required | Array of IP addresses (max: Pro=100, Biz=500) |
Enter your API key above to send requests.
Each IP counts as one lookup toward your monthly quota.
My IP
Return the caller's IP address (no geolocation data).
GET /me
Enter your API key above to send requests.
Example Response
{ "success": true, "data": { "ip": "203.0.113.42" } }
Usage Stats
Returns your current billing period usage: lookups, bulk, tools, and rate limit info.
GET /usage
Enter your API key above to send requests.
Response Fields
Fields included in the IP lookup response depend on your plan's field tier.
| Group | Fields | Free | Pro | Biz | Ent |
|---|---|---|---|---|---|
| Core Geo | country, country_code, state, state_code, city, geoname_id, latitude, longitude, timezone, continent, continent_code | ||||
| Network | isp, asn, asn_name, organization, hostname, domain | ||||
| Postal | postal_code | — | |||
| Security | is_vpn, is_tor_exit, is_proxy, is_relay, is_datacenter, is_bogon, is_anonymous, threat_score, ip_type | — | |||
| Cloud | cloud_provider, cloud_region | — | |||
| Country Meta | currency_code, currency_name, currency_symbol, languages, calling_code, capital, country_tld, country_flag, is_eu | — | |||
| Allocation | rir, allocation_date, registration_country | — | |||
| Summary | summary (verdict + overview) | — | |||
| Sanctions | is_sanctioned_country, sanctions_programs, corruption_index | — | — | ||
| RDAP | abuse_contact, network_name | — | — |
Plans & Pricing
Free
$0 forever
Core geolocation data. No credit card required.
- 1,000 lookups/mo
- 10 req/min
- Geo + network fields
- 1 API key + test keys
- HTTPS included
Pro
$29 /month
Security intelligence and bulk lookups.
- 100,000 lookups/mo
- 60 req/min
- VPN, proxy, Tor, threat — $99+ elsewhere
- Bulk (100 IPs/req)
- 3 keys · 7-day trial
Business
$79 /month
Sanctions, RDAP, and full intelligence.
- 500,000 lookups/mo
- 200 req/min
- Everything in Pro
- Sanctions + corruption index
- RDAP abuse + network name
- Bulk (500 IPs) · 10 keys
Enterprise
$199 /month
High-volume with dedicated support.
- 2,000,000 lookups/mo
- 500 req/min
- Everything in Business
- Bulk (1,000 IPs/req)
- 25 API keys
- Dedicated support
Why My IP Help
Annual billing saves 2 months: Pro $290/yr, Business $790/yr, Enterprise $1,990/yr. Manage subscription
Rate Limits
Rate limits are applied per API key, per minute. Every response includes rate limit headers:
| Header | Description |
|---|---|
| X-RateLimit-Limit | Max requests per minute for your plan |
| X-RateLimit-Remaining | Requests remaining in the current minute |
| Retry-After | Seconds until the rate limit resets (only on 429) |
Monthly quota limits are also enforced. When your monthly lookups are exhausted, you'll receive a 429 response with an upgrade link.
Error Codes
All errors return a consistent JSON format:
{
"success": false,
"error": {
"code": "ERROR_CODE",
"message": "Human-readable description."
}
}
| HTTP | Code | Description |
|---|---|---|
| 401 | API_KEY_MISSING | No X-API-Key header provided |
| 401 | API_KEY_INVALID | Key not found or revoked/expired |
| 403 | IP_NOT_ALLOWED | Request IP not in key's allowlist |
| 403 | PLAN_REQUIRED | Endpoint requires a higher plan |
| 403 | BULK_NOT_ALLOWED | Bulk not available on Free plan |
| 400 | INVALID_IP | Invalid IP address format |
| 404 | IP_NOT_FOUND | No geolocation data for this IP |
| 422 | PRIVATE_IP | Private/reserved IP not supported |
| 422 | BULK_LIMIT_EXCEEDED | Too many IPs in bulk request |
| 429 | QUOTA_EXCEEDED | Monthly lookup limit reached |
| 429 | RATE_LIMITED | Per-minute rate limit exceeded |
| 503 | DATABASE_NOT_FOUND | GeoIP database unavailable |
Code Examples
# Single IP lookup
curl -H "X-API-Key: mih_live_YOUR_KEY" \
"https://www.myiphelp.com/api/v1/ipdata/lookup/8.8.8.8"
# Lookup your own IP
curl -H "X-API-Key: mih_live_YOUR_KEY" \
"https://www.myiphelp.com/api/v1/ipdata/lookup/me"
# Bulk lookup
curl -X POST -H "X-API-Key: mih_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"ips": ["8.8.8.8", "1.1.1.1"]}' \
"https://www.myiphelp.com/api/v1/ipdata/lookup/bulk"
# Check usage
curl -H "X-API-Key: mih_live_YOUR_KEY" \
"https://www.myiphelp.com/api/v1/ipdata/usage"
import requests
API_KEY = "mih_live_YOUR_KEY"
BASE = "https://www.myiphelp.com/api/v1/ipdata"
headers = {"X-API-Key": API_KEY}
# Single IP lookup
resp = requests.get(f"{BASE}/lookup/8.8.8.8", headers=headers)
data = resp.json()
print(data["data"]["country"]) # "United States"
# Bulk lookup
resp = requests.post(
f"{BASE}/lookup/bulk",
headers=headers,
json={"ips": ["8.8.8.8", "1.1.1.1"]}
)
# Handle rate limits
if resp.status_code == 429:
retry_after = int(resp.headers.get("Retry-After", 60))
print(f"Rate limited. Retry in {retry_after}s")
const API_KEY = "mih_live_YOUR_KEY";
const BASE = "https://www.myiphelp.com/api/v1/ipdata";
// Single IP lookup
const resp = await fetch(`${BASE}/lookup/8.8.8.8`, {
headers: { "X-API-Key": API_KEY }
});
const { data } = await resp.json();
console.log(data.country); // "United States"
// Bulk lookup
const bulk = await fetch(`${BASE}/lookup/bulk`, {
method: "POST",
headers: {
"X-API-Key": API_KEY,
"Content-Type": "application/json"
},
body: JSON.stringify({ ips: ["8.8.8.8", "1.1.1.1"] })
});
// Check remaining quota
console.log(resp.headers.get("X-RateLimit-Remaining"));
<?php
$apiKey = "mih_live_YOUR_KEY";
$base = "https://www.myiphelp.com/api/v1/ipdata";
// Single IP lookup
$ch = curl_init("$base/lookup/8.8.8.8");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ["X-API-Key: $apiKey"],
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
echo $response["data"]["country"]; // "United States"
// Using Laravel HTTP client
$response = Http::withHeaders([
'X-API-Key' => $apiKey,
])->get("$base/lookup/8.8.8.8");
$data = $response->json('data');
package main
import (
"encoding/json"
"fmt"
"net/http"
)
func main() {
apiKey := "mih_live_YOUR_KEY"
base := "https://www.myiphelp.com/api/v1/ipdata"
req, _ := http.NewRequest("GET", base+"/lookup/8.8.8.8", nil)
req.Header.Set("X-API-Key", apiKey)
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
var result struct {
Success bool `json:"success"`
Data struct {
Country string `json:"country"`
City string `json:"city"`
} `json:"data"`
}
json.NewDecoder(resp.Body).Decode(&result)
fmt.Println(result.Data.Country) // "United States"
}