---
title: "Make a page, or one screenshot, again"
method: POST
path: "/pages/{id}/regenerate"
tags: ["Pages"]
---

# Make a page, or one screenshot, again

`POST /pages/{id}/regenerate`

## Request

- Base URL: `https://pagefully.com/api/v1`
- URL: `https://pagefully.com/api/v1/pages/{id}/regenerate`
- Auth: HTTP bearer

With `what` left out or `page`: the whole page is written and drawn again as a job, and the answer is 202 with `job_id`. A page already being built is not started twice: the job building it is the answer. With `headline`, `background` or `screen` and a screenshot: new words from the model, the next style, or the next of the app's screens the page is not using, done before the answer, which is 200 with `job_id` null. Each counts against the month's rewrites for the plan, counted across the workspace. Approval is withdrawn.

## Path parameters

- `id` string, uuid, required

## Request body

- object
  - `what` 'page' | 'headline' | 'background' | 'screen': Left out, it is the whole page.
  - `slot_id` string, uuid: The screenshot, by id.
  - `position` integer: The screenshot, by its place on the page.

## Response `200`

One screenshot was made again.

- object
  - `job_id` unknown, required
  - `page` Page, required
    - `id` string, uuid, required
    - `app_id` string, uuid, required
    - `name` string, required
    - `kind` string, required
    - `message` string, required
    - `state` string, required: rendering (being built), ready, failed, publishing, in_asc (made in App Store Connect, not submitted for review) or rejected.
    - `approved` boolean, required
    - `locale` string, required
    - `error` string, nullable, required
    - `style` 'clean' | 'bold' | 'soft' | 'night' | 'lift' | 'closeup', required: The page's style.
    - `promo_text` string, required
    - `keywords` string[], required
    - `targets` string[], required
    - `reach` string, required: search (it holds a keyword from the keyword field) or ads (reached from ads and links only).
    - `needs_key` boolean, required: The app has no App Store Connect key, so the page cannot be sent yet.
    - `preflight` object, required
      - `blocked` boolean, required: Something fails: the page cannot be approved or sent.
      - `warnings` integer, required
      - `passed` integer, required
      - `checks` Check[], required: What failed or warned.
        - `id` string, required: The rule, by its key: claim_guarantee, competitor, fits.
        - `level` 'warn' | 'fail', required
        - `label` string, required: The rule, by its name.
        - `detail` string, required: What is wrong and what to do.
        - `scope` string, required: slot, promo or page.
        - `slot` integer
        - `overridden` boolean
        - `source` 'rule' | 'measure' | 'judge', required: rule: an exact match. measure: counted from the drawings. judge: the classifier's reading of the whole line.
        - `probability` number: For a judgement: how likely the line breaks the rule, 0 to 1. It warns at 0.5, and a rule that can block fails at 0.85.
        - `text` string, nullable, required: The words the finding is about: the screenshot's headline and subline, or the promotional text. Null for a finding about the page as a whole.
        - `phrase` string, nullable, required: The exact words a rule matched. Null for a judgement, which reads the whole line and gives no span.
        - `rule` object, required
          - `id` string, required
          - `name` string, required
          - `question` string: For a claim: what the classifier is asked of the line.
          - `counts_as` string: For a claim: what counts as breaking the rule.
          - `does_not_count` string: For a claim: what does not.
          - `passes_when` string, nullable, required
        - `said` string, required: All of it in one sentence: where, the words, the rule, and how it was decided.
    - `slots` object[], required
      - `id` string, uuid, required
      - `position` integer, required
      - `headline` string, required
      - `subline` string, required
      - `state` string, required: pending, rendering, ready or failed.
      - `screen` integer, required: Which of the app's screens it shows, by position.
      - `style` string, nullable, required: Its own style, or null where it follows the page's.
      - `highlight` string, required
      - `design` 'ours' | 'theirs' | 'kept', required: ours: the app's screen in Pagefully's own design, where a headline, a subline and a style all apply. theirs: the developer's own designed screenshot with only its words changed, where a style has nothing to change. kept: a poster with no headline of its own, left whole.
      - `own_words` boolean, required: Still shows the developer's own words: new words could not be set on its design, so the picture is as the developer made it and `headline` is not on it.
      - `screenshot` object, nullable, required
        - `url` string, required: The drawing at display size.
        - `width` integer, required
        - `height` integer, required
        - `device` string, required
      - `checks` Check[], required
        - `id` string, required: The rule, by its key: claim_guarantee, competitor, fits.
        - `level` 'warn' | 'fail', required
        - `label` string, required: The rule, by its name.
        - `detail` string, required: What is wrong and what to do.
        - `scope` string, required: slot, promo or page.
        - `slot` integer
        - `overridden` boolean
        - `source` 'rule' | 'measure' | 'judge', required: rule: an exact match. measure: counted from the drawings. judge: the classifier's reading of the whole line.
        - `probability` number: For a judgement: how likely the line breaks the rule, 0 to 1. It warns at 0.5, and a rule that can block fails at 0.85.
        - `text` string, nullable, required: The words the finding is about: the screenshot's headline and subline, or the promotional text. Null for a finding about the page as a whole.
        - `phrase` string, nullable, required: The exact words a rule matched. Null for a judgement, which reads the whole line and gives no span.
        - `rule` object, required
          - `id` string, required
          - `name` string, required
          - `question` string: For a claim: what the classifier is asked of the line.
          - `counts_as` string: For a claim: what counts as breaking the rule.
          - `does_not_count` string: For a claim: what does not.
          - `passes_when` string, nullable, required
        - `said` string, required: All of it in one sentence: where, the words, the rule, and how it was decided.
    - `screens` object[], required: The app's screens a screenshot can show.
      - `position` integer, required
      - `fit` number, nullable, required: How well it suits this page's search, 0 to 1.
      - `on_page` boolean, required
    - `regenerations_left` integer, nullable, required: Rewrites by the model left this month.
    - `job_id` string, uuid, nullable, required: The job building it, if one is.
    - `preview_url` string, required: The page in the web app.

## Other responses

- `202`: The whole page is being made again.
- `400`: The request could not be read: a body that is not a JSON object, or a field missing or of the wrong kind.
- `401`: No token, or one that is not valid or has been revoked.
- `402`: A plan's limit stopped the call. `error.code` is `upgrade_required`, `error.message` states the facts, and `error.upgrade.url` is the app's plan screen.
- `403`: The token's scope does not allow this call.
- `404`: Not found on this workspace.
- `422`: Understood, and refused by the product. The message says why, in a sentence that can be shown as it is.
- `429`: Too many calls: 120 requests a minute for a token, and 20 generation starts an hour. `retry_after` is seconds.

---

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