Skip to content

Preview Videxo runs jobs, accepts uploads up to 100 MB, serves output downloads and sends signed webhooks. Sign in with email, GitHub or a passkey. Payments are not connected yet, so credit packs and paid plans cannot be bought. Read the quickstart

A Creatomate alternative. JSON, without an editor.

Creatomate pairs a template editor with an API: design in the browser, then change the named parts per render. Videxo has no editor and no templates. It takes JSON that plays clips, stills and title cards in order, with text, overlays, your subtitles and music.

curl "$VIDEXO_API_URL/v1/transcode" \
  -H "Authorization: Bearer $VIDEXO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "input": "https://example.com/video1.mp4",
  "filename": "video1-titled.mp4",
  "resize": {
    "width": 1080,
    "height": 1080,
    "fit": "contain",
    "enlarge": false
  },
  "text": [
    {
      "text": "This text is placed in the element Text-1",
      "font": "inter-bold",
      "size": 44,
      "position": "bottom"
    }
  ],
  "webhook_url": "https://example.com/webhook",
  "metadata": {
    "note": "Any text value"
  }
}'

Side by side

Videxo and Creatomate. Checked on Nov 7, 2026.

Videxo and Creatomate, as their own pages describe them on Nov 7, 2026
TopicVidexoCreatomate
Before the first jobAn API key as a Bearer token. No bucket, role or queue to create.An API key from your project settings, as a Bearer token.
How a video is describedJSON: named inputs and an output whose parts play in order. Or the ffmpeg command you already run. Checked before the job is created.POST /v2/renders with a template_id and modifications, or RenderScript: JSON with elements on numbered tracks.
What a video is built fromVideo clips, still images and title cards in sequence, with up to 8 text layers and 4 overlays on an output, subtitles from your SRT or WebVTT file, and music.Image, video, audio, text, shape and composition elements, with animation presets, transitions and keyframes.
Visual editorNone. You write JSON or an ffmpeg command.A browser template editor with a timeline and keyframes. Its Preview SDK embeds an editor in your app, for desktop browsers.
Saved templatesNone. The JSON body stays in your code.Saved in your account; a render names one and changes its dynamic parts. Also managed over the API.
Generated mediaNone. Every picture and sound is a file you send.Subtitles transcribed at render time; speech and images through ElevenLabs, OpenAI or Stability AI, with your own provider keys.
Output formatsVideo as MP4, MOV, WebM, MKV or TS, audio files, JPG, PNG and GIF.mp4, jpg, png or gif, up to 3840 pixels on a side.
Where outputs goStored for your plan’s retention, 7 days to 30 days, with signed download links that last up to an hour.Hosted on its CDN for up to 30 days. For longer, its docs say to download the file when the webhook arrives and keep it yourself.
When a job endsA webhook URL per job or endpoints on your account, signed in the Standard Webhooks format and retried for about a day.A webhook_url per render, or a default in project settings. Signing is not documented.
AI assistants (MCP)An MCP server that checks, runs and waits for jobs with your API key.A hosted MCP server: list, create and edit templates, start renders and read their status.
CompanyBEO TECHNOLOGY sp. z o.o., Poland, in the European Union.Creatomate, a registered company from the Netherlands, founded in 2020.
  • Videxo

    Before the first job
    An API key as a Bearer token. No bucket, role or queue to create.
    How a video is described
    JSON: named inputs and an output whose parts play in order. Or the ffmpeg command you already run. Checked before the job is created.
    What a video is built from
    Video clips, still images and title cards in sequence, with up to 8 text layers and 4 overlays on an output, subtitles from your SRT or WebVTT file, and music.
    Visual editor
    None. You write JSON or an ffmpeg command.
    Saved templates
    None. The JSON body stays in your code.
    Generated media
    None. Every picture and sound is a file you send.
    Output formats
    Video as MP4, MOV, WebM, MKV or TS, audio files, JPG, PNG and GIF.
    Where outputs go
    Stored for your plan’s retention, 7 days to 30 days, with signed download links that last up to an hour.
    When a job ends
    A webhook URL per job or endpoints on your account, signed in the Standard Webhooks format and retried for about a day.
    AI assistants (MCP)
    An MCP server that checks, runs and waits for jobs with your API key.
    Company
    BEO TECHNOLOGY sp. z o.o., Poland, in the European Union.
  • Creatomate

    Before the first job
    An API key from your project settings, as a Bearer token.
    How a video is described
    POST /v2/renders with a template_id and modifications, or RenderScript: JSON with elements on numbered tracks.
    What a video is built from
    Image, video, audio, text, shape and composition elements, with animation presets, transitions and keyframes.
    Visual editor
    A browser template editor with a timeline and keyframes. Its Preview SDK embeds an editor in your app, for desktop browsers.
    Saved templates
    Saved in your account; a render names one and changes its dynamic parts. Also managed over the API.
    Generated media
    Subtitles transcribed at render time; speech and images through ElevenLabs, OpenAI or Stability AI, with your own provider keys.
    Output formats
    mp4, jpg, png or gif, up to 3840 pixels on a side.
    Where outputs go
    Hosted on its CDN for up to 30 days. For longer, its docs say to download the file when the webhook arrives and keep it yourself.
    When a job ends
    A webhook_url per render, or a default in project settings. Signing is not documented.
    AI assistants (MCP)
    A hosted MCP server: list, create and edit templates, start renders and read their status.
    Company
    Creatomate, a registered company from the Netherlands, founded in 2020.

