---
title: "Get Agent Readiness"
method: GET
path: "/agent-analytics/readiness"
tags: ["Agent Analytics"]
---

# Get Agent Readiness

`GET /agent-analytics/readiness`

## Request

- Base URL: `https://api.peec.ai/customer/v1`
- URL: `https://api.peec.ai/customer/v1/agent-analytics/readiness`
- Auth: one of:
  - API key in header `X-API-Key`
  - API key in query parameter `api_key`
  - HTTP bearer

How ready the project's own brand domains and its competitors' domains are for AI agents, from Peec's agent readiness audit. Each domain of each brand is its own entry in `own` or `competitors`.

Each site gets a level from 0 to 5 (0 Turned away, 1 Reachable, 2 Findable, 3 Readable, 4 Operable, 5 Transactable), named in `level_name`. A level is reached when every counted check of that level and of every level below it passes, so `next_level.blocking_check_ids` lists what to fix next. A level counts its gate checks; a level with no gate, such as Operable and Transactable, counts every applicable check instead. Each check also reports its own outcome and what that outcome means in `reason_label`, including the optional checks of a gated level that never block it, how to fix it, and the pages it failed on.

Reading this endpoint never starts an audit; request one for the project's own domains with `POST /agent-analytics/readiness/audits`, then follow it through `latest_run` on the domain's `own` entry. A domain without an audit completed in the last 90 days returns `audit: null`.

## Query parameters

- `project_id` string: Required if using a company api key
- `domains` string[]: Only include these domains, own or competitor, exactly as the response lists them. Omit to include every domain.
- `check_ids` string[]: Only include these checks in each audit's `checks`. Omit to include every check. `level`, `next_level` and `blocking_check_ids` always count every check.

## Response `200`

Success

