---
title: "Confirm upload and trigger processing (upload-based jobs only)"
method: POST
path: "/api/v1/jobs/{id}/complete-upload"
tags: ["Jobs"]
---

# Confirm upload and trigger processing (upload-based jobs only)

`POST /api/v1/jobs/{id}/complete-upload`

## Request

- Base URL: `https://api.weftly.ai`
- URL: `https://api.weftly.ai/api/v1/jobs/{id}/complete-upload`
- Auth: API key in header `Authorization`

For upload-based jobs (`transcribe`, `summarize`, `find_clips`, `clips_from_video`, `clips_youtube`) only. Verifies that the file landed in R2 storage and that the job is paid, then triggers processing.

Do NOT call this for `extract_clip` / `extract_vertical_clip` / `edit_from_transcript` — those are no-upload derivative jobs and use POST /api/v1/jobs/{id}/process instead.

## Path parameters

- `id` string, uuid, required

## Response `200`

Processing started

- CompleteUploadResponse
  - `job_id` string, uuid, required
  - `status` 'processing', required

## Other responses

- `400`: File not found in storage, or job is a no-upload type (use /process)
- `402`: Payment required
- `404`: Job not found

---

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