---
title: "Audit a single page"
method: POST
path: "/audits/page"
tags: ["Audits"]
---

# Audit a single page

`POST /audits/page`

## Request

- Base URL: `https://next.frase.io/api/v1`
- URL: `https://next.frase.io/api/v1/audits/page`
- Auth: one of:
  - API key in header `X-API-KEY`
  - HTTP bearer

Synchronously scrape and audit a single URL, returning E-E-A-T, GEO, and SEO scores along with detected issues. Every route uses the canonical page scorer; no background audit job is queued.

## Request body

- object
  - `url` string, uri, required: The URL to audit. Must be http or https.
  - `keyword` string: Optional target keyword for SEO scoring context.
  - `audit_page_id` string, uuid: Optional audit page ID. When provided, re-audits the page within its site audit context, updating the auditPages row and recalculating the parent audit score.
  - `site_audit_id` string, uuid: Optional site audit ID. Used together with audit_page_id to specify which site audit the page belongs to.
  - `site_id` string, uuid: Optional site ID. When provided, the endpoint uses this site for routing instead of auto-detecting by domain.
  - `confirm_target_keyword_change` boolean: Retry with true only after the user explicitly confirms replacing the page's canonical target keyword following a 409 response.

## Response `201`

Audit completed successfully (synchronous). Returned for routes: standalone, reaudit_in_site_audit, add_to_site_audit.

- object
  - `route` 'standalone' | 'reaudit_in_site_audit' | 'add_to_site_audit': The routing path taken by the endpoint.
  - `id` string, uuid
  - `url` string, uri
  - `status` 'completed' | 'failed'
  - `keyword` string, nullable
  - `content_type` 'blog_post' | 'page' | 'faq' | 'glossary' | 'comparison' | 'pillar' | 'how_to' | 'landing' | 'listicle' | 'case_study' | 'tutorial' | 'news' | 'product_update' | 'data_report' | 'event' | 'resource' | 'alternative' | 'tool_review' | 'null', nullable: Canonical content type. Null when classification is not applicable or unmeasured.
  - `content_type_confidence` 'high' | 'medium' | 'low' | 'null', nullable: Categorical confidence in the canonical content classification.
  - `content_type_status` 'classified' | 'fallback' | 'not_applicable' | 'unmeasured': Whether canonical classification succeeded, used a deterministic fallback, was not applicable, or was unmeasured.
  - `content_type_method` 'llm' | 'deterministic' | 'null', nullable: Classification method. Null when no classifier ran.
  - `content_type_version` string, nullable: Internal classifier revision. Null when no classifier ran.
  - `title` string, nullable
  - `meta_description` string, nullable
  - `word_count` integer
  - `overall_score` integer, nullable
  - `eeat_score` integer, nullable
  - `eeat_breakdown` object, nullable
  - `geo_score` integer, nullable
  - `geo_breakdown` object, nullable
  - `seo_score` integer, nullable
  - `seo_breakdown` object, nullable
  - `issues` object[]
  - `headings` object[]
    - `level` integer
    - `text` string
  - `outbound_links` string[]
  - `author_name` string, nullable
  - `analyzed_at` string, date-time
  - `created_at` string, date-time

## Other responses

- `409`: Target keyword conflict. Confirm the change with the user, then retry with confirm_target_keyword_change=true.
- `422`: Invalid URL
- `429`: Audit page limit exceeded

---

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