章节:API 参考

开发者

API 参考

VentionDesk API 的所有公开端点。此列表由服务器已注册的路由生成;每个端点的访问规则来自路由上的检查,表格来自 VentionDesk 用于检查请求和生成响应的 Zod 合约。因此,这里写的就是服务器实际执行的内容。

URL 以 https://api.ventiondesk.com 开头。登录、权限范围、错误格式和速率限制见 API 基础。必填字段标有 *;没有表格的端点,要么使用未公开的合约检查请求体,要么没有合约。

访问 的含义如下:“所有者”和“所有者和员工”指在 Web 界面中已登录的人员;使用 API 密钥访问这类端点时,返回 403。带有权限范围的端点,也可以由具备该权限范围的代理密钥访问。

任务

GET/v1/tasks

读取任务,可按项目、状态、负责人或搜索文本筛选。

访问 所有者、员工或具有权限范围 tasks:read 的代理密钥

查询参数

字段类型说明
projectUUID
projectSlug文本
status"hold" | "todo" | "in_progress" | "question" | "review" | "done"
assignee"owner" | "staff" | "claude" | "external"
claimable"true" | "false"
maxAttempts整数≥ 1 | ≤ 20 | 默认值:3
limit整数≥ 1 | ≤ 100 | 默认值:20
q文本至少 1 个字符

响应

字段类型说明
tasks对象 列表

POST/v1/tasks

创建任务;非常相似的未完成任务会被识别为重复。

访问 所有者、员工或具有权限范围 tasks:write 的代理密钥

请求体(JSON)

字段类型说明
projectIdUUID
projectSlug文本
title *文本至少 25 个字符
descriptionMd文本至少 1 个字符
area"frontend" | "backend" | "design" | "infra" | "support"
dueDate日期(YYYY-MM-DD)
estimateMinutes整数> 0
triggerCondition文本至少 1 个字符
evidence文本至少 1 个字符

GET/v1/tasks/:id

包含描述、反馈和附件的任务。

访问 所有者、员工或具有权限范围 tasks:read 的代理密钥

响应

字段类型说明
task对象
results对象 列表
attachments对象 列表

PATCH/v1/tasks/:id

更改任务的字段。

访问 所有者、员工或具有权限范围 tasks:write 的代理密钥

请求体(JSON)

字段类型说明
title文本至少 1 个字符
descriptionMd文本 或 null
status"hold" | "todo" | "in_progress" | "question" | "review" | "done"
assignee"owner" | "staff" | "claude" | "external" 或 null
area"frontend" | "backend" | "design" | "infra" | "support" 或 null
dueDate日期(YYYY-MM-DD) 或 null
estimateMinutes整数 或 null> 0
position文本至少 1 个字符
triggerCondition文本 或 null

POST/v1/tasks/:id/claim

原子性地领取任务——两次运行绝不会领到同一个任务。

访问 所有者、员工或具有权限范围 tasks:write 的代理密钥

请求体(JSON)

字段类型说明
maxAttempts整数≥ 1 | ≤ 20 | 默认值:3
runIdUUID

POST/v1/tasks/:id/decision

人对反馈的批准或驳回;驳回需要评论。

访问 所有者和员工

请求体(JSON)

字段类型说明
decision *"approved" | "rejected"
commentMd文本至少 1 个字符 | 最多 20000 个字符
attachmentIdsUUID 列表默认值:[]

响应

字段类型说明
task对象
result对象

POST/v1/tasks/:id/handoff

将任务移交给 Claude。

访问 所有者、员工或具有权限范围 tasks:write 的代理密钥

POST/v1/tasks/:id/result

反馈任务状态(arbeitet、kontrolle、frage、master、blockiert、erledigt)。

访问 所有者、员工或具有权限范围 tasks:write 的代理密钥

请求体(JSON)

字段类型说明
state *"arbeitet" | "kontrolle" | "frage" | "master" | "blockiert" | "erledigt"
summaryMd文本至少 1 个字符
detailsMd文本至少 1 个字符
prUrlURL
evidence文本至少 1 个字符
runIdUUID

代理运行

POST/v1/agent/runs

启动代理运行。

访问 仅限代理密钥,需权限范围 agent:run

请求体(JSON)

字段类型说明
projectIdUUID
projectSlug文本
meta对象(自由格式)默认值:{}

响应

字段类型说明
run对象

POST/v1/agent/runs/:id/finish

结束代理运行,附摘要或错误状态。

访问 仅限代理密钥

请求体(JSON)

字段类型说明
status *"succeeded" | "failed"
summary文本至少 1 个字符

响应

字段类型说明
run对象

POST/v1/agent/runs/:id/heartbeat

正在进行的代理运行的存活信号。

访问 仅限代理密钥

响应

字段类型说明
run对象

项目

POST/v1/errors/:id/resolve

将未解决的错误标记为已解决——先使用错误来源的访问在错误追踪器(Sentry、Bugsnag、Rollbar)中标记,成功后才在 VentionDesk 中标记。如果服务商处失败(访问只读、错误未知、无响应),错误保持未解决:返回 409 或 502 及原因。适用于所有者、员工和具有 errors:write 的代理。此处不提供隐藏和删除。

访问 所有者、员工或具有权限范围 errors:write 的代理密钥

响应

字段类型说明
issue对象
changedtrue | false

POST/v1/errors/:id/task

根据错误创建任务。

访问 所有者和员工

GET/v1/errors/summary

所有项目的错误计数,用于概览。

访问 所有者和员工

响应

字段类型说明
projects对象 列表

POST/v1/monitors/probe

在创建前检查监控 URL,并报告重定向及最终目标。

访问 所有者和员工

请求体(JSON)

字段类型说明
url *URL最多 2048 个字符

GET/v1/projects

账户或密钥可以看到的项目。

访问 所有者、员工或具有权限范围 projects:read 的代理密钥

