Transloadit
Pricing
EssentialsRobotsFAQAPIFormatsBest Practices

Transcode, resize, or watermark videos

🤖/video/encode encodes, resizes, applies watermarks to videos and animated GIFs.

← /video/concat/video/merge →
TransloaditChecking status…

Product

  • Services
  • Pricing
  • Demos
  • Security
  • Support

Company

  • About/Press
  • Blog/Jobs
  • Comparisons
  • Open source
  • Solutions

Docs

  • Getting started
  • Transcoding
  • FAQ
  • API
  • Supported formats

More

  • Platform status
  • Community forum
  • StackOverflow
  • Uppy
  • Tus

© 2009–2026 Transloadit-II GmbH

PrivacyTermsImprint
Handling uploads
  • /upload/handle
    Handle uploads
File importing
  • /azure/import
    Import files from Azure
  • /backblaze/import
    Import files from Backblaze
  • /box/import
    Import files from Box
  • /cloudfiles/import
    Import files from Rackspace Cloud Files
  • /cloudflare/import
    Import files from Cloudflare R2
  • /digitalocean/import
    Import files from DigitalOcean Spaces
  • /dropbox/import
    Import files from Dropbox
  • /ftp/import
    Import files from FTP servers
  • /google/import
    Import files from Google Storage
  • /http/import
    Import files from web servers
  • /minio/import
    Import files from MinIO
  • /s3/import
    Import files from Amazon S3
  • /sftp/import
    Import files from SFTP servers
  • /supabase/import
    Import files from Supabase
  • /swift/import
    Import files from Openstack/Swift
  • /tigris/import
    Import files from Tigris
  • /vimeo/import
    Import videos from Vimeo
  • /wasabi/import
    Import files from Wasabi
Video encoding
  • /video/adaptive
    Convert videos to HLS, MPEG-Dash and CMAF
  • /video/artwork
    Extract or insert video artwork
  • /video/concat
    Concatenate videos
  • /video/encode
    Transcode, resize, or watermark videos
  • /video/merge
    Merge video, audio, images into one video
  • /video/ondemand
    Stream videos with on-demand encoding
  • /video/split
    Split video
  • /video/subtitle
    Add subtitles to videos
  • /video/thumbs
    Extract thumbnails from videos
  • Video presets
Audio encoding
  • /audio/artwork
    Extract or insert audio artwork
  • /audio/concat
    Concatenate audio
  • /audio/split
    Split audio
  • /audio/encode
    Encode audio
  • /audio/loop
    Loop audio
  • /audio/merge
    Merge audio files into one
  • /audio/waveform
    Generate waveform images from audio
  • Audio presets
Image manipulation
  • /image/bgremove
    Remove the background from images
  • /image/merge
    Merge several images into one image
  • /image/optimize
    Optimize images without quality loss
  • /image/resize
    Convert, resize, or watermark images
Artificial intelligence
  • /document/ocr
    Recognize text in documents (OCR)
  • /image/describe
    Recognize objects in images
  • /image/facedetect
    Detect faces in images
  • /image/generate
    Generate images from text prompts
  • /image/upscale
    Upscale images
  • /image/ocr
    Recognize text in images (OCR)
  • /speech/transcribe
    Transcribe speech in audio or video files
  • /text/speak
    Synthesize speech in documents
  • /text/translate
    Translate text in documents
  • /ai/chat
    Generate AI chat responses
  • /video/generate
    Generate videos from text prompts
Document processing
  • /document/autorotate
    Auto-rotate documents
  • /document/convert
    Convert documents into different formats
  • /document/merge
    Merge documents into one
  • /document/optimize
    Optimize PDF file size
  • /file/read
    Read file contents
  • /document/split
    Extracts pages
  • /document/thumbs
    Extract thumbnail images from documents
  • /html/convert
    Take screenshots of webpages or HTML files
File filtering
  • /file/filter
    Filter files
  • /file/verify
    Verify the file type
  • /file/virusscan
    Scan files for viruses
Code evaluation
  • /script/run
    Run scripts in Assemblies
Media cataloging
  • /file/hash
    Hash files
  • /file/preview
    Generate a preview thumbnail
  • /meta/write
    Write metadata to media
