---
title: "Would this generation be accepted?"
method: POST
path: "/marketing/generations/preflight"
tags: ["marketing"]
---

# Would this generation be accepted?

`POST /marketing/generations/preflight`

## Request

- Base URL: `https://api.gogoscreen.com/api/v1`
- URL: `https://api.gogoscreen.com/api/v1/marketing/generations/preflight`
- Auth: one of:
  - HTTP bearer
  - HTTP bearer

Judge a generation request without starting one: the design exists, the manifest has the pictures it needs, the words would fit the frames, the brand is resolvable. Allocates nothing, spends nothing, creates nothing — it is a read in every sense but the verb, which is a POST because the request is a body. A refusal names the field, so a form can point at it before a customer waits for a video.

## Request body

- object
  - `assetUseConsent` true: Your consent to use the pictures the scan found on your own site.
  - `assist` true: Have the words written for you. Requires `assetUseConsent`.
  - `audioMode` 'music' | 'silent' | 'voice' | 'voice-music'
  - `brandChoice` 'saved' | 'website'
  - `brandName` string
  - `brief` object: { audience, objective, mustSay } — what the words should aim at.
  - `durationSeconds` integer, required: One the design offers at this format, from `catalog.marketing.templates.list`. The six-second edition is retired and is refused here.
  - `expectedRevisionId` string, uuid
  - `format` 'portrait' | 'landscape' | 'square' | 'four-five', required
  - `music` object: { trackId } from the design's own catalogue.
  - `narration` object, nullable: The voice the words are written FOR: { voiceId, language, cadence, synthesisSpeed? }. Absent means no spoken narration.
  - `projectId` string, uuid: Re-generate INTO an existing project; requires `expectedRevisionId`.
  - `review` object: The approved copy and scene choices. Judged by the campaign contract's own schema.
  - `source` object, required: Which scanned website and which manifest version this is made from.
    - `kind` 'website', required: Always `website`. The only source kind this field takes.
    - `manifestHash` string: The manifest's sha256, as `marketing.sources.get` answers it. Pins the exact scan this was planned against.
    - `sourceId` string, uuid, required: The `id` of a scanned source from `marketing.sources.list`.
    - `version` integer, required: Which manifest version of that source — `marketing.sources.get` answers the current one.
  - `templateId` string, required: A design id from catalog.marketing.templates.list (family=website).
  - `templateVersion` string
  - `title` string

## Response `200`

Would this generation be accepted?

- object: What the request would be accepted as: validity, the template version it resolved to, and whether copy is required. Open shape, may gain keys; ≤65536 bytes, ≤16 deep.

## Other responses

- `400`: `validation_failed` — That request is not valid. · `unsupported_duration` — That design does not offer that length. `details.durations` lists what it does. · `brand_logo_source_mismatch` — That logo choice does not match the source it names.
- `401`: `unauthorized` — Authentication is required.
- `402`: `insufficient_seconds` — You do not have enough video time left. Buy more time to keep going.
- `403`: `forbidden_scope` — This credential does not carry the scope this operation needs.
- `404`: `not_found` — No such resource. · `source_not_found` — No such source. · `generation_not_found` — No such generation. · `project_not_found` — No such project. · `source_version_not_found` — No such version of that website source.
- `409`: `generation_busy` — Another generation is already running for that source. · `generation_not_retryable` — That generation cannot be run again. · `generation_idempotency_conflict` — That idempotency key was already used with a different generation. · `brand_kit_required` — Save a brand kit first. · `brand_logo_not_retained` — The logo that choice needs is no longer held. · `source_owner_unavailable` — That account cannot start new work. · `source_version_mismatch` — That version belongs to a different website source. · `source_kind_mismatch` — That project was not made from this kind of source.
- `410`: `source_version_expired` — That version of the website source has been cleaned up. Scan the site again. · `source_expired` — That source is past its retention window. · `source_deleted` — That source has been deleted.
- `413`: `payload_too_large` — That request body is too large.
- `415`: `unsupported_media_type` — That content type is not supported.
- `422`: `campaign_copy_overflow` — Some of those words do not fit the frames they are for. `details.fields` names them. · `campaign_visuals_insufficient` — That design needs more pictures than the source has. `details` says how many and which scenes. · `campaign_logo_aspect_unsupported` — That logo's shape is not one the designs can place. · `campaign_unsupported_claim` — One of those statements is not supported by anything the website says. · `invalid_campaign_narration` — That narration request is not valid.
- `429`: `rate_limited` — Too many requests. Try again shortly.
- `500`: `internal_error` — Something went wrong. Try again.

---

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