查询参数

字段类型说明
status"active" | "blocked" | "review" | "paused"
includeArchived"true" | "false"
q文本至少 1 个字符

响应

字段类型说明
projects对象 列表

GET/v1/projects/:id

按 ID 获取项目。

访问 所有者、员工或具有权限范围 projects:read 的代理密钥

PATCH/v1/projects/:id/customer

将项目分配给其他客户;工单、草稿和文档随之移动。

访问 所有者

请求体(JSON)

字段类型说明
customerId *UUID

响应

字段类型说明
project对象
changedtrue | false
moved对象

GET/v1/projects/:id/deploy

有哪些部署目标,以及每个目标缺少什么。

访问 所有者

响应

字段类型说明
targets对象 列表

POST/v1/projects/:id/deploy

触发部署(202:已触发,不代表成功)。

访问 所有者

请求体(JSON)

字段类型说明
target *"production" | "staging" | "preview"
provider"vercel" | "render"

响应

字段类型说明
provider"vercel" | "render"
target"production" | "staging" | "preview"
externalId文本 或 null
started整数> 0

POST/v1/projects/:id/error-sources

将错误追踪器中的项目关联到此项目。

访问 所有者和员工

请求体(JSON)

字段类型说明
provider *"sentry" | "bugsnag" | "rollbar"
externalId *文本至少 1 个字符 | 最多 200 个字符

DELETE/v1/projects/:id/error-sources/:sourceId

从项目中解除错误来源。

访问 所有者和员工

GET/v1/projects/:id/errors

此项目来自 Sentry、Bugsnag 或 Rollbar 的错误。具有 errors:read 的代理可获得其项目的错误,不含来源和连接。

访问 所有者、员工或具有权限范围 errors:read 的代理密钥

响应

字段类型说明
issues对象 列表
stats对象
sources对象 列表
providers"sentry" | "bugsnag" | "rollbar" 列表

GET/v1/projects/:id/hosting

项目的托管关联。

访问 所有者和员工

响应

字段类型说明
mappings对象 列表
providers"netlify" | "cloudflare_pages" | "aws_amplify" | "railway" | "flyio" | "digitalocean_app_platform" 列表

POST/v1/projects/:id/hosting

关联托管服务商处的网站、应用或服务。

访问 所有者和员工

请求体(JSON)

字段类型说明
provider *"netlify" | "cloudflare_pages" | "aws_amplify" | "railway" | "flyio" | "digitalocean_app_platform"
externalId *文本至少 1 个字符 | 最多 200 个字符

DELETE/v1/projects/:id/hosting/:mappingId

移除托管关联。

访问 所有者和员工

DELETE/v1/projects/:id/render-services/:serviceId

从项目中解除过时的 Render 服务 ID。

访问 所有者

GET/v1/projects/:id/report

用于报告的项目状态:进度、各状态的任务数、未结和逾期的工单、路线图、监控、部署和开放的 pull request。不含金额——既无营收也无预算或成本。

访问 所有者、员工或具有权限范围 stats:read 的代理密钥

GET/v1/projects/:id/roadmap

项目的路线图阶段,按计划顺序排列。

访问 所有者、员工或具有权限范围 roadmap:write 的代理密钥

响应

字段类型说明
phases对象 列表

POST/v1/projects/:id/roadmap

创建路线图阶段。没有 sort 时放在末尾;下一个未完成的阶段就是驾驶舱中的里程碑。

访问 所有者、员工或具有权限范围 roadmap:write 的代理密钥

请求体(JSON)

字段类型说明
title *文本至少 1 个字符 | 最多 200 个字符
startsOn *文本固定格式
endsOn *文本固定格式
sort整数≥ 0

PATCH/v1/projects/:id/roadmap/:phaseId

更改阶段——标题、期间、完成状态或顺序,仅更改所发送的字段。API 不执行删除。

访问 所有者、员工或具有权限范围 roadmap:write 的代理密钥

请求体(JSON)

字段类型说明
title文本至少 1 个字符 | 最多 200 个字符
startsOn文本固定格式
endsOn文本固定格式
donetrue | false
sort整数≥ 0

POST/v1/projects/:id/sync

立即同步项目的 GitHub 数据,而不是等到夜间。

访问 所有者和员工

GET/v1/projects/:id/time

项目的工时记录:日期、时长、描述、任务、是否可计费和已开票、人员姓名——不含小时费率、金额和发票 ID。

访问 所有者、员工或具有权限范围 time:read 的代理密钥

查询参数

字段类型说明
from文本固定格式
to文本固定格式
limit整数≥ 1 | ≤ 500 | 默认值:200

响应

字段类型说明
entries对象 列表
totalSeconds整数≥ 0

GET/v1/projects/by-slug/:slug

按 slug 获取项目。

访问 所有者、员工或具有权限范围 projects:read 的代理密钥

工单

GET/v1/tickets

读取工单,可按状态、渠道、优先级、项目或客户筛选。

访问 所有者、员工或具有权限范围 tickets:read 的代理密钥

查询参数

字段类型说明
status"open" | "in_progress" | "waiting" | "resolved"
source"contact_form" | "app" | "email" | "monitor" | "portal" | "phone" | "on_site" | "stripe" | "api"
priority"low" | "normal" | "high" | "critical"
projectUUID
projectSlug文本
customerUUID
withSla"true" | "false"
q文本至少 1 个字符
limit整数≥ 1 | ≤ 100 | 默认值:50

响应

字段类型说明
tickets对象 列表

POST/v1/tickets

创建工单,例如在电话之后。

访问 所有者、员工或具有权限范围 tickets:write 的代理密钥

请求体(JSON)

