Documentation
Jobs
Create, follow, list and cancel cleaning jobs.
A job is one video being cleaned. Credits are reserved when the job is created and returned if it fails or is canceled.
Lifecycle
| Status | Meaning |
|---|---|
queued |
Credits reserved, waiting for a processing slot |
analyzing |
Reading the captions and the speech of the video |
processing |
Frames are being rebuilt and checked |
succeeded |
The clean video is ready in result.url |
failed |
Processing did not complete; see error (credits returned) |
canceled |
Stopped by you (credits returned) |
While a job runs, stage tells what happens and progress goes from 0 to 1. Stages: queued, preparing, reading_text, downloading, masking, cleaning, verifying, assembling, finalizing, retrying.
Jobs of a workspace run in parallel up to the plan limit (2, 5 or 15). Extra jobs wait in the queue; higher plans are served first when the platform is busy.
Create a job
POST /v1/jobs
| Field | Type | Description |
|---|---|---|
upload_id |
string | An upload created with POST /v1/uploads |
video_url |
string | Public URL of the video (instead of upload_id) |
filename |
string | Optional display name |
texts |
string[] | Optional: the exact texts shown on screen to erase. When given, the automatic reading step is skipped |
metadata |
object | Optional: up to 20 string keys and values, returned with the job and in webhooks |
Send an Idempotency-Key header to retry safely: the same key returns the same job instead of creating a second one.
curl https://pixamake.ai/v1/jobs \
-H "Authorization: Bearer $PIXAMAKE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 0d6c1c5e-62f4-4f57-9c1c-4e6a7c1a2f10" \
-d '{"upload_id": "up_7Qm2rT9vXk3LpZ8aWn4c", "metadata": {"campaign": "spring-sale"}}'The job object
{
"id": "job_3kT9xQ2vLm8RfZp1Wq7a",
"object": "job",
"status": "succeeded",
"stage": null,
"progress": 1,
"source": "api",
"input": { "filename": "ad.mp4", "duration_seconds": 30, "width": 1080, "height": 1920, "size_bytes": 4821331 },
"credits": 75,
"credits_refunded": false,
"result": { "url": "https://...", "expires_at": "2026-10-04T14:12:00.000Z", "size_bytes": 5310877 },
"error": null,
"metadata": { "campaign": "spring-sale" },
"created_at": "2026-10-04T13:05:41.120Z",
"started_at": "2026-10-04T13:05:42.008Z",
"finished_at": "2026-10-04T13:09:57.774Z"
}result.url is a download link valid for one hour. Each GET /v1/jobs/{id} returns a fresh one. Files are kept for the retention period of your plan (7, 30 or 90 days).
Retrieve a job
GET /v1/jobs/{id}. Poll every 5 to 10 seconds, or use webhooks.
List jobs
GET /v1/jobs?limit=20&status=succeeded&starting_after=job_...
| Parameter | Description |
|---|---|
limit |
1 to 100, default 20 |
status |
Filter by status |
starting_after |
Cursor: the id of the last job of the previous page |
{ "object": "list", "data": [ { "id": "job_..." } ], "has_more": true, "next_cursor": "job_..." }Cancel a job
POST /v1/jobs/{id}/cancel stops a queued or running job and returns its credits. Finished jobs are returned unchanged.
Failure codes
error.code |
Meaning |
|---|---|
no_text_found |
No caption or overlay was found in the video. No credits used. |
nothing_erased |
The engine could not find the text to erase. No credits used. |
processing_failed |
The engine stopped with an error. Credits returned. |
timeout |
Processing took too long and was stopped. Credits returned. |
start_failed |
The video could not be prepared after several attempts. Credits returned. |