外呼任务 API
通过 Open API 以程序方式管理外呼任务模板、人工外呼任务、自动外呼任务及发送对象
简述
携带租户 API Key 请求 /api/v1/open/engagement,可管理:
- 外呼任务模板(字段、话术)
- 人工外呼任务(坐席手工拨打、分配对象)
- 自动外呼任务(IVR / 机器人 / 坐席预测式外呼)
数据与 触达中心 共用;API 创建的任务与发送对象不绑定员工账号。API Key 仅用于服务端,勿写入前端或 App。

适用场景
| 场景 | 说明 |
|---|---|
| CRM 批量下发名单 | 外部系统 nightly 将待回访手机号与业务字段写入人工/自动外呼任务 |
| 活动触达自动化 | 营销平台创建自动外呼任务、导入对象后调用 启动 接口开拨 |
| 模板与话术同步 | 从中台同步外呼任务模板及话术树,保证坐席侧话术一致 |
| 进度对账 | 分页拉取任务、发送对象、外呼记录,与源系统比对完成率 |
接入前准备
| 准备项 | 说明 | 获取方式 |
|---|---|---|
| OpenDesk 访问地址 | 租户部署根地址,下文记为 {OpenDesk地址} | 由实施或运维提供 |
| API Key | 格式 sk-odk-... | 管理后台 → 全局设置 → API Key(超级管理员) |
| HTTP 客户端 | 支持 JSON REST;导入接口需 multipart | curl、Python、Java、Node.js 等 |
| 外呼任务模板 ID | 创建任务时必填 | 客服工作台 → 触达中心 预建,或通过本 API 创建模板后取得 id |
| 自动外呼依赖项(按需) | IVR 流程 ID、机器人 ID、队列 ID、主叫号码等 | 管理后台预配,见下表;ID 从 客服工作台 → 触达中心 新建草稿或任务详情取得 |
自动外呼依赖项对照:
| API 字段 | 配置说明 | 界面路径 |
|---|---|---|
voice_flow_id | IVR 语音流程 | 管理后台 → 呼叫中心 → 流程设计 → 语音流程 |
caller_number_id | 外呼 服务号码(系统内部 ID,非界面显示的号码) | 管理后台 → 呼叫中心 → 号码管理 |
queue_id / transfer_queue_id | 员工组(作为呼叫中心队列) | 管理后台 → 组织架构 → 员工组管理 |
若 execution_mode 为 bot,还需:
| API 字段 | 界面路径 |
|---|---|
voicespeed_agent_id | 管理后台 → 全局设置 → OpenAgent(先配 VoiceSpeed)→ 客服工作台 → 触达中心 → 自动外呼任务 → 新建 中选机器人 |
界面下拉框通常只显示名称;可在 客服工作台 → 触达中心 → 自动外呼任务 → 新建 选好各项后,从浏览器创建请求或 GET 任务详情中读取对应 ID。
接口前缀:
{OpenDesk地址}/api/v1/open/engagement
鉴权 Header(JSON 接口必填):
Authorization: Bearer sk-odk-您的密钥
Content-Type: application/json
说明:
- 鉴权仅认
AuthorizationHeader 中的 API Key。 - 数据限定在当前 Key 所属租户;跨租户 ID 返回 404。
- Key 无效 → 401;已禁用 → 403。
- API 创建的任务不关联具体员工。
概念说明
| 概念 | 说明 |
|---|---|
| 外呼任务模板 | 定义任务自定义字段、可选外呼话术树;任务创建时快照模板字段与话术 |
| 人工外呼任务 | 坐席在 呼叫中心工作台 → 我的外呼对象 中手工拨号;支持分配对象、批量导入、跟进状态 |
| 自动外呼任务 | 系统按策略自动拨号;支持 IVR、机器人转人工、坐席队列(渐进 / 比例 / 预测) |
| 发送对象(Target) | 单条外呼记录:手机号 + 自定义字段值 + 状态 |
| 外呼记录(Record) | 每次实际外呼的通话摘要(时长、是否接通、结果等) |
整体流程
人工外呼(推荐顺序)
① GET 外呼任务模板列表 → 确认 template_id
↓
② POST 创建人工外呼任务(draft 或 publish=true 直接激活)
↓
③ POST 批量添加发送对象(JSON bulk 或 Excel import)
↓
④ POST 发布任务(若创建时为 draft)
↓
⑤ GET 查询对象 / 外呼记录,对账进度
↓
⑥ POST 暂停 / 恢复 / 归档(运维控制)
自动外呼(推荐顺序)
① GET 外呼任务模板列表 → 确认 template_id
↓
② POST 创建自动外呼任务(status=draft,配置 execution_mode 与接待目标)
↓
③ POST 批量添加发送对象
↓
④ POST 启动任务 start
↓
⑤ GET stats / monitor / records 监控与复盘
↓
⑥ POST 暂停 / 恢复 / 归档;draft 状态可 DELETE 删除
如何使用
第一步:创建 API Key
- 超级管理员登录 管理后台 → 全局设置 → API Key。
- 新建 Key(如「CRM 外呼同步」「营销自动外呼」),保存完整
sk-odk-...。 - 在脚本或密钥管理系统中配置,勿提交至 Git。

