Create Workspace
curl --request POST \
--url https://api.example.com/v0/workspacesimport requests
url = "https://api.example.com/v0/workspaces"
response = requests.post(url)
print(response.text)const options = {method: 'POST'};
fetch('https://api.example.com/v0/workspaces', 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",
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"
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")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v0/workspaces")
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
Create Workspace
POST /v0/workspaces — Create a personal or team-owned workspace
POST
/
v0
/
workspaces
Create Workspace
curl --request POST \
--url https://api.example.com/v0/workspacesimport requests
url = "https://api.example.com/v0/workspaces"
response = requests.post(url)
print(response.text)const options = {method: 'POST'};
fetch('https://api.example.com/v0/workspaces', 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",
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"
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")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v0/workspaces")
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_bodyCreates a workspace. Omit
teamId for a personal workspace. Pass it to make the team the owner; you must be the team’s owner or a team admin. MCP: workspace_create. CLI: rip workspace create <slug> [--name --description --team-id].
Auth: Authorization: Bearer tr_... (an account API key).
Request body
| Field | Type | Required | Description |
|---|---|---|---|
slug | string | Yes | 1–64 lowercase letters, digits, or hyphens, starting and ending with a letter or digit. Unique per owner or per team |
name | string | Yes | Display name (trimmed; must not be blank) |
description | string | No | |
teamId | string | No | Team UUID to own the workspace. A slug is 400 INVALID_TEAM_ID; rip team list shows the id |
Response (201)
{
"ok": true,
"data": {
"id": "0b7f3c1e-5a2d-4c8e-9f10-2b3c4d5e6f70", "slug": "roadmap", "name": "Roadmap", "description": null,
"ownerAccountId": "rip1…", "teamId": null, "archivedAt": null,
"role": "admin", "membership": "internal", "audiences": ["internal", "shared"],
"capabilities": {
"read": true, "navigate": true, "writeContent": true, "organizeContent": true,
"manageContext": true, "manageAudience": true, "writeTasks": true, "writeHandoff": true,
"archiveContent": true, "manageWorkspace": true, "deleteContent": true, "deleteWorkspace": true
},
"mutationSequence": 1, "accessGeneration": 1,
"createdAt": "2026-09-15T08:00:00.000Z", "updatedAt": "2026-09-15T08:00:00.000Z"
}
}
| Field | Description |
|---|---|
ownerAccountId / teamId | Exactly one is set: the personal owner or the owning team |
role, membership, audiences, capabilities | Your live access (see Roles and capabilities) |
mutationSequence | Position of the latest workspace change |
accessGeneration | Increments when membership or visibility rules change |
Errors
| Status | Code | Cause |
|---|---|---|
400 | INVALID_INPUT | Missing slug or name |
400 | INVALID_WORKSPACE_SLUG | The slug does not match the format |
400 | INVALID_NAME | name is blank |
400 | INVALID_TEAM_ID | teamId is not a UUID |
404 | WORKSPACE_NOT_FOUND | No team with that teamId |
403 | WORKSPACE_FORBIDDEN | You are not the team’s owner or a team admin |
409 | WORKSPACE_SLUG_TAKEN | The slug is already used by that owner or team |