Skip to content

marketing.projects.delete

Delete a marketing project

DELETE/marketing/projects/{id}

Operation
marketing.projects.delete
MCP tool
marketing_projects_delete

Remove a project, every revision it has and every export cut from it, files included. Refused with 409 export_in_flight while an export is still being made — cancel it first — and 409 gallery_example when one of its exports is published as a gallery example. Answers counts only.

curl -X DELETE "https://api.gogoscreen.com/api/v1/marketing/projects/<id>" \
  -H "Authorization: Bearer $GOGOSCREEN_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)"
A request to this operation.

At a glance

FactDetail
Scopesmarketing:write
Credentialsa signed in dashboard session or an API key.
Rate limit120 requests a minute per credential, in the write class.
IdempotencyRequired. Send an Idempotency-Key header; a retry with the same key and the same body returns the stored answer with Idempotent-Replayed: true. How idempotency works.
MCP toolmarketing_projects_delete
Always setsCache-Control: private, no-store
Verified emailRequired. An account whose email address is not verified meets 403 email_unverified before the operation runs.
Marketing videosRequired. An account without marketing videos enabled meets 403 feature_disabled before the operation runs.

Path parameters

NameTypeRequiredDescription
idstringRequiredThe resource id, from a create answer or the matching list.format: uuid

Response

Answers 200. Every answer also carries RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset, and every error body carries a requestId.

200 OK

Delete a marketing project

200 OK body

This response has no body fields.

200 OK headers
HeaderMeaning
Cache-ControlAlways private, no-store.
Idempotent-ReplayedPresent only when this answer was stored by an earlier call with the same Idempotency-Key. Nothing new was done.

Errors

Every refusal is { error: { code, message, details?, requestId } }. Branch on code, never on the sentence. The full catalogue is at Errors.

CodeStatusWhen it happensWhat to do
edit_not_understood400A sentence sent to the deterministic editor was not understood whole. Nothing is half applied, so the project is unchanged.details says why, and names the vocabulary the editor does take. Rewrite the sentence within it, or make the change with marketing.revisions.create instead.
expected_revision_required400A save arrived without expectedRevisionId, so it could have landed on words the caller never saw.Read the project, send its current revision id as expectedRevisionId, and handle revision_conflict when somebody else saved first.
idempotency_key_required400A mutating operation arrived over HTTP with no Idempotency-Key header. It is refused before the body is parsed, so a caller missing both learns about both at once.Add an Idempotency-Key header of up to 128 characters, unique to this request. Over MCP the same value goes in the idempotencyKey tool argument.
invalid_revision400The revision document sent does not satisfy the design it names.details.errors says why. Fix each one and save again.
unknown_template400The marketing design named does not exist.Read GET /catalog/marketing/templates and send an id it lists.
unsupported_duration400The design does not offer that length.details.durations lists what it does offer. Pick one of those.
unsupported_format400The design does not offer that shape.details.formats lists what it does offer. Pick one of those.
validation_failed400The merged path, query and body did not match the operation's schema. The schemas are strict, so an unknown field is a failure rather than something ignored, and a string carrying half of a character is refused before it can be stored.Read details.issues. Each entry carries a path, a message and a machine readable code. Fix every named field and send the request again; the same body always fails the same way.
unauthorized401No credential was presented, or the key is unknown, revoked or expired, or an X-API-Key header carried something that is not an API key. details.reason says which.Send Authorization: Bearer gsk_live_…. A revoked or expired key never starts working again, so issue a new one in the developer console. Put a dashboard session token in Authorization, never in X-API-Key.
forbidden_scope403The credential does not carry every scope the operation declares, or it is the wrong kind of credential for it. keys.* and assistant.* are user only and can never be called by a key.details.requiredScopes and details.missingScopes name what is missing. A key's scopes cannot be changed after it is issued, so create a new key with them. When details.allowedActors is present, no key can call this operation at all.
not_found404No resource of that id belongs to this account. A resource that belongs to somebody else answers 404 as well, never 403.Check the id. Do not treat this as a permissions problem.
source_not_found404No website source of that id belongs to this account.Check the id. A source belonging to another account answers the same way.
source_version_not_found404No such version of that website source.Read the source to see which versions exist, then name one of those.
conflict409The request conflicts with the state the resource is in, and no more specific code applies.Re-read the resource and decide from its current state. Retrying the same request unchanged will not help.
export_in_flight409A project delete or another export was asked for while an export of that project is still running.Wait for it, or cancel it with marketing.exports.cancel, then retry.
gallery_example409A project delete was asked for while one of its exports is published as a gallery example.Nothing a caller can change. Ask support to unpublish the example first.
idempotency_conflict409That idempotency key has already been used on this operation with a different request body.Use a fresh key for a different request. A key stands for one intent, not for one attempt.
idempotency_in_progress409The first request under that key is still being worked. Two concurrent identical requests both reach the store and one of them is told this.Wait the Retry-After seconds, which is 2, and send exactly the same request again with the same key. Do not change the body and do not mint a new key.
missing_required_footage409The design needs footage the recording this project was made from does not have.details.reasons says which. Choose a design that fits the recording, or make a recording that covers the missing beats.
revision_conflict409expectedRevisionId is no longer the project's current revision, so somebody else saved first. Nothing was written.details.currentRevisionId is the revision that won. Re-read the project, rebase the change on it, and save again.
source_kind_mismatch409The project was made from a different kind of source than the one being used, for example a walkthrough render where a scanned website is expected.Use the source the project was built from, or start a new project of the right kind.
source_not_ready409The source has not published a manifest yet, or a walkthrough project's render no longer has its clean source kept.Poll the source until state is succeeded. For a walkthrough project, make the render again.
source_unreadable409The scanned website could not be read: it answered nothing usable, or its content was empty.Check the address loads in a browser without a sign in, then scan again.
source_version_mismatch409The version named belongs to a different website source.Send a version number from the source you are naming.
source_deleted410The website source has been deleted. It still reads state: "cancelled".Scan the site again with marketing.sources.create.
source_expired410The website source is past its retention window.Scan the site again. Projects already built from it keep the version they were built from.
source_version_expired410That manifest version has been cleaned up.Scan the site again and build from the new version.
campaign_copy_overflow422Words sent for a marketing scene do not fit the frame the design draws them in. The fit is measured, not guessed.Shorten the fields details.fields names, then send the revision again. marketing.generations.preflight answers the same refusal before anything is created.
campaign_logo_aspect_unsupported422The logo's aspect ratio is not one any design can place.Supply a logo closer to square or to a standard wordmark shape.
campaign_visuals_insufficient422The design needs more pictures than the scanned source has.details says how many are needed and which scenes are short. Scan a richer page, refresh the source, or choose a design with fewer picture slots.
rate_limited429The credential's per minute budget, the account's per minute ceiling, or a daily cap was exceeded. details.scope is minute, day or account, or global when the product's own daily cap on voice previews is spent.Wait the Retry-After seconds and retry. details.limit and details.resetAt say what was hit and when it reopens. The RateLimit-* headers on every answer let a client pace itself before it gets here.
internal_error500An unhandled failure inside this API. The original message is logged and never answered.Retry once, then quote requestId to support. A 5xx deletes the idempotency claim rather than storing it, so retrying under the same key is safe.
storage_unavailable503File storage could not be reached, so no signed URL could be created.Back off and retry. The file itself is unaffected.