第二步:准备外呼任务模板
查询已有模板:
curl "{OpenDesk地址}/api/v1/open/engagement/outbound-task-templates?page=1&per_page=20" \
-H "Authorization: Bearer sk-odk-您的密钥"

若无合适模板,可新建(含自定义字段):
curl -X POST "{OpenDesk地址}/api/v1/open/engagement/outbound-task-templates" \
-H "Authorization: Bearer sk-odk-您的密钥" \
-H "Content-Type: application/json" \
-d '{
"name": "会员到期提醒",
"description": "CRM 同步用",
"fields": [
{
"key": "member_name",
"name": "会员姓名",
"field_type": "text",
"required": true,
"show_in_list": true
},
{
"key": "expire_date",
"name": "到期日",
"field_type": "date",
"required": false,
"show_in_list": true
}
]
}'
响应中的 id 即为后续创建任务时的 template_id。

话术(可选): 模板可配置外呼话术树。单独维护话术时使用:
GET/PUT .../outbound-task-templates/{template_id}/script
话术为树形结构:含 开始 / 话术 / 分支 / 结束 节点,创建任务时会 快照 至任务,后续改模板不影响已创建任务。

第三步:创建人工外呼任务并导入对象
创建任务(草稿):
curl -X POST "{OpenDesk地址}/api/v1/open/engagement/outbound-tasks" \
-H "Authorization: Bearer sk-odk-您的密钥" \
-H "Content-Type: application/json" \
-d '{
"name": "3月会员回访",
"template_id": 1,
"description": "CRM 自动下发",
"starts_at": "2026-03-01T09:00:00",
"due_at": "2026-03-31T18:00:00",
"allow_self_claim": true,
"default_redial_interval_minutes": 120,
"publish": false
}'
| 字段 | 必填 | 说明 |
|---|---|---|
name | 是 | 任务名称,最多 80 字 |
template_id | 是 | 外呼任务模板 ID |
publish | 否 | true 时创建后直接为 进行中;默认 false 为 草稿 |
starts_at / due_at | 否 | 计划开始 / 截止时间;due_at 不得早于 starts_at |
allow_self_claim | 否 | 是否允许坐席自行认领未分配对象 |
default_redial_interval_minutes | 否 | 默认重拨间隔(分钟) |
assignee_scope_ids | 否 | 可参与任务的员工组 ID 列表 |

批量添加发送对象(JSON,单次最多 5000 条):
curl -X POST "{OpenDesk地址}/api/v1/open/engagement/outbound-tasks/{task_id}/targets/bulk" \
-H "Authorization: Bearer sk-odk-您的密钥" \
-H "Content-Type: application/json" \
-d '{
"targets": [
{
"phone_number": "13800138000",
"assignee_id": null,
"field_values": {
"member_name": "张三",
"expire_date": "2026-03-15"
}
}
]
}'