File compressing
  • /file/compress
    Compress files
  • /file/decompress
    Decompress archives
File exporting
  • Downloading
  • /azure/store
    Export files to Microsoft Azure
  • /backblaze/store
    Export files to Backblaze
  • /box/store
    Export files to Box
  • /cloudfiles/store
    Export files to Rackspace Cloud Files
  • /cloudflare/store
    Export files to Cloudflare R2
  • /digitalocean/store
    Export files to DigitalOcean Spaces
  • /dropbox/store
    Export files to Dropbox
  • /ftp/store
    Export files to FTP servers
  • /google/store
    Export files to Google Storage
  • /minio/store
    Export files to MinIO
  • /s3/store
    Export files to Amazon S3
  • /sftp/store
    Export files to SFTP servers
  • /supabase/store
    Export files to Supabase
  • /swift/store
    Export files to OpenStack/Swift
  • /tigris/store
    Export files to Tigris
  • /tus/store
    Export files to Tus-compatible servers
  • /vimeo/store
    Export files to Vimeo
  • /wasabi/store
    Export files to Wasabi
  • /youtube/store
    Export files to YouTube
Smart CDN
  • /file/serve
    Serve files to web browsers
  • /tlcdn/deliver
    Cache and deliver files globally
  • Pricing
Handling uploads
  • /upload/handle
    Handle uploads
File importing
  • /azure/import
    Import files from Azure
  • /backblaze/import
    Import files from Backblaze
  • /box/import
    Import files from Box
  • /cloudfiles/import
    Import files from Rackspace Cloud Files
  • /cloudflare/import
    Import files from Cloudflare R2
  • /digitalocean/import
    Import files from DigitalOcean Spaces
  • /dropbox/import
    Import files from Dropbox
  • /ftp/import
    Import files from FTP servers
  • /google/import
    Import files from Google Storage
  • /http/import
    Import files from web servers
  • /minio/import
    Import files from MinIO
  • /s3/import
    Import files from Amazon S3
  • /sftp/import
    Import files from SFTP servers
  • /supabase/import
    Import files from Supabase
  • /swift/import
    Import files from Openstack/Swift
  • /tigris/import
    Import files from Tigris
  • /vimeo/import
    Import videos from Vimeo
  • /wasabi/import
    Import files from Wasabi
Video encoding
  • /video/adaptive
    Convert videos to HLS, MPEG-Dash and CMAF
  • /video/artwork
    Extract or insert video artwork
  • /video/concat
    Concatenate videos
  • /video/encode
    Transcode, resize, or watermark videos
  • /video/merge
    Merge video, audio, images into one video
  • /video/ondemand
    Stream videos with on-demand encoding
  • /video/split
    Split video
  • /video/subtitle
    Add subtitles to videos
  • /video/thumbs
    Extract thumbnails from videos
  • Video presets
Audio encoding
  • /audio/artwork
    Extract or insert audio artwork
  • /audio/concat
    Concatenate audio
  • /audio/split
    Split audio
  • /audio/encode
    Encode audio
  • /audio/loop
    Loop audio
  • /audio/merge
    Merge audio files into one
  • /audio/waveform
    Generate waveform images from audio
  • Audio presets
Image manipulation
  • /image/bgremove
    Remove the background from images
  • /image/merge
    Merge several images into one image
  • /image/optimize
    Optimize images without quality loss
  • /image/resize
    Convert, resize, or watermark images
Artificial intelligence
  • /document/ocr
    Recognize text in documents (OCR)
  • /image/describe
    Recognize objects in images
  • /image/facedetect
    Detect faces in images
  • /image/generate
    Generate images from text prompts
  • /image/upscale
    Upscale images
  • /image/ocr
    Recognize text in images (OCR)
  • /speech/transcribe
    Transcribe speech in audio or video files
  • /text/speak
    Synthesize speech in documents
  • /text/translate
    Translate text in documents
  • /ai/chat
    Generate AI chat responses
  • /video/generate
    Generate videos from text prompts
