Tracer Proxy

Download on the App Store

How to see network requests on your iPhone

By Ryan · Published 2026-07-28

You can watch every network request an iPhone app makes, in plaintext, on the phone itself. It takes two ordinary iOS features: a root certificate you install and trust from Settings, and a local VPN configuration that lets an app publish device-wide proxy settings. Neither needs a jailbreak, and once both are in place the requests show up as they happen — including the ones from apps you didn't open.


Two pieces of iOS do all the work

Seeing network requests on iOS means putting something in the middle of the connection and giving it permission to decrypt. The proxy half is a NEProxySettings configuration published by a NetworkExtension provider, which is the only way to set an HTTP proxy that applies to cellular as well as Wi-Fi on a device with no MDM enrollment. The decryption half is a root certificate: TLS refuses to hand plaintext to anything that can't present a certificate signed by an authority the client already trusts, so the inspector generates its own authority and you decide to trust it. That's the whole design.

Install the certificate, then trust it — they're two decisions

iOS splits installing a root certificate and trusting it into two separate steps in two separate places, and skipping the second one is the single most common reason a capture comes back empty. Installing puts the certificate on the device; trusting it is what allows it to vouch for other hosts.

  1. Install. The inspector serves a configuration profile from 127.0.0.1 — your own device, not the internet — and iOS asks whether to allow the download. Approve it, then open Settings, tap the Profile Downloaded row near the top, and install it. The warning about an unmanaged, unsigned root is expected: the certificate was generated on your device moments earlier and no outside authority has signed it.
  2. Trust. Settings → General → About → Certificate Trust Settings, at the very bottom. Turn on the switch under "Enable Full Trust for Root Certificates". This screen only lists certificates that are already installed, so if the toggle isn't there, step 1 didn't finish.
  3. Allow the VPN configuration, confirm with Face ID or your passcode, and start a capture.

The setup guide has a screenshot of every one of those dialogs, including the VPN prompt where iOS highlights "Don't Allow" rather than the button you want.

The VPN prompt isn't what it looks like

The VPN configuration iOS asks you to approve exists to carry a proxy setting, not to tunnel your traffic somewhere. A NetworkExtension provider is the mechanism iOS offers for setting a device-wide proxy on an unmanaged phone, so an on-device inspector has to register one — and the status bar shows the VPN icon regardless of whether anything is actually being routed.

In Tracer, three details make that checkable rather than just reassuring. The provider claims a single route inside 198.18.0.0/15, the range RFC 2544 reserves for benchmarking, and the code never reads packetFlow, so nothing is captured at the packet layer at all. Every hostname is matched by declaring the empty string as a match domain, the empty string being a suffix of every hostname. And the proxy listens on loopback inside the extension process, so a request goes: app → system proxy setting → 127.0.0.1 → the real origin server. The full mechanism is in how on-device network inspection works.

One consequence worth knowing up front: this is a device-wide capture, not a per-app one. Every proxy-aware app on the phone lands in the same log, which is what makes the technique useful for reading apps you didn't write, and also why a session contains traffic you didn't knowingly cause.

What a single logged request contains

Each HTTPS connection arrives at the proxy as a CONNECT host:443 line; the proxy answers HTTP/1.1 200 Connection Established, performs the TLS handshake itself using a leaf certificate minted for that hostname on the spot, and from there records a normal HTTP conversation before forwarding it on. What gets stored for every exchange:

A captured POST to us.i.posthog.com/batch returning 200 OK in 592 milliseconds, sent by the posthog-ios SDK and served from AWS us-east-1.
One decrypted request, captured 2026-07-23. Read the grey line under the hostname: posthog-ios is the SDK that made the call, taken from the User-Agent header, and AWS · us-east-1 is where the IP resolved to.

Read a session by who it talked to, not request by request

A minute of ordinary use produces more requests than anyone wants to page through, so the useful first pass is to group them by hostname and ask who owns each host. Most of the surprises in a capture aren't individual payloads — they're the number of separate companies involved in an app you thought of as one thing. In a capture of a single indie iOS app on 2026-07-23, five organizations showed up in one session: PostHog and Google for analytics, Axiom for logs, RevenueCat for subscriptions, and Supabase for the backend.

