Pixazo APIVideo Tools APIVideo Transition
Pixazo APIVideo Tools APIVideo Transition

Video Transition API - Join Clips With Fades, Wipes and Slides: Pricing, Documentation

by Pixazo

Join clips with a real transition rather than a hard cut. Pick a family - fades, wipes, slides, smooth, geometric, diagonals, slices, wind, cover-reveal or texture - then name the exact effect in transition, giving you all 58 of ffmpeg's transitions rather than a handful. Set the length with crossfade_seconds, from 0.2 to 3 seconds, and shape the audio blend with audio_curve, including nofade to leave a music bed untouched. Accepts 2 to 4 MP4 or MOV clips totalling up to 60 seconds of source.

Get API Key
Video Transition API

Models Version

WELCOME BONUS

Get $5 Free Credit on First Payment

No strings attached — add funds and get $5 bonus instantly

Claim Your $5 →

Video Transition 1.0 API Documentation

https://gateway.pixazo.ai/media-tools/v1/video-transition

Authentication

All requests require an API key passed via header.

Pricing: Billed at $0.004 per second of the produced video — the total length of the clips you join. Joining three 30-second clips costs $0.18. Combined source is capped at 60 seconds.

Rounding: billing is per second but always rounds up to a whole second — a 5.06-second source bills as 6 seconds. The shortest billable job is 1 second.

Retries: this is an asynchronous job on shared encoding capacity, so a request can occasionally come back processing_failed or take much longer than usual. These are transient and succeed on a retry, and a failed job is never charged — the wallet hold is released. If you chain these tools, retry a failed step rather than failing the whole pipeline.

Inputs must be MP4 or MOV. Anything else — WebM, MKV, AVI — is rejected up front with every video_urls entry must be a readable MP4/MOV. The reason is billing, not capability: a merge is priced on the SUM of its clips, so every clip’s duration has to be measured before the job is accepted, and that measurement reads the MP4/MOV container only. Rejecting is deliberate — guessing a duration would mis-charge you. Convert other formats with the Video Converter API first, then merge.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour API subscription key

Video Transition generate request

Request Code

POST https://gateway.pixazo.ai/media-tools/v1/video-transition
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_API_KEY

{
  "video_urls": [
    "https://api-assets.pixazo.ai/media-api-test/t.mov",
    "https://api-assets.pixazo.ai/media-api-test/t.mov"
  ],
  "family": "fades",
  "transition": "dissolve",
  "crossfade_seconds": 1.0
}
import requests

url = "https://gateway.pixazo.ai/media-tools/v1/video-transition"
headers = {
    "Content-Type": "application/json",
    "Cache-Control": "no-cache",
    "Ocp-Apim-Subscription-Key": "YOUR_API_KEY"
}
data = {
    "video_urls": [
        "https://api-assets.pixazo.ai/media-api-test/t.mov",
        "https://api-assets.pixazo.ai/media-api-test/t.mov"
    ],
    "family": "fades",
    "transition": "dissolve",
    "crossfade_seconds": 1.0
}

response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = "https://gateway.pixazo.ai/media-tools/v1/video-transition";
const headers = {
  "Content-Type": "application/json",
  "Cache-Control": "no-cache",
  "Ocp-Apim-Subscription-Key": "YOUR_API_KEY"
};
const data = {
  "video_urls": [
    "https://api-assets.pixazo.ai/media-api-test/t.mov",
    "https://api-assets.pixazo.ai/media-api-test/t.mov"
  ],
  "family": "fades",
  "transition": "dissolve",
  "crossfade_seconds": 1.0
};

fetch(url, {
  method: "POST",
  headers: headers,
  body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.log(data));
curl -X POST "https://gateway.pixazo.ai/media-tools/v1/video-transition" \
  -H "Content-Type: application/json" \
  -H "Cache-Control: no-cache" \
  -H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
  --data-raw '{
    "video_urls": [
      "https://api-assets.pixazo.ai/media-api-test/t.mov",
      "https://api-assets.pixazo.ai/media-api-test/t.mov"
    ],
    "family": "fades",
    "transition": "dissolve",
    "crossfade_seconds": 1.0
  }'