Document processing
  • /document/autorotate
    Auto-rotate documents
  • /document/convert
    Convert documents into different formats
  • /document/merge
    Merge documents into one
  • /document/optimize
    Optimize PDF file size
  • /file/read
    Read file contents
  • /document/split
    Extracts pages
  • /document/thumbs
    Extract thumbnail images from documents
  • /html/convert
    Take screenshots of webpages or HTML files
File filtering
  • /file/filter
    Filter files
  • /file/verify
    Verify the file type
  • /file/virusscan
    Scan files for viruses
Code evaluation
  • /script/run
    Run scripts in Assemblies
Media cataloging
  • /file/hash
    Hash files
  • /file/preview
    Generate a preview thumbnail
  • /meta/write
    Write metadata to media
File compressing
  • /file/compress
    Compress files
  • /file/decompress
    Decompress archives
File exporting
  • Downloading
  • /azure/store
    Export files to Microsoft Azure
  • /backblaze/store
    Export files to Backblaze
  • /box/store
    Export files to Box
  • /cloudfiles/store
    Export files to Rackspace Cloud Files
  • /cloudflare/store
    Export files to Cloudflare R2
  • /digitalocean/store
    Export files to DigitalOcean Spaces
  • /dropbox/store
    Export files to Dropbox
  • /ftp/store
    Export files to FTP servers
  • /google/store
    Export files to Google Storage
  • /minio/store
    Export files to MinIO
  • /s3/store
    Export files to Amazon S3
  • /sftp/store
    Export files to SFTP servers
  • /supabase/store
    Export files to Supabase
  • /swift/store
    Export files to OpenStack/Swift
  • /tigris/store
    Export files to Tigris
  • /tus/store
    Export files to Tus-compatible servers
  • /vimeo/store
    Export files to Vimeo
  • /wasabi/store
    Export files to Wasabi
  • /youtube/store
    Export files to YouTube
Smart CDN
  • /file/serve
    Serve files to web browsers
  • /tlcdn/deliver
    Cache and deliver files globally
  • Pricing

The /video/encode Robot is a versatile tool for video processing that handles transcoding, resizing, and watermarking. It supports various formats including modern standards like HEVC (H.265), and provides features such as presets for common devices, custom FFmpeg parameters for powerusers, watermark positioning, and more.

Adding text overlays with FFmpeg

You can add text overlays to videos using FFmpeg's drawtext filter through this Robot's ffmpeg parameter. Here are two examples — one with the default font and one with a custom font family name:

{
  "steps": {
    ":original": {
      "robot": "/upload/handle"
    },
    "text_overlay_default": {
      "use": ":original",
      "robot": "/video/encode",
      "preset": "empty",
      "ffmpeg_stack": "{{stacks.ffmpeg.recommended_version}}",
      "ffmpeg": {
        "codec:a": "copy",
        "vf": "drawtext=text='My text overlay':fontcolor=white:fontsize=24:box=1:boxcolor=black@0.5:boxborderw=5:x=(w-text_w)/2:y=(h-text_h)/2"
      },
      "result": true
    },
    "text_overlay_custom": {
      "use": ":original",
      "robot": "/video/encode",
      "preset": "empty",
      "ffmpeg_stack": "{{stacks.ffmpeg.recommended_version}}",
      "ffmpeg": {
        "codec:a": "copy",
        "vf": "drawtext=font='Times New Roman':text='My text overlay':fontcolor=white:fontsize=24:box=1:boxcolor=black@0.5:boxborderw=5:x=(w-text_w)/2:y=(h-text_h)/2"
      },
      "result": true
    }
  }
}

Notes:

  • Use the font attribute to reference a font by family name with FFmpeg's drawtext
  • FFmpeg font family names typically do not contain dashes (e.g. Times New Roman), while ImageMagick uses dashed names (e.g. Times-New-Roman).
  • Preserve the source audio by setting "codec:a": "copy".
  • Position text with the x and y expressions. The example above centers the text.

See the live demo here.

Usage example

Transcode uploaded video to HEVC (H.265):

{
  "steps": {
    "hevc_encoded": {
      "robot": "/video/encode",
      "use": ":original",
      "preset": "hevc"
    }
  }
}

