---
title: "Get an AEO report"
method: GET
path: "/api/aeo/reports/{report_id}"
tags: ["AEO Reports"]
---

# Get an AEO report

`GET /api/aeo/reports/{report_id}`

## Request

- Base URL: `https://api.duda.co`
- URL: `https://api.duda.co/api/aeo/reports/{report_id}`
- Auth: HTTP basic

Returns a one-time AEO report over the requested period: brand visibility, tracked prompt performance, a sample of answers and, optionally, recommendations.

- `visibility.brands` holds the report's own brand plus up to `brands` competitors.
- `answers` holds the newest answer for each of the top `chats` tracked prompts, per selected model.
- With `include_recommendations=true`, `on_site_recommendations` and `off_site_recommendations` are filled in. Otherwise they are `null`. If the report has no competitor with a domain, `on_site_recommendations` is empty.

`models` isn't checked against the report's tracked models; a model the report doesn't track returns no data.

## Path parameters

- `report_id` string, required

## Query parameters

- `from` string, date, required
- `to` string, date, required
- `brands` string
- `chats` string
- `models` ApiAeoModel[]
- `geos` string[]
- `include_recommendations` boolean

## Response `200`

OK

- ApiAeoReportResp
  - `answers` ApiAeoPromptAnswerResp[]: Sampled answers from the top `chats` tracked prompts.
    - `answer` string: The full answer text.
    - `brands_mentioned` ApiAeoBrandMentionResp[]: Tracked brands the answer mentions.
      - `domains` string[]: The brand's domains.
      - `id` string: Brand ID.
      - `is_own` boolean: `true` for the site's own brand.
      - `name` string: Brand name.
      - `position` number, double: The brand's rank in this answer. 1 is mentioned first.
    - `date` string, date: Date of the answer (UTC).
    - `mentioned` boolean: Whether the answer mentions the site's own brand.
    - `model_domain` string, nullable: Domain of the AI model that answered, such as `chatgpt.com`. `null` for Perplexity.
    - `prompt` string: The prompt text.
    - `source_domains` string[]: Domains the answer cited.
  - `off_site_recommendations` ApiAeoRecommendationsResp
    - `counts` ApiAeoRecommendationCountsResp
      - `high` integer: Number of `HIGH` impact recommendations.
      - `low` integer: Number of `LOW` impact recommendations.
      - `medium` integer: Number of `MEDIUM` impact recommendations.
    - `items` ApiAeoRecommendationResp[]: Recommendations, by impact (`HIGH` first), then by text.
      - `impact` 'HIGH' | 'MEDIUM' | 'LOW': Expected impact of acting on a recommendation.
      - `suggestion` string: What to do.
      - `type` string: Kind of change. On-site: `Blog` or `Site Page`. Off-site: a kind of third-party page (e.g. `Listicle`, `Comparison`, `Article`) or a community site's domain (e.g. `reddit.com`).
  - `on_site_recommendations` ApiAeoRecommendationsResp
    - `counts` ApiAeoRecommendationCountsResp
      - `high` integer: Number of `HIGH` impact recommendations.
      - `low` integer: Number of `LOW` impact recommendations.
      - `medium` integer: Number of `MEDIUM` impact recommendations.
    - `items` ApiAeoRecommendationResp[]: Recommendations, by impact (`HIGH` first), then by text.
      - `impact` 'HIGH' | 'MEDIUM' | 'LOW': Expected impact of acting on a recommendation.
      - `suggestion` string: What to do.
      - `type` string: Kind of change. On-site: `Blog` or `Site Page`. Off-site: a kind of third-party page (e.g. `Listicle`, `Comparison`, `Article`) or a community site's domain (e.g. `reddit.com`).
  - `tracked_prompts` ApiAeoReportTrackedPromptsResp
    - `from` string, date: First day of the period (UTC).
    - `prompts` ApiAeoTrackedPromptResp[]: Up to 25 active prompts, by `ai_visibility_score`, highest first.
      - `ai_visibility_score` number, double: Percentage of answers to this prompt that mention the site's own brand, from 0 to 100.
      - `id` string: Prompt ID.
      - `position` number, double, nullable: The own brand's average rank in answers to this prompt. Lower is better; `0` means no data.
      - `prompt` string: The prompt text.
      - `sentiment` number, double, nullable: How positively the answers describe the own brand, from 0 to 100. 50 is neutral.
      - `volume` integer: Estimated search volume for the prompt.
    - `to` string, date: Last day of the period (UTC).
  - `visibility` ApiAeoVisibilityResp
    - `brands` ApiAeoVisibilityBrandResp[]: Up to 10 brands. The site's own brand comes first, then competitors by visibility.
      - `by_llm` object, nullable: The same statistics per AI model. Currently always `null`.
      - `domain` string: The brand's primary domain.
      - `id` string: Brand ID.
      - `is_own` boolean: `true` for the site's own brand.
      - `mention_count` integer: Number of answers in the period that mention the brand.
      - `name` string: Brand name.
      - `position` number, double: The brand's average rank among the brands mentioned in an answer. Lower is better.
      - `share_of_voice` number, double: The brand's mentions as a percentage of all brand mentions, from 0 to 100.
      - `visibility` number, double: Percentage of answers that mention the brand, from 0 to 100.
    - `from` string, date: First day of the period (UTC).
    - `source_mentions` ApiAeoSourceMentionResp[]: Up to 10 domains the answers cited. The own brand's domains come first, then by share.
      - `by_llm` object: The share per AI model, from 0 to 100. Keys are AI model values such as `CHAT_GPT`.
      - `domain` string: A domain the answers cited.
      - `is_own` boolean: Whether the domain belongs to the site's own brand.
      - `source_share` number, double: Percentage of answers that cite the domain, from 0 to 100.
    - `to` string, date: Last day of the period (UTC).
    - `total_chats` integer: Answers recorded in the period, across all AI models.
    - `total_chats_by_llm` object: Answers recorded in the period, per AI model. Keys are AI model values such as `CHAT_GPT`.
    - `total_mentions` integer: Brand mentions across all answers in the period, summed over every brand.

## Other responses

- `400`: Bad request. `error_code` is `InvalidInput` and `errors` is empty. - A parameter is missing, invalid or out of range.
- `401`: Unauthorized. The credentials are missing or invalid.
- `403`: Forbidden. `error_code` is `AccessForbidden`, and `errors[0].code` names the cause: - `AeoPlanNotFound`: the account has no active AEO plan.
- `404`: Not found. `error_code` is `ResourceNotExist`, and `errors[0].code` names the cause: - `AeoProjectNotFound`: the report doesn't exist or belongs to another account.
- `429`: Too many requests. The rate limit was exceeded.

---

[API](https://skmtc.dev/duda/apis/duda-partner-api.md) - [All operations](https://skmtc.dev/duda/apis/duda-partner-api/llms.txt) - [OpenAPI document](https://skmtc.dev/duda/apis/duda-partner-api/revisions/52be4d41cb12?raw)
