---
title: "Create an AEO report"
method: POST
path: "/api/aeo/reports"
tags: ["AEO Reports"]
---

# Create an AEO report

`POST /api/aeo/reports`

## Request

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

Creates a one-time AEO report for any domain, and returns its ID. Data collection runs in the background and takes several minutes. Read the report with Get AEO report; there is no separate status field.

- `domain` is required.
- `country_code` defaults to the account's country. A report covers one country.
- `brand_name` defaults to a name derived from `domain`.
- `brands` adds up to 5 competitor brands, and `cities` up to 5 target cities.
- `ai_models` defaults to the plan's report models (ChatGPT and Gemini if the plan sets none). Duplicates are ignored.

The plan decides how many suggested prompts the report tracks. Each report uses one report from the plan's monthly allowance. On custom (contract) plans, it reserves one full scan from the plan's run pool instead.

## Request body

- ApiAeoCreateReportReq
  - `ai_models` ApiAeoModel[]: AI models to track. Defaults to the plan's report models. Must not be empty when sent; duplicates are ignored.
  - `brand_name` string: Name of the brand to report on. Defaults to a name derived from `domain`.
  - `brands` ApiAeoBrandSeedReq[]: Up to 5 competitor brands to compare against.
    - `domains` string[], required: The competitor's domains. At least one is required.
    - `name` string, required: Competitor brand name, used as given.
  - `cities` string[]: Up to 5 cities to target for local visibility.
  - `country_code` string: Country to report on, as an ISO 3166-1 alpha-2 code. Case-insensitive. Defaults to the account's country.
  - `domain` string, required: Domain of the brand to report on. A leading `http://` or `https://` and a trailing `/` are ignored.

## Response `201`

Created

- ApiAeoIdResp
  - `id` string: ID of the created resource.

## Other responses

- `400`: Bad request. `error_code` is `InvalidInput` and `errors` is empty. - `domain` is missing or invalid, `country_code` is unsupported, `ai_models` is empty, or `brands` or `cities` is invalid.
- `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. - `AeoModelsLimitExceeded`: `ai_models` lists more models than the plan allows for reports. - `AeoReportsLimitExceeded`: the plan's monthly report allowance is used up, or the plan includes no reports. - `AeoRunsLimitExceeded`: a custom plan's run pool can't fund another report.
- `409`: Conflict. `error_code` is `InvalidState`, and `errors[0].code` names the cause: - `AeoReportCreationInProgress`: another report is being created for this account. Retry later.
- `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)
