1. Create an account
Sign up at roughy.ai and verify your email.2. Generate an API key
In the dashboard, navigate to API keys and create a new key. Treat it like a password — it grants full access to your account.3. Verify the key
Every Roughy endpoint accepts a Bearer token in theAuthorization
header. A simple sanity check is to read your credit balance:
balance field means you’re set.
4. Cut and render your first video
The end-to-end shape is project → upload → cut → render → download. You’re charged once — per source minute (rounded up), after the asset is processed (see Credit ledger). Everything after that — the cut, the render — is free.Create a project
A project is the container for the work you’re about to do.Upload an asset
Upload an audio or video source via the create-asset → TUS pattern.POST /v1/assets creates the asset and opens its upload in one call —
size_bytes is the file size; language (an optional spoken-language
hint) is set here and immutable:
Location header — hand it to your TUS client to stream the file. See the
Upload an asset guide for ready-to-paste
clients. When the upload finalises, the asset moves to processing;
once Roughy finishes preparing it and the per-minute charge settles, it
becomes ready (cuttable and renderable).
Trigger a cut
A cut is the kept-segment plan — Roughy keeps the spans worth keeping and drops filler, restarts, and off-topic spans. Pass the asset id, plus an optional referencescript in the body:
409 with a typed code:
asset_processing (still being prepared — back off for the Retry-After
seconds and retry), asset_payment_required (top up your balance), or
asset_failed. Otherwise you get a cut — a freshly created one starts in
state: pending (201); re-posting the same asset_id + script returns
the existing cut (200). Poll GET /v1/cuts/{cut_id} until state is
completed.
Render the result
A render applies a cut to the media and produces a video (mp4 / mov) or audio (m4a / mp3) output. Pass cut_id to
apply that cut; omit it to render the full source:
GET /v1/renders/{render_id} until state is completed; the
response then carries a short-lived signed download_url. Fetch the
bytes from there and you’re done.
Skip the polling
Instead of polling, register a webhook endpoint forcut.completed and render.completed and let Roughy push you the
terminal events.
Prefer your own editor?
Skip the render and export the cut straight to your NLE:GET /v1/cuts/{cut_id}/export?format=xmeml (also fcpxml, edl,
otio).
Next steps
- Upload an asset — TUS-resumable upload walkthrough.
- Cut / Render — the core operations.
- Webhooks — push delivery instead of polling.
- API Reference — every endpoint with an interactive playground.