字段类型说明
subject *文本至少 3 个字符
bodyMd *文本至少 1 个字符
source *"contact_form" | "app" | "email" | "monitor" | "portal" | "phone" | "on_site" | "stripe" | "api"
customerIdUUID 或 null
projectIdUUID 或 null
priority"low" | "normal" | "high" | "critical"默认值:"normal"
requesterName文本
requesterEmail电子邮件
requesterMeta对象(自由格式)

DELETE/v1/tickets/:id

删除工单。

访问 所有者和员工

GET/v1/tickets/:id

包含历史的工单。

访问 所有者、员工或具有权限范围 tickets:read 的代理密钥

响应

字段类型说明
ticket对象
messages对象 列表

PATCH/v1/tickets/:id

更改工单的主题、状态、优先级、渠道、客户、项目、负责人或门户可见性。

访问 所有者和员工

请求体(JSON)

字段类型说明
subject文本至少 3 个字符
status"open" | "in_progress" | "waiting" | "resolved"
priority"low" | "normal" | "high" | "critical"
source"contact_form" | "app" | "email" | "monitor" | "portal" | "phone" | "on_site" | "stripe" | "api"
customerIdUUID 或 null
projectIdUUID 或 null
assignedToUUID 或 null
portalVisibletrue | false

POST/v1/tickets/:id/messages

在历史中写入一条记录:内部备注或草稿。不会发送邮件。

访问 所有者、员工或具有权限范围 tickets:write 的代理密钥

请求体(JSON)

字段类型说明
bodyMd *文本至少 1 个字符
isInternalNotetrue | false默认值:false
isDrafttrue | false默认值:false

POST/v1/tickets/:id/reply

回复客户——这是唯一会发送邮件的方式。将工单设为“等待中”。代理的回复始终附有由 AI 助手撰写的提示,并限制为每个密钥每小时 20 条、每个工单每天 3 条(超出返回 429)。

访问 所有者、员工或具有权限范围 tickets:reply 的代理密钥

请求体(JSON)

字段类型说明
bodyMd *文本至少 1 个字符
isInternalNotetrue | false默认值:false
isDrafttrue | false默认值:false
draftIdUUID

POST/v1/tickets/:id/to-task

根据工单创建任务——主题作为标题,全部历史作为描述。

访问 所有者和员工

请求体(JSON)

字段类型说明
projectId *UUID
title文本至少 10 个字符
assignee"owner" | "staff" | "claude" | "external" 或 null

GET/v1/tickets/attachments/:id/url

工单附件的短期 URL——代理只能获取其项目工单的附件。

访问 所有者、员工或具有权限范围 tickets:read 的代理密钥

响应

字段类型说明
urlURL
expiresInSeconds整数> 0

笔记

POST/v1/notes

在项目上创建笔记(项目 ID 或 slug)。

访问 所有者、员工或具有权限范围 notes:write 的代理密钥

请求体(JSON)

字段类型说明
projectIdUUID
projectSlug文本
bodyMd *文本至少 1 个字符
kind"idea" | "decision" | "risk"默认值:"idea"

响应

字段类型说明
note对象

POST/v1/notes/:id/to-task

根据笔记创建任务。

访问 所有者和员工

请求体(JSON)

字段类型说明
title文本至少 25 个字符
assignee"owner" | "staff" | "claude" | "external" 或 null

响应

字段类型说明
okfalse
error文本
code"note_already_converted"
task对象

想法

POST/v1/ideas

创建想法——始终为“未开始”。代理只能创建:不能读取、修改或删除任何想法;没有项目时,仅限适用于所有项目的密钥。

访问 所有者或具有权限范围 ideas:write 的代理密钥

请求体(JSON)

字段类型说明
title *文本至少 1 个字符 | 最多 200 个字符
bodyMd文本最多 20000 个字符
tags文本 列表默认值:[]
potential"low" | "medium" | "high"
priority"low" | "high"
projectIdUUID 或 null

响应

字段类型说明
idea对象

工时

GET/v1/time/entries

读取工时记录。

访问 所有者和员工

查询参数

字段类型说明
from文本
to文本
projectUUID
userUUID
unbilled"true" | "false"
limit整数≥ 1 | ≤ 500 | 默认值:200

响应

字段类型说明
entries对象 列表

POST/v1/time/entries

补录工时。

访问 所有者和员工

请求体(JSON)

字段类型说明
label *文本至少 1 个字符
startedAt *时间戳(ISO 8601)
endedAt *时间戳(ISO 8601)
seconds整数> 0
projectIdUUID 或 null
ticketIdUUID 或 null
taskIdUUID 或 null
billabletrue | false默认值:true

DELETE/v1/time/entries/:id

删除工时记录。

访问 所有者和员工

PATCH/v1/time/entries/:id

更改工时记录。

访问 所有者和员工

请求体(JSON)

字段类型说明
label文本至少 1 个字符
seconds整数> 0
billabletrue | false
projectIdUUID 或 null
ticketIdUUID 或 null

GET/v1/time/timer

账户正在运行的计时器。

访问 所有者和员工

响应

字段类型说明
timer对象 或 null

POST/v1/time/timer/start

启动计时器。

访问 所有者和员工

请求体(JSON)

字段类型说明
label文本默认值:""
projectIdUUID 或 null
ticketIdUUID 或 null
taskIdUUID 或 null

POST/v1/time/timer/stop

停止计时器,并将时间记录为一条记录。

访问 所有者和员工

GET/v1/time/unbilled

尚未开票的可计费工时,按项目列出,含金额。

访问 所有者

响应

字段类型说明
projects对象 列表
totals对象

客户

DELETE/v1/customers/:id

删除客户,包括文件。

访问 所有者

响应

字段类型说明
customerIdUUID
shortName文本
impact对象
files对象
portalAccounts对象

GET/v1/customers/:id/deletion

预览删除客户时会一并移除的内容。

访问 所有者

响应

字段类型说明
customerIdUUID
shortName文本
deletabletrue | false
reason文本 或 null
blockers对象
impact对象

POST/v1/customers/:id/portal-access