Excel / CSV 导入(multipart):
curl -X POST "{OpenDesk地址}/api/v1/open/engagement/outbound-tasks/{task_id}/targets/import" \
-H "Authorization: Bearer sk-odk-您的密钥" \
-F "file=@targets.xlsx"
| 导入限制 | 值 |
|---|---|
| 文件大小 | 最大 10 MB |
| 行数 | 最大 5000 行(不含表头) |
| 手机号列 | 表头须为下列之一:phone_number / phone / mobile / tel / 手机号 / 手机号码 / 联系电话 / 呼叫号码 / 号码 |
| 自定义字段列 | 表头与模板字段 key 或 名称 匹配(不区分大小写、空格、下划线) |
| 必填字段 | 模板标记为必填的字段,行内不能为空 |
响应含 total、created、failed 及逐行 errors(最多返回 100 条错误明细)。

发布任务:
curl -X POST "{OpenDesk地址}/api/v1/open/engagement/outbound-tasks/{task_id}/publish" \
-H "Authorization: Bearer sk-odk-您的密钥"
发布前须至少添加 1 个 发送对象;仅 草稿 或 已暂停 任务可发布。
第四步:创建并启动自动外呼任务
创建自动外呼任务(IVR 示例):
curl -X POST "{OpenDesk地址}/api/v1/open/engagement/auto-outbound-tasks" \
-H "Authorization: Bearer sk-odk-您的密钥" \
-H "Content-Type: application/json" \
-d '{
"name": "3月到期 IVR 提醒",
"template_id": 1,
"execution_mode": "ivr",
"voice_flow_id": 12,
"start_date": "2026-03-01",
"end_date": "2026-03-31",
"daily_time_windows": [
{"start": "09:00", "end": "12:00"},
{"start": "14:00", "end": "20:00"}
],
"caller_number_id": "pn_1",
"max_concurrency": 10,
"daily_per_number_limit": 3
}'
execution_mode | 必填关联配置 |
|---|---|
ivr | voice_flow_id — 语音流程 ID |
bot | voicespeed_agent_id + transfer_queue_id — 机器人与转人工队列 |
agent | queue_id + pacing_mode;比例/预测模式还需 dial_ratio 或 dial_intensity、abandon_prompt 等 |
caller_number_id 为 号码管理 中号码的系统内部 ID(如 pn_1),不是界面显示的 400… 号码。


创建后任务为 草稿。导入发送对象后 启动:
curl -X POST "{OpenDesk地址}/api/v1/open/engagement/auto-outbound-tasks/{task_id}/start" \
-H "Authorization: Bearer sk-odk-您的密钥"
启动前须至少 1 个 发送对象;仅 草稿 或 已暂停 可启动。
监控:
# 统计趋势、结果分布
curl "{OpenDesk地址}/api/v1/open/engagement/auto-outbound-tasks/{task_id}/stats" \
-H "Authorization: Bearer sk-odk-您的密钥"
# 实时并发、坐席就绪、弃呼率等
curl "{OpenDesk地址}/api/v1/open/engagement/auto-outbound-tasks/{task_id}/monitor" \
-H "Authorization: Bearer sk-odk-您的密钥"