Parameters

  • interpolate

    boolean | Record<string, boolean>

    Controls whether Assembly Variables are interpolated for individual instruction fields.

    By default, most Robot instruction fields interpolate Assembly Variables. Set this to false to treat every instruction field as literal text, or set an individual field path to false to treat only that field as literal text. For Robot-specific fields that are literal by default, set this to true or set that field path to true to opt back into interpolation.

    Use field names such as path, or dotted paths such as ffmpeg.vf for nested objects.

  • output_meta

    Record<string, boolean> | boolean | Array<string>

    Allows you to specify a set of metadata that is more expensive on CPU power to calculate, and thus is disabled by default to keep your Assemblies processing fast.

    For images, you can add "has_transparency": true in this object to extract if the image contains transparent parts and "dominant_colors": true to extract an array of hexadecimal color codes from the image.

    For images, you can also add "blurhash": true to extract a BlurHash string — a compact representation of a placeholder for the image, useful for showing a blurred preview while the full image loads.

    For videos, you can add the "colorspace: true" parameter to extract the colorspace of the output video.

    For videos, you can also add "interlaced": true to detect whether the video is interlaced. This combines the cheap ffprobe field_order flag with a bounded idet sampling pass over the first frames of the source, exposing interlaced, field_order, and a diagnostic interlace_detection object under file.meta. This is computationally expensive and billed accordingly.

    For audio, you can add "mean_volume": true to get a single value representing the mean average volume of the audio file.

    You can also set this to false to skip metadata extraction and speed up transcoding.

  • result

    boolean (default: false)

    Whether the results of this Step should be present in the Assembly Status JSON

  • queue

    batch

    Setting the queue to 'batch', manually downgrades the priority of jobs for this step to avoid consuming Priority job slots for jobs that don't need zero queue waiting times

  • force_accept

    boolean (default: false)

    Force a Robot to accept a file type it would have ignored.

    By default, Robots ignore files they are not familiar with. 🤖/video/encode, for example, will happily ignore input images.

    With the force_accept parameter set to true, you can force Robots to accept all files thrown at them. This will typically lead to errors and should only be used for debugging or combatting edge cases.

  • ignore_errors

    boolean | Array<meta | execute> (default: [])

    Ignore errors during specific phases of processing.

    Setting this to ["meta"] will cause the Robot to ignore errors during metadata extraction.

    Setting this to ["execute"] will cause the Robot to ignore errors during the main execution phase.

    Setting this to true is equivalent to ["meta", "execute"] and will ignore errors in both phases.

  • use

    string | Array<string> | Array<object> | object

    Specifies which Step(s) to use as input.

    • You can pick any names for Steps except ":original" (reserved for user uploads handled by Transloadit)
    • You can provide several Steps as input with arrays:
      {
        "use": [
          ":original",
          "encoded",
          "resized"
        ]
      }
      
    • You can also tag an input Step with as to pass semantic intent to robots:
    • You can also tag input Steps with as to pass semantic intent to robots:
      {
        "use": [
          {
            "name": ":original",
            "as": "image"
          },
          {
            "name": ":original",
            "as": "mask"
          }
        ]
      }
      
    Tip

    That's likely all you need to know about use, but you can view Advanced use cases.

  • ffmpeg

    object

    A parameter object to be passed to FFmpeg. If a preset is used, the options specified are merged on top of the ones from the preset. For available options, see the FFmpeg documentation. Options specified here take precedence over the preset options.

  • ffmpeg_stack

    v6 | v7 | v8 | string (default: "v6.0.0")

    Selects the FFmpeg stack version to use for encoding. These versions reflect real FFmpeg versions. We currently recommend to use "v6.0.0". Deprecated "v5.x" values are accepted for backward compatibility.

  • width

    string | number | null

    Width of the new video, in pixels.

    If the value is not specified and the preset parameter is available, the preset's supplied width will be implemented.

  • height

    string | number | null

    Height of the new video, in pixels.

    If the value is not specified and the preset parameter is available, the preset's supplied height will be implemented.

  • preset

    android | android-high | android-low | android_high | android_low | dash-1080p-video | dash-1080p_video |

    Converts a video according to pre-configured settings.

    If you specify your own FFmpeg parameters using the Robot's and/or do not not want Transloadit to set any encoding setting, starting ffmpeg_stack: "v6", you can use the value 'empty' here.

  • resize_strategy

    crop | fit | fillcrop | min_fit | pad | stretch (default: "pad")

    See the available resize strategies.

  • zoom

    boolean (default: true)

    If this is set to false, smaller videos will not be stretched to the desired width and height. For details about the impact of zooming for your preferred resize strategy, see the list of available resize strategies.

  • crop

    object | string

    Specify an object containing coordinates for the top left and bottom right corners of the rectangle to be cropped from the original video(s). Values can be integers for absolute pixel values or strings for percentage based values.

    For example:

    {
      "x1": 80,
      "y1": 100,
      "x2": "60%",
      "y2": "80%"
    }
    

    This will crop the area from (80, 100) to (600, 800) from a 1000×1000 pixels video, which is a square whose width is 520px and height is 700px. If crop is set, the width and height parameters are ignored, and the resize_strategy is set to crop automatically.

    You can also use a JSON string of such an object with coordinates in similar fashion:

    "{\"x1\": <Integer>, \"y1\": <Integer>, \"x2\": <Integer>, \"y2\": <Integer>}"
    
  • background

    string (default: "#00000000")

    The background color of the resulting video the "rrggbbaa" format (red, green, blue, alpha) when used with the "pad" resize strategy. The default color is black.

  • rotate

    0 | 90 | 180 | 270 | 360 | false

    Forces the video to be rotated by the specified degree integer. Currently, only multiples of 90 are supported. We automatically correct the orientation of many videos when the orientation is provided by the camera. This option is only useful for videos requiring rotation because it was not detected by the camera. If you set rotate to false no rotation is performed, even if the metadata contains such instructions.

  • hint

    boolean (default: false)

    Enables hinting for mp4 files, for RTP/RTSP streaming.

  • turbo

    boolean (default: false)

    Splits the video into multiple chunks so that each chunk can be encoded in parallel before all encoded chunks are stitched back together to form the result video. This comes at the expense of extra Priority Job Slots and may prove to be counter-productive for very small video files.

  • chunk_duration

    string | number

    Allows you to specify the duration of each chunk when turbo is set to true. This means you can take advantage of that feature while using fewer Priority Job Slots. For instance, the longer each chunk is, the fewer Encoding Jobs will need to be used.

  • watermark_url

    string (default: "")

    A URL indicating a PNG image to be overlaid above this image. You can also supply the watermark via another Assembly Step.

  • watermark_position

    bottom | bottom-left | bottom-right | center | left | right | top | | Array<bottom | bottom-left | bottom-right | center | left | right | top | > (default: "center")

    The position at which the watermark is placed.

    An array of possible values can also be specified, in which case one value will be selected at random, such as [ "center", "left", "bottom-left", "bottom-right" ].

    This setting puts the watermark in the specified corner. To use a specific pixel offset for the watermark, you will need to add the padding to the image itself.

  • watermark_x_offset

    string | number (default: 0)

    The x-offset in number of pixels at which the watermark will be placed in relation to the position it has due to watermark_position.

    Values can be both positive and negative and yield different results depending on the watermark_position parameter. Positive values move the watermark closer to the image's center point, whereas negative values move the watermark further away from the image's center point.

  • watermark_y_offset

    string | number (default: 0)

    The y-offset in number of pixels at which the watermark will be placed in relation to the position it has due to watermark_position.

    Values can be both positive and negative and yield different results depending on the watermark_position parameter. Positive values move the watermark closer to the image's center point, whereas negative values move the watermark further away from the image's center point.

  • watermark_size

    string

    The size of the watermark, as a percentage, such as "50%". How the watermark is resized greatly depends on the watermark_resize_strategy.

  • watermark_resize_strategy

    area | fit | stretch (default: "fit")

    To explain how the resize strategies work, let's assume our target video size is 800×800 pixels and our watermark image is 400×300 pixels. Let's also assume, the watermark_size parameter is set to "25%".

    For the "fit" resize strategy, the watermark is scaled so that the longer side of the watermark takes up 25% of the corresponding video side. And the other side is scaled according to the aspect ratio of the watermark image. So with our watermark, the width is the longer side, and 25% of the video size would be 200px. Hence, the watermark would be resized to 200×150 pixels. If the watermark_size was set to "50%"", it would be resized to 400×300 pixels (so just left at its original size).

    For the "stretch" resize strategy, the watermark image is stretched (meaning, it is resized without keeping its aspect ratio in mind) so that both sides take up 25% of the corresponding video side. Since our video is 800×800 pixels, for a watermark size of 25% the watermark would be resized to 200×200 pixels. Its height would appear stretched, because keeping the aspect ratio in mind it would be resized to 200×150 pixels instead.

    For the "area" resize strategy, the watermark is resized (keeping its aspect ratio in check) so that it covers "xx%" of the video's surface area. The value from watermark_size is used for the percentage area size.

  • watermark_start_time

    string | number (default: 0)

    The delay in seconds from the start of the video for the watermark to appear. By default the watermark is immediately shown.

  • watermark_duration

    string | number (default: -1)

    The duration in seconds for the watermark to be shown. Can be used together with watermark_start_time to create nice effects. The default value is -1.0, which means that the watermark is shown for the entire duration of the video.

  • watermark_opacity

    string | number (default: 1)

    The opacity of the watermark. Valid values are between 0 (invisible) and 1.0 (full visibility).

  • segment

    boolean (default: false)

    Splits the file into multiple parts, to be used for Apple's HTTP Live Streaming.

  • segment_duration

    string | number (default: 10)

    Specifies the length of each HTTP segment. This is optional, and the default value as recommended by Apple is 10. Do not change this value unless you have a good reason.

  • segment_prefix

    string (default: "")

    The prefix used for the naming. For example, a prefix of "segment_" would produce files named "segment_0.ts", "segment_1.ts" and so on. This is optional, and defaults to the base name of the input file. Also see the related segment_name parameter.

  • segment_name

    string (default: "")

    The name used for the final segment. Available variables are ${segment_prefix}, ${segment_number} and ${segment_id} (which is a UUIDv4 without dashes).

  • segment_time_delta

    string | number

    Delta to apply to segment duration. This is optional and allows fine-tuning of segment boundaries.

