Skip to content

Periods

One frozen calendar month or quarter with every metric, its prior value, delta and direction, plus the metric registry that defines each figure.

Requires authentication
60 req/min

Why periods

The dashboard headline is a single day's report, and a days window recomputes over a rolling window that answers differently on the 3rd and the 9th. That drift is what puts an inverted arrow in a month-over-month deck. A period is a scoping parameter, not a date filter: period=2026-08 names the row frozen when August closed, and it answers identically however later it is asked.

A closed month is frozen on the 1st and read from the archive. The open month is computed month to date and says so (status: open). A quarter is derived from its three months by a rule per metric: averages weighted by measured days or runs, counts summed, end-of-period figures taken from the last archived month. A recompute that changes a stored figure is recorded as a restatement rather than silently overwriting it. The same resolver serves the API, the MCP server, the Agent and the Reports page, so a number cannot differ between them for the same period.

Endpoint

GET/get-period-summary

Returns the whole month or quarter: every single-number metric under metrics with the prior period alongside and the delta and direction already computed, the lists and maps under breakdowns, and the unit and direction of each metric under metric_meta.

Query Parameters

brand_idstring

Brand UUID from /get-brands. Required unless brand_ids is given; never both.

brand_idsstring

Several brands at once: comma-separated UUIDs, up to 12. One compact row per brand per closed month with the prior month's delta; period as YYYY-MM keeps that month and the month before it. Ids that are not among your brands come back in excluded and are never read. Quarters, view, compare and include do not apply.

periodstring

A month as YYYY-MM (2026-08) or a quarter as YYYY-Qn (2026-Q3). Defaults to the most recently closed month. A malformed key returns 400.

viewstring

summary, or list: the index of archived months and quarters for the brand

Default: summary

compareboolean

Include the prior period and the computed deltas

Default: true

includestring

Comma-separated extras. definitions adds each metric's one-line definition under definitions.

monthsinteger

view=list only: how many closed months to index. 1 to 36.

Default: 12

This endpoint is rate limited to 60 requests per minute per API key. See the Rate Limits page for handling 429 responses.

view=summary (default)

Without period the summary is for the most recently closed month. The period block says exactly what was resolved; read status and source before publishing a figure.