为联系人授予客户门户访问权限。

访问 所有者

请求体(JSON)

字段类型说明
email *电子邮件
displayName文本至少 1 个字符

响应

字段类型说明
access对象
mail对象

DELETE/v1/customers/:id/portal-access/:userId

撤销账户的门户访问权限。已签发的令牌在续期前仍然有效。

访问 所有者

响应

字段类型说明
revoked对象

POST/v1/customers/:id/portal-access/:userId/invite

重新发送客户门户邀请。

访问 所有者

响应

字段类型说明
mail对象

文档

GET/v1/documents

读取文档,可按客户、项目或类型筛选。

访问 任何已登录账户;由其角色决定能看到什么

查询参数

字段类型说明
customerUUID
projectUUID
type"pdf" | "image" | "sheet" | "contract" | "other"
q文本至少 1 个字符 | 最多 120 个字符
limit整数≥ 1 | ≤ 200 | 默认值:50

响应

字段类型说明
documents对象 列表

PATCH/v1/documents/:id

更改文档的归属、类型、标签或门户可见性。

访问 任何已登录账户;由其角色决定能看到什么

请求体(JSON)

字段类型说明
name文本至少 1 个字符 | 最多 200 个字符
type"pdf" | "image" | "sheet" | "contract" | "other"
projectIdUUID 或 null
sharedWithPortaltrue | false
tags文本 列表

GET/v1/documents/:id/url

下载文档的短期 URL。

访问 任何已登录账户;由其角色决定能看到什么

响应

字段类型说明
urlURL
expiresInSeconds整数> 0

财务

GET/v1/finance/export

为税务顾问提供的年度导出:ZIP,每张表一个 CSV,外加已保存的凭证。

访问 所有者

GET/v1/invoices

读取发票,可按状态、客户或“逾期”筛选。代理只能看到其项目的草稿。

访问 所有者或具有权限范围 invoices:write 的代理密钥

查询参数

字段类型说明
status"draft" | "open" | "overdue" | "paid" | "cancelled"
customerUUID
overdue"true" | "false"
limit整数≥ 1 | ≤ 200 | 默认值:50

响应

字段类型说明
invoices对象 列表

POST/v1/invoices

创建发票草稿——尚无发票编号。没有 customerId 时使用项目的客户;代理只能在其项目之一中创建草稿。定稿、发送和付款仍由所有者负责。

访问 所有者或具有权限范围 invoices:write 的代理密钥

请求体(JSON)

字段类型说明
customerIdUUID
projectIdUUID 或 null
paymentTermsDays整数≥ 1 | ≤ 90
vatRate整数
vatScheme"standard" | "reverse_charge"
serviceFrom文本固定格式
serviceTo文本固定格式
serviceDateEqualsInvoiceDatetrue | false默认值:false
positions对象 列表默认值:[]

GET/v1/invoices/:id

包含明细、合计和付款的发票。

访问 所有者或具有权限范围 invoices:write 的代理密钥

响应

字段类型说明
invoice对象
positions对象 列表

POST/v1/invoices/:id/cancel

冲销已定稿的发票;会生成冲销凭证。

访问 所有者

请求体(JSON)

字段类型说明
reason *文本至少 3 个字符 | 最多 500 个字符
serviceRendered *true | false

响应

字段类型说明
invoice对象
releasedEntries整数≥ 0
entries"released" | "failed"
correction"stored" | "skipped" | "failed"
taxOfficeConsenttrue | false

GET/v1/invoices/:id/cancellation/pdf

PDF 格式的冲销凭证。

访问 所有者

POST/v1/invoices/:id/cancellation/send

通过电子邮件发送冲销凭证。

访问 所有者

响应

字段类型说明
mail"sent" | "skipped"
reason文本可缺省
invoice对象

POST/v1/invoices/:id/dunning/send

发送到期的催款级别。

访问 所有者

响应

字段类型说明
mail"sent" | "skipped"
reason文本可缺省
invoice对象
level整数 或 null≥ 1 | ≤ 4

POST/v1/invoices/:id/finalize

将草稿定稿:分配连续编号、锁定发票并保存 PDF。

访问 所有者

请求体(JSON)

字段类型说明
settle对象

响应

字段类型说明
invoice对象
pdf"stored" | "skipped" | "failed"
payment"none" | "booked" | "failed"
paymentError文本可缺省

POST/v1/invoices/:id/payments

记录付款或退款。

访问 所有者

请求体(JSON)

字段类型说明
amountCents *整数
paidOn文本固定格式
method"transfer" | "stripe" | "cash" | "other"默认值:"transfer"
note文本最多 500 个字符

GET/v1/invoices/:id/pdf

PDF 格式的发票——定稿时保存的凭证。

访问 所有者

POST/v1/invoices/:id/positions

向草稿添加明细。

访问 所有者或具有权限范围 invoices:write 的代理密钥

请求体(JSON)

字段类型说明
description *文本至少 1 个字符
quantity *数字> 0
unit"hour" | "flat"默认值:"hour"
unitPriceCents *整数≥ 0
sort整数

DELETE/v1/invoices/:id/positions/:positionId

从草稿中移除明细。

访问 所有者或具有权限范围 invoices:write 的代理密钥

PATCH/v1/invoices/:id/positions/:positionId

更改草稿的明细——仅更改所发送的字段。已定稿的发票返回 409。

访问 所有者或具有权限范围 invoices:write 的代理密钥

请求体(JSON)

字段类型说明
description文本至少 1 个字符
quantity数字> 0
unit"hour" | "flat"默认值:"hour"
unitPriceCents整数≥ 0
sort整数

POST/v1/invoices/:id/remind

发送付款提醒。

访问 所有者

响应

字段类型说明
mail"sent" | "skipped"
reason文本可缺省
invoice对象

POST/v1/invoices/:id/send

通过电子邮件发送已定稿的发票。

