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

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

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)

Each IP counts as one lookup toward your monthly quota.

My IP

Return the caller's IP address (no geolocation data).

GET /me

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

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
Most Popular

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

Threat detection at $29 — others charge $99+
Sanctions & RDAP data no one else offers
Test keys for risk-free development
HTTPS on all plans including Free

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"
}