Request
Code language
1curl -H "Authorization: Bearer $TRAKKR_API_KEY" \
2 'https://api.trakkr.ai/get-period-summary?brand_id=BRAND_ID&period=2026-08'
200 OK
1{
2 "brand": { "id": "00000000-0000-4000-8000-81f286d10c3c", "name": "Notion", "website": "https://notion.so" },
3 "period": {
4 "key": "2026-08",
5 "kind": "month",
6 "label": "August 2026",
7 "start": "2026-08-01",
8 "end": "2026-08-31",
9 "status": "closed",
10 "source": "archive",
11 "frozen_at": "2026-09-01T03:12:44+00:00",
12 "pipeline_version": "rollup-v3",
13 "restated_at": null,
14 "restatements": [],
15 "coverage": {
16 "days_in_period": 31,
17 "report_days": 31,
18 "perception_runs": 4,
19 "citation_days": 31,
20 "audit_count": 4,
21 "data_status": "complete"
22 },
23 "fields_computed": [],
24 "fields_missing": [],
25 "notes": [
26 "Rank was rebuilt from the retained raw answers when the month closed, using the competitor roster as of that day."
27 ],
28 "rank_source": "recompute"
29 },
30 "prior": { "key": "2026-07", "kind": "month", "label": "July 2026", "status": "closed", "source": "archive", "...": "same shape as period" },
31 "metrics": {
32 "visibility_avg": { "value": 24.4, "prior": 24.3, "delta": 0.1, "delta_pct": 0.4, "direction": "up" },
33 "presence_avg": { "value": 41.2, "prior": 39.8, "delta": 1.4, "delta_pct": 3.5, "direction": "up" },
34 "rank_end": { "value": 10, "prior": 11, "delta": -1.0, "positions_gained": 1, "direction": "up" },
35 "rank_pool_end": { "value": 1299, "prior": 1264, "delta": 35.0, "delta_pct": 2.8, "direction": "higher" },
36 "mentions_total": { "value": 815, "prior": 790, "delta": 25.0, "delta_pct": 3.2, "direction": "up" },
37 "citation_brand_mentions": { "value": 44, "prior": 51, "delta": -7.0, "delta_pct": -13.7, "direction": "down" },
38 "citation_source_domain_share_pct": { "value": 6.1, "prior": 5.8, "delta": 0.3, "delta_pct": 5.2, "direction": "up" },
39 "prompt_coverage_pct": { "value": 58.3, "prior": 56.7, "delta": 1.6, "delta_pct": 2.8, "direction": "up" },
40 "perception_score_avg": { "value": 71.5, "prior": 70.9, "delta": 0.6, "delta_pct": 0.8, "direction": "up" },
41 "audit_score_end": { "value": 82, "prior": 82, "delta": 0.0, "delta_pct": 0.0, "direction": "held" },
42 "report_days": { "value": 31, "prior": 31 },
43 "...": "one entry per single-number metric"
44 },
45 "breakdowns": {
46 "model_visibility": {
47 "models": [
48 { "model": "ChatGPT", "visibility_avg": 31.2, "presence_avg": 52.0, "days": 31, "mentions_total": 240, "prior_visibility_avg": 30.1, "visibility_delta": 1.1 },
49 { "model": "Perplexity", "visibility_avg": 12.8, "presence_avg": 24.5, "days": 31, "mentions_total": 88, "prior_visibility_avg": 13.6, "visibility_delta": -0.8 }
50 ],
51 "strongest": "ChatGPT",
52 "weakest": "Perplexity",
53 "zero_models": []
54 },
55 "top_competitors": {
56 "competitors": [
57 { "name": "Coda", "visibility": 38.6, "rank": 1, "prior_rank": 1, "prior_visibility": 37.9, "positions_gained": 0, "visibility_delta": 0.7 },
58 { "name": "ClickUp", "visibility": 27.1, "rank": 4, "prior_rank": 6, "prior_visibility": 24.7, "positions_gained": 2, "visibility_delta": 2.4 }
59 ],
60 "notable_change": { "name": "ClickUp", "visibility_delta": 2.4, "positions_gained": 2 }
61 },
62 "top_prompts": [
63 { "prompt_id": "abc-123", "text": "best project management tools 2026", "visibility_avg": 62.4, "presence_avg": 90.3, "days": 31, "new_entrant": false }
64 ],
65 "tag_visibility": [
66 { "tag": "Pricing", "prompts": 12, "visibility_avg": 27.5, "zero_prompts": 2, "prior_visibility_avg": 26.9, "visibility_delta": 0.6 }
67 ],
68 "perception_categories": {
69 "categories": {
70 "trust_reliability": { "score": 74.0, "rank": 2, "prior_score": 73.1, "delta": 0.9, "delta_pct": 1.2, "direction": "up" }
71 },
72 "strongest": "trust_reliability",
73 "weakest": "innovation_appeal"
74 },
75 "perception_competitors": [
76 { "name": "Notion", "score_avg": 71.5, "is_you": true, "prior_score_avg": 70.9, "score_delta": 0.6 }
77 ],
78 "descriptors_end": { "primary": ["flexible", "all-in-one"], "emerging": ["AI-native"], "fading": ["complex"] },
79 "citation_top_pages": [
80 { "url": "https://example.com/best-pm-tools", "domain": "example.com", "title": "The best project management tools", "citations": 46, "models": ["chatgpt", "perplexity"], "new_in_list": false }
81 ],
82 "citation_top_gap_domains": [
83 { "domain": "reviews.example", "citations": 58, "pages": 7, "new_in_list": true }
84 ]
85 },
86 "headline_metric_ids": ["visibility_avg", "presence_avg", "rank_end", "rank_pool_end", "mentions_total", "citation_brand_mentions", "citation_source_domain_share_pct", "prompt_coverage_pct", "perception_score_avg", "audit_score_end"],
87 "groups": [
88 { "id": "visibility", "label": "Visibility", "metric_ids": ["visibility_avg", "presence_avg", "mentions_total", "visibility_min", "visibility_max", "report_days", "model_visibility"] }
89 ],
90 "metric_meta": {
91 "rank_end": { "id": "rank_end", "label": "Rank at month end", "group": "competitors", "unit": "rank", "precision": 0, "better": "lower", "aggregation": "recompute", "comparison": "positions", "kind": "measure" }
92 }
93}

