Skip to main content
A transform makes a new Derived asset from an asset in your Library, using a recipe. Transforms are free, and the original stays as it was. Use one to take a still from a video, cut a clip down, or convert a file that a model refuses.

Transform an asset

Send a recipe to POST /v1/assets/{assetId}/transform. The key needs the runs:create and runs:read scopes, because the new asset’s ID comes from reading the run.

Follow the run

The work runs in the background, so a transform returns a run, not an asset. The response is 202 while the run is unfinished and 200 once it has ended, and Location names the run. To follow it, read GET /v1/runs/{id}. You can also send Prefer: wait=N, up to 60 seconds, on either request to hold the response until the run ends. When the run succeeds, outputs[0].asset is the new asset. Use its id as a run input, or download it with GET /v1/assets/{assetId}/download. A transform’s model is null, and it’s never charged.

Reused work

If you already ran the same recipe on the same asset, for the same project and folder, the response returns that run with reused set to true and starts nothing. This applies to your runs that are unfinished or succeeded, whichever surface started them, as long as the copy is still in that folder. A failed run is never reused, so sending the request again retries it. A retry with the same Idempotency-Key starts nothing and returns the run as it is now.

Recipes

A recipe has one form, chosen by the source asset. Each step is optional, but a recipe needs at least one, and steps always apply in the order shown. For each step’s fields and limits, see the endpoint reference. Crop coordinates are whole pixels of the picture as it displays, the size an asset’s width and height report.

Apply a LUT

A LUT applies to video only. List your organization’s newest 200 LUTs with GET /v1/luts, which needs the library:read scope, and name one in the recipe:
Each LUT’s inputColor says what footage its uploader made it for. ZeroGen can’t check this against your footage, so choose a LUT that matches: a log LUT looks wrong on Rec.709 footage. People add and remove LUTs in ZeroGen, not through the API. lut.strength mixes the original back in: a percent from 1 to 100, where 100, the default, applies the whole LUT.

Correct color

adjust corrects a video’s color after any LUT, so it trims what the LUT gave. It takes exposure, brightness, contrast, saturation, temperature, and tint, each a whole number from -100 to 100, where 0 changes nothing:
inputColor says what the footage is, such as slog3-sgamut3cine or rec709. A file’s metadata can’t tell, so send it only when you know. With it, exposure, temperature, and tint run before any LUT, on the footage’s own curve, which can recover what the LUT would clip. It takes the same values as a LUT’s inputColor.

When a transform fails

A request ZeroGen can refuse up front starts nothing: Some failures show only when the work runs. The run then ends as failed, with the reason in its error: for example, despill, a LUT, and adjust refuse an HDR source. Convert the source to MP4 first, and transform that copy.