关于 workspaces
这是一份通过未公开的 REST API 管理 Domo 工作区的逆向参考,适用于整理工作区内容的开发者。它介绍添加、移除、列出和搜索工作区项目的端点。
主要功能
- 01添加卡片及其他内容
- 02移除内容但不删除原项目
- 03列出工作区内容及元数据
- 04列出可访问的工作区
- 05搜索工作区内容
适用场景
- 01整理工作区中的卡片
- 02查看工作区内容和标题
- 03从工作区移除项目
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ stahura/ domo-ai-vibe-rules --skill workspaces安装后在 Claude Code 中输入/workspaces确认已加载。
详细介绍
Domo Workspace API(逆向工程)
CLI 与 API:Java CLI 没有 workspace 命令。所有 workspace 操作都需要通过 curl 调用 REST API。
状态:截至 2026 年 3 月,未公开文档 / 逆向工程 Base URL:
https://<instance>.domo.com认证:X-DOMO-Developer-Token请求头
概述
Domo 中的 Workspace 是组织性容器,将相关内容——卡片、页面、数据集、应用及其他资产——归入一个可导航的集合。Workspace API 没有由 Domo 公开文档化。这些端点是从 Domo Web 客户端逆向工程得来,并通过测试验证。
支持的操作:
- 向 workspace 添加内容(卡片、页面、数据集)
- 从 workspace 移除内容
- 列出 workspace 的所有内容
- 在 workspace 内搜索特定内容
端点
1. 向 Workspace 添加内容(推荐)
向 workspace 添加单个内容项。这是已确认可用的端点。
| 字段 | 值 |
|---|---|
| 方法 | POST |
| 路径 | /nav/v1/workspaces/:guid/contents |
| Content-Type | application/json |
请求体:
{
"entityId": "728638278",
"entityType": "CARD"
}
响应(成功):
{
"id": 6,
"entityType": "CARD",
"entityId": "728638278",
"addedAt": "2026-03-04 16:37:52",
"addedBy": 149955692
}
支持的 entityType 值:CARD、PAGE、DATASET、DATA_APP、WORKSPACE_URL
已验证:该端点于 2026 年 3 月通过向一个 workspace 添加 22 张卡片进行了测试。全部 22 张均成功。
1b. 向 Workspace 添加内容(批量 - 不可靠)
批量端点存在,但在测试中,无论采用何种格式变体,都返回 400 Bad Request。请改用上面的单项端点。
| 字段 | 值 |
|---|---|
| 方法 | POST |
| 路径 | /nav/v1/workspaces/bulk/execute |
| Content-Type | application/json |
请求体(有文档记载但不可靠):
{
"operations": [
{
"operation": "ADD",
"workspace": "99bf62b4-21f8-474b-985b-9bb83c773998",
"contents": [
{
"id": "CARD_OR_CONTENT_ID",
"type": "CARD"
}
]
}
]
}
警告:在 2026 年 3 月的测试中,无论
id/entityId格式、字符串/数字类型,还是内容类型值(CARD、card、KPI_CARD)如何,该端点都返回 400 错误。单项/contents端点是可靠的替代方案。
2. 从 Workspace 移除内容
从 workspace 移除内容,但不会将其从 Domo 中删除。请使用内容在 workspace 内部的 id(添加时返回的数字 ID,或从列出 workspace 内容中获得),而不是卡片/数据集 ID。
| 字段 | 值 |
|---|---|
| 方法 | DELETE |
| 路径 | /nav/v1/workspaces/:guid/contents/:contentId |
其中 :contentId 是 workspace 内部的数字 ID(列表/添加响应中的 id 字段)。
替代方案(批量端点 - 可能不可靠,见第 1b 节的说明):
| 字段 | 值 |
|---|---|
| 方法 | POST |
| 路径 | /nav/v1/workspaces/bulk/execute |
| Content-Type | application/json |
{
"operations": [
{
"operation": "REMOVE",
"workspace": "99bf62b4-21f8-474b-985b-9bb83c773998",
"contents": [
{
"id": "CARD_OR_CONTENT_ID",
"type": "CARD"
}
]
}
]
}
3. 列出 Workspace 内容
返回 workspace 中的所有内容对象,可选包含详细信息。
| 字段 | 值 |
|---|---|
| 方法 | GET |
| 路径 | /nav/v1/workspaces/:guid/walk?includeDetails=true |
路径参数:
:guid-- Workspace GUID(例如99bf62b4-21f8-474b-985b-9bb83c773998)
查询参数:
includeDetails(布尔值)-- 当为true时,返回每个内容项的完整元数据
响应结构:
{
"current": null,
"pins": [],
"sorts": [],
"folders": [],
"contents": [
{
"id": 6,
"entityType": "CARD",
"entityId": "728638278",
"addedAt": "2026-03-04 16:37:52",
"addedBy": 149955692,
"attributes": {
"entityType": "card",
"databaseId": "728638278",
"winnerText": "Revenue by Department",
...
}
}
]
}
每个内容项的关键字段:
id-- Workspace 内部数字 ID(用于移除操作)entityType--CARD、DATA_APP、WORKSPACE_URL等entityId-- Domo 实体 ID(卡片 ID、数据集 ID 等)attributes.winnerText-- 显示名称/标题
3b. 列出所有 Workspace
返回已认证用户有权访问的所有 workspace。
| 字段 | 值 |
|---|---|
| 方法 | GET |
| 路径 | /nav/v1/workspaces |
响应结构:
{
"results": [
{
"guid": "579394f2-5ec2-4152-b2b7-7e2c6c7a1305",
"name": "Claude",
"createdAt": "2026-03-04 16:31:32",
"createdBy": 149955692,
"icon": "ai",
"iconColor": "#e4715d",
"members": [...],
"contents": [],
"folders": []
}
]
}
4. 搜索工作区内容
在工作区内搜索与查询匹配的内容。
| 字段 | 值 |
|---|---|
| 方法 | POST |
| 路径 | /nav/v1/workspaces/:guid/addContentQuery |
| Content-Type | application/json |
路径参数:
:guid-- 工作区 GUID
示例:
POST /nav/v1/workspaces/99bf62b4-21f8-474b-985b-9bb83c773998/addContentQuery
身份验证
所有请求都需要将 Domo Developer Token 作为标头传递:
X-DOMO-Developer-Token: your_token_here
在 Domo UI 中通过 Admin > Security > Access Tokens 生成令牌。
代码示例
Python (requests)
import requests
DOMO_BASE = "https://your-instance.domo.com/api"
TOKEN = "your_domo_developer_token"
WORKSPACE_GUID = "579394f2-5ec2-4152-b2b7-7e2c6c7a1305"
headers = {
"X-DOMO-Developer-Token": TOKEN,
"Content-Type": "application/json",
}
def add_card_to_workspace(card_id: str) -> dict:
"""Add a single card to the workspace (confirmed working)."""
url = f"{DOMO_BASE}/nav/v1/workspaces/{WORKSPACE_GUID}/contents"
body = {"entityId": card_id, "entityType": "CARD"}
resp = requests.post(url, json=body, headers=headers)
resp.raise_for_status()
return resp.json()
def add_multiple_cards_to_workspace(card_ids: list[str]) -> list[dict]:
"""Add multiple cards one at a time."""
results = []
for card_id in card_ids:
result = add_card_to_workspace(card_id)
results.append(result)
return results
def list_workspace_contents() -> dict:
"""List all contents of the workspace with details."""
url = f"{DOMO_BASE}/nav/v1/workspaces/{WORKSPACE_GUID}/walk"
params = {"includeDetails": "true"}
resp = requests.get(url, params=params, headers=headers)
resp.raise_for_status()
return resp.json()
def list_all_workspaces() -> dict:
"""List all workspaces the user has access to."""
url = f"{DOMO_BASE}/nav/v1/workspaces"
resp = requests.get(url, headers=headers)
resp.raise_for_status()
return resp.json()
def search_workspace(query_body: dict) -> dict:
"""Search for content within the workspace."""
url = f"{DOMO_BASE}/nav/v1/workspaces/{WORKSPACE_GUID}/addContentQuery"
resp = requests.post(url, json=query_body, headers=headers)
resp.raise_for_status()
return resp.json()
curl
向工作区添加卡片(已验证可用):
curl -X POST "https://your-instance.domo.com/api/nav/v1/workspaces/WORKSPACE_GUID/contents" \
-H "X-DOMO-Developer-Token: $DOMO_TOKEN" \
-H "Content-Type: application/json" \
-d '{"entityId": "123456789", "entityType": "CARD"}'
列出所有工作区:
curl -X GET "https://your-instance.domo.com/api/nav/v1/workspaces" \
-H "X-DOMO-Developer-Token: $DOMO_TOKEN"
列出工作区内容:
curl -X GET "https://your-instance.domo.com/api/nav/v1/workspaces/WORKSPACE_GUID/walk?includeDetails=true" \
-H "X-DOMO-Developer-Token: $DOMO_TOKEN"
搜索工作区:
curl -X POST "https://your-instance.domo.com/api/nav/v1/workspaces/WORKSPACE_GUID/addContentQuery" \
-H "X-DOMO-Developer-Token: $DOMO_TOKEN" \
-H "Content-Type: application/json" \
-d '{}'
注意事项和已知问题
| 问题 | 详情 |
|---|---|
| 批量端点返回 400 | 在 2026 年 3 月的测试中,/nav/v1/workspaces/bulk/execute 端点在所有格式变体(id/entityId、字符串/数字、CARD/card/KPI_CARD)下均返回 400 Bad Request。请改用 /nav/v1/workspaces/:guid/contents —— 该端点已验证可用。 |
使用 /contents 而非 /bulk/execute | 单项 POST /nav/v1/workspaces/:guid/contents 端点搭配 {"entityId": "...", "entityType": "CARD"} 是添加内容的可靠方式。已在单次会话中用 22 张卡片验证。 |
| entityType 值 | 从现有工作区数据中确认:CARD、DATA_APP、WORKSPACE_URL。另有文档记载:PAGE、DATASET。 |
| 未记录的 API | 这些端点不在官方 Domo API 文档中。它们是从 Domo Web 客户端逆向工程得出的,可能随时更改,恕不另行通知。 |
| GUID 格式 | 工作区标识符使用 UUID/GUID 格式(例如 579394f2-5ec2-4152-b2b7-7e2c6c7a1305),而非数字 ID。 |
| 响应包含内部 ID | 添加内容时,响应中包含一个 id 字段(例如 6)。这是工作区内部的内容 ID,与卡片/数据集 ID 不同。请使用此 ID 进行删除操作。 |
URL 必须包含 /api 前缀 | 工作区端点使用 /api/nav/v1/... 路径。省略 /api 会返回 404。 |