---
title: "Rework a project"
method: POST
path: "/marketing/projects/{id}/revisions"
tags: ["marketing"]
---

# Rework a project

`POST /marketing/projects/{id}/revisions`

## Request

- Base URL: `https://api.gogoscreen.com/api/v1`
- URL: `https://api.gogoscreen.com/api/v1/marketing/projects/{id}/revisions`
- Auth: one of:
  - HTTP bearer
  - HTTP bearer

Save a new version of a project: different words, different scenes, different music, a different speed or look, or a restore of an earlier version. `expectedRevisionId` is a compare-and-set against the project's CURRENT revision — if somebody else saved in the meantime it is 409 `revision_conflict` with the id that won, and nothing is written. Parts the customer has locked are not moved by a re-plan. Every version is kept, so every change is undoable.

## Path parameters

- `id` string, uuid, required

## Headers

- `Idempotency-Key` string, required

## Request body

- object
  - `copy` object: The words, by role.
  - `expectedRevisionId` string, uuid, required: The revision you are changing. A compare-and-set: 409 if it is no longer current.
  - `locks` object: The parts to pin against a re-plan.
  - `music` object
  - `narration` union
    - object
    - boolean
  - `restoreRevisionId` string, uuid: Restore an earlier version as a NEW one; the history is never rewritten.
  - `scenes` object: Which picture fills which slot.
  - `speed` number
  - `style` object

## Response `201`

Rework a project

- object
  - `currentRevisionId` string, required
  - `revision` object, required
    - `createdAt` string, date-time, nullable, required
    - `document` object, required: The revision's own document: the scenes, the copy, the music and the timing. Open shape, may gain keys; ≤65536 bytes, ≤16 deep.
    - `id` string, required
    - `locks` object, required: The parts of this revision the customer has locked. Open shape, may gain keys; ≤65536 bytes, ≤16 deep.
    - `number` number, required
    - `parentRevisionId` string, nullable, required
    - `projectId` string, required
    - `restoredFromRevisionId` string, nullable, required
    - `seed` number, required

## Other responses

- `400`: `validation_failed` — That request is not valid. · `idempotency_key_required` — This operation needs an Idempotency-Key header: a string of up to 128 characters, unique to this request, so a retry cannot do the work twice. · `unknown_template` — No such design. The catalogue is at GET /api/v1/catalog/marketing/templates. · `unsupported_format` — That design does not offer that shape. `details.formats` lists what it does. · `unsupported_duration` — That design does not offer that length. `details.durations` lists what it does. · `invalid_revision` — That revision is not valid. `details.errors` says why. · `expected_revision_required` — Name the revision you are changing, so a save cannot land on words you never saw. · `edit_not_understood` — That change was not understood whole, so nothing was changed. `details` says why and what this editor does take.
- `401`: `unauthorized` — Authentication is required.
- `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. · `source_version_not_found` — No such version of that website source.
- `409`: `idempotency_conflict` — That idempotency key was already used with a different request. · `idempotency_in_progress` — That idempotency key is still being processed. · `conflict` — That request conflicts with the current state. · `source_not_ready` — That source is not ready to be used yet. · `source_unreadable` — That source could not be read. · `missing_required_footage` — That design needs footage this recording does not have. `details.reasons` says which. · `revision_conflict` — That revision is no longer the project's current one. · `export_in_flight` — An export of that project is still running. · `gallery_example` — One of that project's exports is published as a gallery example. · `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_speed_breaks_music_ending` — At that version's saved speed the music would not end with the film. `details.missing` says what to put right. · `campaign_speed_breaks_narration_fit` — At that version's saved speed a spoken line would no longer fit its shot. `details.missing` says what to put right.
- `429`: `rate_limited` — Too many requests. Try again shortly.
- `500`: `internal_error` — Something went wrong. Try again.
- `503`: `storage_unavailable` — File storage is temporarily unavailable.

---

[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)
