← All posts Mobile

I Watched the App Store Reviewer Use My App

Fifteen days in the queue, then approved the same day it was opened. Here is how to tell whether review has actually started, where Apple reviews from, and the nine minutes I watched happen in my server logs.

On August 10, 2026 I submitted Restoria for App Store review. It sat at Waiting for Review for fifteen days.

Apple's norm is around twenty-four hours. Two weeks of silence is exactly long enough to start rewriting review notes, second-guessing a demo login, and wondering whether something about the build offended a static analyzer.

None of that was happening. Nobody had opened it.

On August 25, 2026 a reviewer picked it up, spent nine minutes in the app, and approved it the same day.

Stuck on "Waiting for Review" for days? Do not resubmit

If you have landed here mid-wait, that is the one thing worth saying first. Resubmitting sends you to the back of the queue. So does swapping the build, and so does editing the version in ways that require re-approval. The most common reaction to a long wait is the thing that makes the wait longer.

Before changing anything, find out whether a reviewer has opened your app at all. Usually nobody has.

The question you actually want answered

App Store Connect's web UI shows you a status. What it does not make obvious is the difference between queued and being looked at — and those are completely different situations that call for completely different behavior.

The API answers it directly:

GET https://api.appstoreconnect.apple.com/v1/reviewSubmissions?filter[app]={appId}

Read state. It moves WAITING_FOR_REVIEW → IN_REVIEW.

While it still says WAITING_FOR_REVIEW, no human has opened your app. Not "a reviewer is being thorough". Not "something looks suspicious". Nobody has started. Silence is queue latency.

That single distinction is worth wiring up, because it converts two weeks of speculation into a yes or no. Everything you would otherwise be tempted to change — resubmitting, rewriting review notes, swapping the build — resets your place in that queue and makes the wait longer.

Two more endpoints earn their keep:

  • GET /v1/apps/{appId}/appStoreVersions → appStoreState, the version's own status.
  • appStoreReviewDetail returns the demo account credentials Apple actually holds. If you suspect a reviewer is locked out, check what they were given rather than guessing. Stale review notes are a real failure mode and this is how you rule it in or out.

Authentication is an ES256 JWT signed with an App Store Connect API key. If the machine has no JWT library handy, openssl and your language's standard library are enough — it is a three-field header and a short claims set.

Where Apple reviews from

Everyone knows 17.0.0.0/8 is Apple. Most people stop there, and that is how you convince yourself Apple has not touched your app.

App Store review traffic also comes from AS714, 139.178.128.0/17. If your log filter only watches 17.x, you will see nothing and conclude nothing is happening.

It is worth being precise about what 139.178 is, because the obvious guess is wrong. It is Apple corporate and engineering — not iCloud Private Relay. You can verify that yourself: Apple publishes the Private Relay egress ranges at mask-api.icloud.com/egress-ip-ranges.csv, and there are zero 139.178 ranges in it.

One more trap. TestFlight Beta App Review and App Store review are different tracks, and both originate from Apple's network. Logs alone cannot tell you which one you are watching. That is precisely why the API question above matters — it distinguishes them and your access log cannot.

The nine minutes

Here is the reviewer session, August 25, 2026, 18:46–18:55 UTC, from 17.222.114.234:

GET  /app/version          version check on launch
POST /auth/apple           signed in with Sign in with Apple
     subscribe             hit the paywall
     AI Quick Session      used the headline feature
     start a session       ...and actually ran one
     stream video          206 range requests, so they watched it
GET  /users/blocks         the 1.2 user-generated-content checklist
     profile edit          changed something on their account

Zero non-2xx responses across the entire session.

Three things in that trace are worth more than the timing.

They did not use the demo login. I supplied one. They signed in with Apple instead. If your app only works properly for the demo account — seeded data, a bypassed paywall, a special case somewhere — a reviewer taking the front door will find whatever that special case was hiding.

They went straight to the money. Subscribe, then the flagship feature, then a real session end to end. Not a tour of settings screens. Whatever your app is for is what gets exercised.

GET /users/blocks is Guideline 1.2. If your app has user-generated content, Apple requires a way to block users and filter objectionable content. That request is a reviewer ticking a specific box. Knowing which endpoint corresponds to which guideline tells you exactly what they are checking as they check it.

You can fix things while they are in the app

This is the part that changes how you behave during review, and I want to be careful about how I put it.

The binary under review talks to your live API. Server-side changes apply to it immediately. The app Apple is testing today is your production backend, whatever you deployed five minutes ago.

I used that twice during those nine minutes:

  • A delete-account endpoint was returning 500. That is Guideline 5.1.1(v) territory — account deletion has to work. It became a clean 403 mid-review.
  • A stream-token grace period shipped roughly eight minutes before the reviewer's access token would have expired and turned their video black.

The obvious corollary is the more important one. Deploy nothing risky while a reviewer is in your app. The same mechanism that let me fix two things would have let me break everything, and a reviewer hitting a fresh 500 does not know it was a deploy. Keep the API surface green and sit on your hands.

It approved with a known crash

Worth recording honestly, because the internet's model of App Store review is more mystical than the reality.

The reviewer hit a WatchdogTermination about a second after the library grid loaded, on an iPad running iOS 26.6. I have two independent confirmations: a crash report tied to their session, and a second cold version check, which is what a relaunch looks like.

My target device family includes iPad, so iPad is a supported device and that counts against Guideline 2.1.

It approved anyway.

Draw the right conclusion from that. Not "crashes are fine" — it is getting fixed before the next submission. The lesson is that review is a human spending a few minutes forming a judgment, not an exhaustive audit, and the variance runs in both directions. Plenty of apps are rejected for less.

What I would set up before the next submission

  1. A one-command review-state check. reviewSubmissions.state, printed. It is the difference between knowing and guessing, and guessing costs you resubmissions.
  2. A log filter covering both ranges — 17.0.0.0/8 and 139.178.128.0/17 — so a reviewer session is visible while it happens rather than reconstructed afterward.
  3. An alert on non-2xx responses during any window where review might start. A 500 a reviewer sees is a rejection; a 500 you see first is a deploy.
  4. A deploy freeze from submission until the state flips, or at minimum a rule that nothing touching auth, payment or the main flow goes out unattended.

The short version

Fifteen days of silence meant nothing had happened. Nine minutes of attention decided it. The API will tell you which of those you are in, and your access log will show you the second one as it happens — if you are watching the right two IP ranges.