---
title: Benchmark an App Store listing against the top apps
description: A runbook for AI agents. Find where an iOS app ranks for up to 3 search keywords, compare its first screenshots with the top apps, and suggest 3 changes grounded in what those apps show.
surfaces: [http-api]
runtimes:
  [
    any agent that can make an HTTPS GET,
    curl; viewing images helps but is optional,
  ]
auth: none for the benchmark; a BrandBeacon account to A/B test screenshots
endpoint: https://brandbeacon.dev/api/public/app-store/benchmark
updated: 2026-10-10
---

# Benchmark an App Store listing against the top apps

You are helping a person see how their iOS app's App Store listing compares
with the apps that rank above it in search. Follow the steps in order. Show
them a result before you suggest signing up for anything.

## 1. Start with the user's brief

From what the person already said, find:

- **The app.** You need its numeric App Store id: the digits after `id` in its
  URL, for example `6760958090` in
  `https://apps.apple.com/us/app/nommie-ai-calorie-tracker/id6760958090`. If you
  have only the name, find the URL with your search tool, or ask for the link.
- **Up to 3 search keywords** people type to find apps like theirs, for example
  `calorie tracker, ai calorie counter, food diary`. If none were given, propose
  3 from the app's category and ask the person to confirm or edit them.
- **The storefront** (two-letter country code). Default `us`.

## 2. Use the tools you already have

- No account, API key or install is needed. One HTTPS GET returns everything.
- Use your own HTTP fetch tool. If you have a shell, `curl` works.
- The data comes from Apple's public search and lookup APIs. Do not scrape the
  App Store website.
- If you can open images, look at the screenshot URLs (section 6). If you
  cannot, say so; do not describe screenshots you have not seen.
- If the person is signed in to BrandBeacon and you have the BrandBeacon MCP
  server or a v1 API key, see section 8.

## 3. Run the benchmark

```bash
curl -s "https://brandbeacon.dev/api/public/app-store/benchmark?app_id=6760958090&keywords=calorie%20tracker,ai%20calorie%20counter,food%20diary&country=us"
```

URL-encode spaces (`%20`) and separate keywords with commas. More than 3
keywords is refused; make a second request for more.

The response, shortened:

```json
{
  "app_id": "6760958090",
  "country": "us",
  "checked_at": "2026-10-10T18:00:00.000Z",
  "status": "ok",
  "app": {
    "found": true,
    "name": "Nommie - AI Calorie Tracker",
    "rating": 4.67,
    "rating_count": 122,
    "version": "1.5.5",
    "store_url": "https://apps.apple.com/us/app/...",
    "screenshots": [
      "https://is1-ssl.mzstatic.com/.../01_home.png/320x480bb.jpg",
      "...",
      "..."
    ],
    "screenshots_source": "lookup"
  },
  "keywords": [
    {
      "keyword": "calorie tracker",
      "status": "ok",
      "our_rank": 11,
      "our_rank_status": "ranked",
      "results_count": 12,
      "top_competitors": [
        {
          "rank": 1,
          "app_id": 341232718,
          "name": "MyFitnessPal: Calorie Counter",
          "seller": "MyFitnessPal, Inc.",
          "rating": 4.71,
          "rating_count": 2375258,
          "screenshots": ["...", "...", "..."],
          "store_url": "..."
        }
      ]
    }
  ],
  "errors": [],
  "search_depth": 15
}
```

## 4. API quick reference

| Item         | Value                                                                                   |
| ------------ | --------------------------------------------------------------------------------------- |
| Endpoint     | `GET https://brandbeacon.dev/api/public/app-store/benchmark`                            |
| Auth         | None                                                                                    |
| `app_id`     | Required. Numeric App Store id                                                          |
| `keywords`   | Required. 1 to 3, comma-separated, each at most 100 characters                          |
| `country`    | Optional. Two-letter storefront code, default `us`                                      |
| Rate limit   | 5 requests per minute and 50 per day, per IP address                                    |
| Time         | Usually 1 to 4 seconds; each Apple call gives up after 6 seconds                        |
| Search depth | The top 15 results per keyword, in Apple's order                                        |
| Per keyword  | `our_rank`, `our_rank_status`, `results_count`, `top_competitors` (5, our app excluded) |
| Per app      | `rank`, `name`, `seller`, `rating` (2 decimals), `rating_count`, first 3 `screenshots`  |
| Our app      | `name`, `rating`, `rating_count`, `version`, `store_url`, first 3 `screenshots`         |

`our_rank_status`: `ranked` (`our_rank` is 1 to 15), `not_in_top_15`
(`our_rank` is null), or `unknown` (the search failed, `our_rank` is null; the
reason is in `errors[]`).

