curl --request GET \
--url https://descriptapi.com/v1/projects \
--header 'Authorization: Bearer <token>'import requests
url = "https://descriptapi.com/v1/projects"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://descriptapi.com/v1/projects', 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://descriptapi.com/v1/projects",
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://descriptapi.com/v1/projects"
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://descriptapi.com/v1/projects")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://descriptapi.com/v1/projects")
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{
"data": [
{
"id": "9f36ee32-5a2c-47e7-b1a3-94991d3e3ddb",
"name": "Marketing Video",
"created_at": "2025-11-18T10:30:00Z",
"updated_at": "2025-11-19T14:00:00Z",
"folder_path": "Clients/Acme/Videos"
}
],
"pagination": {
"next_cursor": "<string>"
}
}{
"error": "unauthorized",
"message": "Missing or invalid authentication token"
}{
"error": "rate_limit_exceeded",
"message": "Too many requests. Please try again later."
}List projects
List projects accessible to the authenticated user within a drive.
The drive is determined from the access token.
Results are paginated. Use the cursor from the response pagination.next_cursor
to fetch subsequent pages.
curl --request GET \
--url https://descriptapi.com/v1/projects \
--header 'Authorization: Bearer <token>'import requests
url = "https://descriptapi.com/v1/projects"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://descriptapi.com/v1/projects', 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://descriptapi.com/v1/projects",
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://descriptapi.com/v1/projects"
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://descriptapi.com/v1/projects")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://descriptapi.com/v1/projects")
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{
"data": [
{
"id": "9f36ee32-5a2c-47e7-b1a3-94991d3e3ddb",
"name": "Marketing Video",
"created_at": "2025-11-18T10:30:00Z",
"updated_at": "2025-11-19T14:00:00Z",
"folder_path": "Clients/Acme/Videos"
}
],
"pagination": {
"next_cursor": "<string>"
}
}{
"error": "unauthorized",
"message": "Missing or invalid authentication token"
}{
"error": "rate_limit_exceeded",
"message": "Too many requests. Please try again later."
}Authorizations
Personal API token created in Descript Settings → API Tokens. See the Authentication section for details.
Query Parameters
Filter projects whose name contains this string (case-insensitive).
Filter projects by folder path (e.g. "Clients/Acme/Videos"). Use "/" to separate nested folders. Returns only projects directly inside the deepest folder.
Filter projects created by this user UUID. Pass me to filter by the authenticated user.
Filter projects created after this ISO 8601 timestamp.
Filter projects created before this ISO 8601 timestamp.
Filter projects updated after this ISO 8601 timestamp.
Filter projects updated before this ISO 8601 timestamp.
Sort field. Defaults to created_at.
name, created_at, updated_at, last_viewed_at Sort direction. Defaults to desc.
asc, desc Pagination cursor from a previous response's pagination.next_cursor.
Number of projects per page (1-100). Defaults to 20.
1 <= x <= 100