Creatomate, as its own pages said on Nov 7, 2026: API overview Create a render Render status Modifications Set up a webhook File retention RenderScript RenderScript quick start Animations Subtitles AI providers Template editor Preview SDK MCP Integrations About

Before you read on

What Videxo does not have. Said plainly.

Videxo runs each job as ffmpeg over the files you send. A timeline and an editor are a different product, and this API is not one.

  • No visual editor. You write JSON or an ffmpeg command. There is no editor to design in, none to embed in your app and no picture preview before a job runs.
  • No hosted templates. We store no template to render by id. The JSON body stays in your code, and your code fills in the values.
  • No timeline. There are no tracks and no clips placed at set times. Parts play one after another, with text and up to 4 overlays on top.
  • No keyframes. Text fades in and out, stills have six fixed motions, and parts cross with transitions from a fixed list. Nothing moves along a path you set.
  • No generated media. No voices, no images and no captions from speech. Every picture and sound is a file you send, and subtitles come from your SRT or WebVTT file.
  • No no-code connectors. There is no Zapier, Make or n8n module of ours. A tool that can send an HTTP request can call the API.
  • No fonts of your own. Text uses the curated fonts listed at GET /v1/fonts; you cannot link a font file.
  • Always a file in. A job reads at least one input, so a video from text alone is refused.

Moving over

What each part is called here. One request per job.

Every job returns the ffmpeg command it ran, so you can compare the output with what you have today, one job at a time.

Every output type and option
Creatomate concepts and what they are in Videxo
CreatomateVidexo
POST /v2/rendersPOST /v1/jobs, or POST /v1/concat, /v1/slideshow or /v1/transcode
RenderScriptThe operations body: inputs and outputs
Video and image elements in a row on one trackParts in concat
Composition with a fill_color and textA title card: color, duration and text
Animation with transition: truetransition on the part
Text elementA text layer on the output or on a part
transcript_source with an SRT or WebVTT filesubtitles, reading an SRT or WebVTT input
Audio elementaudio.input, or audio.mix under the clips’ sound
output_format, width and heightformat or the filename’s extension, and resize
max_width and max_heightresize with enlarge: false: scaled down to fit, never up
webhook_url and metadatawebhook_url, signed, and metadata as string pairs
GET /v2/renders/{id}GET /v1/jobs/{id}: state and progress
template_id and modificationsNo equivalent: your code builds the body

Request by request

Their JSON, then ours. And what does not carry.

Each request on the left is from the Creatomate docs. Each one on the right compiles with the same code the API runs, every time this site is built, and its last tab shows the ffmpeg command.

