Prompt Tracking API: create, tag, run and read prompts on 6 AI engines
The Prompt Tracking API creates the prompts a brand monitors in AI answers, tags them by topic, market and funnel stage, runs them on ChatGPT, Perplexity, Google AI Mode, Claude, Copilot and Grok, then returns the stats of each prompt. One execution costs one credit, between $0.013 and $0.007.
Updated
- ChatGPT
- Perplexity
- Google AI Mode
- Claude
- Microsoft Copilot
- Grok
Playground
Two POSTs create 4 prompts and queue them on 3 models for 12 credits
The Prompt Tracking API takes a prompt list with its tags, then the models to run it on. Edit the list and pick models: the payload, the job and the credit count update as you type. One prompt run once on one model costs one credit, so four prompts on three models charge twelve credits when the job starts.
POST /v1/queries · POST /v1/jobs/execute
models[]
- Credits per run
- 12
- Credits per month
- 360
- Estimated cost per month
- $4.68
# 1. upsert the prompt set curl -X POST https://api.apiforgeo.com/v1/queries \ -H "Authorization: Bearer $API_FOR_GEO_KEY" \ -H "x-project-id: $PROJECT_ID" \ -H "Content-Type: application/json" \ -d '{ "queries": [ { "text": "best project management tool for creative agencies", "type": "commercial", "language": "en", "country": "US", "tagIds": [ "t_pm-tools", "t_us" ] }, { "text": "project management software with client portals", "type": "informational", "language": "en", "country": "US", "tagIds": [ "t_pm-tools", "t_us" ] }, { "text": "alternatives to spreadsheet based studio planning", "type": "informational", "language": "en", "country": "US", "tagIds": [ "t_pm-tools", "t_us" ] }, { "text": "which pm tool has the best time tracking", "type": "informational", "language": "en", "country": "US", "tagIds": [ "t_pm-tools", "t_us" ] } ] }' # 2. run it on 3 models curl -X POST https://api.apiforgeo.com/v1/jobs/execute \ -H "Authorization: Bearer $API_FOR_GEO_KEY" \ -H "x-project-id: $PROJECT_ID" \ -H "Content-Type: application/json" \ -d '{ "models": [ "chatgpt", "perplexity", "google-ai-mode" ], "executionsPerQuery": 1 }'
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"]} # 1. upsert the prompt set requests.post(f"{API}/queries", headers=H, json={ "queries": [ { "text": "best project management tool for creative agencies", "type": "commercial", "language": "en", "country": "US", "tagIds": [ "t_pm-tools", "t_us" ] }, { "text": "project management software with client portals", "type": "informational", "language": "en", "country": "US", "tagIds": [ "t_pm-tools", "t_us" ] }, { "text": "alternatives to spreadsheet based studio planning", "type": "informational", "language": "en", "country": "US", "tagIds": [ "t_pm-tools", "t_us" ] }, { "text": "which pm tool has the best time tracking", "type": "informational", "language": "en", "country": "US", "tagIds": [ "t_pm-tools", "t_us" ] } ] }, timeout=30) # 2. run it on 3 models r = requests.post(f"{API}/jobs/execute", headers=H, json={ "models": [ "chatgpt", "perplexity", "google-ai-mode" ], "executionsPerQuery": 1 }, 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()); // 1. upsert the prompt set await post("/queries", { "queries": [ { "text": "best project management tool for creative agencies", "type": "commercial", "language": "en", "country": "US", "tagIds": [ "t_pm-tools", "t_us" ] }, { "text": "project management software with client portals", "type": "informational", "language": "en", "country": "US", "tagIds": [ "t_pm-tools", "t_us" ] }, { "text": "alternatives to spreadsheet based studio planning", "type": "informational", "language": "en", "country": "US", "tagIds": [ "t_pm-tools", "t_us" ] }, { "text": "which pm tool has the best time tracking", "type": "informational", "language": "en", "country": "US", "tagIds": [ "t_pm-tools", "t_us" ] } ] }); // 2. run it on 3 models console.log(await post("/jobs/execute", { "models": [ "chatgpt", "perplexity", "google-ai-mode" ], "executionsPerQuery": 1 }));
200 OK · POST /v1/jobs/execute
{
"created": 4,
"updated": 0,
"job": {
"id": "job_7c1f9ad2",
"status": "queued",
"models": [
"chatgpt",
"perplexity",
"google-ai-mode"
],
"queries": 4,
"creditsCharged": 12,
"createdAt": "2026-09-03T09:41:02Z"
}
} Schema
A prompt object carries 7 fields, including its own locale
The Prompt Tracking API stores each prompt as an object: the text sent to the model, its intent type, one language, one country and its tag links. A prompt carries its own locale, so the same question tracked in four markets is four prompts and four result sets you can compare.
| Field | Type | Description |
|---|---|---|
id | uuid | Prompt identifier, stable across re-imports. |
text | string | The prompt sent to the model, verbatim. |
type | enum | informational · commercial · comparison · branded · navigational |
language | string | ISO language code, from the supported allowlist. |
country | string | ISO country code, validated against per-model availability. |
tagIds[] | array | Tag links. Replacing the array replaces the associations. |
lastExecutedAt | datetime | Freshness marker for this prompt, null before the first run. |
Lifecycle
Four calls take a prompt list to per-prompt stats
The Prompt Tracking API takes a prompt list to per-prompt stats in four POST requests: create tags, upsert prompts, execute, read. The key is generated in the app, with one project per brand or per client. Credits are charged when a job starts, and the fourth call can be repeated as often as needed without being billed.
-
Step 1
Create tags
Create the topics, markets and funnel stages of the project. Tags slice every statistic later, so they come before the prompts.
POST /v1/tags -
Step 2
Upsert prompts
Send the prompt list in bulk with its tag links. Tag ids are checked against the project before anything is written, and prompts are matched on text, language and country.
POST /v1/queries -
Step 3
Execute
Pick the models and the number of executions per prompt. Credits are charged up front and the call returns a job to poll.
POST /v1/jobs/execute -
Step 4
Read per-prompt stats
Read visibility, entities, sources and raw responses for each prompt once the job completes. Reads over stored runs are not billed.
POST /v1/queries/stats
Failed executions are refunded to the balance automatically.
Prompt performance tracking
Prompt performance tracking shows a 36.9-point visibility gap inside one prompt set
The Prompt Tracking API reads the stats of each prompt separately: number of runs, brand visibility, average position and cited sources. In this sample set of 4 prompts on 3 models in US English, the brand appears in 64.8% of answers to its best prompt and 27.9% to its weakest, over the same 90 runs per prompt.
POST /v1/queries/stats
curl -X POST https://api.apiforgeo.com/v1/queries/stats \ -H "Authorization: Bearer $API_FOR_GEO_KEY" \ -H "x-project-id: $PROJECT_ID" \ -H "Content-Type: application/json" \ -d '{ "models": [ "chatgpt", "perplexity", "google-ai-mode" ], "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}/queries/stats", headers=H, json={ "models": [ "chatgpt", "perplexity", "google-ai-mode" ], "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("/queries/stats", { "models": [ "chatgpt", "perplexity", "google-ai-mode" ], "country": "US" }));
200 OK
{
"scope": {
"models": [
"chatgpt",
"perplexity",
"google-ai-mode"
],
"country": "US"
},
"results": [
{
"id": "q_3f9a1c20",
"text": "best project management tool for creative agencies",
"type": "commercial",
"language": "en",
"country": "US",
"tagIds": [
"t_pm-tools",
"t_us"
],
"runs": 90,
"visibility": 64.8,
"avgPosition": 1.8,
"entities": [
{
"name": "Loopwork",
"entityType": "brand",
"visibility": 64.8,
"avgPosition": 1.8
},
{
"name": "Cadence",
"entityType": "competitor",
"visibility": 52.2,
"avgPosition": 2.4
},
{
"name": "Northbeam",
"entityType": "competitor",
"visibility": 40,
"avgPosition": 3.2
}
],
"sources": [
{
"url": "https://review-site.com/pm-tools",
"domain": "review-site.com",
"category": "review",
"mentionsBrand": true
},
{
"url": "https://loopwork.io/agencies",
"domain": "loopwork.io",
"category": "brand",
"mentionsBrand": true
}
],
"responses": [
{
"model": "chatgpt",
"executedAt": "2026-09-02T06:00:14Z",
"answer": "For creative agencies, Loopwork is often recommended for its proofing workflow, while Cadence is favoured by larger studios..."
}
],
"lastExecutedAt": "2026-09-02T06:00:14Z"
}
]
} | Field | Type | Description |
|---|---|---|
runs | int | Stored responses for the prompt in scope, the base of every rate. |
visibility | float | Responses mentioning the project brand ÷ runs, from 0 to 100. |
avgPosition | float | Mean rank of the brand's first mention inside the answer. Lower is better. |
entities[] | array | Every brand and competitor named in the answers, with its own visibility and average position. |
sources[] | array | Cited URLs with domain, category and whether the page mentions the brand. |
responses[] | array | Raw answer text per run, with model and execution time, for verification. |
lastExecutedAt | datetime | Time of the most recent run in scope. |
| Prompt | Runs | Brand visibility | Avg position | Tags |
|---|---|---|---|---|
| best project management tool for creative agencies | 90 | 64.8% | 1.8 | pm-tools |
| project management software with client portals | 90 | 51.2% | 2.2 | comparison |
| alternatives to spreadsheet based studio planning | 90 | 38.4% | 2.6 | pm-tools |
| which pm tool has the best time tracking | 90 | 27.9% | 3.0 | comparison |
Comparison
The Prompt Tracking API covers all 5 needs, a scraping API covers 1
The Prompt Tracking API stores each prompt and returns its answers with citations, resolved entities and positions already computed. An AI scraping API returns the raw answer and bare URLs, which leaves the prompt store, entity resolution and ranking to build for each engine. A GEO dashboard tool computes those layers but keeps them inside its interface.
| Capability | API for GEO | AI scraping API | GEO dashboard tool | In-house build |
|---|---|---|---|---|
| Raw answer text | Yes | Yes | Sometimes | Build it |
| Citations with domain + category | Yes | URLs only | In the UI | Build it |
| Entity resolution across aliases | Yes | No | Yes, closed | Build it |
| Average position in answer | Yes | No | Yes, closed | Build it |
| Ongoing maintenance when engines change | Ours | Partly theirs | Theirs | Yours |
Use cases
Teams build 3 products on tracked prompts: platform modules, client reports, product monitors
The Prompt Tracking API serves the three audiences of the use cases page. SEO and martech platforms embed a prompt tracker in their product, agencies keep one re-importable prompt set per client, and e-commerce brands track category questions market by market. Each card opens the full pattern with the endpoints it combines.
A prompt tracker inside your product
Each end customer gets an isolated project and manages its own prompt set from your interface. The payload carries no attribution requirement, so the module ships under your brand.
AgenciesOne prompt set per client, re-importable
The prompt list validated with the client is pushed from a spreadsheet as often as needed without duplicates. Tags by theme and market feed the monthly report.
E-commerce & brandsCategory prompts tracked per market
The same buying question is tracked as one prompt per country and language. Each market returns its own visibility, position and cited sources.
Pricing
Prompt Tracking API pricing runs from $0.013 to $0.007 per credit
The Prompt Tracking API is billed pay-as-you-go: one credit is one prompt, executed once, against one model, in one locale, with every enrichment layer included. Creating prompts and reading their stats is not billed. There are no seats and no platform fee, and credits never expire.
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
Prompt tracking, answered
What does a stats call return?
The Prompt Tracking API returns one object per prompt from POST /v1/queries/stats: the number of runs in scope, brand visibility, average position, every entity named with its own figures, the cited sources and the raw answers. The read is scoped by tag, model, country and date range, and it is not billed, so a dashboard can call it as often as it needs.
What does a small pilot cost?
The Prompt Tracking API bills one credit per prompt, per model, per run. A pilot of 80 prompts on 3 models, run 4 times in a month, uses 960 credits, which comes to $12.48 at the first tier's $0.013. Creating prompts, tagging them and reading the stats are not billed.
Can I run the same prompt several times per execution?
The Prompt Tracking API accepts several executions per prompt in one job. Generative answers change from one run to the next, so repeated runs give a steadier rate. Credits scale with the count and each run is stored as its own response: one prompt run three times on two models costs six credits.
What happens if I re-import my prompt list?
The Prompt Tracking API upserts prompts on text, language and country, so a re-import creates no duplicate and only the tag links change. A bulk tag update matches on those same three fields instead of ids, which suits pipelines that never stored the prompt ids. Each prompt keeps its id through every re-import.
Do deleted prompts destroy history?
The Prompt Tracking API keeps every response a deleted prompt generated. Deleting a prompt unlinks its stored answers from the prompt list, so historical aggregates by tag, model or market stay intact and past reports still add up. Only the prompt itself leaves the active set.
Can I resell prompt tracking data?
The Prompt Tracking API allows resale and white-label use at every tier. The payload carries no attribution requirement, and one organisation can hold an isolated project per end customer, so an agency or a platform can deliver the prompt stats under its own brand and at its own price.
Related GEO APIs
AI Visibility API →
Read what the tracked prompts produced per entity: mention rate, share of voice, average position.
APIFan-Out API →
Mine the follow-up questions engines generate from a prompt to grow the prompt set.
APIAI Model Comparison API →
Compare results per model to decide which engines are worth the credits.
Same topic: AI prompt tracker · Prompt tracking guide