Period (also prior)

keystring

The period key, 2026-08 or 2026-Q3

kindstring

month or quarter

labelstring

August 2026, Q3 2026

startstring

First day of the period, YYYY-MM-DD

endstring

Last day of the period, inclusive

statusstring

closed, or open for the current month and for a quarter with a month still running

sourcestring

archive (frozen row), computed (open month, or a closed month archived on demand), derived_from_months (quarter), missing (nothing archived yet)

frozen_atstringnullable

When the row was written. For a quarter, the latest freeze among its months.

pipeline_versionstringnullable

The rollup pipeline that produced the row

restated_atstringnullable

When a figure was last restated

restatementsarray

Every restatement: at, note, pipeline_before, pipeline_after, and changed with the old and new value per field

coverageobject

days_in_period, report_days, perception_runs, citation_days, audit_count and data_status (complete, partial or empty). A quarter adds months_archived and a per-month list.

fields_computedarray

Metric ids computed in this request rather than read from the archive

fields_missingarray

Metric ids with no value for the period

notesarray

Plain-language caveats: an open month, a month computed on demand, a restatement, a plan withholding

monthsobjectnullable

Quarters only: each month key with its source

rank_sourcestringnullable

How the month-end rank was produced; recompute means it was rebuilt from the retained raw answers when the month closed

Metric entry (metrics.*)

valuenumbernullable

The metric for the period

priornumbernullable

The same metric for the prior period. Absent when compare=false.

deltanumbernullable

value minus prior, in the metric's own unit

delta_pctnumbernullable

Percentage change against the prior. Left out when the prior is zero, because a change from zero is a tracking artifact.

positions_gainedintegernullable

Ranks only: prior minus value, so a positive number is an improvement

directionstringnullable

up, down or held from the metric's own point of view, so rank 11 to 10 is up. Metrics with no better direction say higher, lower or held.

Direction is decided server-side from the metric's own point of view. Rank 11 to 10 is a negative delta, a positions_gained of 1 and a direction of up. Print the direction word, not the sign of the delta.

Breakdowns

Lists and maps live under breakdowns, each with the prior period alongside where it exists.

  • model_visibility: models[] with visibility, presence, measured days and mentions per model, plus strongest, weakest and zero_models
  • top_competitors: competitors[] with rank, visibility, prior_rank, positions_gained, visibility_delta and new_in_list, plus notable_change, the rival that gained most
  • top_prompts: the prompts with the highest average visibility, each flagged new_entrant against the prior period
  • tag_visibility: average visibility per prompt tag with zero_prompts and the prior value
  • perception_categories: categories keyed by category with score, prior and direction, plus strongest and weakest
  • perception_competitors: average perception score per tracked competitor, the brand included
  • descriptors_end: primary, emerging and fading descriptors from the last perception run of the period
  • citation_top_pages: the pages naming the brand that were cited most, with citations inside the period and the models that cited them
  • citation_top_gap_domains: the domains cited most with no page naming the brand, the outreach targets

view=list

The archive index: which closed months exist for the brand, the quarters they form, and the open month. Use it before asking for a period so a missing month is not mistaken for a month with no data.

Request
Code language
1curl -H "Authorization: Bearer $TRAKKR_API_KEY" \
2 'https://api.trakkr.ai/get-period-summary?brand_id=BRAND_ID&view=list&months=12'
200 OK
1{
2 "brand": { "id": "00000000-0000-4000-8000-81f286d10c3c", "name": "Notion", "website": "https://notion.so" },
3 "periods": [
4 {
5 "key": "2026-08",
6 "kind": "month",
7 "label": "August 2026",
8 "start": "2026-08-01",
9 "end": "2026-08-31",
10 "status": "closed",
11 "source": "archive",
12 "data_status": "complete",
13 "frozen_at": "2026-09-01T03:12:44+00:00",
14 "restated_at": null,
15 "complete_report_set": true
16 },
17 {
18 "key": "2026-07",
19 "kind": "month",
20 "label": "July 2026",
21 "start": "2026-07-01",
22 "end": "2026-07-31",
23 "status": "closed",
24 "source": "archive",
25 "data_status": "complete",
26 "frozen_at": "2026-08-01T03:10:02+00:00",
27 "restated_at": "2026-08-14T09:30:11+00:00",
28 "complete_report_set": true
29 }
30 ],
31 "quarters": [
32 { "key": "2026-Q3", "kind": "quarter", "label": "Q3 2026", "start": "2026-07-01", "end": "2026-09-30", "status": "open", "source": "derived_from_months", "months_archived": 2 }
33 ],
34 "current": { "key": "2026-09", "kind": "month", "label": "September 2026", "status": "open", "source": "computed", "days_elapsed": 11 }
35}

