Skip to content

Visibility scores

GEThttps://api.trakkr.ai/get-scores
60 requests a minute · Scale plan · Reads only, changes nothing

Visibility, presence and mentions for one brand’s latest scan, how visibility and presence moved over the days you ask for, and one point for every scan in them. view=time_series adds rank per scan.

API referenceOpen in Playground ›
Reading the exampleBrand id75ffdeb9-…-c2470d73d224Sign in to see your own.

What comes back

Leave out view and you get the summary: the brand, its scores from the latest scan, how they changed across the days you asked for, and one point for each scan in those days.

Field · example valuesOct 8
latest_scoresfrom the latest scan
visibility

0 to 100. How often AIs name the brand, and how high in the answer. A brand with no finished scan, or a scan where no answers came back, is sent as 0, not null.

49.5
presence

Share of requests that named it at all. Failed requests count here, so it can read lower than Presence in the app.

32.1
average_rank

Its average place when named, 1 is first. The summary sends it as null today; view=time_series carries it per scan.

–
mentions

Answers that named it.

54
model_scores

Both scores for each AI, by its name.

one per AI
trendacross the days you asked for
visibility_change

Points gained or lost since the last scan before the days began. This is the raw change; the app colours a change only outside the usual range.

+1.9
presence_change

The same, for presence.

+1.5
historicala list
[ ]

One per scan in the days: its date, visibility and presence. Rank and mentions come back empty here; view=time_series carries them.

7 scans

How each score is worked out:How Visibility is worked out ›

Parameters

Send them in the query string. Only brand_id is needed; the rest change what the numbers cover.

brand_iduuid · required

The brand to read. You can send brand instead. Its id is in the /get-brands reply.

Example75ffdeb9-…-c2470d73d224
days7 to 365

How far back the change and the history reach. The latest scores are the same whatever you pick.

default 90
viewtext

The shape of the reply: summary, time_series, by_model or by_prompt. See the four views below.

default summary
periodYYYY-MM or YYYY-Qn

A calendar month or quarter instead of a rolling window. A closed month comes from the monthly archive, so repeat reads match unless we publish a correction to that month. days is then ignored.

e.g. 2026-09 or 2026-Q3
tag_idsuuids, comma-separated

Score only the prompts with these tags. Their answers are scored again as one set, not averaged prompt by prompt. Reports from before Jul 20, 2026 keep a per-prompt average.

summary only · not with period
prompt_iduuid

Score one prompt on its own, from its answers on every AI.

summary only · not with period

Four views

The view parameter changes the shape of the reply. Pick the one that fits what you’re building.

summarydefault

The latest scores, the change and every scan. This page.

49.5+1.9
visibility, Oct 8vs 7 days ago
time_series7 rows

A row for each scan with every score. For your own charts.

Oct 2Oct 8
by_modelper AI

Each AI's scores from the latest scan, with its change.

others 41 to 61AI Overviews 35.9
by_prompt21 prompts

Each prompt's scores from the latest scan, with its text.

20 above 01 at 0

The other three views send back only the brand’s id and name, read every market’s scans (summary reads the brand’s main market), and ignore tag_ids and prompt_id.

Errors

Every error has a status and a detail: usually a sentence written to be shown as it is, an object for plan limits, and a list for a bad parameter. The one exception is 429, which sends error instead of detail.

400
"brand_id is required"

Add brand_id, or brand. A view outside the four gets a 400 too, with its own detail.

401
"Missing API key"

Send Authorization: Bearer, then your key. A key that doesn’t start sk_live_ gets a 401 too.

403
"Invalid API key"

The key is mistyped, or was replaced or removed. Make a new one on the API keys page.

"Access denied to this brand"

Your account can’t read this brand, or the id is wrong. Check it against /get-brands.

"The REST API requires an eligible paid plan."

The REST API comes with Scale. The code is feature_not_entitled. MCP works on Growth too.

404
"Brand not found or no data available"

We couldn’t read the brand’s record. Send it again; if it keeps happening, check the id against /get-brands.

422
[{ "loc": ["query", "days"], … }]

brand_id or prompt_id isn’t a uuid, or days is outside 7 to 365. The list names the field.

429
"Rate limit exceeded: 60 per 1 minute"

In error, not detail. Wait a minute, then try again.

503
"Authentication service temporarily unavailable"

Ours, not yours. Try again in a few seconds.

Rate limits

60 requests a minute to this endpoint, counted for your whole account, so every server you call from shares the one count. No plan raises it.

Headers

None. There’s no remaining count and no Retry-After.

After a 429

Wait a minute, then send again.

Fewer calls

Scores change when a scan finishes, so one read after each scan keeps you current.

Every endpoint’s limit ›
Did this answer your question?