---
title: "project_export.failed"
method: POST
path: "project_export.failed"
tags: ["Webhook events"]
---

# project_export.failed

`POST project_export.failed` (webhook)

Delivered when a project export started via the API fails.

## Payload

- ProjectExportWebhookPayload — Body POSTed to a registered webhook endpoint when a project export started via the API reaches a terminal state. Use `exportId` with `GET /v1/projects/{projectId}/exports/{exportId}` for signed download URLs.
  - `event` 'project_export.succeeded' | 'project_export.failed' | 'project_export.cancelled', required — Lifecycle events emitted for project exports started via the developer API (`POST /v1/projects/{projectId}/export`).
  - `exportId` string, required — Opaque export id matching the original request (e.g. `vg_expo_...`).
  - `projectId` string, required — Id of the exported project (e.g. `vg_proj_...`).
  - `occurredAt` integer, required — Seconds since epoch (Unix timestamp) at which VideoGen observed the terminal state.
  - `exportFileId` string, nullable, required — File id (e.g. `vg_file_...`) of the rendered MP4. Always present as a field; `null` until `project_export.succeeded`. Pass it to `POST /v1/files/{fileId}/hydrate` for signed download URLs.
  - `error` ApiError — Standard error body returned with every non-2xx response (the `default` response of every operation). The HTTP status code conveys the error class; this body carries the details: - `400` invalid request, `401` missing or invalid API key, `403` not permitted (e.g. plan or add-on required, see `requirement`), `404` not found, `409` conflict, `429` rate limited or out of credits, `5xx` server error. Common `code` values include `invalid_request`, `invalid_api_key`, `not_authorized`, `not_found`, `insufficient_credits`, and `rate_limited`. Always branch on `code` (and `requirement.type` when present) rather than parsing `message`.
    - `message` string, required — Human-readable error description. For display and logging only; do not branch on its exact text.
    - `code` string, nullable — Machine-readable error code in snake_case (e.g. `invalid_api_key`, `insufficient_credits`). `null` when no specific code applies.
    - `requirement` ErrorRequirement — What is needed to resolve an error, when it can be fixed by fulfilling a specific requirement (e.g. purchasing an add-on or upgrading the plan).
      - `type` string, required — Machine-readable requirement type in snake_case (e.g. `purchase_add_on`, `upgrade_plan`).
      - `details` object — Key-value pairs with requirement-specific context (e.g. the add-on id to purchase).
    - `internalErrorCode` string, nullable — Opaque internal error code for debugging. Include this when contacting support. `null` when not applicable.

## Acknowledgement `200`

Acknowledge receipt

---

[API](https://skmtc.dev/videogen/apis/videogen-api.md) · [All operations](https://skmtc.dev/videogen/apis/videogen-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/videogen/videogen-api/revisions/33dda0455d67/schema)