访问 所有者

响应

字段类型说明
mail"sent" | "skipped"
reason文本可缺省
invoice对象

GET/v1/invoices/:id/stripe-refund

Stripe 付款是否可以退款以及可退多少。

访问 所有者

POST/v1/invoices/:id/stripe-refund

通过 Stripe 退还经 Stripe 支付的发票;通过 webhook 入账。

访问 所有者

请求体(JSON)

字段类型说明
amountCents整数> 0

POST/v1/invoices/from-unbilled

将项目未开票的可计费工时转为发票草稿——每条工时记录一条明细。

访问 所有者或具有权限范围 invoices:write 的代理密钥

请求体(JSON)

字段类型说明
projectId *UUID
untilDate文本
paymentTermsDays整数≥ 1 | ≤ 90
vatRate整数
vatScheme"standard" | "reverse_charge"

响应

字段类型说明
invoice对象
entries整数≥ 0
hours数字≥ 0

GET/v1/quotes

读取报价单。代理只能看到其项目的草稿。

访问 所有者或具有权限范围 quotes:write 的代理密钥

响应

字段类型说明
quotes对象 列表

POST/v1/quotes

创建报价单草稿——尚无编号。没有 customerId 时使用项目的客户;代理只能在其项目之一中创建草稿,且不能为潜在客户创建。

访问 所有者或具有权限范围 quotes:write 的代理密钥

请求体(JSON)

字段类型说明
title *文本至少 3 个字符
customerIdUUID 或 null
prospectName文本
prospectEmail电子邮件
projectIdUUID 或 null
validUntil文本
vatRate整数
vatScheme"standard" | "reverse_charge"
positions对象 列表默认值:[]

DELETE/v1/quotes/:id

删除报价单草稿——它还没有编号。

访问 所有者或具有权限范围 quotes:write 的代理密钥

GET/v1/quotes/:id

包含明细的报价单。

访问 所有者或具有权限范围 quotes:write 的代理密钥

响应

字段类型说明
quote对象
positions对象 列表

PATCH/v1/quotes/:id

更改草稿的标题和有效期。已发送的报价单返回 409。

访问 所有者或具有权限范围 quotes:write 的代理密钥

请求体(JSON)

字段类型说明
title文本至少 3 个字符
validUntil文本 或 null固定格式

GET/v1/quotes/:id/pdf

PDF 格式的报价单。

访问 所有者

POST/v1/quotes/:id/positions

向报价单草稿添加明细。

访问 所有者或具有权限范围 quotes:write 的代理密钥

请求体(JSON)

字段类型说明
description *文本至少 1 个字符
quantity *数字> 0
unit"hour" | "flat"默认值:"hour"
unitPriceCents *整数≥ 0
sort整数

DELETE/v1/quotes/:id/positions/:positionId

从报价单草稿中移除明细。

访问 所有者或具有权限范围 quotes:write 的代理密钥

PATCH/v1/quotes/:id/positions/:positionId

更改报价单草稿的明细——仅更改所发送的字段。

访问 所有者或具有权限范围 quotes:write 的代理密钥

请求体(JSON)

字段类型说明
description文本至少 1 个字符
quantity数字> 0
unit"hour" | "flat"默认值:"hour"
unitPriceCents整数≥ 0
sort整数

POST/v1/quotes/:id/send

通过电子邮件发送报价单。

访问 所有者

响应

字段类型说明
mail"sent" | "skipped"
reason文本可缺省
quote对象

连接

GET/v1/integrations

工作区已连接的来源,不含机密。

访问 所有者和员工

响应

字段类型说明
integrations对象 列表
plattformtrue | false
githubInstallierbartrue | false

POST/v1/integrations

连接来源。访问凭据在保存前会先经服务商检查。

访问 所有者

请求体(JSON)

字段类型说明
provider *"vercel" | "render" | "netlify" | "cloudflare_pages" | "aws_amplify" | "railway" | "flyio" | "digitalocean_app_platform" | "postmark" | "mailgun" | "amazon_ses" | "resend" | "sentry" | "bugsnag" | "rollbar" | "stripe"
fields *对象(自由格式)

DELETE/v1/integrations/:id

移除连接。

访问 所有者

PATCH/v1/integrations/:id

编辑连接;留空的机密保持不变。

访问 所有者

请求体(JSON)

字段类型说明
fields *对象(自由格式)

GET/v1/integrations/:id/webhook

连接(Stripe、Sentry、Bugsnag、Rollbar)的 webhook URL,需在服务商处填写。

访问 所有者

响应

字段类型说明
urlURL
signierttrue | false
bereittrue | false

GET/v1/integrations/:provider/error-projects

该访问在错误追踪器中能看到的项目。

访问 所有者和员工

响应

字段类型说明
resources对象 列表

GET/v1/integrations/:provider/resources

托管访问在服务商处能看到的网站、应用或服务。

访问 所有者和员工

响应

字段类型说明
resources对象 列表

GET/v1/integrations/github/callback

安装后从 GitHub 返回的路径;将安装绑定到工作区。

访问 已签名的 state 和 GitHub 登录

查询参数

字段类型说明
installation_id文本固定格式
setup_action文本最多 20 个字符
code文本最多 200 个字符
state文本最多 2000 个字符

POST/v1/integrations/github/install-url

在 GitHub 上安装 VentionDesk 应用的 URL。

访问 所有者

响应

字段类型说明
urlURL

账户、设置和管理

GET/v1/admin/api-keys

工作区的 API 密钥,不含明文。

访问 所有者

响应

字段类型说明
keys对象 列表

POST/v1/admin/api-keys

创建代理密钥或入口密钥。明文只在这一次响应中出现。

访问 所有者

请求体(JSON)

