OttoCut
Cut by phrase, not by timecode

Cut video by the words, not the timecode.

Name the phrase the clip starts on and the phrase it ends on. OttoCut resolves both against the transcript and cuts the media — over an API built for developers, agents and anyone tired of scrubbing a timeline.

quarterly-review.mp400:04:12 → 00:04:47

so we ran the numbers again and the results are in churn dropped by a third once we shipped the new onboarding, which nobody expected this quarter, and then we back after the break to talk through what that means for next year.

Two phrases in, one clip out. No timeline, no scrubbing for the exact frame.

curl -X POST https://api.ottocut.com/clips \
  -H "Content-Type: application/json" \
  -d '{
    "media_id": "med_abc123",
    "start": { "type": "phrase", "value": "the results are in" },
    "end":   { "type": "phrase", "value": "back after the break" }
  }'
import httpx

clip = httpx.post(
    "https://api.ottocut.com/clips",
    json={
        "media_id": "med_abc123",
        "start": {"type": "phrase", "value": "the results are in"},
        "end": {"type": "phrase", "value": "back after the break"},
    },
).json()["data"]

print(clip["download_url"])

Built on infrastructure you already trust

  • Whisper
  • ffmpeg
  • FastAPI
  • Cloud Run

Capabilities

Everything a clip request needs, and nothing it does not.

The API is the product. A browser UI, a CLI and an MCP server are all layers on the same eight endpoints.

Phrase markers

Mark a clip with the words spoken at each end. Matching is case-insensitive and punctuation-tolerant, so you type what you heard, not what the transcript guessed.

  • "start": { "type": "phrase", "value": "the results are in" }

Agent-native accessPlanned

An MCP server for tool-using assistants, and x402 so an agent that meets the API mid-task can pay per request and keep going — no account, no onboarding.

  • Authorization: Bearer otto_...
  • clip_media(media_id, start, end)
  • HTTP 402 → X-Payment → 200

Cached clips

The same media with the same markers returns the existing clip instantly. No second encode, no second charge.

Cached transcripts

The first clip from a video pays for transcription. Every later clip from that video does not.

Repeat and proximity resolution

When a phrase occurs more than once, pick the occurrence by index — or hand over a rough timestamp and let the closest match win.

Upload or ingest by URL

Push a file straight to a signed upload URL, or hand the API a source URL and let it fetch the media itself.

Predictable envelope

Every response carries data, error and a request_id — the same shape on success and failure, which is what makes it safe to hand to an agent.

Pricing

Prepaid credits, not a subscription.

You pay per clip. Transcription is charged once per source video, so the second clip from a video costs a fraction of the first.

Planned pricing. Accounts and billing ship with v1 — every figure here is an estimate and will change before launch.

Free

$0.50

in signup credit

Enough to run the whole pipeline before you integrate anything.

  • Clip by phrase or timestamp
  • Upload or ingest from a URL
  • Cached transcripts and clips
  • Daily request cap
  • Email verification required
Get early access
Most popular

Prepaid credits

Pay as you clip

base + transcription x audio minutes

The workhorse. Top up a balance, get a key, spend it per request.

  • One API key, revocable
  • Balance debited per request
  • Transcription charged once per source video
  • Top up by card
  • Usage history per key
Get early access

Agent / x402

No signup

priced per request, quoted up front

For agents that meet the API mid-task and have no account.

  • No key, no onboarding
  • Price quoted in the 402 response
  • Pay in USDC, retry, done
  • Same endpoints, same envelope
Get early access

Questions

The things people ask first.

What if the phrase appears more than once?

Pass an occurrence index to pick which one, or a rough timestamp to select the occurrence nearest it. The timestamp wins when you give both, which is usually what you want when you already know roughly where you are in the video.

What if the transcript gets a word slightly wrong?

Matching ignores case and punctuation, so most near-misses still resolve. When a word is genuinely mis-transcribed, fall back to a raw timestamp marker for that end of the clip — you can mix a phrase marker and a timestamp marker in the same request.

Can I still use raw timestamps?

Yes. A marker is either a phrase or a timestamp in seconds, and the two are interchangeable at either end of a clip.

What can I feed it?

Video or audio, either uploaded directly to a signed URL or fetched by the API from a source URL you provide.

How long do download links last?

A clip download URL is signed and valid for one hour. Ask for the clip again and you get a fresh URL — the clip itself is not re-encoded.

Do I pay twice for two clips of the same video?

No. Transcription is charged once per source video; later clips from it pay only the base cost. And two identical clip requests return the same cached clip rather than encoding it twice.

Is it available yet?

The clipping pipeline is built and running, but there is no way to sign up yet. Accounts, API keys and billing all land together with v1. Join the early-access list and we will email you the day it opens.

Will there be a CLI and an MCP server?

Both are planned. The API is the primary interface and everything else is a layer on it, so a CLI and an MCP server are thin wrappers rather than separate products.

Be first in when accounts open.

Accounts, API keys and billing all open together with v1. Tell us what you are building and we will email you the day it does.

What are you building?

We will email you when accounts open. No newsletter, no sharing your address. Questions:hello@ottocut.com.

One request

curl -X POST https://api.ottocut.com/clips \
  -H "Content-Type: application/json" \
  -d '{"media_id":"med_abc123",
       "start":{"type":"phrase","value":"the results are in"},
       "end":{"type":"phrase","value":"back after the break"}}'