---
title: "Submit a fabric-1.0 job"
method: POST
path: "/v1/fabric-1.0"
tags: ["Fabric 1.0"]
---

# Submit a fabric-1.0 job

`POST /v1/fabric-1.0`

Start an asynchronous job that animates a source image to lip-sync it to an audio track, producing a talking video at the resolution you choose.

**Inputs**

- `image_url` — public URL of the source image (should contain a face)
- `audio_url` — public URL of the audio track to speak
- `resolution` — output resolution: `480p` or `720p`

**What happens next**

The job is **accepted immediately** — you get `202 Accepted` with a `job_id` and status `PROCESSING`. Rendering runs in the background; poll `GET /v1/fabric-1.0/{job_id}` until the job is `COMPLETED` or `FAILED`.

## Headers

- `X-Veed-Store-IO` '0' | '1'
- `X-Veed-Media-Expiration-Seconds` integer

## Request body

- FabricInput
  - `$schema` string, uri — A URL to the JSON Schema for this object.
  - `audio_url` string, uri, required — URL of the audio track to lip-sync to.
  - `image_url` string, uri, required — URL of the source image to animate.
  - `resolution` '720p' | '480p', required — Output video resolution.

## Response `202`

Accepted

- ResourceFabricJob
  - `$schema` string, uri — A URL to the JSON Schema for this object.
  - `data` FabricJob, required
    - `error` JobErrorFabricErrorCode
      - `code` 'input_validation' | 'content_moderation' | 'invalid_file' | 'audio_too_long' | 'transload_failed' | 'generation_failed' | 'timeout', required — Stable, machine-readable failure code for this job type.
      - `details` JobErrorDetail[], nullable — Optional structured failure details.
        - `field` string — Dotted path to the offending input, when applicable.
        - `message` string, required — Human-readable explanation of this detail.
        - `type` string, required — The category of this detail entry.
      - `message` string, required — Human-readable failure message.
    - `job_id` string, uuid, required — Stable identifier of the job and of the resource it produces.
    - `result` FabricVideo
      - `video` File, required
        - `content_type` string — The mime type of the file.
        - `file_name` string — The name of the file.
        - `file_size` integer — The size of the file in bytes.
        - `url` string, required — The URL where the file can be downloaded from.
    - `status` 'PROCESSING' | 'COMPLETED' | 'FAILED' | 'CANCELLED', required — Current lifecycle state of the job.

## Other responses

- `401` — Unauthorized
- `422` — Unprocessable Entity
- `429` — Rate limit exceeded
- `500` — Internal Server Error

---

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