Output

{
  "request_id": "media-transition_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/media-transition_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

Webhook (Optional)

Add the X-Webhook-URL header to your generate request to receive a POST callback instead of polling.

X-Webhook-URL: https://your-server.com/webhook/callback

Request Parameters - Video Transition generate request

Parameter Required Type Default Allowed values / range Description
video_urlsYesarray of strings2 – 4 items; each an HTTP(S) URL to an MP4 or MOV; combined length ≤ 60 sThe clips to join, in the order given, with a transition between each pair. Every entry must be readable — if any one cannot be measured the request is rejected before you are charged.
familyYesenumfades, wipes, slides, smooth, geometric, diagonals, slices, wind, cover-reveal, textureWhich group of transitions to use. Pick the family for the effect you want — a dip or blend (fades), a travelling edge (wipes, smooth, diagonals), a moving clip (slides, cover-reveal), a shape opening or closing (geometric), banded or streaky dissolves (slices, wind), or an optical effect (texture). Then name the exact one in transition.
transitionYesenumDepends on family — see Transitions by family belowThe specific transition, which must belong to the family you named. A valid transition from the wrong family is rejected with a 400 listing that family's values, so the two fields can never disagree silently.
audio_curveNoenumtrinofade, tri, qsin, esin, hsin, log, ipar, qua, cub, squ, cbr, par, exp, iqsin, ihsin, dese, desi, losi, sinc, isinc, quat, quatr, qsin2, hsin2The fade shape applied to the audio at each join. tri (the default) is a straight linear crossfade. nofade leaves the audio untouched through the join — useful when a continuous music bed should not dip. The rest are easing curves: qsin, hsin and esin are sine-based and sound gentler than linear; log, exp and par weight the fade toward one side.
crossfade_secondsNonumber1.00.2 – 3How long each transition lasts. It must be shorter than the first and last clips, and at most half of any clip between them — otherwise the request is rejected with a message naming the clip. That rule is deliberate: a longer fade would consume a clip entirely and silently drop it from the output.
target_resolutionNoenum— (matches the first clip)480p, 720p, 1080pNormalise every clip to this size before joining. Omit it and the first clip's dimensions are used.

Transitions by family. Both family and transition are required, and the transition must be one of the values listed for the family you chose. The bold value in each row is a good default if you have no preference. All 58 are available.

familyValid transition valuesWhat it looks like
fadesfade, fadeblack, fadewhite, fadegrays, fadefast, fadeslow, dissolveBlends and dips. Straight cross-dissolves, dips through black/white/grey, and a grainy per-pixel dissolve.
wipeswipeleft, wiperight, wipeup, wipedown, wipetl, wipetr, wipebl, wipebrA hard edge travels across the frame, revealing the next clip. Four sides plus four corners.
slidesslideleft, slideright, slideup, slidedownBoth clips move together — the outgoing one is pushed off frame.
smoothsmoothleft, smoothright, smoothup, smoothdownThe same directions as a wipe, but with a soft, ramped edge instead of a hard line.
geometriccircleopen, circleclose, circlecrop, rectcrop, vertopen, vertclose, horzopen, horzclose, radialA shape opens or closes over the frame. radial sweeps around the centre like a clock hand.
diagonalsdiagtl, diagtr, diagbl, diagbrThe boundary runs corner to corner.
sliceshlslice, hrslice, vuslice, vdsliceThe frame is cut into bands that swap one after another.
windhlwind, hrwind, vuwind, vdwindA streaky, directional dissolve, as if blown across the frame.
cover-revealcoverleft, coverright, coverup, coverdown, revealleft, revealright, revealup, revealdownOne clip moves over or off a stationary one. cover* slides the incoming clip on top; reveal* slides the outgoing clip away to expose it.
texturezoomin, pixelize, hblur, distance, squeezeh, squeezevOptical and sampling effects rather than a moving boundary — zoom, blur, pixelate, squeeze.

Example Request

{
  "video_urls": [
    "https://api-assets.pixazo.ai/media-api-test/t.mov",
    "https://api-assets.pixazo.ai/media-api-test/t.mov"
  ],
  "family": "fades",
  "transition": "dissolve",
  "crossfade_seconds": 1.0
}

Response

{
  "request_id": "media-transition_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "QUEUED",
  "polling_url": "https://gateway.pixazo.ai/v2/requests/status/media-transition_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

Request Headers

Header Value
Content-Typeapplication/json
Cache-Controlno-cache
Ocp-Apim-Subscription-KeyYOUR_API_KEY

Response Handling

Common status codes.

CodeMeaning
202Accepted — Request queued
Bad Request
401Unauthorized
402Insufficient Balance
403Forbidden
Too Many Requests
500Internal Server Error

Error Responses

Queue system errors and model validation errors.

Queue System Errors

// 402 — Insufficient balance
{
  "error": "Insufficient Balance",
  "message": "Your wallet does not have enough balance."
}
// 400 — Model not found
{
  "error": "Model not found",
  "message": "Model 'media-transition' not found or is disabled"
}

Error via Status/Webhook

{
  "request_id": "media-transition_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "media-transition",
  "error": "Description of the error",
  "output": null
}

Retrieving Results

Poll the universal status endpoint to check progress and retrieve results.

Endpoint

GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_API_KEY

cURL Example

curl -H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
  "https://gateway.pixazo.ai/v2/requests/status/media-transition_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

Response (Completed)

{
  "request_id": "media-transition_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "media-transition",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/media-transition_019dxxxx/output.mp4"
    ],
    "media_type": "video/mp4"
  },
  "created_at": "2026-03-31T10:00:00.000Z",
  "updated_at": "2026-03-31T10:00:15.000Z",
  "completed_at": "2026-03-31T10:00:15.000Z"
}

