POST /scan— kick off an immediate re-scan (useful right after a metadata change or when you want fresh data without waiting for the daily run).GET / PUT /settings— choose which AI models to scan, how often the scheduled scans run, and whether AI Visibility is enabled at all for the app.
Trigger an on-demand scan
GET /overview within roughly 3–6 minutes.
Scheduled scans run automatically — you should only need this endpoint when you want fresh data now (after a launch, a new feature, a metadata change, or right after adding new intents/prompts).
Path parameters
Body
No body is required. The scan uses the app’s saved settings (country, models, language).Response
If there are no active prompts the call returns
400 NO_PROMPTS. Run bootstrap first or add intents + prompts manually.
Same-day idempotency
Each(prompt × model × day) is fingerprinted before the model call. Re-running /scan later the same day won’t charge you for a second round of model calls — the existing answers are reused. So you can hit “Refresh” in the UI without worrying about double-billing.
If you really want a re-query on the same day (e.g. you suspect a flaky earlier answer), pause the prompt, scan, then re-activate it; or wait until tomorrow’s automatic scan.
Get or update settings
GET /v1/ai-visibility/:appId/settings
Returns the current scanning configuration for the app, plus the list of AI providers Appeeky currently has credentials for (so you can render a UI that only offers configurable options).
settings is null until you’ve called bootstrap at least once.
tier reflects the caller’s current plan and the per-plan AI Visibility caps (see pricing overview). Use it in your dashboard to grey out model toggles the user can’t actually enable: e.g. on the small plan above, only the first 2 entries in availableModels are selectable.
aiVisibilityCredits is the dedicated credit bucket for AI Visibility (separate from your general API quota). estimatedMonthlyCost is a forecast based on the current cadence and enabled models — (prompts × Σ(model_cost)) × (30 / scanCadenceDays). Use it to surface “you’ll spend ~5,760 / 8,000 this month” before the user commits to a setting change.
PUT /v1/ai-visibility/:appId/settings
All fields are optional — only the ones you provide are updated.
Cost controls
Both manual and scheduled scans bill against the dedicated AI Visibility credit bucket (api_plans.ai_visibility_monthly_credits) — not your general API quota. Each call costs per (prompt × model), summed across every model you’ve enabled.
A typical setup of 8 intents × 6 prompts = 48 prompts at the default 3-day cadence (10 scans/month) burns:
The exact estimate for your current setup is returned by
GET /settings → aiVisibilityCredits.estimatedMonthlyCost. Manual /scan calls return the per-call charge in X-Credit-Cost (and the response body’s estimatedCost).
What happens when the bucket runs low
You can detect a degraded scan in the dashboard by checking
ai_visibility_runs.models_dropped — it’s empty when the full requested set ran, otherwise it lists the silently-removed models so you can prompt the user to upgrade.
Tier limits on models[]
The PUT endpoint enforces a per-plan cap on how many models you can enable simultaneously:
If you submit
models: ["chatgpt", "claude"] on the Indie plan, the API returns 403 TIER_LIMIT_EXCEEDED and your settings stay unchanged.
A practical recommendation:
- Start with
["chatgpt"]. It’s the dominant assistant by usage and gives you the most signal per credit. - Add
perplexitywhen you want web-grounded comparisons (Perplexity returns citations alongside the answer — useful for understanding why the assistant picked an app). - Add
claudeandgeminiwhen you have evidence your audience uses them. Note thatclaudeis the most expensive at 15 credits/call — the scheduler will drop it first when budget gets tight.
Code examples
Credits
All AI Visibility endpoints meter against
api_plans.ai_visibility_monthly_credits. The middleware sets X-AiVisibility-Limit and X-AiVisibility-Remaining headers on the response so dashboards can render the current bucket state.
Errors
See also
- Bootstrap — required before the first scan
- Overview endpoint — read fresh data after the scan completes
- Intents — change what’s scanned
- Prompts — change which queries are sent