Status, sources and restatements

status is closed or open. An open month is month to date, is never persisted, carries no month-end rank, and will change until it closes. A quarter with a month still running is open too.

source says where the figures came from. archive is the frozen row. computed is the open month, or a closed month that was not archived yet and has just been computed from retained raw data and stored; it is frozen from then on, and one request fills at most one month. derived_from_months is a quarter. missing means the archive holds nothing for that brand and month and the fill was not possible in this request; every metric is null and notes says so.

A recompute that changes a stored figure appends an entry to restatements with at, note, the pipeline version before and after, and changed keyed by field with the old and new value. The original frozen_at is kept and restated_at marks the latest restatement, so a report can name the change instead of showing a different number with no explanation.

Perception and competitor metrics are withheld on plans without those features. The metric comes back with value: null, its breakdown is dropped, and period.notes names the withheld groups.

Get Metrics

GET/get-metrics

The metric registry: every figure the period endpoints report, with its label, one-line definition, unit, direction of improvement, how a month is formed from daily readings, and how two periods compare. It takes no brand_id. Product tooltips, the Learn metrics page and the MCP trakkr://metrics resource render from the same source.

Request
Code language
1curl -H "Authorization: Bearer $TRAKKR_API_KEY" \
2 'https://api.trakkr.ai/get-metrics'
200 OK
1{
2 "groups": [
3 {
4 "id": "visibility",
5 "label": "Visibility",
6 "tagline": "How often and how prominently the brand shows up in AI answers.",
7 "metrics": [
8 {
9 "id": "visibility_avg",
10 "label": "Visibility average",
11 "group": "visibility",
12 "unit": "score",
13 "precision": 1,
14 "better": "higher",
15 "aggregation": "mean_daily",
16 "comparison": "points",
17 "kind": "measure",
18 "definition": "How prominently AI models mention the brand across every tracked prompt and model, weighted by where it appears in the answer, averaged over each measured day in the period. 0 to 100.",
19 "aggregation_note": "Average of the daily values inside the period, one value per day.",
20 "quarter_rule": "weighted_days",
21 "learn_url": "https://trakkr.ai/learn/metrics#visibility"
22 }
23 ]
24 }
25 ],
26 "metrics": {
27 "visibility_avg": { "...": "the same entry, keyed by id" }
28 },
29 "comparison_kinds": ["points", "percent", "positions", "none"]
30}

Metric

idstring

The key used in metrics and breakdowns, for example visibility_avg

labelstring

Display label, for example Visibility average

groupstring

visibility, competitors, citations, prompts, perception or site_health

unitstring

score, percent, count, rank, map or list

precisioninteger

Decimal places the value is rounded to

betterstring

higher, lower or none

aggregationstring

How the month is formed: mean_daily, sum_daily, sum_activity, mean_runs, end_of_period, last_run, min_daily, max_daily, count_days, count_runs, derived or recompute

comparisonstring

points, percent, positions or none

kindstring

measure (one number), breakdown (a list or map) or derived (computed from other archived figures)

definitionstring

/get-metrics and include=definitions only: the one-line definition

aggregation_notestring

/get-metrics and include=definitions only: the aggregation rule in prose

quarter_rulestring

/get-metrics and include=definitions only: weighted_days, weighted_runs, sum, last, min, max, merge_sum or none

learn_urlstringnullable

/get-metrics and include=definitions only: the Learn page anchor for the metric, where one exists