Demos

  • Service to generate a slideshow from AI-filtered images
  • Overlay videos with dynamic artwork generated with HTML & JS
  • Add text overlay to videos
  • Service to convert a GIF to a video
  • Service to frame video files using a watermark
  • Overlay a video on top of another video
  • Remove a green screen from a video
  • Service to automatically rotate a video
  • Video watermarking service

Related blog posts

  • Auto-rotation for iPhone video uploads launched November 19, 2010
  • Real-time encoding - over 150x faster December 20, 2010
  • Transloadit announces WebM support with watermarking April 27, 2011
  • Launching audio encode Robot & exciting new updates November 21, 2011
  • Stability & performance boosts with enhanced scaling July 24, 2012
  • Enhancing FFmpeg for superior encoding performance July 30, 2015
  • Introducing MPEG-DASH support for adaptive streaming October 11, 2016
  • New pricing model for future Transloadit customers February 7, 2018
  • Transloadit launches Turbo Mode for faster video encoding November 15, 2018
  • How to insert watermarks to videos with Transloadit February 20, 2019
  • Guide to encoding videos for streaming with Transloadit April 28, 2020
  • Creating audio waveform videos with FFmpeg & Node.js January 4, 2021
  • Let's Build: spinning record GIF generator April 1, 2021
  • Build a Reddit video subtitling bot with Transloadit February 10, 2022
  • Creating engaging audio visualizations with Transloadit April 2, 2023
  • Optimizing video quality with advanced compression May 2, 2023
  • Easily remove green screens with Transloadit & FFmpeg June 2, 2023
  • MKV vs MP4 - which format is better for video? June 27, 2023
  • How to build a 360° video player with Three.js & Transloadit August 21, 2023
  • Save costs with on-demand video encoding May 5, 2025