- object: Success
  - `own` object[], required: Every own brand domain of the project, audited or not. Empty when the project has no own domain.
    - `brand` object, required
      - `id` string, required
      - `name` string, required
    - `domain` string, required: One of the own brand's domains, exactly as the brand lists it; a brand with several domains appears once per domain.
    - `audit` object, nullable, required: The newest audit completed within the last 90 days, or null when the domain has none.
      - `completed_at` string, required: When the audit finished, in ISO 8601 (UTC).
      - `level` integer, required: The highest level whose counted checks all pass, climbing from level 1: a level's gate checks, or every applicable check on a level with no gate, such as Operable and Transactable. 0 until every level 1 gate passes.
      - `level_name` string, required: The name of `level`: 0 Turned away, 1 Reachable, 2 Findable, 3 Readable, 4 Operable, 5 Transactable.
      - `level_question` string, required: The question `level` answers for agents.
      - `ceiling` integer, required: The highest level this audit can award the site: the top level with at least one applicable counted check.
      - `ceiling_name` string, required: The name of `ceiling`.
      - `ceiling_question` string, required: The question `ceiling` answers for agents.
      - `next_level` object, nullable, required: What stands between the site and the next level. Null when the site is already at its ceiling.
        - `level` integer, required
        - `level_name` string, required: The name of the next level.
        - `level_question` string, required: The question the next level answers for agents.
        - `passed_gates` integer, required: Counted checks of the next level that already pass.
        - `total_gates` integer, required: Applicable counted checks of the next level.
        - `blocking_check_ids` string[], required: The counted checks that keep the site from the next level. Fix these to level up.
      - `checks` object[], required: Every check the audit ran, in catalog order.
        - `id` 'domain.robots_txt' | 'domain.ai_agent_access' | 'domain.sitemap' | 'domain.link_headers' | 'domain.llms_txt' | 'domain.soft_404' | 'domain.content_signals' | 'domain.aipref_content_usage' | 'domain.sitemap_lastmod' | 'domain.llms_full_txt' | 'domain.api_catalog' | 'domain.mcp_server_card' | 'domain.oauth_authorization_server' | 'domain.oauth_protected_resource' | 'domain.a2a_agent_card' | 'domain.agent_skills_index' | 'domain.auth_md' | 'domain.web_bot_auth' | 'domain.ard' | 'domain.ucp' | 'page.md_suffix' | 'page.render_without_javascript' | 'page.navigation_without_javascript' | 'page.markdown_negotiation' | 'page.bot_reachability' | 'page.meta_robots' | 'page.snippet_controls' | 'page.soft_404' | 'page.structured_data' | 'page.organization_schema' | 'page.semantic_landmarks' | 'page.heading_structure' | 'page.document_title' | 'page.language' | 'page.meta_description' | 'page.canonical' | 'page.open_graph' | 'page.image_alt_text' | 'page.descriptive_links' | 'page.editorial_freshness' | 'page.page_type_schema' | 'page.entity_linking', required
        - `title` string, required: The check's name, as the Peec app shows it.
        - `level` integer, required: The level this check counts toward.
        - `level_name` string, required: The name of the check's level.
        - `level_question` string, required: The question the check's level answers for agents.
        - `tier` 'gate' | 'reported' | 'emerging', required: `gate` (Scored): Decides your level. Every scored check at a level has to pass to clear it. `reported` (Optional): Hygiene that doesn't change your level, unless the level has no scored checks. `emerging` (Optional): A standard few agents use yet. It only counts on a level with no scored checks.
        - `outcome` 'confirmed' | 'absent' | 'invalid' | 'blocked' | 'inconclusive' | 'not_applicable', required: The check's result across every page it ran on, the most severe one winning. `absent`, `invalid`, and `blocked` need fixing.
        - `reason_label` string, required: What the result that decided `outcome` means, in plain language, such as why a file counts as malformed.
        - `why` string, required: Why the check matters to AI agents, written for the check's outcome, such as a missing file versus a malformed one.
        - `fix` string, required: How to make the check pass from its outcome.
        - `failing_pages` string[], required: Up to 5 URLs of pages the check failed on, sorted. Empty when it failed on none, and for checks of the whole domain, such as robots.txt.
    - `latest_run` object, nullable, required: The domain's newest audit run, to follow one requested with `POST /agent-analytics/readiness/audits`. Null when no audit was ever run for the domain.
      - `id` string, required: The run's id, as `POST /agent-analytics/readiness/audits` returns it in `run_id`.
      - `status` 'queued' | 'running' | 'completed' | 'failed' | 'cancelled', required: `queued` and `running` runs are in progress. Once a run is `completed`, `audit` holds its result.
      - `created_at` string, required: When the run was requested, in ISO 8601 (UTC).
      - `finished_at` string, nullable, required: When the run completed or failed, in ISO 8601 (UTC). Null while it is in progress.
      - `error` string, nullable, required: The error code of the run's last failed attempt, such as `execution_failed` or `execution_expired`, or null. A `failed` run always has one.
  - `competitors` object[], required: Every competitor brand of the project that has a domain, audited or not.
    - `brand` object, required
      - `id` string, required
      - `name` string, required
    - `domain` string, required: One of the competitor brand's domains; a brand with several domains appears once per domain.
    - `audit` object, nullable, required: The newest audit completed within the last 90 days, or null when the domain has none.
      - `completed_at` string, required: When the audit finished, in ISO 8601 (UTC).
      - `level` integer, required: The highest level whose counted checks all pass, climbing from level 1: a level's gate checks, or every applicable check on a level with no gate, such as Operable and Transactable. 0 until every level 1 gate passes.
      - `level_name` string, required: The name of `level`: 0 Turned away, 1 Reachable, 2 Findable, 3 Readable, 4 Operable, 5 Transactable.
      - `level_question` string, required: The question `level` answers for agents.
      - `ceiling` integer, required: The highest level this audit can award the site: the top level with at least one applicable counted check.
      - `ceiling_name` string, required: The name of `ceiling`.
      - `ceiling_question` string, required: The question `ceiling` answers for agents.
      - `next_level` object, nullable, required: What stands between the site and the next level. Null when the site is already at its ceiling.
        - `level` integer, required
        - `level_name` string, required: The name of the next level.
        - `level_question` string, required: The question the next level answers for agents.
        - `passed_gates` integer, required: Counted checks of the next level that already pass.
        - `total_gates` integer, required: Applicable counted checks of the next level.
        - `blocking_check_ids` string[], required: The counted checks that keep the site from the next level. Fix these to level up.
      - `checks` object[], required: Every check the audit ran, in catalog order.
        - `id` 'domain.robots_txt' | 'domain.ai_agent_access' | 'domain.sitemap' | 'domain.link_headers' | 'domain.llms_txt' | 'domain.soft_404' | 'domain.content_signals' | 'domain.aipref_content_usage' | 'domain.sitemap_lastmod' | 'domain.llms_full_txt' | 'domain.api_catalog' | 'domain.mcp_server_card' | 'domain.oauth_authorization_server' | 'domain.oauth_protected_resource' | 'domain.a2a_agent_card' | 'domain.agent_skills_index' | 'domain.auth_md' | 'domain.web_bot_auth' | 'domain.ard' | 'domain.ucp' | 'page.md_suffix' | 'page.render_without_javascript' | 'page.navigation_without_javascript' | 'page.markdown_negotiation' | 'page.bot_reachability' | 'page.meta_robots' | 'page.snippet_controls' | 'page.soft_404' | 'page.structured_data' | 'page.organization_schema' | 'page.semantic_landmarks' | 'page.heading_structure' | 'page.document_title' | 'page.language' | 'page.meta_description' | 'page.canonical' | 'page.open_graph' | 'page.image_alt_text' | 'page.descriptive_links' | 'page.editorial_freshness' | 'page.page_type_schema' | 'page.entity_linking', required
        - `title` string, required: The check's name, as the Peec app shows it.
        - `level` integer, required: The level this check counts toward.
        - `level_name` string, required: The name of the check's level.
        - `level_question` string, required: The question the check's level answers for agents.
        - `tier` 'gate' | 'reported' | 'emerging', required: `gate` (Scored): Decides your level. Every scored check at a level has to pass to clear it. `reported` (Optional): Hygiene that doesn't change your level, unless the level has no scored checks. `emerging` (Optional): A standard few agents use yet. It only counts on a level with no scored checks.
        - `outcome` 'confirmed' | 'absent' | 'invalid' | 'blocked' | 'inconclusive' | 'not_applicable', required: The check's result across every page it ran on, the most severe one winning. `absent`, `invalid`, and `blocked` need fixing.
        - `reason_label` string, required: What the result that decided `outcome` means, in plain language, such as why a file counts as malformed.
        - `why` string, required: Why the check matters to AI agents, written for the check's outcome, such as a missing file versus a malformed one.
        - `fix` string, required: How to make the check pass from its outcome.
        - `failing_pages` string[], required: Up to 5 URLs of pages the check failed on, sorted. Empty when it failed on none, and for checks of the whole domain, such as robots.txt.

## Other responses

- `403`: Response for status 403

## Changes

- **2026-11-03** `9fdffdff48a5`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/peec/apis/peec-ai-customer-api/changes/agent-analytics/readiness/get.md)

---

[API](https://skmtc.dev/peec/apis/peec-ai-customer-api.md) - [All operations](https://skmtc.dev/peec/apis/peec-ai-customer-api/llms.txt) - [OpenAPI document](https://skmtc.dev/peec/apis/peec-ai-customer-api/revisions/9d774600c8eb?raw)
