n4nAI

Benchmarking API latency from India to US model endpoints

A practical analysis of India to US LLM API latency: why RTT dominates, how to measure it, and which architectural tradeoffs cut tail latency.

n4n Team5 min read1,066 words

Audio narration

Coming soon — every post will get a voice note here.

India to US LLM API latency is the silent budget line for any AI feature shipped from Bangalore or Mumbai to models hosted in Virginia or Oregon. The round-trip time across the submarine cable alone sets a hard floor that no model optimization can erase, and most teams underestimate the compounding effect of TLS handshakes on every cold call.

The physical floor: packets don’t cheat

A ping from Mumbai to us-east-1 typically reports 200–230 ms RTT. That is the speed of light in fiber taking the long way around, and it is non-negotiable. If your user in Pune makes a request that must hit a model in Ashburn, the fastest possible acknowledgment is ~200 ms away before a single token is generated.

This matters because LLM APIs are chatty. You send a large prompt, the server streams tokens back, and you may send follow-up requests in the same session. Each round trip stacks. A simple chat completion with a 1 KB prompt and a 200-token response still pays the full forward latency tax on the first byte.

What actually happens in a request

TCP and TLS overhead

A cold HTTPS connection from India to a US endpoint costs three or four round trips before application data flows: TCP SYN/SYN-ACK/ACK, then TLS 1.3 handshake (or TLS 1.2 with two extra round trips if not resumed). On a 210 ms RTT link, that is 600–900 ms of dead time before your JSON payload is even read by the model server.

Even with TLS 1.3 and session resumption, the first request after idle still pays a TCP reconnect if the socket was closed. HTTP/1.1 default close-after-response kills you.

DNS resolution adds hidden delay

Recursive DNS from an Indian resolver to a US-authoritative nameserver can add 50–100 ms if the record is not cached locally. In containerized environments that restart often, this tax is paid repeatedly. Pin endpoints via a local resolver or, during benchmarking, hardcode IPs in /etc/hosts to isolate the network variable.

Inference time vs network time

Once the request lands, the model itself may take 300–800 ms to produce the first token for a modest prompt on a mid-size model. That is comparable to the network floor. But the network tax is paid again on every subsequent interaction unless you keep the connection warm.

Streaming helps perceived latency but not the initial gap. The user sees the first token only after the network floor plus time-to-first-token (TTFT). If your UI blocks on that, India to US LLM API latency is the entire experience.

Measuring it yourself

Don’t trust vendor dashboards. Run a measurement from the same network your production traffic uses. A minimal Python script with httpx and the OpenAI-compatible client shows the breakdown:

import time, httpx, asyncio

BASE = "https://api.example-us.com/v1"

