基础查询
获取项目列表、数字员工列表、线路状态、音色列表,以及创建项目、关联数字员工。
对接前,需先通过 API 获取 programId(项目 ID)和 botId(数字员工 ID),后续所有操作依赖这两个ID。
1.1 获取项目列表
GET /api/v1/external/programs(所需权限:READ)
curl "https://api.halfcall.cn/api/v1/external/programs" \
-H "Authorization: Bearer sk_xxx"
{
"code": 0,
"data": {
"total": 2,
"list": [
{
"programId": "cmkhndatf000jdulm6ez8ojyf",
"name": "事半AI客服",
"runState": "PAUSED",
"executionMode": "Stream"
}
]
}
}
响应字段说明:
| 字段 | 说明 |
|---|---|
| total | 企业下项目总数 |
| programId | 项目唯一 ID,后续接口均需此值 |
| name | 项目名称 |
| runState | 运行状态:RUNNING=运行中,PAUSED=已暂停 |
| executionMode | 执行模式:Stream=流式自动外呼,Batch=手动批次模式 |
1.2 获取项目下数字员工列表
GET /api/v1/external/programs/:programId/bots(所需权限:READ)
curl "https://api.halfcall.cn/api/v1/external/programs/cmk.../bots" \
-H "Authorization: Bearer sk_xxx"
{
"code": 0,
"data": {
"bots": [
{
"botId": "bot_xxx",
"name": "小智",
"stage": 1,
"isEnabled": true,
"hotInitStatus": "NONE"
}
]
}
}
响应字段说明:
| 字段 | 说明 |
|---|---|
| botId | 数字员工唯一 ID,AI 呼入时作为 X-BotId 传入,上传线索时指定 botId |
| name | 数字员工名称 |
| stage | 轮次序号,一个项目可配置多个数字员工按轮次依次跟进 |
| isEnabled | 是否启用,false 表示该数字员工已暂停 |
| hotInitStatus | 话术配置状态:NONE=正常可用,PENDING=升级排队,UPGRADING=升级中,FAILED=升级失败 |
1.3 查询线路状态
GET /api/v1/external/programs/:programId/line-status(所需权限:READ)
查询项目当前线路使用情况,可用于判断是否有空闲线路可发起外呼。
curl "https://api.halfcall.cn/api/v1/external/programs/cmk.../line-status" \
-H "Authorization: Bearer sk_xxx"
{
"code": 0,
"data": {
"programId": "cmk...",
"runState": "RUNNING",
"maxConcurrency": 50,
"currentConcurrency": 12,
"idle": 38
}
}
响应字段说明:
| 字段 | 说明 |
|---|---|
| runState | 项目运行状态:RUNNING / PAUSED |
| maxConcurrency | 最大并发线路数 |
| currentConcurrency | 当前正在通话的线路数 |
| idle | 空闲线路数(maxConcurrency - currentConcurrency) |
小程序集成建议:在发起外呼前先调用此接口,当
idle > 0且runState = "RUNNING"时再推送线索。
1.4 获取线路列表
GET /api/v1/external/trunks(所需权限:READ)
获取当前企业可读取到的线路——包含本企业名下的线路,以及对本企业开放的共享线路(不区分项目)。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| status | string | - | 按线路状态筛选:Normal=可用,Band=已禁止,不传则不过滤 |
| page | number | - | 页码,默认 1 |
| pageSize | number | - | 每页数量,默认 20,最大 100 |
curl "https://api.halfcall.cn/api/v1/external/trunks" \
-H "Authorization: Bearer sk_xxx"
{
"code": 0,
"data": {
"total": 2,
"page": 1,
"pageSize": 20,
"list": [
{
"trunkId": "trunk_xxx",
"name": "北京-移动专线",
"description": "示例线路",
"status": "Normal",
"trunkType": "SIP",
"operators": "CMCC",
"showPhoneType": "FixedLine",
"outerCaller": "010xxxxxxx",
"whitelistCity": "北京",
"concurrency": 50,
"callRate": 3000,
"startTime": "2024-01-01T00:00:00.000Z",
"endTime": "2024-12-31T23:59:59.000Z",
"scope": "own"
}
]
}
}
响应字段说明:
| 字段 | 说明 |
|---|---|
| trunkId | 线路唯一 ID |
| status | 线路状态:Normal=可用,Band=已禁止 |
| trunkType | 线路类型:FreeSwitch / SIP / PhoneNumber / AX |
| operators | 运营商:CMCC=移动,CUCC=联通,CTCC=电信 |
| showPhoneType | 外显号码类型:FixedLine=固话,VirtualTrumpet=虚拟小号,RealnameMobile=实名手机 |
| outerCaller | 外显主叫号码 |
| whitelistCity | 限制城市 |
| concurrency | 线路并发数 |
| callRate | 每日拨打频次上限 |
| scope | own=本企业名下线路,shared=对本企业开放的共享线路 |
1.5 获取音色列表
GET /api/v1/external/voices(所需权限:READ)
获取当前企业可读取到的音色(TTS 模型)——包含全局共享音色,以及本企业专属克隆音色,用于配置数字员工时参考。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| status | string | - | 按状态筛选:active=使用中,disabled=已停用,不传则不过滤 |
| page | number | - | 页码,默认 1 |
| pageSize | number | - | 每页数量,默认 20,最大 100 |
curl "https://api.halfcall.cn/api/v1/external/voices" \
-H "Authorization: Bearer sk_xxx"
{
"code": 0,
"data": {
"total": 3,
"page": 1,
"pageSize": 20,
"list": [
{
"voiceModelId": "model_xxx",
"name": "佳音",
"model": "speech-2.8-hd",
"voice": "voice_id_xxx",
"price": 0.01,
"status": "active",
"scope": "shared",
"previewUrl": "https://cdn.halfcall.cn/tts_preview/external/halfcall/model_xxx.mp3",
"createdAt": "2024-01-01T00:00:00.000Z",
"bots": [
{ "botId": "bot_xxx", "name": "小智" }
]
}
]
}
}
响应字段说明:
| 字段 | 说明 |
|---|---|
| voiceModelId | 音色对应的模型 ID,配置数字员工 TTS 时使用 |
| name | 音色名称 |
| model | 底层模型标识 |
| voice | 底层音色标识(voice_id) |
| price | 计费单价(元) |
| status | active=使用中,disabled=已停用 |
| scope | own=本企业专属音色,shared=全局共享音色 |
| previewUrl | 固定文案的试听音频地址(mp3),可直接在浏览器或播放器中播放;部分音色尚未生成,返回 null |
| bots | 当前使用该音色的本企业数字员工列表(botId + name) |
1.6 创建项目
POST /api/v1/external/programs(所需权限:CONTROL)
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| name | string | 是 | 项目名称 |
| trunkIds | string[] | 是 | 线路 ID 列表,至少一条,取自 1.4「获取线路列表」返回的 trunkId |
| bots | array | - | 顺带关联数字员工 [{botId, stage?}],botId 取自 identify,stage 默认 1,不传则创建空项目,之后用 1.7 关联 |
| description | string | - | 项目描述 |
| callType | string | - | 呼叫类型:Need=按需(默认)、Long=长期 |
| operationType | string | - | 业务类型:Intention=意向筛选(默认)、StockConversion=存量转化、ServiceCare=服务关怀、SelfService=自助运营 |
| wechatType | string | - | 微信类型:None=无(默认)、Personal=个微、Business=企微 |
| judgeMode | string | - | 意向判断方式:ScoreMode=评分模式(默认)、IntentionMode=意向模式 |
| runState | string | - | 创建后运行状态:RUNNING/PAUSED(默认 PAUSED,避免创建后立即开始拨打) |
| maxConcurrency | number | - | 项目级总并发限制,1-500,默认 50 |
| ringingTimeout | number | - | 响铃超时(秒),5-120,默认 30 |
| maxCallDuration | number | - | 单通最长时长(秒),0=不限制(默认)或至少 15 |
| dailyCapMetric | string | - | 每日上限口径:DIALED=去重外呼数、REACHED=去重接通数(默认) |
| maxDailyCap | number | - | 每日上限数值,0=不限制(默认) |
| dialIntervalSec | number | - | 两次拨打最小间隔(秒),默认 0 |
| webhookUrl / webhookSecret | string | - | 通话结算回调地址/签名密钥,也可创建后单独配置 |
| workTimeConfig | object | - | 拨打时间窗口,不传则默认工作日/每天 9:00-12:00 + 14:00-18:00 |
| smsFee | number | - | 短信单价(元/条),默认 0 |
| effectPrice | number | - | 效果单价(元/条),默认 8 |
注意:
hashrateFee(算力费)/callFee(电话费)不支持通过 API 指定,创建时自动按贵企业所属渠道的配置价填入(渠道未配置则用平台默认价)——这两个字段线上是强管控的计费口径,不开放给外部调用方。
curl -X POST "https://api.halfcall.cn/api/v1/external/programs" \
-H "Authorization: Bearer sk_xxx" \
-H "Content-Type: application/json" \
-d '{
"name": "国庆促销外呼",
"trunkIds": ["trunk_xxx"],
"bots": [{ "botId": "bot_xxx", "stage": 1 }]
}'
{ "code": 0, "msg": "success", "data": { "programId": "prog_xxx", "name": "国庆促销外呼", "runState": "PAUSED" } }
1.7 关联数字员工
PUT /api/v1/external/programs/:programId/bots(所需权限:CONTROL)
整份替换:传入的
bots数组会完全替换该项目当前的数字员工配置(先清空再按传入列表重建),不是增量添加/删除——如果项目已经关联了 3 个数字员工,这次只传 1 个,另外 2 个会被移除。需要"只加一个"的效果,请先用 1.2「获取项目下数字员工列表」读出现有配置,拼接后整份传入。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| bots | array | 是 | [{botId, stage?}],至少一项;botId 取自 identify,stage 默认 1 |
curl -X PUT "https://api.halfcall.cn/api/v1/external/programs/prog_xxx/bots" \
-H "Authorization: Bearer sk_xxx" \
-H "Content-Type: application/json" \
-d '{ "bots": [{ "botId": "bot_xxx", "stage": 1 }, { "botId": "bot_yyy", "stage": 2 }] }'
{ "code": 0, "msg": "success", "data": { "programId": "prog_xxx", "botCount": 2 } }