AI Visibility API: mention rate, share of voice and rank on 6 engines
The AI Visibility API measures how often a brand is named in AI answers, how much of the conversation it holds against competitors and where it ranks when it appears. One call returns those numbers per entity across ChatGPT, Perplexity, Google AI Mode, Claude, Copilot and Grok, with a timeseries for trends.
Updated
- ChatGPT
- Perplexity
- Google AI Mode
- Claude
- Microsoft Copilot
- Grok
Playground
One call ranks 5 entities by how often ChatGPT names them
The AI Visibility API reads every stored answer for the prompt, model and market and returns one row per entity. In this sample, Loopwork is named in 68.4% of ChatGPT answers to the prompt and Cadence in 54.2%. Change the model or the market and the figures change, because each pair has its own stored answers.
POST /v1/visibility/entities
models[]
curl -X POST https://api.apiforgeo.com/v1/visibility/entities \ -H "Authorization: Bearer $API_FOR_GEO_KEY" \ -H "x-project-id: $PROJECT_ID" \ -H "Content-Type: application/json" \ -d '{ "prompt": "best project management tool for creative agencies", "models": [ "chatgpt" ], "country": "US", "bucketSize": "week" }'
import os, requests API = "https://api.apiforgeo.com/v1" H = {"Authorization": f"Bearer {os.environ['API_FOR_GEO_KEY']}", "x-project-id": os.environ["PROJECT_ID"]} r = requests.post(f"{API}/visibility/entities", headers=H, json={ "prompt": "best project management tool for creative agencies", "models": [ "chatgpt" ], "country": "US", "bucketSize": "week" }, timeout=30) print(r.json())
const API = "https://api.apiforgeo.com/v1"; const headers = { Authorization: `Bearer ${process.env.API_FOR_GEO_KEY}`, "x-project-id": process.env.PROJECT_ID, "Content-Type": "application/json", }; const post = (path, body) => fetch(API + path, { method: "POST", headers, body: JSON.stringify(body) }).then((r) => r.json()); console.log(await post("/visibility/entities", { "prompt": "best project management tool for creative agencies", "models": [ "chatgpt" ], "country": "US", "bucketSize": "week" }));
| Entity | Visibility | Share of voice | Avg position | Mentions | Sentiment |
|---|---|---|---|---|---|
| Loopwork | 68.4% | 24.1% | 1.8 | 137 | 76 / positive |
| Cadence | 54.2% | 19.6% | 2.4 | 111 | 68 / positive |
| Northbeam | 41.7% | 14.2% | 3.2 | 81 | 61 / neutral |
| Fieldnote | 33.9% | 11.8% | 3.8 | 67 | 58 / neutral |
| Palette OS | 22.5% | 8.4% | 4.4 | 48 | 54 / neutral |
{
"scope": {
"prompt": "best project management tool for creative agencies",
"models": [
"chatgpt"
],
"country": "US",
"responses": 420
},
"results": [
{
"entityId": "e18f3a2c",
"name": "Loopwork",
"entityType": "brand",
"visibility": 68.4,
"shareOfVoice": 24.1,
"avgPosition": 1.8,
"mentions": 137,
"sentiment": {
"score": 76,
"label": "positive"
}
},
{
"entityId": "e28f3a2c",
"name": "Cadence",
"entityType": "competitor",
"visibility": 54.2,
"shareOfVoice": 19.6,
"avgPosition": 2.4,
"mentions": 111,
"sentiment": {
"score": 68,
"label": "positive"
}
},
{
"entityId": "e38f3a2c",
"name": "Northbeam",
"entityType": "competitor",
"visibility": 41.7,
"shareOfVoice": 14.2,
"avgPosition": 3.2,
"mentions": 81,
"sentiment": {
"score": 61,
"label": "neutral"
}
},
{
"entityId": "e48f3a2c",
"name": "Fieldnote",
"entityType": "competitor",
"visibility": 33.9,
"shareOfVoice": 11.8,
"avgPosition": 3.8,
"mentions": 67,
"sentiment": {
"score": 58,
"label": "neutral"
}
},
{
"entityId": "e58f3a2c",
"name": "Palette OS",
"entityType": "other",
"visibility": 22.5,
"shareOfVoice": 8.4,
"avgPosition": 4.4,
"mentions": 48,
"sentiment": {
"score": 54,
"label": "neutral"
}
}
],
"timeseries": [
{
"bucket": "2026-08-10",
"visibility": 64.2,
"avgPosition": 2.1
},
{
"bucket": "2026-08-17",
"visibility": 65.8,
"avgPosition": 2
},
{
"bucket": "2026-08-24",
"visibility": 67.3,
"avgPosition": 1.9
},
{
"bucket": "2026-08-31",
"visibility": 68.4,
"avgPosition": 1.8
}
],
"freshness": {
"lastExecutionAt": "2026-09-02T04:12:07Z",
"bucketSize": "week"
}
} | Field | Type | Description |
|---|---|---|
entityId | uuid | Stable id for the resolved entity, aliases merged. |
name | string | Canonical entity name as configured in the project. |
entityType | enum | brand · competitor · person · product · other |
visibility | float | Percentage of in-scope responses mentioning the entity. |
shareOfVoice | float | Entity mentions ÷ all entity mentions in scope. |
avgPosition | float | Mean rank of the first mention inside the answer. Lower is better. |
mentions | int | Raw mention count across in-scope responses. |
sentiment | object | Score from 0 to 100 and its derived label. |
timeseries[] | array | One point per bucket: visibility and average position. |
Competitors
Loopwork leads Cadence by 14.2 points in the same response
The AI Visibility API returns the brand and every competitor in one response, and every row shares one denominator, so the gaps are direct. In this sample on ChatGPT in the US, Loopwork leads Cadence by 14.2 points of visibility and 4.5 points of share of voice, and is named earlier in the answer.
POST /v1/visibility/entities
curl -X POST https://api.apiforgeo.com/v1/visibility/entities \ -H "Authorization: Bearer $API_FOR_GEO_KEY" \ -H "x-project-id: $PROJECT_ID" \ -H "Content-Type: application/json" \ -d '{ "prompt": "best project management tool for creative agencies", "models": [ "chatgpt" ], "country": "US" }'
import os, requests API = "https://api.apiforgeo.com/v1" H = {"Authorization": f"Bearer {os.environ['API_FOR_GEO_KEY']}", "x-project-id": os.environ["PROJECT_ID"]} r = requests.post(f"{API}/visibility/entities", headers=H, json={ "prompt": "best project management tool for creative agencies", "models": [ "chatgpt" ], "country": "US" }, timeout=30) print(r.json())
const API = "https://api.apiforgeo.com/v1"; const headers = { Authorization: `Bearer ${process.env.API_FOR_GEO_KEY}`, "x-project-id": process.env.PROJECT_ID, "Content-Type": "application/json", }; const post = (path, body) => fetch(API + path, { method: "POST", headers, body: JSON.stringify(body) }).then((r) => r.json()); console.log(await post("/visibility/entities", { "prompt": "best project management tool for creative agencies", "models": [ "chatgpt" ], "country": "US" }));
200 OK
{
"results": [
{
"name": "Loopwork",
"entityType": "brand",
"visibility": 68.4,
"shareOfVoice": 24.1,
"avgPosition": 1.8,
"mentions": 137
},
{
"name": "Cadence",
"entityType": "competitor",
"visibility": 54.2,
"shareOfVoice": 19.6,
"avgPosition": 2.4,
"mentions": 111
},
{
"name": "Northbeam",
"entityType": "competitor",
"visibility": 41.7,
"shareOfVoice": 14.2,
"avgPosition": 3.2,
"mentions": 81
},
{
"name": "Fieldnote",
"entityType": "competitor",
"visibility": 33.9,
"shareOfVoice": 11.8,
"avgPosition": 3.8,
"mentions": 67
},
{
"name": "Palette OS",
"entityType": "other",
"visibility": 22.5,
"shareOfVoice": 8.4,
"avgPosition": 4.4,
"mentions": 48
}
]
} | Field | Type | Description |
|---|---|---|
name | string | Canonical entity name as configured in the project. |
entityType | enum | brand · competitor · person · product · other |
visibility | float | Percentage of in-scope responses mentioning the entity. |
shareOfVoice | float | Entity mentions ÷ all entity mentions in scope. |
avgPosition | float | Mean rank of the first mention inside the answer. Lower is better. |
mentions | int | Raw mention count across in-scope responses. |
Timeseries
Four weekly buckets show Loopwork gaining 4.2 points of visibility
The AI Visibility API returns a timeseries alongside the totals, one point per bucket of a day, a week or a month. In this sample, Loopwork's visibility on ChatGPT moves from 64.2% in the week of 10 August to 68.4% three weeks later, while its average position improves from 2.1 to 1.8.
POST /v1/visibility/entities
curl -X POST https://api.apiforgeo.com/v1/visibility/entities \ -H "Authorization: Bearer $API_FOR_GEO_KEY" \ -H "x-project-id: $PROJECT_ID" \ -H "Content-Type: application/json" \ -d '{ "prompt": "best project management tool for creative agencies", "models": [ "chatgpt" ], "country": "US", "bucketSize": "week" }'
import os, requests API = "https://api.apiforgeo.com/v1" H = {"Authorization": f"Bearer {os.environ['API_FOR_GEO_KEY']}", "x-project-id": os.environ["PROJECT_ID"]} r = requests.post(f"{API}/visibility/entities", headers=H, json={ "prompt": "best project management tool for creative agencies", "models": [ "chatgpt" ], "country": "US", "bucketSize": "week" }, timeout=30) print(r.json())
const API = "https://api.apiforgeo.com/v1"; const headers = { Authorization: `Bearer ${process.env.API_FOR_GEO_KEY}`, "x-project-id": process.env.PROJECT_ID, "Content-Type": "application/json", }; const post = (path, body) => fetch(API + path, { method: "POST", headers, body: JSON.stringify(body) }).then((r) => r.json()); console.log(await post("/visibility/entities", { "prompt": "best project management tool for creative agencies", "models": [ "chatgpt" ], "country": "US", "bucketSize": "week" }));
200 OK
{
"results": [
{
"name": "Loopwork",
"entityType": "brand",
"visibility": 68.4,
"avgPosition": 1.8
},
{
"name": "Cadence",
"entityType": "competitor",
"visibility": 54.2,
"avgPosition": 2.4
},
{
"name": "Northbeam",
"entityType": "competitor",
"visibility": 41.7,
"avgPosition": 3.2
},
{
"name": "Fieldnote",
"entityType": "competitor",
"visibility": 33.9,
"avgPosition": 3.8
},
{
"name": "Palette OS",
"entityType": "other",
"visibility": 22.5,
"avgPosition": 4.4
}
],
"timeseries": [
{
"bucket": "2026-08-10",
"visibility": 64.2,
"avgPosition": 2.1
},
{
"bucket": "2026-08-17",
"visibility": 65.8,
"avgPosition": 2
},
{
"bucket": "2026-08-24",
"visibility": 67.3,
"avgPosition": 1.9
},
{
"bucket": "2026-08-31",
"visibility": 68.4,
"avgPosition": 1.8
}
]
} | Field | Type | Description |
|---|---|---|
timeseries[] | array | One point per bucket: visibility and average position. |
timeseries[].bucket | date | Start of the bucket, sized by bucketSize: day, week or month. |
timeseries[].visibility | float | Visibility inside that bucket. |
timeseries[].avgPosition | float | Average position inside that bucket. |
Get started
Four setup steps lead to the first visibility read
The AI Visibility API reads runs a project has already stored, so the first read comes after four steps: create the project, generate a key in the app, import the prompts with POST /v1/queries, then run them. Reads over stored runs are not billed, so a dashboard can repeat the call as often as it refreshes.
-
Step 1
Create a project
Create an organisation and a project, one project per brand or per client.
-
Step 2
Generate a key
Generate an API key in the app; keys are managed there, never through the API.
-
Step 3
Import your prompts
Import your prompts and tags with a single POST /v1/queries.
-
Step 4
Run and read
Trigger an execution, poll the job, then read any analytics endpoint.
Comparison
A scraping API returns none of the 3 numbers the AI Visibility API computes
The AI Visibility API resolves brand aliases, ranks each entity inside the answer and computes share of voice on every stored response. An AI scraping API returns the answer text and leaves those three steps to build for each engine. A GEO dashboard tool computes them but keeps them inside its interface, and an in-house build owns them for good.
| Capability | API for GEO | AI scraping API | GEO dashboard tool | In-house build |
|---|---|---|---|---|
| Entity resolution across aliases | Yes | No | Yes, closed | Build it |
| Average position in answer | Yes | No | Yes, closed | Build it |
| Share of voice | Yes | No | Yes, closed | Build it |
Use cases
The AI Visibility API feeds 3 deliverables, one per audience
The AI Visibility API is used three ways in the site's integration patterns: platforms embed a visibility score, agencies generate monthly client tables, and brands watch for competitors overtaking them on the prompts that matter. Each card opens the full pattern, with the endpoints it combines.
A visibility score in your dashboard
One call per workspace, cached daily, renders a headline number with a sparkline from timeseries[]. Each customer sits in an isolated project, so the score ships under your brand.
AgenciesMonthly client tables, generated
The same call with a month bucket produces the client's monthly visibility table. Pulling the report again costs nothing, because reads over stored runs are not billed.
E-commerce & brandsAn alert when a rival moves ahead
Compare share of voice week over week and flag the prompts where a competitor overtakes the brand. Product categories become tags, so each alert names the category it concerns.
Pricing
AI Visibility API pricing runs from $0.013 to $0.007 per credit
The AI Visibility API reads runs that are already paid for, so the visibility call itself is not billed. Credits are spent when prompts run: one prompt on one model in one locale is one credit, with every enrichment layer included. The tier follows the month's volume, with no commitment needed to reach it.
Price per credit, set by the month's total volume.
200 prompts × 3 models × 30 runs = 18,000 credits a month, $234 at $0.013
FAQ
AI visibility data, answered
What does one call return?
The AI Visibility API returns one row per entity for the scope you set: visibility, share of voice, average position, mention count and a sentiment score with its label, plus a timeseries for the period. Brands the engines name on their own come back too, so the list is not limited to the ones you configured.
Does one prompt run count as one response?
The AI Visibility API counts one response per prompt, per model, per execution. Running 200 prompts on 3 models produces 600 responses per run, and every aggregate reads all of them, so the denominator grows with each execution inside the date range you query.
Can I track competitors I don't own?
The AI Visibility API treats competitors as ordinary entities, so any brand can be tracked with the same numbers as your own. Brands the engines bring up unprompted are detected and returned as well, which means a new rival shows up in the results before anyone adds it to the project.
Do reads cost credits?
The AI Visibility API does not bill reads. Credits are consumed by executions, when a prompt runs against a model, and every analytics read over stored runs is unmetered. A dashboard can therefore refresh the visibility table as often as it needs without moving the monthly bill.
Can I resell visibility data?
The AI Visibility API allows resale and white-label use. The response carries no API for GEO branding, and each end customer can sit in an isolated project of your organisation, so platforms and agencies can show the numbers as their own metrics at a price they set.
Related GEO APIs
AI Model Comparison API →
Split the same visibility across models to see which engine under-represents the brand.
APIPrompt Tracking API →
Create and run the prompt set that feeds every visibility number.
APIFan-Out API →
Find the follow-up questions where visibility is still unclaimed.
Same topic: AI visibility tool · AI search visibility guide