---
title: "Get Visibility Trend"
method: GET
path: "/api/v1/geo/experiments/{experiment_id}/visibility-trend"
tags: ["geo-monitoring", "geo-dashboard"]
---

# Get Visibility Trend

`GET /api/v1/geo/experiments/{experiment_id}/visibility-trend`

AI Visibility for an experiment over a date range, bucketed daily or weekly.

A projection of the SAME canonical equal-cell measurement the AI Presence Overview
and the hotel portfolio use — not a separate row-pooled definition. Each local day
pools every eligible data-bearing run (scheduled AND manual) whose canonical local
day falls in the range — scheduled runs by their INTENDED window day, manual runs
by their ``created_at`` date — grouping usable rows by ``prompt × provider`` cell
and pooling all of a day's runs into that cell (more observations deepen a cell's
estimate, never its weight). Orphan (deleted-prompt) rows are excluded, and cells
are weighted equally: ``compute_ai_presence_visibility`` per day and
``compute_period_ai_presence_visibility`` per week over ``(cell, local day)`` (a
weekly point is canonical period visibility, never an average of the daily points).
``mention_rate`` is that equal-cell rate over ALL of the bucket's cells — the
Overall series, and the parity target for the portfolio card's daily series;
``sample_size`` is the usable responses behind it; ``run_ids`` / ``run_count`` are
the runs that contributed to the point. ``is_active`` never enters the calc (cells
come from persisted results), so deactivated prompts still count for the days they
ran. Computed on read; nothing is persisted.

``by_provider`` is the SAME equal-cell measurement scoped to each canonical
provider's cells, one entry per ``PLATFORMS`` name in that fixed order on every
point. A provider with no measured cell in a bucket has ``rate=None`` (rendered as
a gap), never ``0.0``. Overall is measured over the pooled cell set, so it is not
an arithmetic mean of the four provider values whenever their cell counts differ.

## Path parameters

- `experiment_id` string, uuid, required

## Query parameters

- `start_date` string, date, required
- `end_date` string, date, required
- `granularity` 'day' | 'week'

## Response `200`

Successful Response

- VisibilityTrendResponse
  - `points` VisibilityTrendPoint[], required
    - `bucket_start` string, date, required
    - `bucket_end` string, date, required
    - `mention_rate` number, nullable, required
    - `sample_size` integer, required
    - `run_count` integer, required
    - `run_ids` string[], required
    - `by_provider` ProviderVisibility[]
      - `platform_name` string, required
      - `rate` number, nullable
  - `granularity` 'day' | 'week', required

## Other responses

- `404` — Experiment not found
- `422` — Validation Error

## Changes

- **2026-09-03** `d65b8fefae34` — 2 info
  - added the optional property `detail/items/ctx` to the response with the `422` status
  - added the optional property `detail/items/input` to the response with the `422` status

[Change history](https://skmtc.dev/getanana/apis/cleon-api/changes/api/v1/geo/experiments/:experiment_id/visibility-trend/get.md)

---

[API](https://skmtc.dev/getanana/apis/cleon-api.md) · [All operations](https://skmtc.dev/getanana/apis/cleon-api/llms.txt) · [OpenAPI document](https://skmtc.dev/getanana/apis/cleon-api/revisions/41c5e4645524?raw)