任务状态与生命周期
人工外呼任务 status
| 状态 | 含义 | 可执行操作(API) |
|---|---|---|
draft | 草稿 | 编辑、添加对象、publish |
active | 进行中 | 坐席外呼、pause |
paused | 已暂停 | 编辑、resume、publish、archive |
completed | 已完成 | 只读查询 |
archived | 已归档 | 只读查询;不可再改对象 |
状态流转:draft/paused → publish → active → pause → paused → resume → active;paused/completed → archive → archived。
自动外呼任务 status
| 状态 | 含义 | 可执行操作(API) |
|---|---|---|
draft | 草稿 | 编辑、添加对象、start、delete |
active | 拨号中 | pause、查询 stats/monitor |
paused | 已暂停 | 编辑、resume、archive |
completed | 已完成 | 只读 |
archived | 已归档 | 只读 |
发送对象状态(人工)
pending(待呼叫)· calling(呼叫中)· redial(待重拨)· completed(已完成)· do_not_call(勿呼)· invalid_number(无效号码)
发送对象状态(自动)
pending · calling · redial_pending · completed · invalid
接口速查
外呼任务模板
| 功能 | Method | Path |
|---|---|---|
| 模板列表 | GET | /api/v1/open/engagement/outbound-task-templates |
| 新建模板 | POST | /api/v1/open/engagement/outbound-task-templates |
| 模板详情 | GET | /api/v1/open/engagement/outbound-task-templates/{template_id} |
| 更新模板 | PUT | /api/v1/open/engagement/outbound-task-templates/{template_id} |
| 删除模板 | DELETE | /api/v1/open/engagement/outbound-task-templates/{template_id} |
| 获取话术 | GET | /api/v1/open/engagement/outbound-task-templates/{template_id}/script |
| 更新话术 | PUT | /api/v1/open/engagement/outbound-task-templates/{template_id}/script |
列表参数:page(默认 1)、per_page(默认 20)、q(名称搜索)。
人工外呼任务
| 功能 | Method | Path |
|---|---|---|
| 任务列表 | GET | /api/v1/open/engagement/outbound-tasks |
| 新建任务 | POST | /api/v1/open/engagement/outbound-tasks |
| 任务详情 | GET | /api/v1/open/engagement/outbound-tasks/{task_id} |
| 更新任务 | PUT | /api/v1/open/engagement/outbound-tasks/{task_id} |
| 发布 | POST | /api/v1/open/engagement/outbound-tasks/{task_id}/publish |
| 暂停 | POST | /api/v1/open/engagement/outbound-tasks/{task_id}/pause |
| 恢复 | POST | /api/v1/open/engagement/outbound-tasks/{task_id}/resume |
| 归档 | POST | /api/v1/open/engagement/outbound-tasks/{task_id}/archive |
| 对象列表 | GET | /api/v1/open/engagement/outbound-tasks/{task_id}/targets |
| 添加单个对象 | POST | /api/v1/open/engagement/outbound-tasks/{task_id}/targets |
| 批量添加对象 | POST | /api/v1/open/engagement/outbound-tasks/{task_id}/targets/bulk |
| Excel 导入对象 | POST | /api/v1/open/engagement/outbound-tasks/{task_id}/targets/import |
| 批量分配坐席 | POST | /api/v1/open/engagement/outbound-tasks/{task_id}/targets/bulk-assign |
| 批量删除对象 | POST | /api/v1/open/engagement/outbound-tasks/{task_id}/targets/bulk-delete |
| 更新单个对象 | PUT | /api/v1/open/engagement/outbound-targets/{target_id} |
| 外呼记录列表 | GET | /api/v1/open/engagement/outbound-tasks/{task_id}/records |
任务列表参数:page、per_page(最大 200)、q、status、template_id。
对象列表参数:page、per_page、q、status、assignee_id。
批量分配请求体:
{
"target_ids": [101, 102],
"assignee_id": 5,
"overwrite": false
}
overwrite=false 时跳过已有负责人的对象;assignee_id=null 表示取消分配。
自动外呼任务
| 功能 | Method | Path |
|---|---|---|
| 任务列表 | GET | /api/v1/open/engagement/auto-outbound-tasks |
| 新建任务 | POST | /api/v1/open/engagement/auto-outbound-tasks |
| 任务详情 | GET | /api/v1/open/engagement/auto-outbound-tasks/{task_id} |
| 更新任务 | PUT | /api/v1/open/engagement/auto-outbound-tasks/{task_id} |
| 启动 | POST | /api/v1/open/engagement/auto-outbound-tasks/{task_id}/start |
| 暂停 | POST | /api/v1/open/engagement/auto-outbound-tasks/{task_id}/pause |
| 恢复 | POST | /api/v1/open/engagement/auto-outbound-tasks/{task_id}/resume |
| 归档 | POST | /api/v1/open/engagement/auto-outbound-tasks/{task_id}/archive |
| 删除(仅草稿) | DELETE | /api/v1/open/engagement/auto-outbound-tasks/{task_id} |
| 统计 | GET | /api/v1/open/engagement/auto-outbound-tasks/{task_id}/stats |
| 监控 | GET | /api/v1/open/engagement/auto-outbound-tasks/{task_id}/monitor |
| 对象列表 | GET | /api/v1/open/engagement/auto-outbound-tasks/{task_id}/targets |
| 添加单个对象 | POST | /api/v1/open/engagement/auto-outbound-tasks/{task_id}/targets |
| 批量添加对象 | POST | /api/v1/open/engagement/auto-outbound-tasks/{task_id}/targets/bulk |
| Excel 导入对象 | POST | /api/v1/open/engagement/auto-outbound-tasks/{task_id}/targets/import |
| 更新对象 | PUT | /api/v1/open/engagement/auto-outbound-targets/{target_id} |
| 标记无效 | POST | /api/v1/open/engagement/auto-outbound-targets/{target_id}/mark-invalid |
| 删除对象 | DELETE | /api/v1/open/engagement/auto-outbound-targets/{target_id} |
| 外呼记录列表 | GET | /api/v1/open/engagement/auto-outbound-tasks/{task_id}/records |
自动外呼列表分页参数为 page、page_size(最大 200),另支持 q、status、mode(ivr / bot / agent)。
完整请求 / 响应 Schema 见 {OpenDesk地址}/docs(OpenAPI)。
错误与排查
| HTTP 状态 | 常见原因 | 处理建议 |
|---|---|---|
| 401 | Key 缺失、无效或已删除 | 检查 Authorization Header |
| 403 | Key 已禁用 | 启用或更换 Key |
| 404 | 任务 / 模板 / 对象 ID 不存在或不属当前租户 | 核对 ID |
| 400 / 422 | 业务规则不满足 | 见下表 |
外呼任务专项规则:
| 规则 | 说明 |
|---|---|
| 发布 / 启动 | 须至少 1 个 发送对象 |
| 归档任务 | 不可再添加或修改对象 |
| 自动外呼删除 | 仅 draft 可 DELETE |
| 批量导入 | 须含手机号列;单行必填字段不可空 |
| 批量 JSON | 单次 targets 数组 1~5000 条 |
| 跨租户 | 一律返回 404,不泄露是否存在 |
错误响应体示例:
{
"code": "VALIDATION_ERROR",
"message": "Please add outbound targets before publishing",
"status": 400
}
安全与限制
- API Key 仅部署在服务端;日志与监控不得打印完整 Key。
- 生产 / 测试环境分离 Key;停用脚本后 禁用并删除 对应 Key。
- 所有请求使用 HTTPS。
- Open API 不走员工权限树;租户隔离完全由 Key 决定。
- 本 API 不提供:坐席工作台实时外呼控制、WebRTC 签权、通话录音直链下载、短信群发(见触达中心其他能力)。
与其他功能的关系
- API Key(管理后台):与本接口及《传递客户上下文》《知识库 API》共用鉴权凭证。
- 客服工作台 · 触达中心:API 写入的任务与发送对象在主管侧同一界面可见、可管理。
- 客服工作台 · 呼叫中心工作台:坐席在 我的外呼对象 执行人工外呼、填写业务字段与话术。
- 管理后台 · 流程设计 / 号码管理:自动外呼 IVR 模式依赖已配置的语音流程与主叫号码。
- CLI 工具:可使用
deepflow-opendesk-cli的outbound-templates子命令维护模板;任务级 Open API 适合 CRM 批量集成。
对接示例
CRM 下发人工回访名单
每日凌晨将待回访手机号与会员字段写入人工外呼任务:
GET /outbound-task-templates?q=回访取得template_idPOST /outbound-tasks创建草稿(若无进行中任务)POST /outbound-tasks/{id}/targets/bulk写入名单(每批 ≤5000)POST .../publish发布;后续批次继续 bulk 追加GET .../targets?status=pending对账剩余量
坐席在 呼叫中心工作台 → 我的外呼对象 中可见并外呼(须已发布且对象已分配或可认领)。


营销活动自动 IVR 外呼
POST /auto-outbound-tasks配置 IVR、拨打窗口、并发POST .../targets/import上传 ExcelPOST .../start启动- 定时
GET .../stats看接通率;异常则POST .../pause - 结束
POST .../archive
