curl --request GET \
--url https://roughy-api-staging.fly.dev/v1/assets \
--header 'Authorization: Bearer <token>'import requests
url = "https://roughy-api-staging.fly.dev/v1/assets"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://roughy-api-staging.fly.dev/v1/assets', 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/assets",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://roughy-api-staging.fly.dev/v1/assets"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://roughy-api-staging.fly.dev/v1/assets")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://roughy-api-staging.fly.dev/v1/assets")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"items": [
{
"content_type": "audio/mpeg",
"created_at": "2026-05-02T08:54:52.423000Z",
"duration_seconds": "324.412",
"extension": "mp3",
"filename": "interview.mp3",
"id": "019de7f7-3a52-74d1-9eeb-323e0bfb7bb9",
"language": "de",
"project_id": "019de7f5-7e21-7402-92a8-1c0e1fa84411",
"size_bytes": 4823572,
"state": "ready",
"type": "audio"
}
],
"limit": 50,
"next_cursor": null
}{
"error": {
"code": "not_found",
"message": "Project not found."
}
}{
"error": {
"code": "rate_limited",
"message": "Per-user rate limit exceeded; honour `Retry-After`."
}
}List assets
One page of your assets, newest first (keyset cursor pagination).
curl --request GET \
--url https://roughy-api-staging.fly.dev/v1/assets \
--header 'Authorization: Bearer <token>'import requests
url = "https://roughy-api-staging.fly.dev/v1/assets"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://roughy-api-staging.fly.dev/v1/assets', 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/assets",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://roughy-api-staging.fly.dev/v1/assets"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://roughy-api-staging.fly.dev/v1/assets")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://roughy-api-staging.fly.dev/v1/assets")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"items": [
{
"content_type": "audio/mpeg",
"created_at": "2026-05-02T08:54:52.423000Z",
"duration_seconds": "324.412",
"extension": "mp3",
"filename": "interview.mp3",
"id": "019de7f7-3a52-74d1-9eeb-323e0bfb7bb9",
"language": "de",
"project_id": "019de7f5-7e21-7402-92a8-1c0e1fa84411",
"size_bytes": 4823572,
"state": "ready",
"type": "audio"
}
],
"limit": 50,
"next_cursor": null
}{
"error": {
"code": "not_found",
"message": "Project not found."
}
}{
"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.
Query Parameters
Filter by lifecycle state. Omit to return every state.
pending_upload, processing, pending_payment, ready, failed Maximum number of assets to return (1-100). Defaults to 20.
1 <= x <= 100Opaque continuation token from the previous page's next_cursor. Omit for the first page.
Response
One page of assets, newest first.
One page of assets, newest first (keyset cursor pagination).
One page of items, ordered by this list's sort key descending. See the endpoint description for which key that is.
Show child attributes
Show child attributes
The page-size limit this response was computed with.
Opaque continuation token. Pass as cursor on the next request to fetch the following page; null means this is the last page.