> ## Documentation Index
> Fetch the complete documentation index at: https://docs.appeeky.com/llms.txt
> Use this file to discover all available pages before exploring further.

# AI answers

> Track whether ChatGPT, Claude, Gemini and Perplexity name your app when people ask for an app like it, through Appeeky or on your own model keys, and measure every listing change against it.

People ask AI assistants for apps, not only the store. AI visibility records whether ChatGPT, Claude, Gemini and Perplexity name your app when someone asks for an app like it, who they name instead, and which pages they cite. The questions live in the spec and the answers live in the repo, so `verify` can measure them before and after every push.

## What you track

An **intent** is what someone wants. Its **prompts** are how they ask for it. Both live in `appeeky.spec.yaml`, per storefront:

```yaml theme={"theme":{"light":"github-light","dark":"github-dark"}}
aiVisibility:
  countries: [us]                 # default: the first storefront under targets
  intents:
    us:
      - label: fall asleep to rain sounds
        description: Rain and storm sounds to fall asleep to   # optional
        prompts:
          - what app plays rain sounds to help me sleep
          - best free rain sounds app for iPhone
  models: [chatgpt, claude, gemini, perplexity]   # --local: which assistants to ask
  aliases: [Sleep Sounds Rain]                    # other names the assistants use for the app
  store: app-store                                # when the app is on both stores
```

| Key | Meaning |
| - | - |
| `countries` | Storefronts to watch. Default: the first storefront under `targets` |
| `intents.<country>` | `label` (8+ characters), optional `description`, and `prompts` (15+ characters each) |
| `models` | Which assistants a `--local` scan asks, among those with a key. Default: all of them |
| `aliases` | Other names for the app. The app's name and every listing title already count |
| `store` | `app-store` or `google-play`, when the app is on both. Default: App Store |

Write prompts the way a person types them, not the way you would describe the app.

## Two ways to run it

| | Through Appeeky | On your own keys |
| - | - | - |
| Needs | `APPEEKY_API_KEY` | `OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, `GEMINI_API_KEY` (or `GOOGLE_API_KEY`), `PERPLEXITY_API_KEY`: any of them |
| Who asks | Appeeky AI Visibility, on a schedule | Spec, from your machine, CI or server |
| Pays | AI Visibility credits for an extra `scan` | Each provider bills you directly |
| Suggested fixes | Yes, in the file | No |
| Commands | `visibility init`, `sync`, `pull`, `scan` | `visibility init --local`, `scan --local` |

Each key adds that assistant. With only `ANTHROPIC_API_KEY`, a local scan asks Claude alone.

## Through Appeeky

```bash theme={"theme":{"light":"github-light","dark":"github-dark"}}
npx @appeeky/spec visibility init      # write the intents Appeeky tracks into the spec
npx @appeeky/spec visibility sync      # send your edits back
npx @appeeky/spec visibility pull      # write the latest answers to appeeky/visibility/
npx @appeeky/spec visibility scan      # ask now instead of waiting for the schedule
```

* `init` writes the intents and prompts Appeeky already tracks into `aiVisibility.intents`. With none yet, Appeeky writes them from your listing, and `init` says to run it again in a few minutes. `--country <cc>` adds a storefront.
* `sync` sends the spec's intents and prompts to Appeeky. Ones that are only in Appeeky are listed, and archived only with `--prune`. `--dry-run` shows the plan and sends nothing.
* `pull` writes one file per storefront (`--country` for one).
* `scan` asks the assistants now. It uses AI Visibility credits; pull the results a few minutes later.

```
✓ appeeky/visibility/us.yaml  2 named · 3 weak · 1 missing
  missing "fall asleep to rain sounds": they name Calm Night (75%), Rain Rain (50%)
  changed "white noise for a crying baby": weak → winning (25% → 60%), up
  4 suggested fixes in the file.
