Adopt Content
curl --request POST \
--url https://api.example.com/v0/workspaces/{id}/adoptimport requests
url = "https://api.example.com/v0/workspaces/{id}/adopt"
response = requests.post(url)
print(response.text)const options = {method: 'POST'};
fetch('https://api.example.com/v0/workspaces/{id}/adopt', 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/workspaces/{id}/adopt",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
]);
$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/workspaces/{id}/adopt"
req, _ := http.NewRequest("POST", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.example.com/v0/workspaces/{id}/adopt")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v0/workspaces/{id}/adopt")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
response = http.request(request)
puts response.read_bodyWorkspaces
Adopt Content
POST /v0/workspaces/:id/adopt — Move standalone artifacts or a folder you own into the workspace
POST
/
v0
/
workspaces
/
{id}
/
adopt
Adopt Content
curl --request POST \
--url https://api.example.com/v0/workspaces/{id}/adoptimport requests
url = "https://api.example.com/v0/workspaces/{id}/adopt"
response = requests.post(url)
print(response.text)const options = {method: 'POST'};
fetch('https://api.example.com/v0/workspaces/{id}/adopt', 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/workspaces/{id}/adopt",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
]);
$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/workspaces/{id}/adopt"
req, _ := http.NewRequest("POST", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.example.com/v0/workspaces/{id}/adopt")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v0/workspaces/{id}/adopt")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
response = http.request(request)
puts response.read_bodyMoves eligible standalone content you own into the workspace in one transaction. Nothing is copied: identity and version history are kept, and the content’s team shares are removed. Requires
A
writeContent; external editors can adopt only into shared. MCP: workspace_adopt. CLI: rip workspace adopt <workspace-id> <item> --audience … [--kind folder] [--destination-folder-id].
Auth: Authorization: Bearer tr_... (an account API key). {id} is the workspace UUID.
Request body
kind selects the shape:
| Field | Type | Required | Description |
|---|---|---|---|
kind | string | Yes | artifact or folder |
artifactId / artifactIds | string / string[] | artifact: exactly one of the two | Artifact id, public id, or one of your aliases; at most 500, no duplicates |
destinationFolderId | string | null | artifact only, optional | A folder of this workspace. Without it, adopted artifacts land at the workspace root |
folderId | string | folder only | A personal folder you own. Its current artifacts come with it and stay inside it |
audience | string | Yes | internal or shared, applied to every adopted item |
workspaceSessionId | string | No | Session attribution |
Response (201)
{ "ok": true, "data": { "artifactIds": ["5c9e…", "a13f…"], "folderId": null } }
artifactIds are the public ids of the moved artifacts. folderId is the adopted folder’s id for kind: "folder", otherwise null.
Sharing an adopted artifact exposes its complete version history. Adoption is one-way: there is no route that moves workspace content back to standalone ownership.
Errors
Every check runs before any change is made.| Status | Code | Cause |
|---|---|---|
400 | INVALID_INPUT | Bad kind shape (for example both artifactId and artifactIds, or folderId with artifact fields), or missing/invalid audience |
400 | DUPLICATE_ARTIFACT | The same artifact appears twice |
400 | WORKSPACE_BULK_LIMIT | More than 500 artifacts |
404 | ARTIFACT_NOT_FOUND / FOLDER_NOT_FOUND | An artifact or the folder does not exist |
403 | WORKSPACE_FORBIDDEN | No writeContent; an external editor asked for internal; or the folder is not your personal folder |
409 | MIXED_OWNERSHIP | An artifact is not owned by you |
409 | ALREADY_IN_WORKSPACE | The artifact or folder already belongs to a workspace |
409 | INELIGIBLE_STORAGE | A public asset, independently hosted content, an unproven storage class, or public version history |
409 | CROSS_WORKSPACE_MOVE | destinationFolderId is not a folder of this workspace |
409 | ARTIFACT_FOLDER_CHANGED / FOLDER_CHANGED | Content moved while the request ran; retry |
409 | WORKSPACE_ARCHIVED | The workspace is archived |
404 | WORKSPACE_NOT_FOUND | No workspace with that id |
workspaceSessionId is validated as described in Shared errors.