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 Shotstack alternative. Sequences, not a timeline.

Shotstack describes a video as a timeline of tracks and clips. Videxo has no timeline: parts play one after another, with text, overlays, your subtitles and music on top. If your edits are sequences, they map over, and this page shows how.

curl "$VIDEXO_API_URL/v1/jobs" \
  -H "Authorization: Bearer $VIDEXO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "inputs": {
    "music": "https://example.com/moment.mp3"
  },
  "outputs": [
    {
      "type": "video",
      "filename": "hello.mp4",
      "resize": {
        "width": 1024,
        "height": 576
      },
      "audio": {
        "input": "music"
      },
      "concat": [
        {
          "color": "black",
          "duration": 5,
          "text": [
            {
              "text": "HELLO WORLD",
              "font": "montserrat",
              "size": 32,
              "position": "left",
              "end": 5,
              "fade": {
                "in": 0.5,
                "out": 0.5
              }
            }
          ]
        }
      ]
    }
  ]
}'

Side by side

Videxo and Shotstack. Checked on Nov 7, 2026.

Videxo and Shotstack, as their own pages describe them on Nov 7, 2026
TopicVidexoShotstack
Before the first jobAn API key as a Bearer token. No bucket, role or queue to create.An API key per environment in the x-api-key header: a sandbox (stage) and production (v1).
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.An edit in JSON: a timeline of tracks, clips placed at a start time with a length, and an output.
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.Video, image, text, rich text, audio, shape, luma, caption, HTML and SVG assets on stacked tracks, with transitions, effects, filters and tweens.
Visual editorNone. You write JSON or an ffmpeg command.Studio, a browser editor with a timeline. The Studio SDK embeds an editor in your app; its source is public under the PolyForm Shield licence.
Saved templatesNone. The JSON body stays in your code.Hosted templates over an API, with {{ MERGE }} fields, rendered by id.
Generated mediaNone. Every picture and sound is a file you send.Video, images, speech and music from a prompt, and captions generated from a clip in the same render.
Output formatsVideo as MP4, MOV, WebM, MKV or TS, audio files, JPG, PNG and GIF.mp4, gif, mp3, jpg, png or bmp, from a preset up to 4K or a custom size.
Where outputs goStored for your plan’s retention, 7 days to 30 days, with signed download links that last up to an hour.Its hosting and CDN by default, or destinations such as S3, Google Cloud Storage, Azure Blob Storage, Google Drive and Vimeo.
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 callback URL on the edit, retried up to 10 times. Its docs say payloads are not signed.
AI assistants (MCP)An MCP server that checks, runs and waits for jobs with your API key.An MCP server that composes and renders videos, manages templates and generates assets.
CompanyBEO TECHNOLOGY sp. z o.o., Poland, in the European Union.Shotstack Pty Ltd; its terms apply the law of New South Wales, Australia.
  • 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.
  • Shotstack

    Before the first job
    An API key per environment in the x-api-key header: a sandbox (stage) and production (v1).
    How a video is described
    An edit in JSON: a timeline of tracks, clips placed at a start time with a length, and an output.
    What a video is built from
    Video, image, text, rich text, audio, shape, luma, caption, HTML and SVG assets on stacked tracks, with transitions, effects, filters and tweens.
    Visual editor
    Studio, a browser editor with a timeline. The Studio SDK embeds an editor in your app; its source is public under the PolyForm Shield licence.
    Saved templates
    Hosted templates over an API, with {{ MERGE }} fields, rendered by id.
    Generated media
    Video, images, speech and music from a prompt, and captions generated from a clip in the same render.
    Output formats
    mp4, gif, mp3, jpg, png or bmp, from a preset up to 4K or a custom size.
    Where outputs go
    Its hosting and CDN by default, or destinations such as S3, Google Cloud Storage, Azure Blob Storage, Google Drive and Vimeo.
    When a job ends
    A callback URL on the edit, retried up to 10 times. Its docs say payloads are not signed.
    AI assistants (MCP)
    An MCP server that composes and renders videos, manages templates and generates assets.
    Company
    Shotstack Pty Ltd; its terms apply the law of New South Wales, Australia.

Shotstack, as its own pages said on Nov 7, 2026: Core concepts Hello World using curl API keys API reference Webhooks Templates Merging data Animations Rich captions Limitations Hosting Destinations Generative AI MCP server Studio Studio SDK Terms

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 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 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 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 HTML layers. A web page cannot be a layer in a video.
  • 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
Shotstack concepts and what they are in Videxo
ShotstackVidexo
Edit, POST /edit/v1/renderA job with a video output: POST /v1/jobs
Timeline and tracksNo equivalent: parts in concat play in order
Clips end to end, with start and lengthParts: start and end say which piece of the input to use
Image clip with effect zoomInAn image part with motion: "zoom-in"
Rich-text or text assetA text layer on the output or on a part
Image or video on a higher trackoverlays: position, width, opacity, start and end
Transition in and outtransition into a part; fade on an output or a text layer
Caption asset with an SRT or VTT filesubtitles, reading an SRT or WebVTT input
Audio clip across the timelineaudio.input, or audio.mix under the clips’ sound
output: format, size and fpsformat or the filename’s extension, resize and fps
callbackwebhook_url, signed in the Standard Webhooks format
GET /edit/v1/render/{id}GET /v1/jobs/{id}: state and progress
Templates and merge fieldsNo 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 Shotstack 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.

Hello World: text and a soundtrack