字段类型说明
name *文本至少 3 个字符
kind"agent" | "intake"默认值:"agent"
scopes *"projects:read" | "tasks:read" | "tasks:write" | "tickets:read" | "tickets:write" | "tickets:reply" | "notes:write" | "deployments:read" | "agent:run" | "intake:write" | "access-log:write" | "invoices:write" | "errors:read" | "errors:write" | "time:read" | "stats:read" | "quotes:write" | "roadmap:write" | "ideas:write" 列表
projectIds *UUID 列表 或 null
expiresAt时间戳(ISO 8601)

响应

字段类型说明
key对象
plaintext文本

DELETE/v1/admin/api-keys/:id

撤销密钥——立即生效。

访问 所有者

PATCH/v1/admin/api-keys/:id

更改密钥的权限和项目——密钥本身保持不变。

访问 所有者

请求体(JSON)

字段类型说明
scopes *"projects:read" | "tasks:read" | "tasks:write" | "tickets:read" | "tickets:write" | "tickets:reply" | "notes:write" | "deployments:read" | "agent:run" | "intake:write" | "access-log:write" | "invoices:write" | "errors:read" | "errors:write" | "time:read" | "stats:read" | "quotes:write" | "roadmap:write" | "ideas:write" 列表
projectIds *UUID 列表 或 null

响应

字段类型说明
key对象

DELETE/v1/admin/api-keys/:id/endgueltig

永久删除已撤销的密钥。

访问 所有者

GET/v1/admin/members

工作区成员及其角色。

访问 所有者

响应

字段类型说明
members对象 列表

PATCH/v1/admin/members/:id

更改成员的角色。

访问 所有者

请求体(JSON)

字段类型说明
role *"owner" | "staff"

响应

字段类型说明
member对象
activeHeretrue | false

DELETE/v1/admin/users/:id

删除门户账户;历史中的姓名和地址会先被假名化。

访问 所有者

响应

字段类型说明
removed对象
account"kept" | "deleted" | "locked"

POST/v1/admin/users/invite

通过电子邮件邀请员工。

访问 所有者

请求体(JSON)

字段类型说明
email *电子邮件
role *"owner" | "staff"
displayName文本至少 1 个字符

响应

字段类型说明
user对象
existingAccounttrue | false可缺省 | 默认值:false

GET/v1/ki-apps

已连接的 AI 应用:自己在所有工作区中的连接,所有者还可看到整个工作区的连接。

访问 所有者和员工

响应

字段类型说明
apps对象 列表
alleImBetriebtrue | false

POST/v1/ki-apps

保存对 AI 应用的同意(工作区、权限、项目)——在登录授权之前。应用名称由 Supabase Auth 提供,而不是调用方。

访问 所有者和员工

请求体(JSON)

字段类型说明
authorizationId *文本至少 1 个字符 | 最多 200 个字符
orgId *UUID
scopes *"projects:read" | "tasks:read" | "tasks:write" | "tickets:read" | "tickets:write" | "tickets:reply" | "notes:write" | "deployments:read" | "agent:run" | "intake:write" | "access-log:write" | "invoices:write" | "errors:read" | "errors:write" | "time:read" | "stats:read" | "quotes:write" | "roadmap:write" | "ideas:write" 列表
projectIds *UUID 列表 或 null

响应

字段类型说明
app对象

DELETE/v1/ki-apps/:id

断开 AI 应用——立即生效;对于自己的连接,登录授权也会一并撤回。

访问 所有者和员工

GET/v1/ki-apps/rahmen

同意页面提供的内容:此人的工作区、允许的权限和项目。

访问 所有者和员工

响应

字段类型说明
betriebe对象 列表
betriebUUID
rolle"owner" | "staff"
erlaubt"projects:read" | "tasks:read" | "tasks:write" | "tickets:read" | "tickets:write" | "tickets:reply" | "notes:write" | "deployments:read" | "agent:run" | "intake:write" | "access-log:write" | "invoices:write" | "errors:read" | "errors:write" | "time:read" | "stats:read" | "quotes:write" | "roadmap:write" | "ideas:write" 列表
projekte对象 列表

GET/v1/ki-apps/vorgabe

员工可以授予 AI 应用哪些权限。

访问 所有者和员工

响应

字段类型说明
scopes"projects:read" | "tasks:read" | "tasks:write" | "tickets:read" | "tickets:write" | "tickets:reply" | "notes:write" | "deployments:read" | "agent:run" | "intake:write" | "access-log:write" | "invoices:write" | "errors:read" | "errors:write" | "time:read" | "stats:read" | "quotes:write" | "roadmap:write" | "ideas:write" 列表
abWerk"projects:read" | "tasks:read" | "tasks:write" | "tickets:read" | "tickets:write" | "tickets:reply" | "notes:write" | "deployments:read" | "agent:run" | "intake:write" | "access-log:write" | "invoices:write" | "errors:read" | "errors:write" | "time:read" | "stats:read" | "quotes:write" | "roadmap:write" | "ideas:write" 列表
waehlbar"projects:read" | "tasks:read" | "tasks:write" | "tickets:read" | "tickets:write" | "tickets:reply" | "notes:write" | "deployments:read" | "agent:run" | "intake:write" | "access-log:write" | "invoices:write" | "errors:read" | "errors:write" | "time:read" | "stats:read" | "quotes:write" | "roadmap:write" | "ideas:write" 列表

PUT/v1/ki-apps/vorgabe

更改此默认设置。

访问 所有者

请求体(JSON)

字段类型说明
scopes *"projects:read" | "tasks:read" | "tasks:write" | "tickets:read" | "tickets:write" | "tickets:reply" | "notes:write" | "deployments:read" | "agent:run" | "intake:write" | "access-log:write" | "invoices:write" | "errors:read" | "errors:write" | "time:read" | "stats:read" | "quotes:write" | "roadmap:write" | "ideas:write" 列表

响应

