---
search:
  tags:
    - Jobs
    - POST
seo:
  description: >-
    Seals the uploaded file, checks that its size matches input_bytes, and
    queues the job.… Reference for the POST /v1/jobs/{id}/start endpoint in the
    convt API.
sidebar:
  label: Start a job
  badge: POST
title: Start a job
type: openapi-operation
---
Seals the uploaded file, checks that its size matches `input_bytes`, and queues the job. The response usually shows `queued`.

Calling start again is safe: a job that is no longer `created` is returned as it is. If the uploaded size does not match, the job is cancelled and the call fails with `size_mismatch`. Reserve a new job to try again.

If nothing was uploaded, start fails with `502 storage_unavailable` and the job stays `created`. Check that your `PUT` succeeded before you retry.

`POST /v1/jobs/{id}/start`

**Responses**

- `200` — The job, now \`queued\`, or unchanged if it was already started.
- `400` — \`size\_mismatch\`: the upload's size differs from \`input\_bytes\`. The job is cancelled.
- `401` — \`unauthorized\`: no \`Authorization: Bearer\` header.
- `403` — \`unauthorized\` (key invalid or revoked) or a billing limit.
- `404` — \`not\_found\`: the job does not exist, belongs to another account, or has expired.
- `429` — \`rate\_limited\`: more than 120 requests in a minute for this key.
- `502` — \`storage\_unavailable\`: object storage did not answer. Retry with backoff.

Response example, 200:

```json
{
  "id": "job_01k6z7v4q8m3x2a9b5c0d1e2f3",
  "status": "queued",
  "input_format": "png",
  "target_format": "webp",
  "input_bytes": 48213,
  "attempt": 0,
  "error_code": null,
  "expires_at": "2026-10-08T12:00:00Z"
}
```

Response example, 400:

```json
{
  "error": {
    "code": "size_mismatch",
    "message": "Uploaded size must match the reservation and stay within 2 GB."
  }
}
```
