Cut Video: Video Trimmer, Clip Cutter & Video to GIF
Pricing
from $20.00 / 1,000 clip createds
Cut Video: Video Trimmer, Clip Cutter & Video to GIF
Cut video clips from video file URLs: trim by start/end or duration, split into equal segments, or make a GIF or MP3. Fast stream copy or frame-accurate re-encode, mp4/webm/gif/mp3 out, signed download links. Direct files only, no YouTube.
Pricing
from $20.00 / 1,000 clip createds
Rating
0.0
(0)
Developer
Data Done Right
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Security
Limited permissionsShare
This video trimmer lets you cut video clips out of direct video file URLs: give it a start and end time (or a start and a duration), or split a whole video into equal segments, and it returns a download link for every clip as MP4, WebM, animated GIF or MP3. It runs ffmpeg in the cloud, so there is nothing to install and no API key.
What it does not do. It reads direct video files (mp4, mov, webm, mkv, avi) from a public URL. It does not download from YouTube, Vimeo, TikTok, Instagram or other streaming sites and rejects those links without charge. HLS/DASH playlists (.m3u8, .mpd) are not supported. It cuts, it does not merge, caption or edit. Use it only on videos you own or have the right to process.
What you get
- One dataset row per requested clip: source URL, clip number, start, end, measured duration, format, bytes, width, height, a signed download link, and a status or clear error.
- Frame-accurate cuts (re-encode) or an instant stream copy (keyframe-aligned).
- Failed clips are free, never stop the run, and say exactly why they failed.
How to cut video clips from a URL
- Paste one or more direct video URLs in
videoUrls. - Add the clips you want from each video:
[{"start": 5, "end": 12}, {"start": "00:01:05.250", "duration": 4}]. Times are seconds (12.5) orHH:MM:SS.mmm. Leave outendanddurationto cut to the end of the video. - Run it. Open the dataset: every row has a
urlto the clip file. TheSUMMARYrecord lists each video's duration, resolution and any notes.
How to turn a video into a GIF
Set "outputFormat": "gif", pick the moment with start and end (or duration, at most 60 s), and tune gifFps (default 12) and gifWidth (default 480 px). The GIF uses a generated colour palette, so it looks much better than a plain conversion. GIF files have no sound and can be large: lower the fps or width to shrink them.
How to split a video into equal segments
Leave clips empty and set segmentSeconds, for example 30. Every video becomes 30-second parts (a leftover tail under a quarter second is dropped). Each part is one clip and one charge, and maxClipsPerRun caps the total.
How to cut a list of clips from a dataset
Put one row per clip in a dataset (url, start, end or duration, optional name), pick it in cutListDatasetId, and rows of the same URL are cut from a single download. You can also pass per-video clips in videos: [{"url": "https://example.com/a.mp4", "clips": [{"start": 5, "end": 12}]}].
Accurate or copy mode
accurate (default) | copy | |
|---|---|---|
| How | re-encodes (H.264 + AAC for MP4, VP9 + Opus for WebM) | copies the compressed streams, no re-encode |
| Cut position | exactly at start and end | starts at the keyframe at or before start, ends at about end |
| Speed / quality | slower, one generation of re-compression (crf sets quality) | very fast, no quality loss |
| Output formats | mp4, webm, gif, mp3 | mp4, webm (GIF and MP3 are always re-encoded) |
In copy mode the clip can begin earlier than you asked: the row shows the real start in actualStart and the measured durationSeconds, and a note explains it. In a local test on a 5 s sample with sparse keyframes, copy-mode segments overlapped each other; use accurate for segments and exact cuts. If a stream copy is not possible (for example H.264 into WebM) the clip is re-encoded and the row says so.
Input
| Field | Default | What it does |
|---|---|---|
videoUrls | sample video | Direct video file links. |
clips | 2 sample clips | Clips cut from every video: start, end or duration, optional name. |
videos | empty | Per-video clips: [{"url", "clips": [...]}]. |
cutListDatasetId | empty | Dataset with one row per clip. |
segmentSeconds | 0 (off) | Split videos without explicit clips into equal parts. |
outputFormat | mp4 | mp4, webm, gif or mp3. |
mode | accurate | accurate or copy. |
crf | 23 | Quality for mp4/webm (16 best, 35 smallest). |
width | 0 | Max width for mp4/webm (0 = original, never upscales). |
gifFps / gifWidth | 12 / 480 | GIF frame rate and width. |
audioBitrateKbps | 192 | MP3 bitrate. |
maxClipSeconds | 600 | Longer clips are rejected (free). |
maxClipsPerRun | 100 | Hard cap on clips per run (max 2000). |
maxVideoSizeMb | 500 | Source size cap (max 2048). |
maxDurationMinutes | 240 | Source duration cap. |
videoTimeoutSecs | 600 | Per download and per clip. |
outputStoreName | empty | Save clips in a named store that is kept until you delete it. |
Input example:
{"videoUrls": ["https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4"],"clips": [{"start": 0, "end": 2, "name": "intro"},{"start": 3, "duration": 1.5},{"start": 4, "end": 99}],"outputFormat": "mp4","mode": "accurate"}
Output
From a real local run of the input above (the third clip is longer than the 5.055 s video, so it is an error row and is not charged):
{"sourceUrl": "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4","videoIndex": 1, "clipIndex": 1, "name": "intro","start": 0.0, "end": 2.0, "startTimecode": "00:00:00.000", "endTimecode": "00:00:02.000","actualStart": 0.0, "durationSeconds": 2.002, "format": "mp4", "mode": "accurate","bytes": 133989, "width": 960, "height": 540,"url": "https://api.apify.com/v2/key-value-stores/<store>/records/v01-clip-001.mp4","key": "v01-clip-001.mp4", "status": "ok", "error": null, "note": null}
{"sourceUrl": "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4","videoIndex": 1, "clipIndex": 3, "start": 4.0, "end": 99.0,"status": "error","error": "end 00:01:39.000 is past the end of the video (duration 00:00:05.055)","url": null}
On Apify the url is a signed link that downloads without a token. status is ok, error or skipped (spending limit or maxClipsPerRun reached).
Use with the Apify API, MCP, n8n and Make
Python:
from apify_client import ApifyClientrun = ApifyClient("<APIFY_TOKEN>").actor("data-done-right/video-trimmer").call(run_input={"videoUrls": ["https://example.com/talk.mp4"],"clips": [{"start": "00:10:00", "end": "00:10:45", "name": "highlight"}],"outputFormat": "mp4"})for row in ApifyClient("<APIFY_TOKEN>").dataset(run["defaultDatasetId"]).iterate_items():print(row["status"], row["url"] or row["error"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<APIFY_TOKEN>' });const run = await client.actor('data-done-right/video-trimmer').call({videoUrls: ['https://example.com/talk.mp4'], segmentSeconds: 60 });const { items } = await client.dataset(run.defaultDatasetId).listItems();
In n8n or Make use the Apify node with the actor name and the same JSON. With Apify's MCP server (mcp.apify.com) an AI assistant can call it: "cut 10 to 20 seconds from this mp4 as a GIF". Only a video URL is needed.
Use cases
- Cut highlight clips from your own recordings, webinars or product demos.
- Turn a moment of a screen recording into a GIF for docs, tickets or chat.
- Split a long recording into fixed-length parts for review or upload limits.
- Extract the audio of a clip as MP3 for transcription or podcasts.
- Cut a list of timestamps (from a transcript or a scene detector) into files in one run.
How much does it cost
Pay per event: $0.025 per clip created (clip-created, $25 per 1,000). Failed and skipped clips, rejected links and the SUMMARY record are free. Plan discounts apply (Silver about 10%, Gold and higher about 20%).
- 1,000 clips: $25.
- 10,000 clips: $250.
- 100,000 clips: $2,500.
maxClipsPerRun caps a run, and if you set a maximum spend per run the Actor stops cleanly when it is reached and removes the clip it could not charge for. The cost is per clip whatever its length or format; Apify platform usage is included in this price.
FAQ
Can it cut YouTube videos?
No. YouTube, Vimeo, TikTok, Instagram and other streaming-site links are rejected with a message and no charge. Use a direct link to a video file (for example a file on your own server or a public file host) that you have the rights to.
Is the cut frame-accurate?
In accurate mode yes: it re-encodes and cuts at your start and end. In copy mode no: it starts at the keyframe at or before your start, which can be seconds earlier, and reports the real start in actualStart.
What happens if a time is outside the video?
The Actor reads the real duration with ffprobe. A start past the end, an end more than 50 ms past the end, an end before the start, or an unreadable time gives an error row that names the problem and the video's duration. The other clips still run and nothing is charged for the failed one.
Which limits apply?
Source files up to 2 GB (default 500 MB) and 4 hours by default, clips up to 1 hour (default 10 minutes), GIFs up to 60 s, up to 2000 clips per run. Links to private or internal addresses are blocked. The whole source file is downloaded once per video, so a very large file takes time even for a short clip.
Which formats can it read and write?
It reads common video containers (mp4, mov, webm, mkv, avi, flv, mpeg, ts) with codecs ffmpeg can decode. It writes MP4 (H.264/AAC), WebM (VP9/Opus), GIF and MP3. A video without sound cuts fine to MP4, WebM and GIF; MP3 gives an error row for it.
How long are the clip links kept?
Clips live in the run's key-value store, which expires with your plan's retention period. Set outputStoreName to keep them in a named store until you delete it.
Related tools
- Video Frame Extractor: Keyframes, Scenes & Thumbnails for AI pulls still images from the same videos.
- All-in-One File Converter: PDF, Office, Images, Audio & Video converts the clips to other formats.
- Transcribe Audio to Text: Files, Podcasts & Video URLs turns the audio of a clip into a transcript.