IPFrog API

Public API · Version 1

Network facts without the fuss.

A small, privacy-first JSON API for caller IP discovery, DNS resolution, regional latency probes, and client-side speed-test configuration. No account or API key is required.

Quick start

One request. Useful context.

Ask IPFrog what connection reached the API. The result includes the observed address, IP version, reverse hostname when available, network details, approximate location, and Cloudflare edge context.

cURL

curl --fail-with-body \
  https://api.ipfrog.com/v1/ip

JavaScript

const response = await fetch(
  'https://api.ipfrog.com/v1/ip'
)
if (!response.ok) throw new Error('Request failed')
const result = await response.json()
console.log(result.data.address)
{
  "data": {
    "address": "203.0.113.7",
    "ip_version": "ipv4",
    "reverse_hostname": null,
    "network": { "asn": 64500, "organization": "Example Network" },
    "location": { "country_code": "US", "timezone": "America/Chicago" },
    "connection": { "cloudflare_colo": "ORD", "http_protocol": "HTTP/2" },
    "data_provenance": "observed_connection"
  },
  "meta": {
    "api_version": "v1",
    "request_id": "550e8400-e29b-41d4-a716-446655440000",
    "requested_at": "2026-07-16T12:00:00.000Z"
  }
}

Endpoint reference

Everything currently public.

All success payloads use a data object and request metadata lives in meta. Open any GET example directly or copy its cURL command.

GET/v1/ip

Returns information observed from the caller’s current connection. It does not accept a target IP and is never cached.

Try in browser →
120 requests / minuteNo-store
GET/v1/dns/resolve?name={name}&type={type}

Resolves an allowlisted DNS type through IPFrog’s fixed resolver. Types: A, AAAA, CNAME, MX, NS, TXT, and PTR. For PTR, pass a normal IPv4 or IPv6 address as name.

curl 'https://api.ipfrog.com/v1/dns/resolve?name=example.com&type=A'
Try example →
30 requests / minuteDNS TTL-aware cache
GET/v1/latency/regions

Lists stable region identifiers and their current availability.

Try in browser →
Cached for 5 minutes
GET/v1/latency/regions/{region}/probe

Measures a Cloudflare edge-to-regional Durable Object round trip. This is infrastructure latency, not the caller’s complete network latency.

curl https://api.ipfrog.com/v1/latency/regions/wnam/probe
30 requests / minuteNo-storeRegions: wnam, enam, weur, eeur, apac-ne, apac-se, oc
GET/v1/speed-test/configuration

Returns the versioned measurement modes, units, limits, and analytics schema used by official clients. Speed tests execute on the client; IPFrog does not run or persist them server-side.

Try in browser →
Cached for 1 hour
POST/v1/events

Accepts documented, privacy-safe speed-test analytics events. Unknown properties are discarded; IP addresses, coordinates, hostnames, User-Agent strings, DNS contents, and persistent identifiers are prohibited.

curl --fail-with-body https://api.ipfrog.com/v1/events \
  -H 'content-type: application/json' \
  --data '{
    "event": "speed_test_completed",
    "event_id": "550e8400-e29b-41d4-a716-446655440000",
    "properties": {
      "source": "cli",
      "mode": "full",
      "duration_ms": 14000,
      "download_mbps": 242.5,
      "upload_mbps": 31.2,
      "latency_ms": 22.4,
      "jitter_ms": 3.1
    }
  }'
202 Accepted60 requests / minute4 KiB maximum body
GET/v1/health

Returns sanitized service health and the active API version without consuming DNS-provider quota.

Check service health →
Cached for 30 seconds

HTTP conventions

Predictable by design.

Errors

Errors use application/problem+json with status, a stable machine-readable code, a safe detail, and request_id.

Rate limits

Limited routes expose RateLimit-Limit, RateLimit-Remaining, and RateLimit-Reset. A 429 response also includes Retry-After.

CORS

Public endpoints allow any origin without credentials. Preflight requests use OPTIONS; GET endpoints also support HEAD.

Privacy

No accounts or API keys. Request-specific IP results are never cached. Speed-test results are not persisted by the API.

Common status codes

StatusMeaning
200Successful GET request.
202Analytics event accepted for best-effort delivery.
400Invalid parameter or JSON body.
405Unsupported method; inspect the Allow header.
429Rate limit exceeded; honor Retry-After.
502–504A bounded upstream operation failed or timed out.