curl --request POST \
--url https://roughy-api-staging.fly.dev/v1/cuts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"asset_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"script": "<string>"
}
'import requests
url = "https://roughy-api-staging.fly.dev/v1/cuts"
payload = {
"asset_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"script": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({asset_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a', script: '<string>'})
};
fetch('https://roughy-api-staging.fly.dev/v1/cuts', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://roughy-api-staging.fly.dev/v1/cuts",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'asset_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'script' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://roughy-api-staging.fly.dev/v1/cuts"
payload := strings.NewReader("{\n \"asset_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"script\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://roughy-api-staging.fly.dev/v1/cuts")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"asset_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"script\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://roughy-api-staging.fly.dev/v1/cuts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"asset_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"script\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"asset_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"state": "pending",
"script": "<string>",
"error_code": "<string>",
"error_message": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"started_at": "2023-11-07T05:31:56Z",
"completed_at": "2023-11-07T05:31:56Z"
}{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"asset_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"state": "pending",
"script": "<string>",
"error_code": "<string>",
"error_message": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"started_at": "2023-11-07T05:31:56Z",
"completed_at": "2023-11-07T05:31:56Z"
}{
"error": {
"code": "not_found",
"message": "Asset not found."
}
}{
"error": {
"code": "conflict",
"message": "The asset isn't cuttable yet — `asset_processing` (still ingesting / transcribing; retry after `Retry-After`), `asset_payment_required` (transcribed but unpaid; top up), or `asset_failed` (terminal; re-upload)."
}
}{
"error": {
"code": "validation_error",
"message": "Request validation failed.",
"fields": [
{
"field": "body.name",
"message": "Field required"
}
]
}
}{
"error": {
"code": "rate_limited",
"message": "Per-user rate limit exceeded; honour `Retry-After`."
}
}Cut an asset
Create a cut for an asset from the supplied script. Idempotent on the
full request shape: an identical request returns the existing cut.
trigger_cut takes no request session — it owns its transaction (create
- compute-job defer commit together).
curl --request POST \
--url https://roughy-api-staging.fly.dev/v1/cuts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"asset_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"script": "<string>"
}
'import requests
url = "https://roughy-api-staging.fly.dev/v1/cuts"
payload = {
"asset_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"script": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({asset_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a', script: '<string>'})
};
fetch('https://roughy-api-staging.fly.dev/v1/cuts', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://roughy-api-staging.fly.dev/v1/cuts",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'asset_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'script' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://roughy-api-staging.fly.dev/v1/cuts"
payload := strings.NewReader("{\n \"asset_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"script\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://roughy-api-staging.fly.dev/v1/cuts")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"asset_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"script\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://roughy-api-staging.fly.dev/v1/cuts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"asset_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"script\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"asset_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"state": "pending",
"script": "<string>",
"error_code": "<string>",
"error_message": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"started_at": "2023-11-07T05:31:56Z",
"completed_at": "2023-11-07T05:31:56Z"
}{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"asset_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"state": "pending",
"script": "<string>",
"error_code": "<string>",
"error_message": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"started_at": "2023-11-07T05:31:56Z",
"completed_at": "2023-11-07T05:31:56Z"
}{
"error": {
"code": "not_found",
"message": "Asset not found."
}
}{
"error": {
"code": "conflict",
"message": "The asset isn't cuttable yet — `asset_processing` (still ingesting / transcribing; retry after `Retry-After`), `asset_payment_required` (transcribed but unpaid; top up), or `asset_failed` (terminal; re-upload)."
}
}{
"error": {
"code": "validation_error",
"message": "Request validation failed.",
"fields": [
{
"field": "body.name",
"message": "Field required"
}
]
}
}{
"error": {
"code": "rate_limited",
"message": "Per-user rate limit exceeded; honour `Retry-After`."
}
}Authorizations
Pass your API key as Authorization: Bearer sk_…. Mint a key from your dashboard's API-keys page.
Body
Create a cut for an asset, aligned to the supplied script
(snapshotted onto the cut at create time).
Response
A cut with the same (asset, script) already exists; it is returned.
A cut.
Cut id.
The source asset (video or audio) this cut belongs to.
Cut lifecycle state: pending / processing while the cut computes, completed when ready, failed on error. completed and failed are terminal.
pending, processing, completed, failed The script this cut was computed with (from the create request, snapshotted at create time).
Machine-readable failure code when state=failed.
Human-readable failure detail when state=failed.
When the cut was created.
When compute started.
When the cut reached a terminal state.