The 35 metric ids, in the order a report reads them. Visibility: visibility_avg, presence_avg, mentions_total, position_avg (answer position when mentioned, not competitor rank), visibility_min, visibility_max, report_days, model_visibility. Competitors: rank_end, rank_avg, rank_pool_end, top_competitors. Citations: citations_total, citation_brand_mentions, citation_brand_pages_cumulative_end, citation_days, citation_source_domains_end, citation_source_domains_brand_end, citation_source_domain_share_pct, citation_top_pages, citation_top_gap_domains. Prompts: prompts_measured, prompts_with_visibility, prompt_coverage_pct, top_prompts, tag_visibility. Perception: perception_score_avg, perception_categories, perception_competitors, descriptors_end, perception_runs. Site health: audit_score_end, audit_open_issues_end, audit_count. Traffic: ai_sessions_total, AI-referred sessions from the connected analytics property, read once, three days after the month ends, so the provider has finished counting it.

The definitions in prose are on the Learn metrics page.

period on the other endpoints

Seven read endpoints accept period=YYYY-MM or period=YYYY-Qn and then read their own shape from the archive. When period is set, days is ignored and the response carries the same period block as above. A malformed key returns 400.

  • /get-scores: every view. Not combinable with tag_ids or prompt_id (400); visibility by tag for the period is in the summary's breakdowns.
  • /get-rankings: view=overall only. win_rate and threat_count are null, and a month with no archived rank returns 404.
  • /get-models: total_queries is the number of measured days for the model, presence is filled, and the average_position and top-3 fields are null.
  • /get-competitor-data: view=summary only, and the response takes a period shape: your_rank, rank_pool, your_visibility, competitors[] with prior_rank, positions_gained, visibility_delta and new_in_list, notable_change and perception_competitors.
  • /get-citations: view=top_pages and view=analytics. appearance_count is the page's citations inside the period, with appearance_count_period and models alongside. In analytics, top_domains are the domains cited most with no page naming the brand, and period_figures carries the brand-page figures.
  • /get-perception: view=dashboard and view=metrics. perception_score.change_period is the change against the prior period.
  • /get-audits: the audit whose score stood at the end of the period. Site health for the period is audit_score_end in the summary.

Use Cases

  • Build a monthly client report that fetches the same figures again next quarter
  • Compare August with July, or Q3 with Q2, with the direction already right for ranks
  • Check status, source and restatements before a number goes into a deck
  • Render metric labels, units and definitions from /get-metrics instead of hard-coding them
  • List what is archived with view=list before backfilling a warehouse

Code example

