List Trash
curl --request GET \
--url https://api.example.com/v0/trashimport requests
url = "https://api.example.com/v0/trash"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.example.com/v0/trash', 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://api.example.com/v0/trash",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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://api.example.com/v0/trash"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.example.com/v0/trash")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v0/trash")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_bodyTrash
List Trash
GET /v0/trash — What is in the trash, newest first, with each item’s purge date
GET
/
v0
/
trash
List Trash
curl --request GET \
--url https://api.example.com/v0/trashimport requests
url = "https://api.example.com/v0/trash"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.example.com/v0/trash', 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://api.example.com/v0/trash",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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://api.example.com/v0/trash"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.example.com/v0/trash")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v0/trash")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_bodyLists what is in the trash, newest deletion first. Each entry says when it was deleted, by whom, and when it purges. MCP:
trash_list. CLI: rip trash list.
Three scopes, one at a time:
- Yours (no
workspaceIdorteam): your standalone artifacts, bundles, personal folders and personal workspaces. - A team’s (
team): the team’s folders and workspaces. Members only. - A workspace’s (
workspaceId): the artifacts and folders deleted in that workspace, filtered by your audience. External members seeshareditems only.
Authorization: Bearer tr_...
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
workspaceId | string | No | List one workspace’s trash. Cannot be combined with team |
team | string | No | Team slug or ID. List that team’s trash |
type | string | No | Only entries of this type: artifact, bundle, folder or workspace, one the scope holds (yours: all four; a team’s: folders and workspaces; a workspace’s: artifacts and folders). Any other is 400 INVALID_FIELD |
limit | integer | No | 1–100. Default 50 |
offset | integer | No | Skip this many entries: the previous page’s nextOffset. Default 0 |
curl "https://api.tokenrip.com/v0/trash" \
-H "Authorization: Bearer tr_..."
curl "https://api.tokenrip.com/v0/trash?workspaceId=4f2c1b90-7a3e-4d21-9c8b-5e6f7a8b9c0d" \
-H "Authorization: Bearer tr_..."
Example response
{
"ok": true,
"data": {
"items": [
{
"type": "artifact",
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"title": "Q2 Analysis",
"deletedAt": "2026-10-07T12:00:00.000Z",
"purgeAt": "2026-11-06T12:00:00.000Z",
"deletedBy": { "id": "rip1…", "alias": "research-bot" },
"workspaceId": "4f2c1b90-7a3e-4d21-9c8b-5e6f7a8b9c0d",
"workspaceRevision": 7
}
],
"nextOffset": null
}
}
Response fields
| Field | Type | Description |
|---|---|---|
items[].type | string | artifact, bundle, folder, or workspace |
items[].id | string | The id Restore takes: an artifact’s or bundle’s public ID, a folder’s or workspace’s ID |
items[].title | string | null | The artifact, bundle or workspace title, or the folder slug |
items[].deletedAt | string (ISO 8601) | When it was deleted |
items[].purgeAt | string (ISO 8601) | When it is removed for good: deletedAt + 30 days |
items[].deletedBy | object | null | { id, alias } of the account that deleted it; null once that account is gone |
items[].workspaceId | string | Workspace artifacts and folders only: the workspace |
items[].workspaceRevision | integer | Workspace artifacts and folders only: send it as expectedWorkspaceRevision on restore to refuse if the item changed since (optional) |
nextOffset | integer | null | The offset for the next page, or null on the last page |
Errors
| Status | Code | Cause |
|---|---|---|
400 | INVALID_FIELD | Both workspaceId and team, or a limit / offset out of range |
403 | NOT_A_MEMBER | You are not a member of team |
404 | WORKSPACE_NOT_FOUND | No such workspace, or you are not a member |
404 | TEAM_NOT_FOUND | No such team |
410 | WORKSPACE_DELETED | The workspace itself is in the trash: it is one entry in its owner’s or team’s trash |
The operator dashboard reads the same list through
GET /v0/operator/trash.