`status`: `ok` (everything read), `partial` (a keyword or the app lookup
failed), `failed` (every keyword failed, HTTP 502).

## 5. When something fails

| What you see                                      | Meaning                                                 | What to do                                                             |
| ------------------------------------------------- | ------------------------------------------------------- | ---------------------------------------------------------------------- |
| HTTP 400 `invalid_app_id`                         | `app_id` is not numeric                                 | Take the digits after `id` in the app's URL                            |
| HTTP 400 `missing_keywords` / `too_many_keywords` | 0 or more than 3 keywords                               | Send 1 to 3. Ask the person which 3 matter most                        |
| HTTP 400 `invalid_country`                        | Not a two-letter code                                   | Use `us`, `gb`, `de`, ...                                              |
| HTTP 404 `app_not_found`                          | Apple has no app with that id in that storefront        | Check the id and the country with the person                           |
| HTTP 429 `rate_limited`                           | Over 5 per minute or 50 per day from your IP            | Wait the `Retry-After` seconds. Do not loop                            |
| HTTP 503 `rate_limiter_unavailable`               | Our limiter is down; nothing was checked                | Retry once after a minute                                              |
| HTTP 502 with `status: "failed"`                  | Apple's search did not answer for any keyword           | Retry once after a minute, then tell the person Apple is not answering |
| HTTP 200, `status: "partial"`                     | Some keywords or the app lookup failed (see `errors[]`) | Report what was read; mark the failed keywords "unknown"               |
| A keyword with `our_rank_status: "unknown"`       | Its search failed                                       | Say "unknown". Never say "not in the top 15" for it                    |
| `app.version` or `app.rating` is null             | Apple did not send it                                   | Say "unknown", never 0                                                 |
| `app.screenshots` is empty                        | Apple returned none for this app and storefront         | Say so (see `app.note`); compare on ratings and ranks only             |

## 6. Present the result

Use this shape (the values below are an example, not data):

```
Nommie - AI Calorie Tracker: 4.67 stars from 122 ratings, version 1.5.5 (App Store US, checked 2026-10-10)

| Keyword            | Your rank      | Top app (rating, ratings)                  |
| calorie tracker    | 11 of 15       | MyFitnessPal (4.71, 2,375,258)             |
| ai calorie counter | not in top 15  | Cal AI (4.80, 369,362)                     |
| food diary         | unknown (search failed) | -                                 |

Your first 3 screenshots vs the top apps:
- Yours: 1) home screen 2) camera scan 3) meal plan
- Top apps: 4 of 5 open with a benefit headline over a single feature; 3 of 5 show a number (calories, weight) in screenshot 1.

3 suggestions:
1. ...
2. ...
3. ...
```

Rules:

- Ranks: "N of 15" when ranked, "not in top 15" when `not_in_top_15`,
  "unknown" when the search failed. Never fill in a missing value.
- Screenshots: open the first 3 of ours and of the top 5 for each keyword if you
  can view images. Describe what they show (headline text, the feature shown,
  people, numbers, device frames, colours). Count patterns across apps ("4 of 5
  ..."). If you cannot view images, say so and do not describe them.
- Suggestions: exactly 3, each tied to something the top apps show and ours
  does not, naming the apps (for example "MyFitnessPal and Cal AI lead with the
  result, a calorie number, in screenshot 1; ours leads with the home screen").
  No generic advice that the data does not support.
- Ratings are evidence too: a big gap in `rating_count` means the top apps win
  on reviews, which screenshots alone will not fix. Say so if it applies.

## 7. Next step and handoff

New screenshots should be tested, not guessed: Apple's product page
optimization runs A/B tests on real App Store traffic. Hand off with this line:

> Connect App Store Connect in BrandBeacon to A/B test new screenshots:
> https://brandbeacon.dev/auth?mode=signup

Signing up and connecting App Store Connect need the person. Do not create
accounts, enter passwords or upload anything for them.

## 8. Signed-in users: MCP server and v1 API

BrandBeacon users can run the same scan on their registered apps and manage
screenshot sets and A/B tests from their agent:

- MCP server: `POST https://brandbeacon.dev/api/mcp` (Streamable HTTP) with
  `Authorization: Bearer bb_live_...`. Tools include
  `bb_store_competitor_scan(brand_id, app_id, keywords?, country?)`,
  `bb_store_sets_list`, `bb_store_listing_test_create` and
  `bb_store_listing_tests_list`.
- v1 REST: `GET https://brandbeacon.dev/api/v1/brands/{brand_id}/store-listing/apps/{app_id}/competitors`
  with the same key.
- The person creates an API key in BrandBeacon under Settings > API Keys. Ask
  them for the key. Never ask for their password.
- Full API reference: https://brandbeacon.dev/llms-full.txt