Tracer session view listing five organizations contacted by one app: PostHog, Google, axiom.co, RevenueCat and Supabase, each with its cloud provider and region.
The same capture, grouped by company rather than by request. Each attribution comes from a specific mechanism: the hostname matched against a bundled list of 424 organizations and 1,091 host patterns, the SDK from the first token of the User-Agent, the region from an IP-to-datacenter lookup, and the CDN edge from whichever header is present — cf-ray, x-amz-cf-pop, x-served-by or x-vercel-id.

If reading those payloads is the actual goal — which requests are the app working and which are tracking riding along — that's the subject of what data apps send about you, and the teardowns do it for specific apps.

Capturing changes two things about your connections

A capture is not transparent, and both distortions are visible in the recorded exchanges rather than hidden.

When the log stays empty, it's one of three things

An empty or partial capture has three causes worth separating, because they look identical from the outside.

Telling the first two apart from the third is the annoying part. The test is to evaluate the inspector's own leaf certificate against the device's trust store: if this device trusts a certificate the app just rejected, the app is pinning. Tracer runs that check on the first leaf it mints for a session — SecTrustEvaluateWithError with network fetch disabled — and writes the verdict to the system log. A trusted verdict there means the rejection is app-side and no amount of reinstalling will fix it.

What this method can never show you

Proxy-based inspection only sees clients that honor proxy settings, which on iOS means URLSession, CFNetwork and WKWebView — the large majority of what a normal app sends, but not all of it. Absent from every capture:

Trusting a root certificate is a real decision

A trusted root certificate lets whoever holds the matching private key impersonate any website to your phone, so the question isn't whether root certificates are dangerous in the abstract — it's where this particular key lives and who can use it.

Three questions settle it for any inspector. Is the authority generated on the device, or shipped inside the app binary — a baked-in root is the same key on every user's phone. Does captured traffic leave the device. And can you remove it completely afterwards.

Tracer's answers, since it's the example throughout: the authority is an ECDSA P-256 key generated on your phone inside the Secure Enclave, marked non-exportable, named CN=Tracer CA <8 hex digits>, O=Tracer, C=US with a random suffix per install — so no two users share a root and the key can't leave the phone, not even for us. Nothing captured is sent anywhere. Removal is two steps, because the key lives in a shared keychain access group rather than the app's container: Reset Certificate in the app's settings, then delete the profile. The longer version is in inspecting HTTPS traffic without a Mac.

FAQ

Can I see network requests on an iPhone without a computer?

Yes. An App Store app can register a NetworkExtension provider that publishes device-wide proxy settings, and iOS lets you install and trust a root certificate from Settings. Together those two public iOS features are enough to log and decrypt HTTPS requests on the phone itself, with no computer and no jailbreak.

Can I see requests from other apps, or only my own?

All of them. Proxy settings published by a NetworkExtension provider apply device-wide, so every proxy-aware app on the phone is captured, not just one you built or launched. This is the difference between an on-device capture and a debugger attached to a single process.

Why do I see requests I didn't cause?

Because a capture is device-wide and iOS is busy in the background. Backgrounded apps refresh, push-triggered fetches run, and analytics SDKs flush queued events on a timer rather than when you tap something. Attribute a request by its hostname and by the SDK name in its User-Agent, not by what you happened to be doing at the time.

Is an iPhone HTTP inspector the same as a packet capture?

No. A proxy-based inspector sees framed HTTP requests from clients that honor the system proxy — URLSession, CFNetwork and WebKit — and nothing else. A packet capture records raw IP packets, including DNS, QUIC and anything using raw sockets. Recording at the packet layer needs the phone tethered to a computer; no App Store app can do it, because reading other processes' packets is what the iOS sandbox exists to prevent.

Why does nothing appear when I start a capture?

Check the trust toggle first. iOS treats installing a certificate and trusting it as two separate decisions, and a certificate that is installed but not trusted decrypts nothing. Go to Settings → General → About → Certificate Trust Settings and confirm full trust is enabled for the root your inspector generated. If hosts appear but their bodies stay empty, that is certificate pinning, not a setup problem.


Generate the certificate on the phone, trust it deliberately, capture only while you're watching, and remove the profile when you're done — that's the discipline the whole technique rests on. Tracer is free to download and walks the three steps above as a checklist in about a minute, then labels every request that appears with the company, SDK and datacenter behind it. The interesting part starts once the requests do appear: the teardowns are what tends to be in them.