Watch-IP

Watch-IP vs ipapi.co

ipapi.co and Watch-IP both resolve a supplied IPv4 or IPv6 address to an approximate location, but with different authentication, free-tier scope, and batch support. The facts below were checked directly against ipapi.co's own site; neither table declares an overall winner.

ipapi.co facts on this page were checked directly against the pages listed under Sources on 2026-09-08 and can change without notice — re-check the vendor's own site before relying on a specific number. Watch-IP facts come from this repository's own code and current /pricing page. Report anything that looks stale via /contact.

What this page compares

This page compares server-side, supplied-IP lookup only — ipapi.co's core API against Watch-IP's GET /v1/lookup/{ip} and POST /v1/lookup (secret key, third-party geolocation database). It does not compare Watch-IP's separate browser visitor-geolocation product (GET /v1/geo, publishable key, origin-locked), which has no equivalent in this comparison.

Feature comparison

Watch-IPipapi.co
AuthenticationSecret key required on every request, via Authorization: Bearer.No API key on the documented free-rate endpoint (ipapi.co/{ip}/json/); paid usage is arranged separately.ipapi.co API reference · 2026-09-08
Free tier for arbitrary-IP lookupNone. Lookup plans start at $19/month. (Watch-IP's separate browser visitor-geolocation product has its own free tier — a different endpoint, key, and use case.)Free rate up to 1,000 requests/day (about 30,000/month), described as for testing and development, "not for production use."ipapi.co pricing · 2026-09-08
Entry paid tier$19/month for 5,000 lookups, 20 requests/minute.$15/month for 60,000 lookups/month; per-minute rate limit not published.ipapi.co pricing · 2026-09-08
Batch/bulk lookupPOST /v1/lookup accepts 1–100 IPs per call, returned as an array in submitted order.A bulk lookup tool is offered; ipapi.co's published API reference does not document a JSON batch endpoint or a per-call IP limit for it.ipapi.co API reference · 2026-09-08
Response fieldsip, country, region (subdivision name via GeoNames), regionCode, city, postalCode (via a compiled GeoNames index, where covered), latitude, longitude, continent, timezone (computed from coordinates), isEUCountry, asn, asOrganization, currency, callingCode, compliance, locale, sun, holiday, age, tax, found; userAgent/hostname/security optional.ip, city, region (name), country, postal, latitude, longitude, timezone, UTC offset, calling code, currency, languages, ASN, organization.ipapi.co API reference · 2026-09-08
IPv6 supportAccepted for lookup; postalCode/region come from the GeoNames index for either IP version where GeoNames has coverage (timezone is computed from coordinates instead of read from the source database directly).Advertised as "flexible IPv4/IPv6 support" across paid tiers.ipapi.co · 2026-09-08

Migrating from ipapi.co

A runnable version of every step below is in examples/migrate-from-ipapi.mjs in the Watch-IP GitHub repository — it makes both requests and prints both responses so you can diff them yourself.

1. Swap the request

Replace the unauthenticated ipapi.co request with an authenticated call to Watch-IP's lookup endpoint. The IP moves from the URL path to the same position, but every Watch-IP request needs a secret key.

ipapi.co

curl https://ipapi.co/203.0.113.1/json/

Watch-IP

curl https://api.watch-ip.com/v1/lookup/203.0.113.1 \
  -H "Authorization: Bearer YOUR_SECRET_KEY"

2. Update field names

ipapi.co's "region" is a region name (e.g. "California"); Watch-IP's "region" is also a name, resolved from a separate GeoNames table, and its ISO subdivision code (e.g. "CA") is available too as its own "regionCode" field — use whichever your code needs, no mapping table required.

ipapi.co response (partial)

{
  "city": "Mountain View",
  "region": "California",
  "country_name": "United States"
}

Watch-IP response (partial)

{
  "city": "Mountain View",
  "region": "California",
  "regionCode": "CA",
  "country": "US"
}

3. Batch multiple IPs in one call

If your integration currently loops over single ipapi.co requests, POST /v1/lookup can resolve up to 100 of them in one call instead — fewer round trips, one usage event per IP either way.

Looping single calls

for (const ip of ips) {
  const r = await fetch(`https://ipapi.co/${ip}/json/`);
  results.push(await r.json());
}

Watch-IP batch

const r = await fetch('https://api.watch-ip.com/v1/lookup', {
  method: 'POST',
  headers: {
    Authorization: 'Bearer YOUR_SECRET_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ ips }),
});
const { results } = await r.json(); // same order as `ips`

See examples/migrate-from-ipapi.mjs in the Watch-IP monorepo on GitHub for the runnable version of this migration.

Frequently asked questions

Is Watch-IP cheaper than ipapi.co?

It depends on volume and which fields you need — the two vendors' tiers don't map onto each other at matching prices, and per-request price is only part of the real cost of a migration. Compare the table above and each vendor's current pricing page directly; this page does not declare a cheaper vendor.

Does Watch-IP have a free tier for arbitrary-IP lookup like ipapi.co?

No, as of 2026-09-08. Watch-IP's IP lookup product has no free tier; its separate visitor-geolocation product (GET /v1/geo, browser-only, publishable key) does have a free tier, but that is a different product and key type, not a free arbitrary-IP lookup allowance.

Will my existing ipapi.co integration work against Watch-IP without changes?

No. Authentication, the request URL, and several field names and shapes differ — see the migration steps above and run examples/migrate-from-ipapi.mjs to see both responses side by side before rewriting your integration.

Sources

Related pages