Response Fields

FieldTypeDescription
request_idstringUnique request identifier
statusstringQUEUED, PROCESSING, COMPLETED, FAILED, or ERROR
model_idstringModel that processed the request
errorstring|nullError message if failed
output.media_urlarrayURLs to generated media (R2 CDN)
output.media_typestringMIME type of the output
created_atstringWhen request was created
completed_atstringWhen request completed
polling_urlstringStatus URL (initial response only)

Status Values

StatusDescription
QUEUEDRequest accepted, waiting to be processed
PROCESSINGBeing processed by the model
COMPLETEDDone — output contains the result
FAILEDFailed — check error field
ERRORSystem error — not charged

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

  1. Send a generate request to the API endpoint
  2. Save the request_id from the response
  3. Poll every 5-10 seconds: GET /v2/requests/status/{request_id}
  4. When status is "COMPLETED", download from output.media_url

Tip: Use X-Webhook-URL header to get a callback instead of polling.

Video Transition 1.0 API Pricing

Your request will cost $0.004 per second of the produced video.
joining two 10-second clips with a 1-second fade costs $0.08

⚡ Performance

Live usage measured on Pixazo's gateway, split by model version. Generation time is how long a generation takes end-to-end (lower is better). Success rate is the percent of generations that complete (higher is better).

Show data for the last
Generations
2,900last 30d
~97 per day
Success rate
62.1%
of completed generations
Generation time
44.4savg
p95 69.4s
Requests
Jul 27max 2,900Aug 25
Video Transition 1.0Avg 97/day
Generation Time
Jul 27max 44.4sAug 25
Video Transition 1.0Avg 44.4s
Error Rate
Jul 27max 37.9%Aug 25
Video Transition 1.0Avg 37.9%

〰 Uptime

Percent of generations that succeeded over the selected period, per model version.

Avg. Success Rate (30d)
62.07%
across all generations of this model family
Uptime
Jul 27max 100%Aug 25
SuccessfulAvg 62.07%