A template with modifications

{
  "template_id": "YOUR_TEMPLATE_ID_HERE",
  "modifications": {
    "Text-1": "This text is placed in the element Text-1",
    "Video-1": "https://cdn.creatomate.com…/demo/video1.mp4"
  },
  "render_scale": 0.75,
  "max_width": 1080,
  "max_height": 1080,
  "webhook_url": "https://example.com…/webhook",
  "metadata": "Any text value"
}

Create a render , read on Nov 7, 2026.

{
  "input": "https://example.com/video1.mp4",
  "filename": "video1-titled.mp4",
  "resize": {
    "width": 1080,
    "height": 1080,
    "fit": "contain",
    "enlarge": false
  },
  "text": [
    {
      "text": "This text is placed in the element Text-1",
      "font": "inter-bold",
      "size": 44,
      "position": "bottom"
    }
  ],
  "webhook_url": "https://example.com/webhook",
  "metadata": {
    "note": "Any text value"
  }
}

POST /v1/transcode makes video1-titled.mp4: the clip scaled down to fit within 1080 by 1080, its shape kept and never enlarged, with the text at the bottom.

  • Videxo stores no template. Where the text sits, its font and the frame are in the body, so your code holds what the template held.
  • metadata is a set of string pairs, not one value.
  • max_width and max_height become resize with enlarge: false. render_scale has no equivalent: a size is set in pixels. Creatomate’s docs say it is ignored once a maximum is set, so nothing is lost here.

Clips with fades, a caption, an end card and music

{
  "output_format": "mp4",
  "width": 1280,
  "height": 720,
  "elements": [
    {
      "type": "audio",
      "track": 1,
      "time": 0,
      "duration": null,
      "source": "https://cdn.creatomate.com…/demo/music3.mp3",
      "loop": true,
      "audio_fade_out": 2
    },
    {
      "type": "composition",
      "track": 2,
      "time": 0,
      "elements": [
        {
          "name": "Videos",
          "type": "composition",
          "track": 1,
          "time": 0,
          "elements": [
            {
              "name": "Video-1",
              "type": "video",
              "track": 1,
              "source": "https://cdn.creatomate.com…/demo/house1.mp4"
            },
            {
              "name": "Video-2",
              "type": "video",
              "track": 1,
              "source": "https://cdn.creatomate.com…/demo/house2.mp4",
              "animations": [
                {
                  "time": 0,
                  "duration": 1,
                  "transition": true,
                  "type": "fade",
                  "enable": "second-only"
                }
              ]
            },
            {
              "name": "Video-3",
              "type": "video",
              "track": 1,
              "source": "https://cdn.creatomate.com…/demo/house3.mp4",
              "animations": [
                {
                  "time": 0,
                  "duration": 1,
                  "transition": true,
                  "type": "fade",
                  "enable": "second-only"
                }
              ]
            }
          ]
        },
        {
          "name": "Description",
          "type": "text",
          "track": 2,
          "time": 0,
          "text": "Los Angeles, CA 90045\nCall (123) 555-1234 to arrange a viewing today",
          "font_family": "Montserrat",
          "font_weight": "800",
          "animations": [
            {
              "time": 0,
              "duration": 0.8,
              "easing": "quadratic-out",
              "type": "text-slide",
              "split": "line",
              "direction": "up"
            }
          ]
        }
      ]
    },
    {
      "name": "Outro",
      "type": "composition",
      "track": 2,
      "duration": 4,
      "fill_color": "rgba(255,255,255,1)",
      "animations": [
        {
          "time": 0,
          "duration": 1,
          "transition": true,
          "type": "fade"
        }
      ],
      "elements": [
        {
          "type": "text",
          "track": 1,
          "time": 0,
          "text": "My Brand Realtors",
          "font_family": "Inter"
        },
        {
          "name": "Contact-Name",
          "type": "text",
          "track": 2,
          "time": 0,
          "text": "Elisabeth Parker",
          "font_family": "Inter",
          "font_weight": "800"
        }
      ]
    }
  ]
}

