Using GEO Analyses
This guide describes how to read GEO visibility data, and manage the analyses behind it, through the Jasper API and the Jasper MCP Server.
GEO analyses track how AI answer engines (ChatGPT, Gemini, Claude and Perplexity) describe and cite your brand. Use the API to pull the same analyses, runs, recommendations and trends that appear in the GEO Hub into your own reporting, or use the MCP tools to ask a connected AI assistant questions like "what are my top 3 GEO recommendations?"
Key concepts
| Term | Description |
|---|---|
| Analysis | A tracked website with its scopes, competitors, AI providers, topic clusters and schedule. Its ID is the configId and starts with agc_. |
| Run | One completed execution of an analysis. Its ID is the runId and starts with aga_. |
| Recommendations | Findings from a run. Each has a severity, a category, the affected pages and an action. |
| Trends | Score changes and a series over time, plus the key events that help explain them. |
Endpoints
| Endpoint | Purpose |
|---|---|
GET /v1/geo/analyses | Retrieve your analyses with their latest completed run. Analyses without a completed run are excluded. |
GET /v1/geo/analyses/summary | Retrieve your analyses with their current scores and the change over a range. |
GET /v1/geo/analyses/{configId} | Retrieve one analysis by ID. |
GET /v1/geo/analyses/{configId}/runs | Retrieve an analysis's completed runs, newest first. |
GET /v1/geo/analyses/{configId}/runs/{runId} | Retrieve one run by ID, whole or by section. |
GET /v1/geo/analyses/{configId}/runs/{runId}/recommendations | Retrieve a run's recommendations, filtered and paginated. |
GET /v1/geo/analyses/{configId}/trends | Retrieve score changes, a series, and key events for an analysis. |
POST /v1/geo/analyses | Create an analysis and queue its first run. |
PATCH /v1/geo/analyses/{configId} | Update an analysis by ID. |
DELETE /v1/geo/analyses/{configId} | Delete an analysis by ID. |
Listing analyses and runs
List your analyses:
curl --request GET \
--url https://api.jasper.ai/v1/geo/analyses \
--header 'X-API-KEY: YOUR_API_KEY'List the completed runs for one analysis, newest first:
curl --request GET \
--url 'https://api.jasper.ai/v1/geo/analyses/agc_ABC123/runs?from=2026-08-01&to=2026-09-08&limit=20' \
--header 'X-API-KEY: YOUR_API_KEY'| Parameter | Type | Default | Description |
|---|---|---|---|
from | string | Inclusive lower bound on the run date, YYYY-MM-DD. | |
to | string | Inclusive upper bound on the run date, YYYY-MM-DD. | |
page | integer | 1 | Page number. |
limit | integer | 20 | Page size, up to 100. |
Getting a run
Get one run. Omit sections to return everything:
curl --request GET \
--url 'https://api.jasper.ai/v1/geo/analyses/agc_ABC123/runs/aga_ABC123?sections=overview,metrics' \
--header 'X-API-KEY: YOUR_API_KEY'sections is a comma-separated list. An unknown value returns 400.
| Section | Contents |
|---|---|
overview | Natural-language summary of the run. |
sentiment | Sentiment summary, themes working for and against the brand, and the positive/neutral/negative split. |
completedAt | When the run completed. |
metrics | Labelled scores: overall, brand presence, citation rate, sentiment and share of voice, including share of voice per provider. |
providerCoverage | Per provider: queries attempted, queries answered, and coverage rate (0 to 1). |
recommendations | One page of findings, with totals per severity and category. |
citations | Hostnames cited by AI providers, typed and counted per provider. |
topicClusters | Topic clusters, their queries, and brand mentions per domain. |
recommendations is paginated. page and limit apply only when it is the only paginated section you request, and the response includes pagination.next for the following page. To filter findings, use the recommendations endpoint below.
Recommendations
curl --request GET \
--url 'https://api.jasper.ai/v1/geo/analyses/agc_ABC123/runs/aga_ABC123/recommendations?severity=critical,warning&category=missing-faq' \
--header 'X-API-KEY: YOUR_API_KEY'| Parameter | Type | Default | Description |
|---|---|---|---|
severity | string | Comma-separated: critical, warning, info. | |
category | string | Comma-separated categories, for example stale-content,missing-faq. | |
topicClusterId | string | Restrict findings to one topic cluster. | |
page | integer | 1 | Page number. |
limit | integer | 20 | Page size, up to 100. |
The response includes totals per severity and category across every page, so you can see when results are truncated.
Trends and key events
curl --request GET \
--url 'https://api.jasper.ai/v1/geo/analyses/agc_ABC123/trends?range=30d' \
--header 'X-API-KEY: YOUR_API_KEY'| Parameter | Type | Default | Description |
|---|---|---|---|
range | string | 90d | One of daily, 7d, 30d, 60d, 90d, all. |
date | string | Yesterday | Anchor day, YYYY-MM-DD. Used only when range=daily. |
The response has score deltas and a series over the range, plus key events that help explain why a score moved:
- Analysis settings changed: queries, AI providers, pages or competitors were added or removed.
- Query model changed: a newer model was used when querying an AI provider.
- Page content changed: a meaningful change was found on a tracked page.
- Score methodology changed: the way GEO scores are calculated was updated.
Events start from when the feature was released and are not backfilled. Most events are logged on scheduled runs, so a page change can appear on a slightly later date than the edit itself.
Pagination
Paginated endpoints take page and limit, and return totalRecords, page, pageSize, next and prev. Follow next until it is null.
Creating an analysis
curl --request POST \
--url https://api.jasper.ai/v1/geo/analyses \
--header 'X-API-KEY: YOUR_API_KEY' \
--header 'Idempotency-Key: 8d6c2d1e-1f6b-4a0e-9d2b-3c5a7f1e2b44' \
--header 'content-type: application/json' \
--data '{
"providers": ["chatgpt"],
"scopes": [{ "kind": "internal", "url": "https://www.jasper.ai", "match": "hostname" }],
"competitors": [{ "name": "Copy.ai", "url": "https://www.copy.ai" }],
"topicClusters": [
{
"topic": "AI marketing tools",
"prompts": [{ "prompt": "What is the best AI tool for marketing teams?" }]
}
],
"label": "Jasper",
"timezone": "Australia/Sydney",
"schedule": "weekly"
}'| Field | Type | Description |
|---|---|---|
providers | array | One or more of chatgpt, gemini, claude, perplexity. |
scopes | array | 1 to 10 scopes. kind is internal or external. match is page, path_prefix, hostname or hostname_and_subdomains. An external scope only accepts page. |
competitors | array | 1 to 10 competitors, each with a url and an optional name. |
topicClusters | array | 1 to 10 clusters, each with a topic and prompts. Prompts can list sources as { "url": "..." }. IDs are generated for you. |
label | string | Optional display name. |
timezone | string | Optional IANA timezone the schedule is anchored to. |
schedule | string | Optional cadence: daily, weekly, monthly or one-off. one-off needs the matching entitlement. |
region | string | Optional market to localize AI answers to: US, GB, AU, CA, NZ, IE, ZA, HK or AE. Needs the region entitlement, otherwise 403. |
Creating an analysis queues its first run and returns the new analysis. Example response:
{
"requestId": "b2ca6fbc-16e1-45b7-be2f-207e89acf377",
"resource": "geo-analyses",
"data": {
"configId": "agc_01a15be81507700080000fa991a2c221",
"label": "Jasper",
"website": "https://www.jasper.ai",
"timezone": "Australia/Sydney",
"region": null,
"status": { "type": "active" },
"schedule": "weekly",
"nextScheduledAnalysisAt": "2026-10-28T10:19:53.187Z",
"topicClusters": [
{
"id": "0d0f7a04-8562-462f-b1d3-18760d2eced5",
"topic": "AI marketing tools",
"prompts": [
{
"id": "3bae2e9c-9398-4670-8ec4-5504e75da66a",
"prompt": "What is the best AI tool for marketing teams?"
}
]
}
],
"metadata": { "credits": { "cost": 10 } }
},
"pagination": null
}Retrying safely. Send an Idempotency-Key header. A retry with the same key and the same body returns the original response without creating a second analysis or charging again. Reusing a key with a different body returns 409.
Updating and deleting an analysis
Create, update and delete need write access. Read-only tokens receive 403.
curl --request PATCH \
--url https://api.jasper.ai/v1/geo/analyses/agc_ABC123 \
--header 'X-API-KEY: YOUR_API_KEY' \
--header 'content-type: application/json' \
--data '{ "label": "New label" }'- Metadata (
label,timezone,schedule,region) is applied as sent. No run starts and nothing is charged. - Settings (
scopes,competitors,providers,topicClusters): omitted fields keep their current values. If the result differs from the latest analysis, a new run starts and any run in progress is cancelled. If it is identical, nothing runs and nothing is charged. - Existing clusters and prompts keep their IDs from earlier responses. Send an ID to edit that item. Leave it out to add a new one.
DELETE /v1/geo/analyses/{configId} returns 204. Deleting stops the schedule and pauses Copilot automations. Afterwards every endpoint for that analysis returns 404. You cannot restore a deleted analysis yourself.
Credits
- Reading is free.
- Creating an analysis, or updating settings so that a new run starts, uses credits. The cost is the number of queries multiplied by the number of providers, and it is charged on every run. Pages are not billed.
- The cost is returned as
metadata.credits.coston create and on an update that starts a run. The same settings cost the same on every run. - An update that changes no settings returns
credits.costof0andanalysisIdasnull. A metadata-only update returns no credits. - If the workspace does not have enough credits, the update is rejected and nothing is applied, including metadata changes.
Errors
| Status | Meaning |
|---|---|
400 | Invalid parameters, for example an unknown sections value, or page and limit sent with more than one paginated section. |
403 | The workspace does not have GEO access, the token has no write access, or an entitlement is missing (for example region). |
404 | The analysis or run does not exist, belongs to another workspace, or has been deleted. |
409 | The Idempotency-Key was already used with a different request body. |
Using GEO with MCP
The Jasper MCP Server exposes four read-only GEO tools. Writes are available through the API only. See Jasper MCP Server to connect a client.
| Tool | What it does | Example prompt |
|---|---|---|
| get-jasper-geo-analyses | Retrieves GEO analyses available to the workspace, or the run history for one analysis. | "List my GEO analyses." |
| get-jasper-geo-run | Retrieves one GEO run, optionally limited to specific sections. | "Show the latest run for example.com, metrics only." |
| get-jasper-geo-recommendations | Retrieves filtered, paginated GEO recommendations for a run. | "What are my top 3 critical GEO recommendations?" |
| get-jasper-geo-trends | Retrieves GEO score changes, a trend series, and key events for an analysis. | "Why did my GEO score change over the last 30 days?" |
Example: find and review your top issues
Step 1: List your analyses and note the configId of the site you want.
curl --request GET \
--url https://api.jasper.ai/v1/geo/analyses \
--header 'X-API-KEY: YOUR_API_KEY'Step 2: Get the latest run ID from the runs list.
curl --request GET \
--url 'https://api.jasper.ai/v1/geo/analyses/agc_ABC123/runs?limit=1' \
--header 'X-API-KEY: YOUR_API_KEY'Step 3: Pull its critical recommendations.
curl --request GET \
--url 'https://api.jasper.ai/v1/geo/analyses/agc_ABC123/runs/aga_ABC123/recommendations?severity=critical' \
--header 'X-API-KEY: YOUR_API_KEY'Updated about 5 hours ago
