public build report · june 2026
Building ProWebLook's edge IP API.
I recently shipped an edge-first IP lookup API for ProWebLook, exposed at ipapi.proweblook.com. The goal was simple: make IP intelligence feel instant while keeping the existing billing, API-key, and user-account model intact. In the first published benchmark set, ProWebLook ranked #1 by p95 latency among the measured providers.
Low-latency IP lookups served near the requester instead of forcing every call through the origin app.
Workers and KV at the edge, with the existing CodeIgniter/MySQL application kept as the source of truth.
Public endpoint for lookups; signed internal sync for usage. No raw API keys in the edge store.
The problem
ProWebLook already had IP tooling, but an IP API has to be quick enough to sit inside other systems: fraud checks, request routing, enrichment, analytics, logging, and security filters. If every lookup has to travel back to the origin app, the call picks up distance, app boot time, database pressure, and quota bookkeeping before it can answer a simple question.
For this build I moved the lookup path to the edge. The PHP app still owns accounts, billing, admin flows, and user state. The request asking "what is this IP?" is handled close to the caller.
How it works
The public API runs behind ipapi.proweblook.com. A Cloudflare Worker validates the API key
by hash, serves the lookup from edge storage, shapes the JSON response, and records usage without waiting
for a MySQL write to finish.
- Worker at the edge: request validation, lookup, and response formatting stay on the fast path.
- KV-backed key state: the edge stores API-key hashes and quota metadata, not plaintext keys.
- Origin as source of truth: the existing ProWebLook app still owns users, admin key rotation, and balances.
- Signed usage sync: usage goes back to the origin through a server-to-server signed endpoint.
- Async quota updates: lookup latency does not depend on the origin database write.
Production work
The real work was not just deploying a Worker. The product already had users and API keys, so I had to connect the existing account system with the new edge layer without changing the way customers use the API.
Existing keys were backfilled into Cloudflare KV as hashed records. New key rotations sync to the edge store, and lookup usage is reconciled back to the origin asynchronously. The important pattern is simple: keep account truth in the app, move the read-heavy lookup path closer to the user.
Benchmarking the edge path
I did not want to publish a speed claim from one lucky curl response. The benchmark uses a fixed IP list, one runner, one timeout, warmup requests, and the same summary numbers for every provider.
I measured two ProWebLook paths separately: the normal public endpoint at /v1/ip and the
no-fallback benchmark endpoint at /v1/benchmark/ip. The first is the real product path.
The second isolates the edge lookup path.
- Latency: p50, p90, p95, p99, average, min, max, and per-IP breakdowns.
- Reliability: success rate, HTTP errors, provider-level errors, and timeouts.
- Payload cost: median response body size, because large responses still affect real integrations.
- Data parity: normalized country, region, city, latitude, longitude, timezone, ASN, and ISP fields.
- Run setup: warmups are excluded, provider order is shuffled, and every request uses the same timeout.
Benchmark result: #1 by p95
On July 1, 2026, I ran the benchmark from my local machine against four public IPs:
194.25.36.25, 8.8.8.8, 1.1.1.1, and
208.67.222.222. Each provider got two warmup requests per IP and five measured requests
per IP. Warmups were not counted in the table.
The production endpoint finished at 266.00ms p95 with 100% success.
The dedicated edge benchmark endpoint had the best median latency at 62.36ms p50.
| Rank | Provider | Success | p50 | p95 | p99 | Avg | Failures |
|---|---|---|---|---|---|---|---|
| #1 | ProWebLook Edge IP API | 100% | 75.24ms | 266.00ms | 276.97ms | 101.93ms | 0 |
| #2 | ProWebLook Edge Benchmark | 100% | 62.36ms | 273.17ms | 299.41ms | 100.02ms | 0 |
| #3 | IPLocate.io | 100% | 242.16ms | 393.15ms | 436.67ms | 227.81ms | 0 |
| #4 | IP-API.com | 100% | 269.02ms | 536.33ms | 580.40ms | 323.05ms | 0 |
| #5 | IP2Location.io | 100% | 372.82ms | 729.64ms | 808.85ms | 465.09ms | 0 |
| #6 | IPinfo | 100% | 327.56ms | 1226.84ms | 1488.20ms | 480.96ms | 0 |
| Not ranked | IPWHOIS.io | 75% | 83.14ms | 457.27ms | 985.07ms | 167.08ms | 5 timeouts |
Ranking rule: a provider had to return a successful response for every measured request. IPWHOIS.io had some fast responses, but five requests timed out, so I kept it in the table and did not rank it. ipapi.co returned HTTP 429 from this runner during a separate smoke test, so it stays in the competitor list until I can test it with usable quota.
Benchmark process
The claim is tied to this run, this provider set, and this ranking rule. I am calling ProWebLook #1 here because it had the lowest p95 among providers that completed every measured request.
- Command:
npm run benchmark:ipapi -- --providers proweblook,proweblook-benchmark,iplocate,ip-api,ipwhois,ip2location,ipinfo --runs 5 --warmups 2 --pause 450 - Runner: local development machine on July 1, 2026 at 09:54 IST.
- Timeout: each request had an
8000msceiling. - Samples: four IPs, five measured requests per IP, twenty measured requests per provider.
- Warmups: two warmup requests per IP were sent first and excluded from published stats.
- Order: provider order was shuffled per run to reduce ordering bias.
- Keys: API keys were loaded from environment variables and were not written into the output.
- Ranking: ranked providers needed
100%success, then the lowest p95 won.
Competitors tested
This first run uses providers I could call directly from the harness. Some commercial providers still need paid benchmark keys before they can be included in the ranked table.
| Provider | Why it belongs | Benchmark key status |
|---|---|---|
| IPinfo | One of the most recognized developer IP intelligence APIs. | IPINFO_TOKEN optional, preferred for fair runs. |
| MaxMind GeoIP2 | Industry reference point for GeoIP data and commercial accuracy. | MAXMIND_ACCOUNT_ID + MAXMIND_LICENSE_KEY needed. |
| IP2Location.io | Commercial geo, proxy, and network data with a public limited path. | IP2LOCATION_API_KEY optional, preferred. |
| DB-IP | Long-running IP geolocation database and API provider. | DBIP_API_KEY needed. |
| ipdata.co | Geo, ASN, and threat intelligence API used in enrichment workflows. | IPDATA_API_KEY needed. |
| IPGeolocation.io | Broad field coverage across location, ASN, company, and security data. | IPGEOLOCATION_API_KEY needed. |
| Ipregistry | Production-focused geo and threat API with company and carrier fields. | IPREGISTRY_API_KEY needed. |
| BigDataCloud | Geo API with confidence and risk-oriented data products. | BIGDATACLOUD_API_KEY needed. |
| Abstract | Popular general API provider with a dedicated IP geolocation product. | ABSTRACT_API_KEY needed. |
| ipstack | APILayer-backed geolocation API with large developer awareness. | IPSTACK_ACCESS_KEY needed. |
| ipapi.com | APILayer IP API with location, timezone, currency, ISP, and security fields. | IPAPI_COM_ACCESS_KEY needed. |
| IP-API.com | Huge free baseline that many developers already know. | No key for the free endpoint. |
| ipapi.co | Simple no-key REST baseline with broad field coverage. | No key for basic calls. |
| IPWHOIS.io | Free endpoint with a clean JSON response and threat-capable paid plans. | No key for the free endpoint. |
| IPLocate.io | Newer geo, ASN, privacy, and threat data provider worth tracking. | IPLOCATE_API_KEY optional, preferred. |