BASE URLhttps://api.ip-meta.xyz
API Key
Developer Reference

IPMeta API
Documentation

Real-time IP geolocation, ASN/ISP lookup, and proxy/VPN/threat intelligence — all behind a single REST API.

Free — 1K lookups/mo
Pro — 150K lookups/mo
Scale — Unlimited lookups
Setup

Authentication

Every request must include your API key as a Bearer token. Keys are prefixed ipm_live_ and scoped to your plan.

Generate keys from Dashboard → API Keys. Keys are SHA-256 hashed before storage — the plaintext is only shown once on creation.
HTTP Header
Authorization: Bearer ipm_live_<your_api_key>
cURL
curl "https://api.ip-meta.xyz/v1/ip-lookup?ip=8.8.8.8" \
  -H "Authorization: Bearer ipm_live_your_key_here"
JavaScript
const res = await fetch(
  'https://api.ip-meta.xyz/v1/ip-lookup?ip=8.8.8.8',
  { headers: { Authorization: 'Bearer ipm_live_your_key_here' } }
);
const data = await res.json();
Billing

Plans & Rate Limits

Limits reset on a 30-day rolling period from subscription date, not calendar month.

PlanLookups/moProxy/VPN/Threat dataBulk endpointTeam seats
Free1,0001
Pro150,0005
ScaleUnlimited20
Rate Limit Headers
X-RateLimit-Limit:     150000     # monthly cap
X-RateLimit-Remaining: 149987     # requests remaining
X-RateLimit-Reset:     1717977600 # unix epoch reset time
Reference

Error Codes

StatusMeaningCommon cause
401UnauthorizedMissing, malformed, or revoked API key
403ForbiddenPlan doesn't include this feature
429Too Many RequestsMonthly quota exceeded — check X-RateLimit-Reset
400Bad RequestMissing required parameters
500Internal ErrorServer-side issue — retry with exponential backoff
503Service UnavailableDatabase unreachable — retry shortly
IP Lookup

IP Lookup API

Resolve an IP address to geolocation, ASN/ISP, and proxy/VPN/threat signals in a single request.

GET/v1/ip-lookup ALL PLANSResolve an IP to geo, ASN & threat data

Resolves an IP address to latitude, longitude, city, region, country, timezone, ASN/ISP, and proxy/VPN/threat signals. Pass ?ip=auto (default) to detect from the request IP, or supply any explicit IPv4/IPv6 address.

Query Parameters
ParamTypeReqDescription
ipstringoptionalIP to resolve. Pass auto (default) to detect from request, or an explicit IPv4/IPv6 address
Response
Response
{
  "ip":           "8.8.8.8",
  "ip_version":   "v4",
  "geo": {
    "lat":      37.4056,
    "lon":      -122.0775,
    "city":     "Mountain View",
    "region":   "California",
    "country":  "US",
    "timezone": "America/Los_Angeles",
    "postal":   "94043"
  },
  "network": {
    "asn":     "AS15169",
    "isp":     "Google LLC",
    "is_mobile": false
  },
  "security": {
    "is_proxy":     false,
    "is_vpn":       false,
    "is_tor":       false,
    "is_datacenter": true,
    "threat_score": 2
  }
}
⚡ TRY ITkey from top bar
GET/v1/bulk PRO+Look up multiple IPs in one request

Resolves up to 100 IPs in a single call. Accepts a comma-separated list via query string (GET) or a JSON array in the body (POST). Each result has the same shape as /v1/ip-lookup.

Query Parameters
ParamTypeReqDescription
ipsstringrequiredComma-separated IPv4/IPv6 addresses, max 100
cURL
curl "https://api.ip-meta.xyz/v1/bulk?ips=8.8.8.8,1.1.1.1" \
  -H "Authorization: Bearer ipm_live_your_key_here"
Response
{
  "results": [
    { "ip": "8.8.8.8", "geo": { "city": "Mountain View", "country": "US" }, "network": { "asn": "AS15169", "isp": "Google LLC" } },
    { "ip": "1.1.1.1", "geo": { "city": "Sydney", "country": "AU" }, "network": { "asn": "AS13335", "isp": "Cloudflare, Inc." } }
  ]
}
POST/v1/bulk PRO+Look up multiple IPs via request body

Same as GET /v1/bulk but accepts a JSON body — useful when the IP list is long or generated programmatically.

Body
FieldTypeReqDescription
ipsstring[]requiredArray of IPv4/IPv6 addresses, max 100
cURL
curl -X POST https://api.ip-meta.xyz/v1/bulk \
  -H "Authorization: Bearer ipm_live_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{"ips": ["8.8.8.8", "1.1.1.1"]}'
Account

Usage & Quota

GET/v1/usage ALL PLANSBilling period usage stats

Returns lookup counts, plan limits, and billing period start/end. No query parameters.

⚡ TRY IT
Firebase Callable Functions

Billing Functions

These are Firebase HTTPS callable functions invoked via the Firebase SDK — not plain REST. They require an authenticated Firebase user session.

Call these via the Firebase JS SDK: httpsCallable(functions, 'functionName')(payload). They enforce Firebase Auth internally — no API key needed, but the user must be signed in.
FNcancelSubscription PRO / SCALECancel active subscription

Cancels the caller's Paystack subscription at period end (non-immediate). Verifies subscription ownership with Paystack before disabling. Takes no payload.

Response
FieldTypeDescription
successbooleanAlways true on success
messagestringHuman-readable confirmation
periodEndstring | nullISO date when access expires
Firebase SDK
import { getFunctions, httpsCallable } from 'firebase/functions';

const functions = getFunctions();
const cancel = httpsCallable(functions, 'cancelSubscription');

const result = await cancel();
// result.data = { success: true, message: "...", periodEnd: "2025-06-15" }
Error codes
CodeCause
unauthenticatedUser not signed in
failed-preconditionNo active subscription (already free)
permission-deniedSubscription doesn't match authenticated user's email
internalPaystack API error — retry
FNcontactSales ALL PLANSSend a sales / enterprise enquiry

Sends a sales/enterprise enquiry to hello@ip-meta.xyz via Resend and stores the lead in sales_leads. Unauthenticated calls are permitted (pricing page use case).

Payload Fields
FieldTypeReqDescription
namestringrequiredContact person name
emailstringrequiredContact email
companystringoptionalCompany name
messagestringoptionalFree-form message
typestringoptionalsales (pricing page) or custom (billing panel upgrade). Default: sales
currentPlanstringoptionalCaller's current plan. Default: free
FNgetPaystackConfig ALL PLANSFetch Paystack public config

Returns the Paystack public key and plan pricing for the frontend to initialize the Paystack widget. The secret key is never returned.

Response shape
Response
{
  "public_key": "pk_live_...",
  "plans": {
    "pro":   { "usd": 19, "name": "Pro" },
    "scale": { "usd": 79, "name": "Scale" }
  }
}