```

## On your own keys

```bash theme={"theme":{"light":"github-light","dark":"github-dark"}}
export ANTHROPIC_API_KEY=…   # and/or OPENAI_API_KEY, GEMINI_API_KEY, PERPLEXITY_API_KEY
npx @appeeky/spec visibility init --local
# ✓ US: wrote 6 intents to aiVisibility.intents in appeeky.spec.yaml
```

`init --local` has your own model write intents and prompts from the listing, the target keywords and your competitors. It prints what that cost on your key, and it skips a storefront that already has intents. Edit them, then quote the scan.

### Quote before you pay

```bash theme={"theme":{"light":"github-light","dark":"github-dark"}}
npx @appeeky/spec visibility scan --local --dry-run
# US  6 intents · 24 prompts × chatgpt, claude, gemini, perplexity · about $2.45
# About $2.45 on your own keys in all. Nothing was asked.
```

`--dry-run` asks nothing and spends nothing. It also lists the assistants that have no key. Without it, the scan shows the same quote and asks `Ask the assistants for about $2.45 on your own keys?` before it spends. `--yes` skips the question.

Each prompt goes to each assistant with web search on, the way the apps answer people, and a second cheap call lists the apps each answer names. The quote is roughly, per prompt:

| Assistant | About |
| - | - |
| ChatGPT | \$0.035 |
| Claude | \$0.015 |
| Gemini | \$0.04 |
| Perplexity | \$0.008 |

The scan prints progress, then the same summary as `pull` with what it cost. An assistant that failed is listed with its error; the others still count.

### On a schedule

`--every <days>` skips a storefront scanned in the last `<days>` days:

```bash theme={"theme":{"light":"github-light","dark":"github-dark"}}
npx @appeeky/spec visibility scan --local --every 7 --yes
# US: scanned 3 days ago, next in 4.
```

Set `VISIBILITY_EVERY` (for example `7`) as a repository variable or in the Docker `.env`, with the keys as secrets. The daily routine then runs `visibility scan --local --every $VISIBILITY_EVERY --yes`. The weekly agent is not allowed to run a paid scan. See [GitHub Actions & CI](https://docs.appeeky.com/docs/spec-ci.md).

## The visibility files

`appeeky/visibility/us.yaml`:

```yaml theme={"theme":{"light":"github-light","dark":"github-dark"}}
pulledAt: 2026-11-04
source: local                     # written by a --local scan
country: us
store: app-store
appId: "1234567890"
summary: { winning: 2, weak: 3, missing: 1, noData: 0 }
intents:
  - label: fall asleep to rain sounds
    status: missing
    you: 0
    byModel: { chatgpt: 0, claude: 0, gemini: 0, perplexity: 0 }
    namedInstead: ["Calm Night (75%)", "Rain Rain (50%)"]
sources:
  - { domain: sleepsounds.app, count: 4, yours: true, url: https://sleepsounds.app/ }
fixes: []                         # suggestions from Appeeky; empty after a local scan
```

| Field | Meaning |
| - | - |
| `status` | `winning`, `weak` (some assistants name the app, rarely), `missing` (none do) or `no_data` (not scanned yet) |
| `you`, `byModel` | Share of prompts whose answer names the app (0–100), averaged and per assistant |
| `namedInstead` | Who the assistants name instead, with their share |
| `sources` | The pages the assistants cite, most cited first. `yours: true` is your website or the listing's marketing or support URL |
| `fixes` | What Appeeky suggests changing, still open |

| Other file | Written by | What is in it |
| - | - | - |
| `changes.md` | `pull`, `scan --local` | An intent moving between `missing`, `weak` and `winning`; the assistants starting or stopping to cite your site |
| `history.csv` | `scan --local` | One row per scan, intent and assistant: `date,country,intent,model,visibility_pct,position,prompts` |
| `answers/<country>.jsonl` | `scan --local` | Every answer from the last scan, with the apps it named and the pages it cited |

## Read the results and improve them

* **Missing, with the same names in `namedInstead`.** Those apps own the intent. Read their store descriptions: assistants quote store text that says what an app is for.
* **Weak on one assistant.** Read that assistant's answers in `answers/<country>.jsonl` to see what it picked and why.
* **Your site is not in `sources`.** Assistants cite pages they can read. Run `seo check` and make the site readable for AI crawlers. See [Website and Google search](https://docs.appeeky.com/docs/spec-website.md).
* **The app is named but not counted.** Add the name the assistants use to `aliases`.

A description that says what the app is for, in the words people use, can move an intent. So can the pages the assistants cite.

## Measure it

`verify` reads `ai_visibility`, the share of answers that name the app, for the first watched storefront: Appeeky's daily series, or `history.csv` from local scans. Higher is better. Experiments can use it too: `experiment add --metric ai_visibility`. See [Push, measure and revert](https://docs.appeeky.com/docs/spec-releases.md).

Related: [Website and Google search](https://docs.appeeky.com/docs/spec-website.md) · [On your own keys](https://docs.appeeky.com/docs/spec-own-keys.md) · [Listing](https://docs.appeeky.com/docs/spec-listing.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.