字段类型说明
scopes"projects:read" | "tasks:read" | "tasks:write" | "tickets:read" | "tickets:write" | "tickets:reply" | "notes:write" | "deployments:read" | "agent:run" | "intake:write" | "access-log:write" | "invoices:write" | "errors:read" | "errors:write" | "time:read" | "stats:read" | "quotes:write" | "roadmap:write" | "ideas:write" 列表
abWerk"projects:read" | "tasks:read" | "tasks:write" | "tickets:read" | "tickets:write" | "tickets:reply" | "notes:write" | "deployments:read" | "agent:run" | "intake:write" | "access-log:write" | "invoices:write" | "errors:read" | "errors:write" | "time:read" | "stats:read" | "quotes:write" | "roadmap:write" | "ideas:write" 列表
waehlbar"projects:read" | "tasks:read" | "tasks:write" | "tickets:read" | "tickets:write" | "tickets:reply" | "notes:write" | "deployments:read" | "agent:run" | "intake:write" | "access-log:write" | "invoices:write" | "errors:read" | "errors:write" | "time:read" | "stats:read" | "quotes:write" | "roadmap:write" | "ideas:write" 列表

GET/v1/me

自己的账户:角色、工作区、可选工作区和服务地址。

访问 任何已登录账户;由其角色决定能看到什么

响应

字段类型说明
idUUID
role"owner" | "staff" | "customer" | "agent"
customerIdUUID 或 null
displayName文本至少 1 个字符
email电子邮件
mfaRequiredtrue | false
intake对象
organization对象 或 null可缺省 | 默认值:null
memberships对象 列表可缺省 | 默认值:[]
support对象 或 null可缺省
locale"de" | "en" | "zh" | "es" | "hi" | "tr" 或 null可缺省

PATCH/v1/me/locale

在账户中保存自己的界面语言。

访问 任何已登录账户;由其角色决定能看到什么

请求体(JSON)

字段类型说明
locale *"de" | "en" | "zh" | "es" | "hi" | "tr"

POST/v1/me/organization

如果账户属于多个工作区,切换当前工作区。

访问 任何已登录账户;由其角色决定能看到什么

请求体(JSON)

字段类型说明
orgId *UUID

响应

字段类型说明
organization对象
role"owner" | "staff"

GET/v1/settings

工作区设置,包括凭证信头。

访问 所有者

响应

字段类型说明
company对象

PATCH/v1/settings

更改设置和信头。

访问 所有者

请求体(JSON)

字段类型说明
company *对象

响应

字段类型说明
company对象

GET/v1/settings/agreements

对条款和数据处理协议的同意状态。

访问 所有者

POST/v1/settings/agreements

接受或拒绝条款或数据处理协议的新版本。

访问 所有者

请求体(JSON)

字段类型说明
document *"agb" | "avv"
version *文本至少 1 个字符 | 最多 40 个字符
decision *"accepted" | "declined"

GET/v1/settings/benachrichtigungen

新工单邮件:开或关、收件人、渠道和最低优先级。

访问 所有者

PATCH/v1/settings/benachrichtigungen

配置新工单邮件(仅限所有者)。

访问 所有者

请求体(JSON)

字段类型说明
aktiv *true | false
wiederoeffnentrue | false
empfaenger *电子邮件 列表 或 null
kanaele *"contact_form" | "app" | "email" | "monitor" | "portal" | "phone" | "on_site" | "stripe" | "api" 列表 或 null
mindestPrioritaet *"low" | "normal" | "high" | "critical"

GET/v1/settings/mail

发给客户的邮件发件人以及自定义发件域名的状态。

访问 所有者

PATCH/v1/settings/mail

更改发件人名称和发件地址。

访问 所有者

请求体(JSON)

字段类型说明
absenderName文本 或 null最多 60 个字符
postfachname文本最多 40 个字符

GET/v1/settings/mail-templates

工作区的邮件模板,包括默认文本。

访问 所有者

响应

字段类型说明
vorlagen对象 列表

DELETE/v1/settings/mail-templates/:kind

将邮件模板重置为默认文本。

访问 所有者

PUT/v1/settings/mail-templates/:kind

保存邮件模板。

访问 所有者

请求体(JSON)

字段类型说明
subject *文本至少 1 个字符 | 最多 200 个字符
html *文本至少 1 个字符 | 最多 102400 个字符

响应

字段类型说明
kind"invoice_send" | "invoice_reminder" | "dunning" | "invoice_cancellation" | "quote_send" | "ticket_reply" | "ticket_receipt" | "ticket_internal" | "ticket_reopened" | "member_invite" | "portal_invite" | "deletion_reminder"
angepassttrue | false
subject文本 或 null
html文本 或 null
aktualisiertAm文本 或 null
bereinigttrue | false

DELETE/v1/settings/mail/domain

移除自定义发件域名。

访问 所有者

POST/v1/settings/mail/domain

创建自定义发件域名;响应会列出 DNS 记录。

访问 所有者

请求体(JSON)

字段类型说明
adresse *文本至少 3 个字符 | 最多 254 个字符

POST/v1/settings/mail/domain/verify

检查发件域名的 DNS 记录。

访问 所有者

VentionDesk 订阅

GET/v1/abo

工作区 VentionDesk 订阅的状态:套餐、试用、停用。

访问 所有者和员工

响应

字段类型说明
betrieb文本
tarif"solo" | "team" | "enterprise"
abrechnung"jaehrlich" | "monatlich"
status"trial" | "active" | "past_due" | "canceled"
testphaseBis文本 或 null
laufzeitBis文本 或 null
kuendigtZum文本 或 null可缺省 | 默认值:null
loeschungAm文本 或 null可缺省 | 默认值:null
gesperrttrue | false可缺省 | 默认值:false
sperrGrund"beendet" | "testphase" | "zahlungsverzug" | "anbieter" 或 null可缺省 | 默认值:null
sperreAb文本 或 null可缺省 | 默认值:null
plaetze整数 或 null
mitglieder整数
stripeKundetrue | false
stripeAbotrue | false可缺省 | 默认值:false
befreittrue | false
stripeBereittrue | false

