---
title: "Fetch the terminal result payload for a completed job."
method: GET
path: "/v1/jobs/{jobId}/result"
tags: ["Jobs"]
---

# Fetch the terminal result payload for a completed job.

`GET /v1/jobs/{jobId}/result`

## Request

- Base URL: `https://api.on-page.ai`
- URL: `https://api.on-page.ai/v1/jobs/{jobId}/result`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/on-page/apis/on-page-ai-api/docs/v1/jobs/:jobId/result/get.ts> (a function with typed inputs; its response is checked against the schema)

Returns the formatted result payload. Shape varies by job type and (for scans) by depth:
- classify / scan (standard or deep) → `customer_v1` by default.
- Lite scans → `customer_v1_lite` by default (reduced shape, see `schema://customer-report-v1-lite`).

Requesting `response_format=customer_v1` on a Lite scan (or `customer_v1_lite` on a non-Lite scan) is rejected with a 409 `UNSUPPORTED_FORMAT`. Call `GET /v1/jobs/{jobId}` first to confirm the job is terminal.

## Path parameters

- `jobId` string, required

## Query parameters

- `response_format` 'customer_v1' | 'customer_v1_lite' | 'legacy'

## Response `200`

Terminal result payload

- union: Terminal payload for a completed job. The shape varies by job `type` (and for scans, by `depth`) but carries no top-level `type` discriminator — match against the endpoint you called. All documented result shapes include `jobId` and `poweredBy: "On-Page.ai"` proof fields. Scan shapes can be further distinguished by the literal `schema_version` field. The `legacy` format remains runtime-supported for existing callers but is intentionally undocumented.
  - object: Terminal `customer_v1` payload for a completed classify job.
    - `jobId` string, required
    - `poweredBy` 'On-Page.ai', required
    - `meta` object, required
      - `report_date` string
      - `target_keyword` string
      - `location` string
      - `url` string
    - `categories` object[], required
      - `category` string, required
      - `score` number, required
  - object: Terminal `customer_v1` payload for a completed Standard or Deep scan job. Fields live at the top level (no wrapper). `entity_coverage` includes related-entity density scores comparing the analyzed URL against the competitor cohort. Standard and Deep scans include structured-data benchmark and coverage sections; Lite scans omit them. The analysis body is additive — future fields will not break existing consumers. `schema_version` is a literal (`onpage-report-customer-v1`) so the jobResultResponseSchema union can discriminate on it.
    - `jobId` string, required
    - `poweredBy` 'On-Page.ai', required
    - `meta` object, required
      - `report_date` string, nullable, required
      - `target_keyword` string, nullable, required
      - `location` string, nullable, required
      - `url` string, nullable, required
    - `on_page_optimization` object, required: Customer-facing On-Page Optimization Score, computed from scan data already produced by the job. The proprietary algorithm exposes only the final score, grade, confidence, summary, and high-level focus areas.
      - `score` integer, nullable, required
      - `grade` 'Excellent' | 'Strong' | 'Good' | 'Needs Work' | 'Under-optimized' | 'Unavailable', required
      - `confidence` number, required
      - `summary` string, required
      - `focus_areas` string[], required
      - `algorithm_version` 'onpage-optimization-score-v1.1', required
      - `chart` string, nullable, required
    - `benchmarks` object, required
    - `entity_coverage` object, required
    - `topic_and_classification` object, required
      - `your_page` object, nullable, required: The analyzed page's top Google category and rounded confidence percentage. Null for legacy stored results, failed target fetches, or scans without target classification.
        - `category` string, required
        - `confidence` integer, nullable, required
    - `internal_linking` object, required
    - `competitor_term_coverage` object, required
    - `structured_data_benchmarks` object
      - `page1_average` object, required
        - `schema_type_count` number, nullable, required
        - `schema_node_count` number, nullable, required
        - `schema_property_count` number, nullable, required
        - `json_ld_block_count` number, nullable, required
        - `microdata_item_count` number, nullable, required
      - `your_url` object, required
        - `schema_type_count` number, nullable, required
        - `schema_node_count` number, nullable, required
        - `schema_property_count` number, nullable, required
        - `json_ld_block_count` number, nullable, required
        - `microdata_item_count` number, nullable, required
    - `structured_data_coverage` object
      - `competitor_count` number, required
      - `top_competitor_count` number, required
      - `schema_types` object[], required
        - `schema_type` string, required
        - `present_in_competitors` number, required
        - `present_in_top_3` number, required
        - `your_url_count` number, required
    - `serp_speed_benchmark` object: Deep Scan only. Head-to-head loading speed and visual stability of the target page and the top 3 organic competitor pages in the same SERP, measured under identical conditions. Lite and Standard scans never include this field. Deep scans MAY include it (optional — present when the benchmark produced a payload); when present, the `status` value indicates whether the run completed (`ok`) or was short-circuited at an entry gate (`disabled`, `skipped_not_deep`, `skipped_no_target_url`, `skipped_budget_exhausted`, `timeout`, `internal_error`). Clients must check for presence on Deep results and tolerate a present-with-skip-status response.
      - `status` 'ok' | 'disabled' | 'skipped_not_deep' | 'skipped_no_target_url' | 'skipped_budget_exhausted' | 'timeout' | 'internal_error', required
      - `what_this_measures` string, required
      - `measurement_type` 'single_run_lab', required
      - `device_profile` 'mobile_viewport_unthrottled_lab', required
      - `network_profile` 'unthrottled', required
      - `cpu_profile` 'unthrottled', required
      - `benchmark_version` string, required
      - `web_vitals_version` string
      - `target` object
      - `competitors` object
      - `chart_core_web_vitals` string, nullable, required
      - `chart_resource_weight` string, nullable, required
    - `originality` object
      - `score` integer, required
      - `grade` 'Highly original' | 'Moderately original' | 'Mostly shared', required
      - `sentence_analysis` object, required
        - `original` integer, required
        - `shared` integer, required
        - `duplicative` integer, required
        - `total_scored` integer, required
      - `duplicative_passages` object[], required
        - `snippet` string, required
        - `matched_domain` string, required
      - `information_gain` object, required
        - `content_most_competitors_have` object[], required
          - `snippet` string, required
          - `competitor_count` integer, required
        - `potential_uncovered_topics_for_information_gain` string[], required
        - `unique_data_points` object, required
          - `your_count` integer, required
          - `page1_average` number, nullable, required
          - `examples` string[], required
      - `chart` string, nullable, required
    - `link_opportunities` object
      - `algorithm_version` string, required
      - `keyword` string, nullable, required
      - `items` object[], required
        - `url` string, required
        - `position` integer, required
        - `domain` string, nullable, required
        - `title` string, nullable, required
        - `page_format` string, required
        - `platform` string, nullable, required
        - `subreddit` string, nullable, required
        - `content_date` string, nullable, required
        - `date_source` string, nullable, required
        - `domain_rank_bucket` string, required
        - `topic_relation` string, required
        - `action` string, required
        - `scores` object, required
          - `attainability` integer, required
          - `willingness` integer, required
          - `seo_link_value` integer, required
          - `ai_citation_value` integer, required
          - `overall` integer, required
        - `reasons` string[], required
    - `schema_version` 'onpage-report-customer-v1', required
  - object: Terminal `customer_v1_lite` payload for a completed Lite scan job. Lite omits `topic_and_classification`, `internal_linking`, and the `related_category_entities` / `specific_category_entities` branches of `entity_coverage` because the Lite pipeline does not run NLP classification or internal-link discovery. Schema: `docs/customer-report-v1-lite/onpage-report-customer-v1-lite.schema.json`.
    - `jobId` string, required
    - `poweredBy` 'On-Page.ai', required
    - `meta` object, required
      - `report_date` string, nullable, required
      - `target_keyword` string, nullable, required
      - `location` string, nullable, required
      - `url` string, nullable, required
    - `on_page_optimization` object, required: Customer-facing On-Page Optimization Score, computed from scan data already produced by the job. The proprietary algorithm exposes only the final score, grade, confidence, summary, and high-level focus areas.
      - `score` integer, nullable, required
      - `grade` 'Excellent' | 'Strong' | 'Good' | 'Needs Work' | 'Under-optimized' | 'Unavailable', required
      - `confidence` number, required
      - `summary` string, required
      - `focus_areas` string[], required
      - `algorithm_version` 'onpage-optimization-score-v1.1', required
      - `chart` string, nullable, required
    - `benchmarks` object, required
    - `entity_coverage` object, required
      - `your_url_related_entity_density_score` number, nullable, required: Weighted related-entity signal per 1,000 main-content words for the analyzed URL.
      - `competitor_related_entity_density_score` number, nullable, required: Average weighted related-entity signal per 1,000 main-content words across the competitor cohort.
      - `natural_language_entities` object[], required
      - `highly_related_terms` object[], required
      - `keyword_variations` object[], required
      - `chart_density_gap` string, nullable, required
      - `chart_coverage_status` string, nullable, required
      - `chart_top_missing` string, nullable, required
    - `competitor_term_coverage` object, required
    - `schema_version` 'onpage-report-customer-v1-lite', required

## Other responses

- `400`: Validation error
- `401`: Unauthorized
- `403`: Scope forbidden
- `404`: Job not found
- `409`: Either the job is not yet in a terminal state (`RESULT_NOT_READY`) or the requested `response_format` is incompatible with the job (`UNSUPPORTED_FORMAT`, e.g. `customer_v1` asked on a Lite scan).
- `429`: Too many requests. Body is a `oneOf` of rate-limit / org-active-limit / org-queued-limit / scan-queue-saturated variants — branch on `error.code`. `Retry-After` is present when the limiter emits it; `X-RateLimit-*` is present on rate-limit-middleware 429s; `X-Concurrency-*` is present on concurrency-limit 429s (ORG_ACTIVE_LIMIT_REACHED / ORG_QUEUED_LIMIT_REACHED).
- `500`: Internal error

---

[API](https://skmtc.dev/on-page/apis/on-page-ai-api.md) - [All operations](https://skmtc.dev/on-page/apis/on-page-ai-api/llms.txt) - [OpenAPI document](https://skmtc.dev/on-page/apis/on-page-ai-api/revisions/a081e8701c19?raw)