async def measure():
    async with httpx.AsyncClient(timeout=30) as c:
        # warm up DNS + TCP + TLS once
        await c.post(f"{BASE}/chat/completions",
                     json={"model":"gpt-4o-mini","messages":[{"role":"user","content":"hi"}]},
                     headers={"Authorization":"Bearer KEY"})
        # now time a realistic prompt over several iterations
        samples = []
        for _ in range(5):
            start = time.perf_counter()
            async with c.stream("POST", f"{BASE}/chat/completions",
                                json={"model":"gpt-4o-mini","messages":[{"role":"user","content":"Summarize: " + "x"*500}]},
                                headers={"Authorization":"Bearer KEY"}) as resp:
                async for chunk in resp.aiter_bytes():
                    samples.append((time.perf_counter()-start)*1000)
                    break
        samples.sort()
        p50 = samples[len(samples)//2]
        p95 = samples[int(len(samples)*0.95)]
        print(f"TTFB p50: {p50:.0f} ms, p95: {p95:.0f} ms")

asyncio.run(measure())

For a raw network view, curl with write-out isolates connection setup:

curl -s -o /dev/null -w "time_connect: %{time_connect}\ntime_starttransfer: %{time_starttransfer}\n" \
  -H "Authorization: Bearer KEY" \
  -d '{"model":"gpt-4o-mini","messages":[{"role":"user","content":"ping"}]}' \
  https://api.example-us.com/v1/chat/completions

Run this from an EC2 Mumbai instance to a US endpoint and you will see time_starttransfer routinely exceed 800 ms on cold runs, dropping to ~250 ms on warm reused connections.

Mitigation strategies

Connection reuse and HTTP/2

The single highest-leverage fix is keeping a pooled, HTTP/2 connection alive. Most OpenAI-compatible SDKs default to short-lived connections. Force a persistent client and reuse it across requests. In Python, instantiate the AsyncOpenAI client once at process start, not per call.

from openai import AsyncOpenAI
client = AsyncOpenAI(base_url="https://api.example-us.com/v1", api_key="KEY")
# reuse `client` for the process lifetime

This collapses the per-call overhead from ~700 ms to the cost of a single RTT (~210 ms) plus server TTFT.

Edge proxies and PoPs

If you cannot move compute, move the termination point. A reverse proxy in Mumbai that holds a warm HTTP/2 tunnel to the US endpoint turns the user’s experience into a local hop plus one optimized long-haul link. A minimal nginx config illustrates the keepalive idea:

upstream us_llm {
    server api.example-us.com:443;
    keepalive 32;
}
location /v1/ {
    proxy_pass https://us_llm;
    proxy_http_version 1.1;
    proxy_set_header Connection "";
    proxy_read_timeout 300s;
}

Products like Cloudflare Workers or a small NLB in India can terminate TLS for the user and forward over a kept-alive connection. The tradeoff: you add a component that must be monitored, and you may violate data-residency assumptions if the proxy logs prompts.

Model choice and streaming

Smaller models reduce TTFT, which compounds with network latency. A 7B local-or-US model may return first token in 150 ms versus 600 ms for a frontier model. If the task tolerates it, use a smaller model hosted in the US but stream immediately.

Streaming does not reduce the network floor, but it makes the floor less painful by showing progress. Always enable stream: true for interactive UX.

Gateway with fallback

An OpenRouter-class gateway such as n4n.ai can mask some transcontinental pain by honoring client routing directives and forwarding provider cache-control hints, letting you pin to a US region while keeping automatic fallback when that provider is degraded. That avoids writing your own retry-and-fallback logic across the slow link. The gateway still sits in the US, so the India to US LLM API latency floor remains, but connection pooling to the gateway’s upstream is handled centrally.

Tradeoffs: consistency vs latency vs cost

You can cut tail latency by hosting a model replica in India (via a local cloud or GPU rental). That eliminates the transcontinental RTT entirely, but you now pay for idle GPUs and take on ops burden. GPU instances in India are often scarce and priced at a premium relative to US regions, a well-known cloud pricing asymmetry. For sporadic traffic, that cost dwarfs the latency savings.

You can use a US gateway with aggressive connection reuse. Cheap, but you still eat ~200 ms minimum on every session start. For batch jobs, irrelevant; for chat, noticeable.

You can proxy at the edge. Adds architecture complexity and possible compliance scope, but delivers the best user-perceived numbers without owning GPUs.

There is no free option. The decision hinges on whether your product is interactive (latency-sensitive) or asynchronous (throughput-sensitive). If you serve 10 requests per second at p99 budget of 400 ms, edge proxy pays off. If you run nightly summarization, the raw link is fine.

Takeaway

India to US LLM API latency is fundamentally a distance problem, not a model problem. Measure it from your real deployment region, kill cold TLS handshakes with persistent HTTP/2 clients, and only invest in edge proxies or local inference if interactive tail latency is hurting retention. For most backend batch and agentic workloads, the 200 ms floor is acceptable and not worth the operational overhead of bypassing. If you need resilience across US providers, a gateway that pools connections and fails over transparently is the pragmatic middle ground.

Make the network boring so the model can be the only variable.

Tagsregional-latencyindiaapi-latencybenchmark

Written by

n4n Team

The team building n4n — a single OpenAI-compatible API in front of 240+ models, with automatic fallback, load balancing and pay-per-token metering.

More from n4n Team →

All regional api latency benchmarks posts →