POST/v1/abo/cancel

在期限结束时取消 VentionDesk 订阅。

访问 所有者

请求体(JSON)

字段类型说明
nonce *文本固定格式
grund"too_expensive" | "missing_features" | "switched_service" | "unused" | "too_complex" | "low_quality" | "customer_service" | "other"
kommentar文本最多 500 个字符

响应

字段类型说明
angenommentrue
ausstehendtrue | false可缺省
hinweis文本可缺省

POST/v1/abo/change

更改 VentionDesk 订阅的套餐或计费周期。

访问 所有者

请求体(JSON)

字段类型说明
tarif *"solo" | "team" | "enterprise"
abrechnung *"jaehrlich" | "monatlich"
plaetze *整数≥ 1 | ≤ 10000
nonce *文本固定格式

POST/v1/abo/checkout

订阅 VentionDesk(重定向到 Stripe Checkout)。

访问 所有者

请求体(JSON)

字段类型说明
tarif *"solo" | "team" | "enterprise"
abrechnung *"jaehrlich" | "monatlich"

响应

字段类型说明
urlURL

GET/v1/abo/export

整个工作区的数据导出,格式为 ZIP(结构见“数据导出”)。

访问 所有者

POST/v1/abo/preview

套餐变更预览,含按比例计算的金额。

访问 所有者

请求体(JSON)

字段类型说明
tarif *"solo" | "team" | "enterprise"
abrechnung *"jaehrlich" | "monatlich"
plaetze *整数≥ 1 | ≤ 10000

响应

字段类型说明
waehrung文本
anteiligCent整数
rechnungCent整数
steuerCent整数
sofortCent整数
faelligAm文本 或 null
imTesttrue | false

GET/v1/abo/rechnungen

VentionDesk 开给工作区的发票。

访问 所有者

响应

字段类型说明
rechnungen对象 列表

POST/v1/abo/resume

在期限内撤回取消。

访问 所有者

请求体(JSON)

字段类型说明
nonce *文本固定格式

响应

字段类型说明
angenommentrue
ausstehendtrue | false可缺省
hinweis文本可缺省

GET/v1/abo/verlauf

订阅历史:订阅、变更、取消。

访问 所有者

响应

字段类型说明
eintraege对象 列表

POST/v1/abo/zahlungsdaten

在 Stripe 更改付款信息(重定向到 Stripe)。

访问 所有者

请求体(JSON)

字段类型说明
nonce *文本固定格式

响应

字段类型说明
urlURL

GET/v1/abo/zahlungsmittel

为订阅保存的付款方式。

访问 所有者

响应

字段类型说明
zahlungsmittel对象 或 null

公开入口

POST/f/:publicKey

第三方网站上的 HTML 表单:创建工单(application/x-www-form-urlencoded)。

访问 URL 中的公开项目密钥(vd_pub_…)

响应

字段类型说明
oktrue
ticket对象

POST/v1/contact

VentionDesk 网站的联系表单(/kontakt,从法律声明中链接)。

访问 公开

响应

字段类型说明
oktrue

POST/v1/intake/reports

来自客户应用浏览器的报告,可附截图——使用公开项目密钥。

访问 请求头 x-ventiondesk-key 中的公开项目密钥,允许的来源

响应

字段类型说明
oktrue
ticket对象

POST/v1/intake/tickets

以服务器到服务器的方式提交工单,可附截图——使用入口密钥。

访问 以 Bearer 形式提供的入口密钥(vd_intake_…)

响应

字段类型说明
oktrue
ticket对象

POST/v1/signup

注册新工作区,包括所有者账户。

访问 公开

响应

字段类型说明
oktrue
email电子邮件
testphaseBis文本
checkoutUrlURL 或 null可缺省 | 默认值:null

MCP

GET/.well-known/oauth-protected-resource

受保护资源元数据(RFC 9728):用于 AI 应用登录的 MCP 地址和授权服务器(Supabase Auth)。

访问 公开

GET/.well-known/oauth-protected-resource/mcp

资源路径下的相同元数据——供会插入该路径的客户端使用。

访问 公开

ALL/mcp

除 POST 外的任何方法都会返回 405 和 Allow: POST。

访问 公开

POST/mcp

基于 HTTP 的 MCP 服务器(无状态):供 Claude 使用的工具,使用代理密钥或已连接 AI 应用的令牌。未有效登录时返回 401,带有 WWW-Authenticate 和指向元数据的路径。

访问 以 Bearer 形式提供的代理密钥(vd_live_…)或已连接 AI 应用的令牌

Webhooks

POST/webhooks/errors/:provider/:integrationId

错误追踪器的 webhook,签名位于请求头中(Sentry)。

访问 服务商签名

POST/webhooks/errors/:provider/:integrationId/:token

错误追踪器的 webhook,机密位于 URL 中(Bugsnag、Rollbar)。

访问 URL 中的机密

POST/webhooks/stripe/:orgId

工作区自有 Stripe 账户的 Stripe webhook:为发票记录付款和退款。

访问 签名 Stripe-Signature

运维与付款链接

GET/api/health

服务的存活信号——只要进程在运行就会响应。

访问 公开

GET/api/health/ready

就绪状态:报告已配置哪些服务;没有数据库时为“degraded”。

访问 公开

GET/pay/:token

发票的付款链接:重定向(303)到 Stripe 付款页面。该链接位于发票邮件和 PDF 中。

访问 URL 中的令牌

GET/pay/:token/abgebrochen

在 Stripe 取消付款后的返回页面。

访问 URL 中的令牌

GET/pay/:token/danke

在 Stripe 付款成功后的返回页面。

访问 URL 中的令牌

API 参考 | VentionDesk 文档