{
  "timeline": {
    "tracks": [
      {
        "clips": [
          {
            "asset": {
              "type": "rich-text",
              "text": "HELLO WORLD",
              "font": {
                "family": "Montserrat",
                "color": "#ffffff",
                "size": 32
              },
              "align": {
                "horizontal": "left"
              }
            },
            "start": 0,
            "length": 5,
            "transition": {
              "in": "fade",
              "out": "fade"
            }
          }
        ]
      },
      {
        "clips": [
          {
            "asset": {
              "type": "audio",
              "src": "https://s3-ap-southeast-2.amazonaws.com/shotstack-assets/music/moment.mp3",
              "effect": "fadeOut"
            },
            "start": 0,
            "length": "end"
          }
        ]
      }
    ]
  },
  "output": {
    "format": "mp4",
    "size": {
      "width": 1024,
      "height": 576
    }
  }
}

Hello World using curl , read on Nov 7, 2026.

{
  "inputs": {
    "music": "https://example.com/moment.mp3"
  },
  "outputs": [
    {
      "type": "video",
      "filename": "hello.mp4",
      "resize": {
        "width": 1024,
        "height": 576
      },
      "audio": {
        "input": "music"
      },
      "concat": [
        {
          "color": "black",
          "duration": 5,
          "text": [
            {
              "text": "HELLO WORLD",
              "font": "montserrat",
              "size": 32,
              "position": "left",
              "end": 5,
              "fade": {
                "in": 0.5,
                "out": 0.5
              }
            }
          ]
        }
      ]
    }
  ]
}

POST /v1/jobs makes hello.mp4: 5 seconds at 1024 by 576, the text at the left on black, fading in and out, over the music.

  • There are no tracks: the sound goes on the output, the picture in its parts.
  • A soundtrack has no fadeOut of its own; fade on an output fades picture and sound together.
  • A Videxo job always reads at least one file, here the music. A video with no input at all is refused.

Text, an image, two clips and music, end to end

{
  "timeline": {
    "background": "#000000",
    "fonts": [
      {
        "src": "https://fonts.gstatic.com/s/montserrat/v31/JTUSjIg1_i6t8kCHKm45xW5rygbi49c.ttf"
      }
    ],
    "tracks": [
      {
        "clips": [
          {
            "asset": {
              "type": "rich-text",
              "text": "Hello World",
              "font": {
                "family": "JTUSjIg1_i6t8kCHKm45xW5rygbi49c",
                "size": 64,
                "weight": "700",
                "color": "#ffffff"
              },
              "align": {
                "horizontal": "center",
                "vertical": "middle"
              }
            },
            "start": 0,
            "length": 4,
            "transition": {
              "in": "fade",
              "out": "fade"
            }
          },
          {
            "asset": {
              "type": "image",
              "src": "https://shotstack-assets.s3.amazonaws.com/images/earth.jpg"
            },
            "start": 4,
            "length": 3,
            "effect": "zoomIn",
            "filter": "greyscale"
          }
        ]
      },
      {
        "clips": [
          {
            "asset": {
              "type": "video",
              "src": "https://shotstack-assets.s3.amazonaws.com/footage/beach.mp4",
              "transcode": true
            },
            "start": 7,
            "length": 4.5
          },
          {
            "asset": {
              "type": "video",
              "src": "https://shotstack-assets.s3.amazonaws.com/footage/city-timelapse.mp4",
              "volume": 0.5
            },
            "start": 11.5,
            "length": 5,
            "transition": {
              "out": "wipeLeft"
            }
          }
        ]
      },
      {
        "clips": [
          {
            "asset": {
              "type": "audio",
              "src": "https://shotstack-assets.s3.amazonaws.com/music/unminus/lit.mp3",
              "effect": "fadeInFadeOut"
            },
            "start": 0,
            "length": "end"
          }
        ]
      }
    ]
  },
  "output": {
    "format": "mp4",
    "resolution": "sd"
  }
}

Render Asset, API reference , read on Nov 7, 2026.

{
  "inputs": {
    "earth": "https://example.com/earth.jpg",
    "beach": "https://example.com/beach.mp4",
    "city": "https://example.com/city-timelapse.mp4",
    "music": "https://example.com/lit.mp3"
  },
  "outputs": [
    {
      "type": "video",
      "filename": "edit.mp4",
      "resize": {
        "width": 1024,
        "height": 576
      },
      "audio": {
        "mix": [
          {
            "input": "music"
          }
        ]
      },
      "concat": [
        {
          "color": "black",
          "duration": 4,
          "text": [
            {
              "text": "Hello World",
              "font": "montserrat-bold",
              "size": 64,
              "end": 4,
              "fade": {
                "in": 0.5,
                "out": 0.5
              }
            }
          ]
        },
        {
          "image": "earth",
          "duration": 3,
          "motion": "zoom-in"
        },
        {
          "input": "beach",
          "end": 4.5
        },
        {
          "input": "city",
          "end": 5
        }
      ]
    }
  ]
}

POST /v1/jobs makes edit.mp4: 16.5 seconds at 1024 by 576: the title, the image zooming in, then the two clips, with the music under their sound.

  • This edit maps because its clips run end to end. Clips that overlap on stacked tracks do not: the closest is up to four overlays on one output.
  • Filters and volume apply to the whole output, not to one clip, so greyscale on the image and volume on the second clip are left out.
  • Fonts come from the curated list (GET /v1/fonts), not from a font file you link.
  • The soundtrack has no fade of its own: fadeInFadeOut is left out too.

Honestly

When Shotstack fits better. Pick it then.

  • Clips overlap on stacked tracks at exact times, or you need tweens on their position and opacity.
  • People edit in Studio, or your users should edit a video inside your app.
  • You want video, images, speech or captions generated in the same render.
  • Renders should go straight to your S3, Google Cloud Storage, Azure, Google Drive or Vimeo.

Questions, answered.

What happens to my Shotstack 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 merge fields filled in. What the JSON cannot express stays with Shotstack.

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.