Request
Code language
1curl -H "Authorization: Bearer $TRAKKR_API_KEY" \
2 'https://api.trakkr.ai/get-period-summary?brand_id=BRAND_ID&period=2026-08'
200 OK
1{
2 "brand": { "id": "00000000-0000-4000-8000-81f286d10c3c", "name": "Notion", "website": "https://notion.so" },
3 "period": {
4 "key": "2026-08",
5 "kind": "month",
6 "label": "August 2026",
7 "start": "2026-08-01",
8 "end": "2026-08-31",
9 "status": "closed",
10 "source": "archive",
11 "frozen_at": "2026-09-01T03:12:44+00:00",
12 "pipeline_version": "rollup-v3",
13 "restated_at": null,
14 "restatements": [],
15 "coverage": {
16 "days_in_period": 31,
17 "report_days": 31,
18 "perception_runs": 4,
19 "citation_days": 31,
20 "audit_count": 4,
21 "data_status": "complete"
22 },
23 "fields_computed": [],
24 "fields_missing": [],
25 "notes": [
26 "Rank was rebuilt from the retained raw answers when the month closed, using the competitor roster as of that day."
27 ],
28 "rank_source": "recompute"
29 },
30 "prior": { "key": "2026-07", "kind": "month", "label": "July 2026", "status": "closed", "source": "archive", "...": "same shape as period" },
31 "metrics": {
32 "visibility_avg": { "value": 24.4, "prior": 24.3, "delta": 0.1, "delta_pct": 0.4, "direction": "up" },
33 "presence_avg": { "value": 41.2, "prior": 39.8, "delta": 1.4, "delta_pct": 3.5, "direction": "up" },
34 "rank_end": { "value": 10, "prior": 11, "delta": -1.0, "positions_gained": 1, "direction": "up" },
35 "rank_pool_end": { "value": 1299, "prior": 1264, "delta": 35.0, "delta_pct": 2.8, "direction": "higher" },
36 "mentions_total": { "value": 815, "prior": 790, "delta": 25.0, "delta_pct": 3.2, "direction": "up" },
37 "citation_brand_mentions": { "value": 44, "prior": 51, "delta": -7.0, "delta_pct": -13.7, "direction": "down" },
38 "citation_source_domain_share_pct": { "value": 6.1, "prior": 5.8, "delta": 0.3, "delta_pct": 5.2, "direction": "up" },
39 "prompt_coverage_pct": { "value": 58.3, "prior": 56.7, "delta": 1.6, "delta_pct": 2.8, "direction": "up" },
40 "perception_score_avg": { "value": 71.5, "prior": 70.9, "delta": 0.6, "delta_pct": 0.8, "direction": "up" },
41 "audit_score_end": { "value": 82, "prior": 82, "delta": 0.0, "delta_pct": 0.0, "direction": "held" },
42 "report_days": { "value": 31, "prior": 31 },
43 "...": "one entry per single-number metric"
44 },
45 "breakdowns": {
46 "model_visibility": {
47 "models": [
48 { "model": "ChatGPT", "visibility_avg": 31.2, "presence_avg": 52.0, "days": 31, "mentions_total": 240, "prior_visibility_avg": 30.1, "visibility_delta": 1.1 },
49 { "model": "Perplexity", "visibility_avg": 12.8, "presence_avg": 24.5, "days": 31, "mentions_total": 88, "prior_visibility_avg": 13.6, "visibility_delta": -0.8 }
50 ],
51 "strongest": "ChatGPT",
52 "weakest": "Perplexity",
53 "zero_models": []
54 },
55 "top_competitors": {
56 "competitors": [
57 { "name": "Coda", "visibility": 38.6, "rank": 1, "prior_rank": 1, "prior_visibility": 37.9, "positions_gained": 0, "visibility_delta": 0.7 },
58 { "name": "ClickUp", "visibility": 27.1, "rank": 4, "prior_rank": 6, "prior_visibility": 24.7, "positions_gained": 2, "visibility_delta": 2.4 }
59 ],
60 "notable_change": { "name": "ClickUp", "visibility_delta": 2.4, "positions_gained": 2 }
61 },
62 "top_prompts": [
63 { "prompt_id": "abc-123", "text": "best project management tools 2026", "visibility_avg": 62.4, "presence_avg": 90.3, "days": 31, "new_entrant": false }
64 ],
65 "tag_visibility": [
66 { "tag": "Pricing", "prompts": 12, "visibility_avg": 27.5, "zero_prompts": 2, "prior_visibility_avg": 26.9, "visibility_delta": 0.6 }
67 ],
68 "perception_categories": {
69 "categories": {
70 "trust_reliability": { "score": 74.0, "rank": 2, "prior_score": 73.1, "delta": 0.9, "delta_pct": 1.2, "direction": "up" }
71 },
72 "strongest": "trust_reliability",
73 "weakest": "innovation_appeal"
74 },
75 "perception_competitors": [
76 { "name": "Notion", "score_avg": 71.5, "is_you": true, "prior_score_avg": 70.9, "score_delta": 0.6 }
77 ],
78 "descriptors_end": { "primary": ["flexible", "all-in-one"], "emerging": ["AI-native"], "fading": ["complex"] },
79 "citation_top_pages": [
80 { "url": "https://example.com/best-pm-tools", "domain": "example.com", "title": "The best project management tools", "citations": 46, "models": ["chatgpt", "perplexity"], "new_in_list": false }
81 ],
82 "citation_top_gap_domains": [
83 { "domain": "reviews.example", "citations": 58, "pages": 7, "new_in_list": true }
84 ]
85 },
86 "headline_metric_ids": ["visibility_avg", "presence_avg", "rank_end", "rank_pool_end", "mentions_total", "citation_brand_mentions", "citation_source_domain_share_pct", "prompt_coverage_pct", "perception_score_avg", "audit_score_end"],
87 "groups": [
88 { "id": "visibility", "label": "Visibility", "metric_ids": ["visibility_avg", "presence_avg", "mentions_total", "visibility_min", "visibility_max", "report_days", "model_visibility"] }
89 ],
90 "metric_meta": {
91 "rank_end": { "id": "rank_end", "label": "Rank at month end", "group": "competitors", "unit": "rank", "precision": 0, "better": "lower", "aggregation": "recompute", "comparison": "positions", "kind": "measure" }
92 }
93}
Press ? for keyboard shortcuts