---
title: "Compose draft pages and report broken markup, assets and SEO"
method: POST
path: "/api/v1/sites/{slug}/verify"
tags: ["Draft & publish"]
---

# Compose draft pages and report broken markup, assets and SEO

`POST /api/v1/sites/{slug}/verify`

## Request

- Base URL: `https://api.dotsy.ai`
- URL: `https://api.dotsy.ai/api/v1/sites/{slug}/verify`
- Auth: one of:
  - HTTP bearer
  - HTTP bearer

Renders each page of the draft the way a visitor would see it after publishing and reports what is wrong: unresolved `<dotsy-*>` tags, missing layouts, content or assets, broken menu wiring, redirect problems and SEO errors. It checks the draft, not the live site. It composes every page, so pass `paths` to check just a few. It records an SEO snapshot, which the dashboard shows.

## Path parameters

- `slug` string, required

## Request body

- VerifyRequest: Which pages to check. The body can be empty.
  - `paths` string[]: Route paths to check. Omit it to check every route on the site; a `:param` route such as `/blog/:slug` is checked through one real page of the draft (`checked`), and skipped when it has none.

## Response `200`

The findings.

- VerifyResult
  - `ok` boolean, required: True when there are no site issues and every checked path is `ok`.
  - `warnings` VerifyIssue[], required: Site-wide findings that do not fail the check (menu wiring).
    - `code` string, required
    - `message` string, required
    - `ref` string: The key, route or asset the issue is about.
    - `snippet` string
    - `severity` 'error' | 'warning' | 'info': Absent on a blocking issue, which counts the same as `error`.
  - `siteIssues` VerifyIssue[], required: Site-wide findings that fail the check (menu wiring).
    - `code` string, required
    - `message` string, required
    - `ref` string: The key, route or asset the issue is about.
    - `snippet` string
    - `severity` 'error' | 'warning' | 'info': Absent on a blocking issue, which counts the same as `error`.
  - `paths` object[], required: One entry per checked path.
    - `path` string, required
    - `checked` string: Present when `path` is a `:param` route: the real page that was composed for it, such as `/blog/hello`.
    - `ok` boolean, required
    - `issues` VerifyIssue[], required: Findings that decide `ok`.
      - `code` string, required
      - `message` string, required
      - `ref` string: The key, route or asset the issue is about.
      - `snippet` string
      - `severity` 'error' | 'warning' | 'info': Absent on a blocking issue, which counts the same as `error`.
    - `seoIssues` VerifyIssue[]: SEO findings for the page, including warnings.
      - `code` string, required
      - `message` string, required
      - `ref` string: The key, route or asset the issue is about.
      - `snippet` string
      - `severity` 'error' | 'warning' | 'info': Absent on a blocking issue, which counts the same as `error`.
    - `ruleIssues` RuleIssue[]: Rules from the site brief that failed on this page. Present only when the brief has Rules; an empty array means all passed. A blocking Rule makes `ok` false.
      - `code` 'rule_failed', required
      - `ruleId` string, required
      - `card` 'intent' | 'design' | 'content' | 'seo', required
      - `level` 'block' | 'warn', required
      - `text` string, required
      - `path` string, required
      - `found` string
  - `seo` object, required
    - `scanned` integer, required
    - `errors` integer, required
    - `warnings` integer, required
  - `redirectScanPartial` true: The redirect scan hit its cap, so some redirect targets may have been misjudged.

## Other responses

- `401`: Missing or invalid credentials.
- `403`: This is a POST, so a viewer role (`forbidden_role`) or a read-only key (`forbidden_read_only`) is refused, as is a key scoped to other sites (`forbidden_site_scope`).
- `404`: No such site, or it is not visible to this account (`site_not_found`).

---

[API](https://skmtc.dev/dotsy/apis/dotsy-api.md) · [All operations](https://skmtc.dev/dotsy/apis/dotsy-api/llms.txt) · [OpenAPI document](https://skmtc.dev/dotsy/apis/dotsy-api/revisions/4272ed3b85d7?raw)
