Skip to main content
Every Percify API job is asynchronous: the call that starts it returns an id at once, and the file arrives later. Read the result by polling with ?wait=45, which holds the request on Percify’s side until the job ends, or by passing a webhook URL so Percify posts the result to you. Failed and timed-out jobs refund their credits automatically.

Generation statuses

These apply to POST /v1/run and GET /v1/generations/{id}. The OpenAPI document also lists queued. Treat it like processing if you ever see it.

Three ways to wait

You do not have to poll for a job to finish. Percify also checks running jobs in the background, so outputs are saved and webhooks are sent either way.

How long can a job run?

A generation that has not finished fails with Generation timed out after 15 minutes plus 5 seconds for every second of input audio or video. Any generation still processing after 30 minutes is failed as well. In both cases the credits are refunded. Lip-sync and other video models take the longest, so use wait or a webhook for them rather than a tight loop.

What happens to credits?

Retry safely

Network errors and timeouts on your side do not tell you whether a run started. Send an Idempotency-Key header on POST /v1/run, and reuse the same value when you retry. Percify returns the generation it already created and does not charge twice.

Longer pipelines

The replication and short-video endpoints run several generations for you and have their own statuses. These endpoints have no wait parameter, so poll them every few seconds or pass a webhook. Details are on Analyze and replicate a short video and Make a short video from a topic.

Get a generation

The polling endpoint and its fields.

Webhooks

Payloads and signature headers.

Errors and rate limits

What each failure means.

Code examples

A full run-and-wait loop in three languages.
Last modified on September 16, 2026