Video Cut API
POST /cut
About this tool
Use the `/cut` route when you need precise FFmpeg trims without re-uploading source files through a drag-and-drop widget. Droid Apps spins up workers that stream your public `video_url`, honor `start` offsets, and emit a new clip whose `duration` matches the seconds you specify in JSON. This matches how modern media microservices operate: declarative payloads, idempotent retries keyed by task IDs, and horizontal scale behind an API key you rotate from the subscription dashboard.
The workflow is intentionally boring in a good way—POST JSON, poll until FFmpeg finishes muxing, then pull the output from the signed download channel returned in the task object. There is no multipart shortcut; that design choice keeps abuse bounded and lets you reuse the same integration for serverless functions, queue workers, or CI smoke tests. Latency tracks input length and codec complexity more than request size, so benchmark with representative Mezzanine files before promising SLAs to end users.
Unlike generic “free online cutters,” this API is contract-driven. Your subscription unlocks sustained QPS, and our observability surfaces attribute failures to specific FFmpeg exit codes when possible. Combine `/cut` with `/silence_process` when you want a second pass that tightens breath gaps, or hand the trimmed asset to `/merge_urls` for stitched highlight reels—all while referencing the identical HTTPS source URL pattern.
Editors who prototype in the hosted form below can copy the synthesized JSON verbatim into curl or axios. Document every parameter for QA: rounding behavior near keyframes, float versus rational timebases, and how audio tracks migrate when trims fall mid-sample. Anchored documentation under this page’s slug explains advanced flags if you graduate beyond start/duration envelopes.
Operational hygiene matters: cache nothing sensitive in query strings, log correlation IDs beside task IDs, and throttle client retries when the API returns capacity errors. FFmpeg is deterministic only when inputs are; if creators deliver variable-frame-rate mobile footage, expect slight drift unless you normalize upstream.
Try it now
How it works
Serialize your trim window
Collect `video_url`, `start` seconds, and `duration` seconds as JSON-friendly numbers. Confirm the source URL is downloadable over TLS without interactive auth.
Authenticate the POST
Send `POST /cut` including `Content-Type: application/json` plus `X-API-Key` from your subscription. The body stays tiny because assets stream from remote origins.
Poll async task metadata
Read `status_url` from the response and GET it periodically until FFmpeg reports completion, surfacing granular states for dashboards.
Fetch the clipped rendition
Download the processed file from the task’s success payload, then upload to your DAM or object store; our workers garbage-collect according to plan retention.
Frequently asked questions
Does `/cut` re-encode the entire program?
FFmpeg chooses safe paths based on container and codec; many trims still require re-encoding around the boundaries to keep A/V sync. Inspect the returned task logs if you need proof of stream copies versus transcodes.
Can I chain multiple cuts in one call?
No—issue sequential tasks or merge segments with `/merge_urls` after producing individual clips. Each task maps to one declarative JSON payload for simpler retries.
What if `start` exceeds the file length?
Validation fails before an expensive job starts, returning an error JSON payload. Always probe duration with metadata endpoints or your own ffprobe jobs first.
Why must URLs be public HTTPS?
Workers run in isolated VPCs without your cookies. HTTPS ensures integrity on the wire; public accessibility means we can retry fetches without credential handshakes.
How does billing interact with failures?
Successful scheduling may still bill depending on plan rules, but hard validation errors typically short-circuit before compute. Check your subscription’s metering section for authoritative detail.