RenderScript quick start, step 2 , read on Nov 7, 2026, shortened by leaving fields out.

{
  "inputs": {
    "house1": "https://example.com/house1.mp4",
    "house2": "https://example.com/house2.mp4",
    "house3": "https://example.com/house3.mp4",
    "music": "https://example.com/music3.mp3"
  },
  "outputs": [
    {
      "type": "video",
      "filename": "listing.mp4",
      "resize": {
        "width": 1280,
        "height": 720,
        "fit": "cover"
      },
      "audio": {
        "input": "music"
      },
      "concat": [
        {
          "input": "house1",
          "end": 8
        },
        {
          "input": "house2",
          "end": 8,
          "transition": {
            "type": "fade",
            "duration": 1
          }
        },
        {
          "input": "house3",
          "end": 8,
          "transition": {
            "type": "fade",
            "duration": 1
          }
        },
        {
          "color": "white",
          "duration": 4,
          "transition": {
            "type": "fade",
            "duration": 1
          },
          "text": [
            {
              "text": "My Brand Realtors",
              "font": "inter",
              "size": 36,
              "color": "black",
              "offset_y": -40
            },
            {
              "text": "Elisabeth Parker",
              "font": "inter-bold",
              "size": 64,
              "color": "black",
              "offset_y": 30
            }
          ]
        }
      ],
      "text": [
        {
          "text": "Los Angeles, CA 90045\nCall (123) 555-1234 to arrange a viewing today",
          "font": "montserrat-bold",
          "size": 32,
          "color": "black",
          "position": "bottom-left",
          "box": {
            "color": "white",
            "opacity": 1,
            "padding": 16
          },
          "end": 22,
          "fade": {
            "in": 0.8
          }
        }
      ]
    }
  ]
}

POST /v1/jobs makes listing.mp4: three clips of 8 seconds crossing into each other, the caption over them, then a white end card, 25 seconds at 1280 by 720, with the music.

  • A transition needs to know the length of what comes before it, so each clip names its end.
  • text-slide and other text animations become a fade: text has fades in and out, no slides or keyframes.
  • Music does not loop and has no fade of its own; the sound ends with the picture.
  • The docs’ request also sets positions and sizes in percent, left out here. Ours are named positions and pixel offsets.

Honestly

When Creatomate fits better. Pick it then.

  • People who do not write code design the videos, and your code only fills in what changes.
  • Your users should edit a video inside your app.
  • You want keyframes, animated text or several elements moving on a timeline.
  • You want speech, images or subtitles from speech in the same render.
  • Your flows run in Zapier, Make or n8n.

Questions, answered.

What happens to my Creatomate templates?

They do not move over as templates. Rebuild each one as a JSON body in your code, with a function that fills in what modifications filled in. What the JSON cannot express stays with Creatomate.

What are the limits?

On Pay as you go a job runs up to 10 min of ffmpeg with inputs up to 1 GB; on Scale up to 60 min with inputs up to 10 GB. Uploads from apps and browsers go up to 100 MB.

Which ffmpeg and which codecs?

ffmpeg 6.1.1, with H.264, H.265, VP8, VP9 and AV1 video, and AAC, MP3, Opus, FLAC and WAV audio, among others. The command rules list every option, filter and format a command can use.

Can I send my own ffmpeg command?

Yes. POST /v1/jobs takes input URLs, output names and an ffmpeg command that names files by alias. It is checked before the job exists; a refused command answers with a code for each problem and costs nothing.

How long are the files kept?

Outputs stay for your plan’s retention. Each download link is signed and lasts up to one hour; read the job again for a fresh one, or delete the files sooner with DELETE /v1/jobs/{id}/files.

How do I know a webhook came from you?

Each delivery is signed with your account’s secret in the Standard Webhooks format. Verify it with the standardwebhooks library or a few lines of code; the docs show both.

Who runs Videxo?

BEO TECHNOLOGY sp. z o.o., a limited company in Poland, in the European Union. Write to hello@videxo.io.

Run your first job. Free, no card.