APIAI Insights
AI visibility API. Whether ChatGPT and Gemini name you, in your own dashboard.
AI Insights asks your prompts to ChatGPT and Gemini and records who they name and link to. It also counts the visits that come to your site from AI assistants. The AI visibility API hands you all of it: per prompt, per AI, per page and per month.
Mentioned or linked
For every prompt, per AI.
Who else
The sites the AIs name instead of you.
Visits from AI
Sessions, conversions and revenue from GA4.
Google AI Overview
Whether Google cites you for your tracked keywords.
Eight AI visibility endpoints, eight MCP tools
Each endpoint is a POST to /rest/v1/<endpoint> on app.marketingtracer.com. In your AI assistant the same data is the MCP tool under each endpoint. An AI is always called by the name you know from your visits: chatgpt, gemini, perplexity, copilot and so on.
| Endpoint and MCP tool | What you get |
|---|---|
aiinsights.summaryget_aiinsights_summary | How often the AIs mention you and link to you, against the previous period, per AI, plus your prompts and what is connected. |
aiinsights.promptsget_aiinsights_prompts | Every prompt with per AI the latest status (linked, mentioned, none, nosearch when the AI did not search the web, null before the first answer), your place as a source, who else is named, and twelve weeks of history. |
aiinsights.promptget_aiinsights_prompt | One prompt: the full answer of each AI, the sources it cited with yours marked, and the visits on your cited pages. |
aiinsights.competitorsget_aiinsights_competitors | Which sites the AIs name for your prompts, against 28 days earlier, and the pages of others they cite most. |
aiinsights.traffic_summaryget_aiinsights_traffic_summary | Visits from AI assistants, engaged visits, conversions and revenue, against the previous period, per AI, and the share of all your visits. |
aiinsights.traffic_pagesget_aiinsights_traffic_pages | The same per landing page, with the number of prompts for which an AI cites that page. |
aiinsights.traffic_monthlyget_aiinsights_traffic_monthly | Visits from AI per month over 16 months, per AI. |
aiinsights.ai_overviewsget_aiinsights_ai_overviews | Per Rank tracker keyword: whether Google shows an AI Overview, whether it cites you and in which place, and who it names instead. |
Every endpoint takes site_id. summary, traffic_summary and traffic_pages cover the last 28 days up to yesterday; pass from and to (YYYY-MM-DD) for another period. traffic_monthly takes to, prompt takes the prompt_id from prompts. The three traffic endpoints need GA4; ai_overviews needs keywords in the Rank tracker.
How often you are named, as the API returns it
curl -X POST https://app.marketingtracer.com/rest/v1/aiinsights.summary \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"site_id": "YOUR_SITE_ID"}'
A real site with six prompts, its id changed and shortened where you see …:
{
"data": {
"prompts": 6,
"answers": 9,
"mentioned": 8,
"linked": 0,
"mentioned_pct": {"value": 88.89, "previous": 66.67, "change": 22.22, "change_pct": 33.3},
"linked_pct": {"value": 0, "previous": 16.67, "change": -16.67, "change_pct": -100},
"per_engine": [
{"key": "chatgpt", "label": "ChatGPT", "answers": 6, "mentioned": 5, "linked": 0},
{"key": "gemini", "label": "Gemini", "answers": 3, "mentioned": 3, "linked": 0}
],
…
},
"meta": {
"site_id": "YOUR_SITE_ID",
"period": {"from": "2026-10-02", "to": "2026-10-29", "compare_from": "2026-09-04", "compare_to": "2026-10-01"}
}
}
This site is named more often than a month ago, but no AI links to it any more. An answer counts once per prompt and per AI: the latest one. change is in percentage points, change_pct in percent.
And the visits from AI to a parenting site, from aiinsights.traffic_summary:
"sessions": {"value": 59, "previous": 26, "change": 33, "change_pct": 126.9},
"engaged_sessions": {"value": 46, "previous": 17, "change": 29, "change_pct": 170.6},
"all_sessions": 26226,
"ai_share_pct": 0.22,
"per_engine": [{"key": "chatgpt", "label": "ChatGPT", "sessions": 59, "engaged_sessions": 46, "conversions": 0, "revenue_eur": 0}]
An AI line in your monthly report
People have started to ask whether ChatGPT knows them. Put the mention rate from aiinsights.summary and the visits from aiinsights.traffic_summary next to the Google numbers in your own report, with the change since last month. The question is answered before anyone asks it.
The prompts where a competitor wins
Take aiinsights.prompts and keep the ones where you are not mentioned and a competitor is. That list is your content plan for AI search: per prompt you see who is named and, through aiinsights.prompt, which pages the AI cited in its answer.
Every endpoint, argument and field
Generated from the same definitions the API itself runs on, and the example answers are tested against them, so this reference is never behind. Every endpoint is a POST with a JSON body; reading endpoints also take a GET with the same arguments in the query string. Send your API key as Authorization: Bearer YOUR_API_KEY. Every answer is {"data": …, "meta": {…}}: meta.site_id always, meta.next_cursor and meta.total for a list, meta.period where the endpoint covers a period. An error is {"error": {"code", "message"}} with the HTTP status: 400 invalid_argument, unknown_argument or missing_argument; 401 not_authenticated; 403 no_access or tool_off; 404 not_found; 429 rate_limited. The machine-readable version is openapi.json.
aiinsights.summary
POST /rest/v1/aiinsights.summary · MCP tool get_aiinsights_summary
Returns the AI visibility of one site: of the current answers (per prompt and AI the latest answer, if it is at most 62 days old), how many mention the site (name it or link to it) and how many link to it (cite one of its pages as a source), as a share now against the last day of the previous period, also per AI (ChatGPT, Gemini); plus the prompts, the measuring package and what is connected. One measurement is one prompt asked to one AI; one round asks every prompt once, at the package's frequency.
Arguments
| Argument | Type | What it does |
|---|---|---|
site_id (required) | string | The site: its id from list_sites, or the id in the app’s address. |
from | string, YYYY-MM-DD | First day of the period, YYYY-MM-DD; give it together with to. Without from and to, the period is the last 28 days up to yesterday, against the 28 days before. |
to | string, YYYY-MM-DD | Last day of the period, YYYY-MM-DD (at most yesterday); give it together with from. The previous period is then the same days one month earlier. |
Example request
curl -X POST https://app.marketingtracer.com/rest/v1/aiinsights.summary \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"site_id":"YOUR_SITE_ID"}'
Example response · A real answer, anonymised and shortened to two items per list.
{
"data": {
"prompts": 6,
"prompts_measured": 6,
"last_measured_date": "2026-10-27",
"engines": [{"key": "chatgpt", "label": "ChatGPT"}, {"key": "gemini", "label": "Gemini"}],
"answers": 9,
"mentioned": 8,
"linked": 0,
"mentioned_pct": {"value": 88.89, "previous": 66.67, "change": 22.22, "change_pct": 33.3},
"linked_pct": {"value": 0, "previous": 16.67, "change": -16.67, "change_pct": -100},
"per_engine": [
{"key": "chatgpt", "label": "ChatGPT", "answers": 6, "mentioned": 5, "linked": 0},
{"key": "gemini", "label": "Gemini", "answers": 3, "mentioned": 3, "linked": 0}
],
"brand_terms": ["Example"],
"competitors": [],
"ga4_connected": true,
"search_console_connected": true,
"rank_tracker_keywords": 10,
"package": {"frequency": "monthly", "measurements": 30},
"included": {"frequency": "monthly", "measurements": 30},
"measurements_used": 12,
"can_write": true,
"can_set_plan": true,
"can_buy": false
},
"meta": {
"site_id": "YOUR_SITE_ID",
"period": {
"from": "2026-10-02",
"to": "2026-10-29",
"compare_from": "2026-09-04",
"compare_to": "2026-10-01"
}
}
}
Response fields · in data:
| Field | Type | What it is |
|---|---|---|
prompts | integer | Prompts of the site. |
prompts_measured | integer | Prompts with at least one current answer. |
last_measured_date | string or null | The day of the site's newest answer, YYYY-MM-DD; null before the first answer. |
engines | array | The AIs the prompts are asked to. |
engines[].key | string | chatgpt or gemini. |
engines[].label | string | The name to show. |
answers | integer | Current answers: per prompt and AI the latest answer, if it is at most 62 days old. |
mentioned | integer | Current answers that mention the site (name it or link to it). |
linked | integer | Current answers that link to the site (cite one of its pages as a source). |
mentioned_pct | object | The share of current answers that mention the site, 0-100, on the last day of the period, against the last day of the previous period. |
mentioned_pct.value | number or null | Now (or on to); null without answers. |
mentioned_pct.previous | number or null | The previous period; null when there was nothing to compare with. |
mentioned_pct.change | number or null | value minus previous (for a _pct field: percentage points). |
mentioned_pct.change_pct | number or null | The change in percent of previous; null when previous is 0 or null. |
linked_pct | object | The share of current answers that link to the site, 0-100, on the last day of the period, against the last day of the previous period. |
linked_pct.value | number or null | Now (or on to); null without answers. |
linked_pct.previous | number or null | The previous period; null when there was nothing to compare with. |
linked_pct.change | number or null | value minus previous (for a _pct field: percentage points). |
linked_pct.change_pct | number or null | The change in percent of previous; null when previous is 0 or null. |
per_engine | array | The same counts per AI. |
per_engine[].key | string | chatgpt or gemini. |
per_engine[].label | string | The name to show. |
per_engine[].answers | integer | Current answers of this AI. |
per_engine[].mentioned | integer | Answers that mention the site. |
per_engine[].linked | integer | Answers that link to the site. |
brand_terms | array<string> | The names we look for in the answers. |
competitors | array<string> | The followed competitors (the list shared with the Rank tracker). |
ga4_connected | boolean | Whether GA4 is connected; the traffic endpoints need it. |
search_console_connected | boolean | Whether Search Console is connected. |
rank_tracker_keywords | integer | Tracked keywords in the Rank tracker; aiinsights.ai_overviews needs them. |
package | object | The measuring package of the site. |
package.frequency | string | monthly, biweekly or weekly: how often a round runs. |
package.measurements | integer | Measurements per round. |
included | object | The package that comes with every site. |
included.frequency | string | monthly, biweekly or weekly: how often a round runs. |
included.measurements | integer | Measurements per round. |
measurements_used | integer | Measurements the prompts take per round; above the package, the newest prompts are paused. |
can_write | boolean | Whether the caller may add and change prompts. |
can_set_plan | boolean | Whether the caller may set a package for the site (white label admins). |
can_buy | boolean | Whether the caller may buy a bigger package. |
aiinsights.prompts
POST /rest/v1/aiinsights.prompts · MCP tool get_aiinsights_prompts
Returns the prompts of one site, oldest first, with per AI the status of the current answer (linked: the site is a source; mentioned: named, not linked; none: not named; nosearch: the AI did not search the web and did not name the site; null: no answer from the last 62 days), the site's place among the sources, the other sites that appear in the answers, and the best status per week over the last 12 weeks.
Arguments
| Argument | Type | What it does |
|---|---|---|
site_id (required) | string | The site: its id from list_sites, or the id in the app’s address. |
Example request
curl -X POST https://app.marketingtracer.com/rest/v1/aiinsights.prompts \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"site_id":"YOUR_SITE_ID"}'
Example response · A real answer, anonymised and shortened to two items per list (weeks: the first two of the twelve).
{
"data": [
{
"id": "6a38ed0ec1b8515f372efd22",
"prompt": "welke webshop verkoopt de beste dakdragers?",
"engines": ["chatgpt", "gemini"],
"brand_terms": ["Example Shop"],
"paused": false,
"errors": [],
"created_at": "2026-06-22T08:06:38Z",
"per_engine": [
{
"key": "chatgpt",
"label": "ChatGPT",
"asked": true,
"status": "none",
"position": null,
"date": "2026-10-26"
},
{
"key": "gemini",
"label": "Gemini",
"asked": true,
"status": null,
"position": null,
"date": null
}
],
"also_mentioned": ["google.com"],
"weeks": [{"date": "2026-08-10", "status": "none"}, {"date": "2026-08-17", "status": "none"}]
},
{
"id": "6a38ed0ec1b851609b415f32",
"prompt": "ik zoek een hondenrek voor mijn audi a3",
"engines": ["chatgpt", "gemini"],
"brand_terms": ["Example Shop"],
"paused": false,
"errors": [],
"created_at": "2026-06-22T08:06:38Z",
"per_engine": [
{
"key": "chatgpt",
"label": "ChatGPT",
"asked": true,
"status": "none",
"position": null,
"date": "2026-10-26"
},
{
"key": "gemini",
"label": "Gemini",
"asked": true,
"status": null,
"position": null,
"date": null
}
],
"also_mentioned": ["dogguards.co.uk", "bol.com"],
"weeks": [
{"date": "2026-08-10", "status": "none"},
{"date": "2026-08-17", "status": "linked"}
]
}
],
"meta": {"site_id": "YOUR_SITE_ID", "next_cursor": null, "total": 30}
}
Response fields · data is a list; each item has:
| Field | Type | What it is |
|---|---|---|
id | string | The prompt id; prompt_id in aiinsights.prompt. |
prompt | string | The question as asked. |
engines | array<string> | The AIs this prompt is asked to. |
brand_terms | array<string> | Extra names looked for in the answers to this prompt. |
paused | boolean | Whether the prompt is above the package and not asked. |
errors | array<string> | Keys of the AIs (chatgpt, gemini) whose latest attempt failed. |
created_at | string or null | When the prompt was added, ISO 8601 UTC. |
per_engine | array | The latest answer per AI. |
per_engine[].key | string | chatgpt or gemini. |
per_engine[].label | string | The name to show. |
per_engine[].asked | boolean | Whether this prompt is asked to this AI. |
per_engine[].status | string or null | linked, mentioned, none or nosearch for the current answer; null when there is no answer from the last 62 days. |
per_engine[].position | integer or null | The site's first place among the answer's sources; null when the answer does not link to the site. |
per_engine[].date | string or null | The day of the answer, YYYY-MM-DD; null without a current answer. |
also_mentioned | array<string> | The other domains that appear most often in the current answers (cited or named), at most 3. |
weeks | array | The best status over the AIs per week, oldest first, 12 weeks. |
weeks[].date | string | The Monday of the week, YYYY-MM-DD. |
weeks[].status | string or null | linked, mentioned, none, nosearch, or null without an answer that week. |
aiinsights.prompt
POST /rest/v1/aiinsights.prompt · MCP tool get_aiinsights_prompt
Returns one prompt up close: per AI its status per week over the last 12 weeks, and its latest answer with the text, the sources it cited (the site's own pages marked) and the other sites in it; plus the site's own pages the AIs cite, with their visits from AI over the last 28 days (GA4).
Arguments
| Argument | Type | What it does |
|---|---|---|
site_id (required) | string | The site: its id from list_sites, or the id in the app’s address. |
prompt_id (required) | string | The id from aiinsights.prompts. |
Example request
curl -X POST https://app.marketingtracer.com/rest/v1/aiinsights.prompt \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"site_id":"YOUR_SITE_ID","prompt_id":"6ae4bb24c906bf28bc7fa65e"}'
Example response · A real answer, anonymised and shortened to two items per list.
{
"data": {
"id": "6ae4bb24c906bf28bc7fa65e",
"prompt": "Waar koop ik accessoires voor een BYD Seal U DM-i?",
"country": "nl",
"language": "nl",
"engines": ["chatgpt", "gemini"],
"brand_terms": ["Example Shop"],
"created_at": "2026-10-30T15:43:32Z",
"per_engine": [
{
"key": "chatgpt",
"label": "ChatGPT",
"weeks": [
{"date": "2026-10-19", "status": null, "position": null},
{"date": "2026-10-26", "status": "linked", "position": 2}
],
"answer": {
"date": "2026-10-30",
"status": "linked",
"position": 2,
"text": "Voor het aanschaffen van accessoires voor uw BYD Seal U DM-i in Nederland zijn er diverse opties beschikbaar:\n\n1. **Mardexo**: Deze Nederlandse webshop biedt specifieke accessoires voor de BYD Seal U DM-i …",
"sources": [
{
"position": 1,
"url": "https://mardexo.nl/collections/byd-seal-u-accessoires/products/opbergbak-bagageruimte-byd-seal-u-dm-i",
"domain": "mardexo.nl",
"own": false
},
{
"position": 2,
"url": "https://www.example-shop.com/byd-seal-u",
"domain": "example-shop.com",
"own": true
}
],
"other_sites": [
{"domain": "mardexo.nl", "mentioned": true, "position": 1},
{"domain": "broditnederland.nl", "mentioned": true, "position": 3}
]
}
},
{
"key": "gemini",
"label": "Gemini",
"weeks": [
{"date": "2026-10-19", "status": null, "position": null},
{"date": "2026-10-26", "status": "linked", "position": 3}
],
"answer": {
"date": "2026-10-30",
"status": "linked",
"position": 3,
"text": "Voor accessoires en onderdelen voor de **BYD Seal U DM-i** kun je op verschillende plekken terecht …",
"sources": [
{
"position": 1,
"url": "https://www.topbyd.com/collections/byd-sealion-6-seal-u-accessoriess",
"domain": "topbyd.com",
"own": false
},
{
"position": 2,
"url": "https://www.shop4ev.com/en/collections/byd-seal-u",
"domain": "shop4ev.com",
"own": false
}
],
"other_sites": [
{"domain": "topbyd.com", "mentioned": true, "position": 1},
{"domain": "shop4ev.com", "mentioned": true, "position": 2}
]
}
}
],
"own_pages": [
{
"url": "https://www.example-shop.com/byd-seal-u",
"path": "/byd-seal-u",
"cited_by": [{"key": "chatgpt", "position": 2}],
"ai_sessions": null,
"conversions": null,
"revenue_eur": null
}
]
},
"meta": {"site_id": "YOUR_SITE_ID"}
}
Response fields · in data:
| Field | Type | What it is |
|---|---|---|
id | string | The prompt id. |
prompt | string | The question as asked. |
country | string or null | Two-letter code of the country the prompt is asked for; null when not set. |
language | string or null | Two-letter language code; null when not set. |
engines | array<string> | The AIs this prompt is asked to. |
brand_terms | array<string> | Extra names looked for in the answers to this prompt. |
created_at | string or null | When the prompt was added, ISO 8601 UTC. |
per_engine | array | Per AI. |
per_engine[].key | string | chatgpt or gemini. |
per_engine[].label | string | The name to show. |
per_engine[].weeks | array | 12 weeks, oldest first. |
per_engine[].weeks[].date | string | The Monday of the week, YYYY-MM-DD. |
per_engine[].weeks[].status | string or null | linked, mentioned, none or nosearch; null without an answer that week. |
per_engine[].weeks[].position | integer or null | The site's first place among the sources; null when that answer does not link to the site. |
per_engine[].answer | object or null | The current answer (the latest, at most 62 days old); null when there is none. |
per_engine[].answer.date | string | The day of the answer, YYYY-MM-DD. |
per_engine[].answer.status | string | linked, mentioned, none or nosearch. |
per_engine[].answer.position | integer or null | The site's first place among the sources; null when the answer does not link to the site. |
per_engine[].answer.text | string | The answer as the AI gave it (usually Markdown), cut at 6,000 characters. |
per_engine[].answer.sources | array | The pages the answer cites, in order. |
per_engine[].answer.sources[].position | integer | The place among the sources. |
per_engine[].answer.sources[].url | string | The page. |
per_engine[].answer.sources[].domain | string | Its domain. |
per_engine[].answer.sources[].own | boolean | Whether it is a page of the site itself. |
per_engine[].answer.other_sites | array | The other sites in the answer. |
per_engine[].answer.other_sites[].domain | string | The domain. |
per_engine[].answer.other_sites[].mentioned | boolean | Whether the text names it. |
per_engine[].answer.other_sites[].position | integer or null | Its first place among the sources; null when only named. |
own_pages | array | The site's own pages the current answers cite. |
own_pages[].url | string | The page. |
own_pages[].path | string | Its path. |
own_pages[].cited_by | array | Which AI cites it, and where. |
own_pages[].cited_by[].key | string | chatgpt or gemini. |
own_pages[].cited_by[].position | integer or null | This page's place among that answer's sources. |
own_pages[].ai_sessions | integer or null | Visits from AI assistants to this page, last 28 days; null without GA4. |
own_pages[].conversions | number or null | Key events of those visits, last 28 days (GA4); null without GA4. |
own_pages[].revenue_eur | number or null | Revenue of those visits in euro, last 28 days (GA4); null without GA4. |
aiinsights.competitors
POST /rest/v1/aiinsights.competitors · MCP tool get_aiinsights_competitors
Returns who appears in the current answers to the site's prompts (named or cited), against 28 days earlier: the site itself, the other sites (the 15 that appear most, plus every followed competitor), the pages of other sites the AIs cite most often, and the followed competitors.
Arguments
| Argument | Type | What it does |
|---|---|---|
site_id (required) | string | The site: its id from list_sites, or the id in the app’s address. |
Example request
curl -X POST https://app.marketingtracer.com/rest/v1/aiinsights.competitors \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"site_id":"YOUR_SITE_ID"}'
Example response · A real answer, anonymised and shortened to two items per list.
{
"data": {
"answers": 58,
"own": {
"domain": "example-shop.com",
"answers": 58,
"mentioned": 10,
"linked": 9,
"mentioned_previous": 0,
"per_engine": [
{"key": "chatgpt", "label": "ChatGPT", "mentioned": 4},
{"key": "gemini", "label": "Gemini", "mentioned": 6}
]
},
"cited_pages": [
{
"url": "https://www.leapmotor.net/nl-nl/andere-producten/b10-accessoires",
"domain": "leapmotor.net",
"citations": 2,
"prompts": 1
},
{
"url": "https://www.car-blaze.com/collections/leapmotor-b10",
"domain": "car-blaze.com",
"citations": 2,
"prompts": 1
}
],
"sites": [
{
"domain": "youtube.com",
"answers": 8,
"mentioned": 6,
"linked": 8,
"answers_previous": 0,
"followed": false,
"per_engine": [
{"key": "chatgpt", "label": "ChatGPT", "answers": 6},
{"key": "gemini", "label": "Gemini", "answers": 2}
]
},
{
"domain": "google.com",
"answers": 7,
"mentioned": 6,
"linked": 7,
"answers_previous": 0,
"followed": false,
"per_engine": [
{"key": "chatgpt", "label": "ChatGPT", "answers": 6},
{"key": "gemini", "label": "Gemini", "answers": 1}
]
}
],
"competitors": []
},
"meta": {"site_id": "YOUR_SITE_ID"}
}
Response fields · in data:
| Field | Type | What it is |
|---|---|---|
answers | integer | Current answers (per prompt and AI the latest, at most 62 days old). |
own | object | The site itself. |
own.domain | string | The site's domain. |
own.answers | integer | The same as answers. |
own.mentioned | integer | Current answers that mention the site. |
own.linked | integer | Current answers that link to it. |
own.mentioned_previous | integer or null | Answers that mentioned it 28 days earlier; null when there were no answers then. |
own.per_engine | array | Mentions per AI. |
own.per_engine[].key | string | chatgpt or gemini. |
own.per_engine[].label | string | The name to show. |
own.per_engine[].mentioned | integer | Answers that mention the site. |
sites | array | Other sites in the current answers (cited or named): the 15 that appear most, then every other followed competitor (with 0 when absent). |
sites[].domain | string | The domain. |
sites[].answers | integer | Answers it appears in (named or as a source). |
sites[].mentioned | integer | Answers whose text names it. |
sites[].linked | integer | Answers that cite it as a source. |
sites[].answers_previous | integer or null | Answers it appeared in 28 days earlier; null when there were no answers then. |
sites[].followed | boolean | Whether it is a followed competitor. |
sites[].per_engine | array | Answers per AI. |
sites[].per_engine[].key | string | chatgpt or gemini. |
sites[].per_engine[].label | string | The name to show. |
sites[].per_engine[].answers | integer | Answers it appears in. |
cited_pages | array | Pages of other sites the AIs cite most, at most 8. |
cited_pages[].url | string | The page. |
cited_pages[].domain | string | Its domain. |
cited_pages[].citations | integer | In how many current answers it is a source. |
cited_pages[].prompts | integer | For how many prompts. |
competitors | array<string> | The followed competitors (the list shared with the Rank tracker). |
aiinsights.traffic_summary
POST /rest/v1/aiinsights.traffic_summary · MCP tool get_aiinsights_traffic_summary
Returns the visits from AI assistants (ChatGPT, Perplexity, Gemini, Copilot, Claude and others) in Google Analytics 4 for the period: sessions, engaged sessions, key events and revenue against the previous period, the share of all visits, and the same per AI. Without GA4 data, ga4_connected is false, the figures are null and per_engine is empty.
Arguments
| Argument | Type | What it does |
|---|---|---|
site_id (required) | string | The site: its id from list_sites, or the id in the app’s address. |
from | string, YYYY-MM-DD | First day of the period, YYYY-MM-DD; give it together with to. Without from and to, the period is the last 28 days up to yesterday, against the 28 days before. |
to | string, YYYY-MM-DD | Last day of the period, YYYY-MM-DD (at most yesterday); give it together with from. The previous period is then the same days one month earlier. |
Example request
curl -X POST https://app.marketingtracer.com/rest/v1/aiinsights.traffic_summary \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"site_id":"YOUR_SITE_ID"}'
Example response · A real answer, anonymised and shortened to two items per list.
{
"data": {
"ga4_connected": true,
"sessions": {"value": 59, "previous": 26, "change": 33, "change_pct": 126.9},
"engaged_sessions": {"value": 46, "previous": 17, "change": 29, "change_pct": 170.6},
"conversions": {"value": 0, "previous": 0, "change": 0, "change_pct": null},
"revenue_eur": {"value": 0, "previous": 0.06, "change": -0.06, "change_pct": -100},
"all_sessions": 26226,
"ai_share_pct": 0.22,
"per_engine": [
{
"key": "chatgpt",
"label": "ChatGPT",
"sessions": 59,
"engaged_sessions": 46,
"conversions": 0,
"revenue_eur": 0
}
]
},
"meta": {
"site_id": "YOUR_SITE_ID",
"period": {
"from": "2026-10-02",
"to": "2026-10-29",
"compare_from": "2026-09-04",
"compare_to": "2026-10-01"
}
}
}
Response fields · in data:
| Field | Type | What it is |
|---|---|---|
ga4_connected | boolean | Whether GA4 data came back (false when GA4 is not connected or did not answer). |
sessions | object or null | Sessions from AI assistants in the period, against the previous period. |
sessions.value | number or null | This period. |
sessions.previous | number or null | The previous period; null when there was nothing to compare with. |
sessions.change | number or null | value minus previous (for a _pct field: percentage points). |
sessions.change_pct | number or null | The change in percent of previous; null when previous is 0 or null. |
engaged_sessions | object or null | Engaged sessions from AI assistants in the period, against the previous period. |
engaged_sessions.value | number or null | This period. |
engaged_sessions.previous | number or null | The previous period; null when there was nothing to compare with. |
engaged_sessions.change | number or null | value minus previous (for a _pct field: percentage points). |
engaged_sessions.change_pct | number or null | The change in percent of previous; null when previous is 0 or null. |
conversions | object or null | Key events of those sessions in the period, against the previous period. |
conversions.value | number or null | This period. |
conversions.previous | number or null | The previous period; null when there was nothing to compare with. |
conversions.change | number or null | value minus previous (for a _pct field: percentage points). |
conversions.change_pct | number or null | The change in percent of previous; null when previous is 0 or null. |
revenue_eur | object or null | Revenue of those sessions in euro in the period, against the previous period. |
revenue_eur.value | number or null | This period. |
revenue_eur.previous | number or null | The previous period; null when there was nothing to compare with. |
revenue_eur.change | number or null | value minus previous (for a _pct field: percentage points). |
revenue_eur.change_pct | number or null | The change in percent of previous; null when previous is 0 or null. |
all_sessions | integer or null | All sessions of the site in the period. |
ai_share_pct | number or null | Sessions from AI as a share of all sessions, 0-100. |
per_engine | array | Per AI, most sessions first. |
per_engine[].key | string | chatgpt, perplexity, gemini, copilot, claude, deepseek, meta, grok, mistral, you, phind or poe. |
per_engine[].label | string | The name to show. |
per_engine[].sessions | integer | Sessions. |
per_engine[].engaged_sessions | integer | Engaged sessions. |
per_engine[].conversions | number | Key events. |
per_engine[].revenue_eur | number | Revenue in euro. |
aiinsights.traffic_pages
POST /rest/v1/aiinsights.traffic_pages · MCP tool get_aiinsights_traffic_pages
Returns the visits from AI assistants per landing page in the period (GA4), most first: per AI, engaged sessions, key events, revenue, the sessions in the previous period, and for how many prompts a current answer cites the page. Empty without GA4 data.
Arguments
| Argument | Type | What it does |
|---|---|---|
site_id (required) | string | The site: its id from list_sites, or the id in the app’s address. |
from | string, YYYY-MM-DD | First day of the period, YYYY-MM-DD; give it together with to. Without from and to, the period is the last 28 days up to yesterday, against the 28 days before. |
to | string, YYYY-MM-DD | Last day of the period, YYYY-MM-DD (at most yesterday); give it together with from. The previous period is then the same days one month earlier. |
limit | integer, 1 to 5,000, default 500 | Pages per call. |
cursor | string | meta.next_cursor of the previous call, for the next page. |
Example request
curl -X POST https://app.marketingtracer.com/rest/v1/aiinsights.traffic_pages \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"site_id":"YOUR_SITE_ID","limit":2}'
Example response · A real answer, anonymised and shortened to two items per list.
{
"data": [
{
"url": "https://example-blog.com/names/josiah",
"path": "/names/josiah",
"sessions": 4,
"sessions_previous": 0,
"engaged_sessions": 2,
"conversions": 0,
"revenue_eur": 0,
"per_engine": [{"key": "chatgpt", "label": "ChatGPT", "sessions": 4}],
"cited_by_prompts": 0
},
{
"url": "https://example-blog.com/forum/first-symptoms",
"path": "/forum/first-symptoms",
"sessions": 3,
"sessions_previous": 1,
"engaged_sessions": 1,
"conversions": 0,
"revenue_eur": 0,
"per_engine": [{"key": "chatgpt", "label": "ChatGPT", "sessions": 3}],
"cited_by_prompts": 0
}
],
"meta": {"site_id": "YOUR_SITE_ID", "next_cursor": "2", "total": 49}
}
Response fields · data is a list; each item has:
| Field | Type | What it is |
|---|---|---|
url | string or null | The landing page; null for GA4's (not set). |
path | string | Its path with the query string, without tracking parameters (utm_*, gclid, fbclid, msclkid, srsltid); (not set) as GA4 gives it. |
sessions | integer | Sessions from AI assistants. |
sessions_previous | integer | The same in the previous period. |
engaged_sessions | integer | Engaged sessions. |
conversions | number | Key events. |
revenue_eur | number | Revenue in euro. |
per_engine | array | Sessions per AI, most first. |
per_engine[].key | string | chatgpt, perplexity, … |
per_engine[].label | string | The name to show. |
per_engine[].sessions | integer | Sessions. |
cited_by_prompts | integer | For how many prompts a current answer cites this page. |
aiinsights.traffic_monthly
POST /rest/v1/aiinsights.traffic_monthly · MCP tool get_aiinsights_traffic_monthly
Returns the visits from AI assistants per month for the 16 months up to the month of to (GA4): sessions per AI, plus key events and revenue for the month. The last month is incomplete until it ends (complete false). Empty without GA4 data.
Arguments
| Argument | Type | What it does |
|---|---|---|
site_id (required) | string | The site: its id from list_sites, or the id in the app’s address. |
to | string, YYYY-MM-DD | Last day, YYYY-MM-DD (at most yesterday). Defaults to yesterday. |
Example request
curl -X POST https://app.marketingtracer.com/rest/v1/aiinsights.traffic_monthly \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"site_id":"YOUR_SITE_ID"}'
Example response · A real answer, anonymised and shortened to two items per list.
{
"data": [
{
"month": "2025-07",
"sessions": 19,
"per_engine": [
{"key": "chatgpt", "label": "ChatGPT", "sessions": 15},
{"key": "perplexity", "label": "Perplexity", "sessions": 4}
],
"conversions": 0,
"revenue_eur": 0.01,
"complete": true
},
{
"month": "2025-08",
"sessions": 32,
"per_engine": [
{"key": "chatgpt", "label": "ChatGPT", "sessions": 31},
{"key": "grok", "label": "Grok", "sessions": 1}
],
"conversions": 0,
"revenue_eur": 0,
"complete": true
}
],
"meta": {"site_id": "YOUR_SITE_ID", "next_cursor": null, "total": 16}
}
Response fields · data is a list; each item has:
| Field | Type | What it is |
|---|---|---|
month | string | YYYY-MM. |
sessions | integer | Sessions from AI assistants. |
per_engine | array | Sessions per AI, most first. |
per_engine[].key | string | chatgpt, perplexity, … |
per_engine[].label | string | The name to show. |
per_engine[].sessions | integer | Sessions. |
conversions | number | Key events. |
revenue_eur | number | Revenue in euro. |
complete | boolean | Whether the month is over (false for the month of to, unless to is its last day). |
aiinsights.ai_overviews
POST /rest/v1/aiinsights.ai_overviews · MCP tool get_aiinsights_ai_overviews
Returns Google's AI Overview at the site's Rank tracker keywords, one item per keyword with an AI Overview reading (its latest measurement): whether Google showed an AI Overview, the site's place among its sources, the other sites it cites, and the organic position. Keywords with an AI Overview come first, then by the site's place, then by keyword. Needs keywords in the Rank tracker.
Arguments
| Argument | Type | What it does |
|---|---|---|
site_id (required) | string | The site: its id from list_sites, or the id in the app’s address. |
Example request
curl -X POST https://app.marketingtracer.com/rest/v1/aiinsights.ai_overviews \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"site_id":"YOUR_SITE_ID"}'
Example response · A real answer, anonymised and shortened to two items per list.
{
"data": [
{
"keyword_id": "6ae0d00f1a123fbf9d03c6d2",
"keyword": "auto zonnescherm",
"country": "nl",
"device": "desktop",
"ai_overview": false,
"position": null,
"also_cited": [],
"organic_position": 2,
"measured_at": "2026-10-29T23:06:31Z"
},
{
"keyword_id": "6ae0d00f1a123fbf9d03c6d4",
"keyword": "automatten",
"country": "nl",
"device": "desktop",
"ai_overview": false,
"position": null,
"also_cited": [],
"organic_position": null,
"measured_at": "2026-10-29T23:06:31Z"
}
],
"meta": {"site_id": "YOUR_SITE_ID", "next_cursor": null, "total": 10}
}
Response fields · data is a list; each item has:
| Field | Type | What it is |
|---|---|---|
keyword_id | string | The keyword id in the Rank tracker. |
keyword | string | The keyword. |
country | string | Two-letter country code. |
device | string | desktop or mobile. |
ai_overview | boolean | Whether Google showed an AI Overview. |
position | integer or null | The site's place among the AI Overview's sources; null when not cited. |
also_cited | array<string> | Other domains among its sources, at most 3. |
organic_position | integer or null | The site's best organic position in the same measurement; null when not in the measured top. |
measured_at | string | When it was measured, ISO 8601 UTC. |
AI visibility for every client. Under your name.
One key reads AI Insights for every client site you can open, so your own AI report runs for all of them at once. On a white-label dashboard the API answers on your own domain. The whole dashboard is white label: your domain, logo and colours, and team roles that set which modules each role sees.
Free 14-day trial
MarketingTracer smart A.I. tool shows you what you need to rank. Then we'll help you get it done.
- No credit card required
- No installation needed
- No strings attached
FAQ
Something else? Ask us.
What is an AI visibility API?
An AI visibility API, or LLM visibility API, tells your own software whether AI assistants name your brand and link to your site when people ask them questions. This one gives what AI Insights measures for the sites in your account.
Which AI assistants?
We ask your prompts to ChatGPT and Gemini, with web search. Visits are counted from more assistants: ChatGPT, Perplexity, Gemini, Copilot, Claude and others, as your GA4 sees them.
Can I trust the numbers?
They are real answers from ChatGPT and Gemini, asked for your prompts, and the API gives the latest answer per prompt and AI. AI answers change from one run to the next, so read a trend over weeks before you act on a single answer.
Do I need GA4?
Only for the visits, conversions and revenue. Mentions, links and competitors work without it.
How many prompts can I track?
Every site comes with a package of measurements; one measurement is one prompt asked to one AI. A bigger package costs extra. Your package and how much of it is in use are in aiinsights.summary.
Can I add prompts through the API?
Not yet. You add prompts in the app; the API reads them and their answers.
What does it cost?
The API costs nothing extra; it is part of every plan. What you measure follows your AI Insights package: one comes with every site, a bigger one costs extra. Prices are on the pricing page.