文档版本切换/platform
Api接口v1版本
切换到Api接口v1版本
v2版本
切换到Api接口v2版本
考试/测评、背调、视频面试接入指南 (platform)
整体流程图/flowchart

绑定认证/Oauth
考试/测评、背调、视频面试需要分别进行绑定
a、绑定步骤
1.第三方供应商提供推送token的URL与功能URL(根据第三方供应商种类不同,提供的不同业务的URL。如考试第三方供应商则提供创建考试的URL)。
2.CSM向第三方供应商发放clientId与clientSecret。
3.第三方供应商带着clientId与redirectUri将用户导向至moka认证页面。
4.验证成功后moka内部绑定成功,然后带着一次性code将跳转回redirectUri。
5.第三方供应商用code与clientSecret等请求moka提供API得到accessToken、refreshToken、appId(每次绑定生出唯一值,appId与mokaUser绑定,appId与第三方供应商用户绑定),第三方供应商绑定成功。
补充
第三方供应商通过refreshToken维护accessToken长时间有效,如有特殊情况,可以通过联系CSM提供一次推送token的服务(推送到第1步提供的URL上)。
b、认证所需接口
a.moka认证页面
请求地址: https://app.mokahr.com/oauth/login
请求方式: GET
请求参数:
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| clientId | 是 | String | moka生产的client的唯一标识 |
| redirectUri | 是 | String | 重定向地址 必须为开通时填写的地址一致 |
| scope | 是 | String | 第三方供应商拥有权限 exam: 考试, evaluation: 测评, interview: 视频面试, survey: 背调 |
| state | 否 | String | 在回调时,会回传state参数给第三方应用,第三方应用的开发者可以验证state参数的有效性(也可以记录用户授权页面的位置) |
返回:(绑定后,浏览器页面会跳转到回调地址)
redirectUri?code=xxxx
例:http://www.xxx.com/redirect?code=xxx
注:
1、code参数会拼接到回调地址url上
2、code有效期为五分钟
---------------------------------------------------------------------------------------
b.获取accessToken
请求地址: https://api.mokahr.com/api/oauth/token
请求方式: POST
body类型: application/x-www-form-urlencoded
请求Headers: Content-Type: application/x-www-form-urlencoded
请求参数:
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| code | 是 | String | 上一步获得的code |
| clientId | 是 | String | 开通时提供 |
| clientSecret | 是 | String | 开通时提供 |
| redirectUri | 是 | String | 上一步填写的redirectUri |
| hireMode | 否 | integer | 招聘模式, 1:社招;2:校招。不填默认都绑定。 |
返回结果:
| 字段 | 类型 | 描述 |
|---|---|---|
| accessToken | String | 访问moka接口的token |
| accessTokenExpiresAt | String | token过期时间 如:2019-03-24T05:45:39.014Z 默认为30天 |
| refreshToken | String | 用于刷新accessToken的refreshToken |
| refreshTokenExpiresAt | String | refreshToken的过期时间 如:2019-03-24T05:45:39.014Z 默认为60天 |
| scope | String | 该token所据有的权限 |
| appId | String | 每次绑定moka生成的唯一值 建议与第三方供应商账号绑定 |
---------------------------------------------------------------------------------------
c.刷新accessToken
请求地址: https://api.mokahr.com/api/oauth/refresh-token
请求方式: POST
body类型: application/x-www-form-urlencoded
请求Headers: Content-Type: application/x-www-form-urlencoded
请求参数:
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| refreshToken | 是 | String | 上一步获得的refreshToken |
| clientId | 是 | String | 开通时提供 |
| clientSecret | 是 | String | 开通时提供 |
返回结果:
| 字段 | 类型 | 描述 |
|---|---|---|
| accessToken | String | 访问moka接口的token |
| accessTokenExpiresAt | String | token过期时间 如:2019-03-24T05:45:39.014Z 默认为30天 |
| refreshToken | String | 用于刷新accessToken的refreshToken |
| refreshTokenExpiresAt | String | refreshToken的过期时间 如:2019-03-24T05:45:39.014Z 默认为60天 |
| scope | String | 该token所据有的权限 |
---------------------------------------------------------------------------------------
d.开放平台解绑
请求样例
curl -X POST \
https://app.mokahr.com/api/oauth/unbind \
--header 'Authorization: Bearer 489645c7ab5f6230d95f6f9488f1d26f6387cbef' \
--header 'Content-Type: application/json' \
--data '{"clientId":"a3212","clientSecret":"1","appId":"844450f0-90cc-4722-a3b6-f631fb4a3926"}'
请求地址: https://app.mokahr.com/api/oauth/unbind
请求方式: POST
body类型: application/json
请求Headers: Content-Type: application/json 和 Authorization: Bearer AccessToken
请求参数:
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| clientId | 是 | String | 开通时提供 |
| clientSecret | 是 | String | 开通时提供 |
| appId | 是 | String | 每次绑定moka生成的唯一值 |
| hireMode | 否 | integer | 招聘模式, 1:社招;2:校招。不填默认都解绑。 |
返回结果:
| 字段 | 类型 | 描述 |
|---|---|---|
| success | Boolean | 是否成功解绑 |
| errorMessage | String | 解绑失败信息 |
服务商信息
更新logo信息
请求样例
$ curl --request POST \
--url http://api.mokahr.com/v1/open-platform/client/info \
--header 'Authorization: Bearer 6efe04cbc4b00ed85e2d8e9d3e8e622de435e55a' \
--header 'Content-Type: application/json' \
--header 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' \
--form 'logo=@/Users/test/test.png'
请求地址: https://api.mokahr.com/api-platform/v1/open-platform/client/info
请求方式: POST
body类型: multipart/form-data方式
请求body参数:
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| logo | 是 | file | 在moka中展示的logo。建议尺寸50px*50px |
更新账户名信息
请求样例
$ curl --request POST \
--url http://api.mokahr.com/v1/open-platform/account/name \
--header 'Authorization: Bearer 6efe04cbc4b00ed85e2d8e9d3e8e622de435e55a' \
--header 'Content-Type: application/json' \
--data '{"appId": "d5200272-b9e2-44ac-b728-26d41780ed95","accountName": "我是好人别吃我"}'
请求地址: https://api.mokahr.com/api-platform/v1/open-platform/account/name
请求方式: POST
body类型: raw-JSON(application/json)
请求参数:
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| appId | 是 | String | 绑定成功后第一次获取accessToken时moka返回 |
| accountName | 是 | String | 账号名称 允许多账号绑定的client类型 切换账号时的名称 |
考试/测评
业务流程图

Moka请求第三方供应商API
a.创建考试
请求样例
$ curl --request POST \
--url 'http://vendor.com/creat?appId=E8iWPLYYQq8dB5Lu3PEbTQwYLlyzaVOu&clientId=9734f2bc-beff-4439-9497-0aa11fcc932c&time=1547100372&sign=08b6a2f880c697bdee9b6069cbed81ceb7300ea4' \
--header 'Content-Type: application/json' \
--data '{"id": "9734f2bc-beff-4439-9497-0aa11fcc932c","event": "createExam","triggeredAt": 1547100372,"data": {"test": true}}'
请求方式: POST
body类型: raw-JSON(application/json)
请求query
| 字段 | 描述 |
|---|---|
| appId | 与moka绑定成功后返回的appId |
| clientId | 对接前提供的clientId |
| time | 当前时间戳 |
| sign | sha1(clientId +clientSecret + appId + time + 请求体body) |
请求格式
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| id | 是 | String | moka生成的id(随机数) |
| event | 是 | String | 事件名称如: createExam |
| triggeredAt | 是 | Number | 触发的时间戳 |
| data | 是 | Object | 请求的具体内容 |
| data.applicationId | 是 | Number | 候选人ID |
| data.name | 是 | String | 候选人名字 |
| data.email | 是 | String | 候选人邮件 |
| data.phone | 否 | String | 候选人手机号 |
| data.certificateType | 否 | Integer | 证件类型1:身份证,2:香港身份证,3:澳门身份证,4:台湾身份证,5:护照,6:其他证件(需客户页面勾选配置才会传送) |
| data.citizenId | 否 | String | 居民身份证号(需客户页面勾选配置才会传送) |
| data.paperId | 是 | String | 试卷Id |
| data.examId | 是 | Number | 考试结果回传时用的ID.moka保证唯一 |
| data.appId | 是 | String | 绑定成功后第一次获取accessToken时moka返回 |
| data.hireMode | 是 | Number | 1-社招 2-校招 |
返回结果:
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| v2Res | 是 | Object | v2格式 |
| v2Res.code | 是 | Integer | 0:成功,非0失败 |
| v2Res.msg | 是 | msg | 失败/成功描述 |
| v2Res.data | 是 | Object | data |
| v2Res.data.url | 是 | String | 考生考试地址 |
| v2Res.data.name | 否 | String | 账号 |
| v2Res.data.password | 否 | String | 密码 |
| v2Res.data.startTime | 否 | long | 邮件通知上的开始时间(毫秒),不限时可传'',如果不传,则取创建试卷接口上的开始时间,发送给候选人 |
| v2Res.data.endTime | 否 | long | 邮件通知上的结束时间(毫秒),不限时可传'',如果不传,则取创建试卷接口上的结束时间,发送给候选人 |
补充
为了安全性,请验证time的实效性,建议5分钟内有效。
第三方供应商请求Moka API
a.余额
请求样例
$ curl --request POST \
--url https://api.mokahr.com/api-platform/v1/open-platform/exam/balance \
--header 'Authorization: Bearer 6efe04cbc4b00ed85e2d8e9d3e8e622de435e55a' \
--header 'Content-Type: application/json' \
--data '{"discount": 0.4,"balance": "100","freeCount": 5, "appId": "fabd076f-1a0f-4fa8-8a5c-306d264e3df1"}'
请求地址: https://api.mokahr.com/api-platform/v1/open-platform/exam/balance
请求方式: POST
请求参数:
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| discount | 否 | Number | 折扣(0-10) 不传或超出范围均当无折扣计算 |
| balance | 是 | Number | 账户余额 |
| freeCount | 否 | Number | 不计余额剩余次数 |
| appId | 是 | String | 绑定成功后第一次获取accessToken时moka返回 |
---------------------------------------------------------------------------------------
b.全量同步试卷列表
请求样例
$ curl --request POST \
--url https://api.mokahr.com/api-platform/v1/open-platform/exam/papers \
--header 'Authorization: Bearer 6efe04cbc4b00ed85e2d8e9d3e8e622de435e55a' \
--header 'Content-Type: application/json' \
--data '{"paperList": [{"paperId": "1112","name": "2222222","price": 2}],"appId": "a5fb37d3-f2d1-4121-b59f-b1ca385096b0"}'
请求地址: https://api.mokahr.com/api-platform/v1/open-platform/exam/papers
请求方式: POST
body类型: raw-JSON(application/json)
请求参数:
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| paperList | 是 | Array | 试卷列表 |
| paperList[].paperId | 是 | String | 试卷ID |
| paperList[].name | 是 | String | 试卷名称 |
| paperList[].startTime | 是 | String | 开始时间 不限时可传'' |
| paperList[].endTime | 是 | String | 结束时间 不限时可传'' |
| paperList[].price | 是 | Number | 试卷消耗 |
| appId | 是 | String | 绑定成功后第一次获取accessToken时moka返回 |
---------------------------------------------------------------------------------------
c.更新试卷
请求样例
$ curl --request POST \
--url https://api.mokahr.com/api-platform/v1/open-platform/exam/paper \
--header 'Authorization: Bearer 6efe04cbc4b00ed85e2d8e9d3e8e622de435e55a' \
--header 'Content-Type: application/json' \
--data '{"paperId": "1112","name": "test","price": 0, "appId": "8c639a7a-2298-42dd-b0fa-9f23895a60ac"}'
请求地址: https://api.mokahr.com/api-platform/v1/open-platform/exam/paper
请求方式: POST
body类型: raw-JSON(application/json)
请求参数:
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| paperId | 是 | String | 试卷ID |
| name | 是 | String | 试卷名称 |
| startTime | 是 | String | 试卷开始时间 不限时可传'' |
| endTime | 是 | String | 试卷结束时间 不限时可传'' |
| price | 是 | Number | 试卷消耗 |
| appId | 是 | String | 绑定成功后第一次获取accessToken时moka返回 |
---------------------------------------------------------------------------------------
d.删除试卷
请求样例
$ curl --request DELETE \
--url https://api.mokahr.com/api-platform/v1/open-platform/exam/paper \
--header 'Authorization: Bearer 6efe04cbc4b00ed85e2d8e9d3e8e622de435e55a' \
--header 'Content-Type: application/json' \
--data '{"paperId": "1", "appId": "fabd076f-1a0f-4fa8-8a5c-306d264e3df1"}'
请求地址: https://api.mokahr.com/api-platform/v1/open-platform/exam/paper
请求方式: DELETE
请求参数:
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| paperId | 是 | String | 试卷Id |
| appId | 是 | String | 绑定成功后第一次获取accessToken时moka返回 |
---------------------------------------------------------------------------------------
e.成绩回传
请求样例
$ curl --request POST \
--url http://api.mokahr.com/v1/open-platform/exam/result \
--header 'Authorization: Bearer 6efe04cbc4b00ed85e2d8e9d3e8e622de435e55a' \
--header 'Content-Type: application/json' \
--data '{
"examId": "1",
"result": "5",
"comment": "不错",
"cheatedStatus":2,
"attachments":[
{
"name": "123.pdf",
"url": "http://www.example.com/123.pdf"
}
],
"detail":[
{
"id": "XXX",
"name": "XXX",
"result": "XXX"
}
]
}'
请求地址: https://api.mokahr.com/api-platform/v1/open-platform/exam/result
请求方式: POST
body类型: raw-JSON(application/json)
请求参数:
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| examId | 是 | Number | 创建考试的时候moka传给第三方供应商的examId |
| result | 是 | String | 成绩 |
| cheatedStatus | 否 | number | 默认是-1,未知,0:未作弊;1:作弊;2:作弊嫌疑 |
| comment | 否 | String | 评价 (注:传字段的话值不能为空,或者不用传该字段 |
| attachments | 否 | Array | 附件 |
| attachments[].name | 否 | String | 附件名称 (注:必须要有后缀,例:123.pdf) |
| attachments[].url | 否 | String | 附件URL (注:目前只支持文件格式的附件url。不需要url编码) |
| detail | 否 | Array | 详细维度 (注:数组最大长度20个) |
| detail[].id | 否 | String | 详细维度id(注:相同试卷的同一维度需保证id唯一,若为空则不支持筛选;返回结果中只支持都传id,或都不传id,不支持部分带id) |
| detail[].name | 否 | String | 详细维度名称(注:如果detail不为空,name必传) |
| detail[].result | 否 | String | 详细维度成绩(注:如果detail不为空,result必传) |
| reportUrl | 否 | String | 服务商报告链接 |
---------------------------------------------------------------------------------------
mokaAPI返回结果:
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| success | 是 | boolean | 返回结果是否成功 |
背调
业务流程图

Moka请求第三方供应商API
a.创建背调
请求样例
$ curl --request POST \
--url 'http://vendor.com/creat?appId=E8iWPLYYQq8dB5Lu3PEbTQwYLlyzaVOu&clientId=9734f2bc-beff-4439-9497-0aa11fcc932c&time=1547100372&sign=08b6a2f880c697bdee9b6069cbed81ceb7300ea4' \
--header 'Content-Type: application/json' \
--data '{"id": "9734f2bc-beff-4439-9497-0aa11fcc932c","event": "createSurvey","triggeredAt": 1547100372,"data": {"test": true}}'
请求方式: POST
body类型: raw-JSON(application/json)
请求query
| 字段 | 描述 |
|---|---|
| appId | 与moka绑定成功后返回的appId |
| clientId | 对接前提供的clientId |
| time | 当前时间戳 |
| sign | sha1(clientId +clientSecret + appId + time + 请求体body) |
请求格式
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| id | 是 | String | moka生成的id(随机数) |
| event | 是 | String | 事件名称如: createExam |
| triggeredAt | 是 | Number | 触发的时间戳 |
| data | 是 | Object | 请求的具体内容 |
| data.applicationId | 是 | Number | 候选人ID |
| data.name | 是 | String | 候选人名字 |
| data.email | 是 | String | 候选人邮件 |
| data.phone | 否 | String | 候选人手机号 |
| data.menuId | 是 | String | 套餐Id |
| data.surveyId | 是 | String | 结果回传时用的ID.moka保证唯一 |
| data.appId | 是 | String | 绑定成功后第一次获取accessToken时moka返回 |
| data.customFields | 是 | Object | 自定义字段 |
| data.operator | 是 | Object | 操作人对象 |
| data.operator.name | 是 | String | 操作人名字 |
| data.operator.email | 是 | String | 操作人邮件 |
| data.operator.phone | 否 | String | 操作人手机号 |
返回结果:statusCode: 200
| 字段 | 类型 | 描述 |
|---|---|---|
| v2Res | object | 新版本3段式返回结构 |
| v2Res.code | integer | 0: 成功 非0:失败 |
| v2Res.msg | string | 返回信息描述 |
| v2Res.data | object | 返回信息 |
| v2Res.data.detailLink | String | 背调详情链接(用于从MOKA跳到服务商直接查看背调) 非必须 |
b.取消背调
请求样例
curl -X POST "https://vender.com?appId=&clientId=&time=&sign=" --header 'Content-Type: application/json' --data '{
"id": "12345",
"event": "cancelSurvey",
"triggeredAt": "12345678901",
"data.surveyId": "12345",
"data.reason": "候选人拒绝入职"
}'
请求方式: POST
body类型: raw-JSON(application/json)
请求query
| 字段 | 描述 |
|---|---|
| appId | 与moka绑定成功后返回的appId |
| clientId | 对接前提供的clientId |
| time | 当前时间戳 |
| sign | sha1(clientId +clientSecret + appId + time) |
请求body
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| id | 是 | String | moka生成的id(随机数) |
| event | 是 | String | 事件名称如: cancelSurvey |
| triggeredAt | 是 | Number | 触发的时间戳 |
| data | 是 | Object | 请求的具体内容 |
| data.surveyId | 是 | String | 背调Id |
| data.reason | 否 | String | 取消原因 |
返回结果:
statusCode: 200
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| code | 是 | number | 非0代表失败 |
| msg | 否 | string | 返回信息描述 |
| data | 是 | object | 返回信息 |
补充
为了安全性,请验证time的实效性,建议5分钟内有效。
c.推送候选人信息
请求样例
@curl --location --request POST 'http://mock-server-yapi.staging-public.svc.k8s.staging.mokahr.com:8080/mock/49/createSurveyV2?appId=980ccbb7-546d-4045-afda-470500ed7258&clientId=PuOBW99eIaJCkFyqI8KhxYX4VMwn3udi&time=1657000349825&sign=4669cf13fa3cfe0004d21ea04eafb01c21a39858' \
--header 'Content-Type: application/json' \
--data-raw '{
"orgName": "Moka-生态专用测试",
"phone": "14592000018",
"accountName": "默认账号",
"jobTitle": "sy校招职位3",
"name": "sys1xz190",
"applicationId": 422059007,
"experiences": [
{
"endDate": "2019-01",
"company": "公司2",
"startDate": "2021-01"
},
{
"endDate": "2016-01",
"company": "公司1",
"startDate": "2017-01"
}
],
"uniqueId": "55c1a97d5b6540e6878f5da5f2d7ebbc797bac2a09664a4ab7b55aed149cf4ee",
"email": "1009417583@qq.com",
"operator": {
"phone": "15001371285",
"name": "石越",
"email": "shiyue@mokahr.com"
}
}'
请求方式: POST
body类型: raw-JSON(application/json)
请求query
| 字段 | 描述 |
|---|---|
| appId | 与moka绑定成功后返回的appId |
| clientId | 对接前提供的clientId |
| time | 当前时间戳 |
| sign | sha1(clientId +clientSecret + appId + time) |
请求body
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| uniqueId | 是 | String | 唯一ID 用于回传背调订单信息 |
| applicationId | 是 | Number | 申请ID |
| name | 是 | String | 姓名 |
| 是 | string | 邮箱 | |
| phone | 是 | String | 手机号 |
| jobTitle | 是 | String | 委托公司名称 |
| orgName | 否 | String | 姓名 |
| operator | 是 | object | 操作人 |
| operator.name | 是 | String | 姓名 |
| operator.email | 是 | String | 邮箱 |
| operator.phone | 否 | String | 手机号 |
| experiences | 是 | array | 候选人经历信息 |
| experiences[].company | 否 | string | 公司名称 |
| experiences[].jobTitle | 否 | string | 曾就职名称 |
| experiences[].startDate | 否 | string | 开始时间 |
| experiences[].endDate | 否 | string | 结束时间 |
| accountName | 是 | string | 账号名称 |
返回结果:
statusCode: 200
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| code | 是 | number | 非0代表失败 |
| msg | 否 | string | 返回信息描述 |
| data | 是 | object | 返回信息 |
| data.redirectUrl | 是 | string | 跳转链接 |
第三方供应商请求Moka API
a.余额
请求样例
$ curl --request POST \
--url https://api.mokahr.com/api-platform/v1/open-platform/survey/balance \
--header 'Authorization: Bearer 6efe04cbc4b00ed85e2d8e9d3e8e622de435e55a' \
--header 'Content-Type: application/json' \
--data '{"discount": 0.4,"balance": "100","freeCount": 5, "appId": "fabd076f-1a0f-4fa8-8a5c-306d264e3df1"}'
请求地址: https://api.mokahr.com/api-platform/v1/open-platform/survey/balance
请求方式: POST
body类型: raw-JSON(application/json)
请求参数:
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| discount | 否 | Number | 折扣(0-10) 不传或超出范围均当无折扣计算 |
| balance | 是 | Number | 账户余额 |
| freeCount | 否 | Number | 不计余额剩余次数 |
| appId | 是 | String | 绑定成功后第一次获取accessToken时moka返回 |
---------------------------------------------------------------------------------------
b.自定义字段
请求样例
$ curl --request POST \
--url https://api.mokahr.com/api-platform/v1/open-platform/survey/custom-fields \
--header 'Authorization: Bearer 6efe04cbc4b00ed85e2d8e9d3e8e622de435e55a' \
--header 'Content-Type: application/json' \
--data '{"customFields": [{"name": "company","description": "公司"},{"name": "abc","description": "Moka页面显示的名字"}]}'
请求地址: https://api.mokahr.com/api-platform/v1/open-platform/survey/custom-fields
接口说明: 全局自定义字段,设置后对使用该服务商的所有租户的所有套餐均适用,个性化自定义字段请在套餐自定义字段中设置
请求方式: POST
body类型: raw-JSON(application/json)
请求参数:
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| customFields | 是 | Array | 自定义字段数组 |
| customFields[].type | 是 | integer | 自定义字段类型: 0:单行文本,1:多行文本,2:单选题,3:多选题,4:候选人公司,5:候选人学校,6:预计入职时间 |
| customFields[].options | 否 | array | 自定义字段选择项,选填,当type为2或3的时候,添加JSON型数组, sample: [{ "id": 1, "name": "A"},{"id":2,"name":"B"}]id表示选择组件的选项ID name表示选择组件的选项名称,发起背调时 单选时 传递的参数值是id,多选时 传递的参数值是以逗号分隔的多个id |
| customFields[].name | 是 | String | 传给接口的字段key |
| customFields[].description | 是 | String | Moka页面显示的名字 |
| customFields[].isRequired | 否 | boolean | 是否必填 |
---------------------------------------------------------------------------------------
c.全量套餐列表
请求样例
$ curl --location --request POST 'https://api.mokahr.com/api-platform/v1/open-platform/survey/menus' \
--header 'Authorization: Bearer 7**********************79' \
--header 'Content-Type: application/json' \
--data-raw '{
"menuList": [
{
"price": 280,
"name": "社招B套餐",
"menuId": "D7***************439A",
"description": "社招B套餐"
},
{
"price": 150,
"name": "学生套餐",
"menuId": "BCA8****************C9EA439A",
"description": "学生套餐"
}
],
"appId": "1a7c7b6d-6***************5acc14f0"
}'
请求地址: https://api.mokahr.com/api-platform/v1/open-platform/survey/menus
接口说明: 如果套餐中设置了自定义字段则使用套餐的设置,否则使用服务商级别的全局自定义字段
请求方式: POST
body类型: raw-JSON(application/json)
请求参数:
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| menuList | 是 | Array | 套餐列表 |
| menuList[].menuId | 是 | String | 套餐ID |
| menuList[].name | 是 | String | 套餐名称 |
| menuList[].description | 是 | String | 套餐描述 |
| menuList[].price | 是 | Number | 套餐价格 |
| appId | 是 | String | 绑定成功后第一次获取accessToken时moka返回 |
| menuList[].customFields | 否 | array | 套餐自定义字段(参照自定义字段接口) |
| menuList[].customFields[].type | 是 | number | 自定义字段类型: 0:单行文本,1:多行文本,2:单选题,3:多选题,4:候选人公司,5:候选人学校,6:预计入职时间 |
| menuList[].customFields[].name | 是 | string | 自定义字段描述 |
| menuList[].customFields[].description | 是 | string | 自定义字段描述 |
| menuList[].customFields[].options | 否 | array | 自定义字段选择项,选填,当type为2或3的时候,添加JSON型数组, sample: [{ "id": "1", "name": "A"},{"id":"2","name":"B"}]id表示选择组件的选项ID name表示选择组件的选项名称,发起背调时 单选时 传递的参数值是id,多选时 传递的参数值是以逗号分隔的多个id |
| menuList[].customFields[].options[].id | 是 | string | 选择组件的选项ID |
| menuList[].customFields[].options[].name | 是 | string | 选择组件的选项名称 |
| menuList[].customFields[].isRequired | 否 | boolean | 是否必填 |
---------------------------------------------------------------------------------------
d.更新套餐
请求样例
$ curl --request POST \
--url https://api.mokahr.com/api-platform/v1/open-platform/survey/menu \
--header 'Authorization: Bearer 6efe04cbc4b00ed85e2d8e9d3e8e622de435e55a' \
--header 'Content-Type: application/json' \
--data '{"menuId": "1112","name": "test","price": 0,"appId": "a5fb37d3-f2d1-4121-b59f-b1ca385096b0"}'
请求地址: https://api.mokahr.com/api-platform/v1/open-platform/survey/menu
请求方式: POST
body类型: raw-JSON(application/json)
请求参数:
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| menuId | 是 | String | 套餐ID |
| name | 是 | String | 套餐名称 |
| description | 否 | String | 套餐描述 |
| price | 是 | Number | 试卷消耗 |
| appId | 是 | String | 绑定成功后第一次获取accessToken时moka返回 |
| customFields | 否 | array | 套餐自定义字段(参照自定义字段接口) |
| customFields[].type | 是 | number | 自定义字段类型: 0:单行文本,1:多行文本,2:单选题,3:多选题,4:候选人公司,5:候选人学校,6:预计入职时间 |
| customFields[].name | 是 | string | 自定义字段描述 |
| customFields[].description | 是 | string | 自定义字段描述 |
| customFields[].options | 否 | array | 自定义字段选择项,选填,当type为2或3的时候,添加JSON型数组, sample: [{ "id": "1", "name": "A"},{"id":"2","name":"B"}]id表示选择组件的选项ID name表示选择组件的选项名称,发起背调时 单选时 传递的参数值是id,多选时 传递的参数值是以逗号分隔的多个id |
| customFields[].options[].id | 是 | string | 选择组件的选项ID |
| customFields[].options[].name | 是 | string | 选择组件的选项名称 |
| customFields[].isRequired | 否 | boolean | 是否必填 |
---------------------------------------------------------------------------------------
e.删除套餐
请求样例
$ curl --request DELETE \
--url https://api.mokahr.com/api-platform/v1/open-platform/survey/menu \
--header 'Authorization: Bearer 6efe04cbc4b00ed85e2d8e9d3e8e622de435e55a' \
--header 'Content-Type: application/json' \
--data '{"menuId": "1","appId": "a5fb37d3-f2d1-4121-b59f-b1ca385096b0"}'
请求地址: https://api.mokahr.com/api-platform/v1/open-platform/survey/menu
请求方式: DELETE
body类型: raw-JSON(application/json)
请求参数:
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| menuId | 是 | String | 套餐Id |
| appId | 是 | String | 绑定成功后第一次获取accessToken时moka返回 |
---------------------------------------------------------------------------------------
f.结果回传
请求样例
$ curl --request POST \
--url http://api.mokahr.com/v1/open-platform/survey/result \
--header 'Authorization: Bearer 6efe04cbc4b00ed85e2d8e9d3e8e622de435e55a' \
--header 'Content-Type: application/json' \
--data '{
"result": "xxx",
"surveyId": "1",
"comment": "最大255的限制制",
"attachment": {
"name": "123.html",
"url": "http://www.example.com/index.html"
}
}'
请求地址: https://api.mokahr.com/api-platform/v1/open-platform/survey/result
请求方式: POST
body类型: raw-JSON(application/json)
请求参数:
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| result | 否 | String | 结果(长度限制20个字符,为空时默认为完成) |
| attachment | 否 | Object | 附件 |
| attachment.name | 否 | String | 附件名称(需要带上后缀名) |
| attachment.url | 否 | String | 附件URL,不需要url编码 |
| surveyId | 是 | Number | 创建背调的时候moka传给第三方供应商的surveyId |
| attachments[] | 否 | Array | 背调多附件,最多支持10个附件(新对接的单附件或多附件请传这个字段,原attachment对象只是兼容历史版本) |
| attachments[].name | 是 | String | 附件名称(需要带上后缀名) |
| attachments[].url | 是 | String | 附件URL,不需要url编码 |
| comment | 否 | String | 备注,支持255个字符 |
---------------------------------------------------------------------------------------
mokaAPI返回结果:
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| success | 是 | boolean | 返回结果是否成功 |
---------------------------------------------------------------------------------------
g.背调进度阶段回传
请求样例
$ curl --request POST \
--url http://api.mokahr.com/v1/open-platform/survey/stage \
--header 'Authorization: Bearer 6efe04cbc4b00ed85e2d8e9d3e8e622de435e55a' \
--header 'Content-Type: application/json' \
--data '{"stageId": "1", "name": "发送链接给候选人", "stageAt": "2019-10-10 01:01:01", "surveyId": 3}'
返回样例
{
success: true
}
请求地址: https://api.mokahr.com/api-platform/v1/open-platform/survey/stage
请求方式: POST
body类型: raw-JSON(application/json)
请求参数:
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| stageId | 否 | String | 背调阶段ID |
| name | 是 | String | 背调阶段名称 |
| stageAt | 是 | datetime | 背调阶段的时间 |
| surveyId | 是 | Number | 创建背调的时候moka传给第三方供应商的surveyId |
---------------------------------------------------------------------------------------
mokaAPI返回结果:
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| success | 是 | boolean | 返回结果是否成功 |
---------------------------------------------------------------------------------------
h.回传候选人信息
请求样例
$ curl --request POST \
--url https://api.mokahr.com/api-platform/v1/open-platform/survey/getCandidateInfo \
--header 'Authorization: Bearer 6efe04cbc4b00ed85e2d8e9d3e8e622de435e55a' \
--header 'Content-Type: application/json' \
--data '{"surveyId": 18}'
返回样例
{
code: 0,
msg: "success",
data: {
resumeUrl: "https://proxy-oss-test.mokahr.com/a5684434-86d8-44db-bd69-76ebe942e12e.pdf?OSSAccessKeyId=LTAIoEXIQWCGUAZO&Expires=1599462096&Signature=IrNuG2qaCJXp8FM7JyvPe04N5%2B0%3D",
standardResumeUrl: "https://proxy-oss-test.mokahr.com/xxx.pdf?OSSAccessKeyId=LTAIoEXIQWCGUAZO&Expires=1599462096&Signature=IrNuG2qaCJXp8FM7JyvPe04N5%2B0%3D"
}
}
请求地址: https://api.mokahr.com/api-platform/v1/open-platform/survey/getCandidateInfo
请求方式: POST
body类型: raw-JSON(application/json)
请求参数:
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| surveyId | 是 | Number | 创建背调的时候moka传给第三方供应商的surveyId |
---------------------------------------------------------------------------------------
mokaAPI返回结果:
| 字段 | 类型 | 描述 |
|---|---|---|
| code | number | 非0代表错误 |
| success | string | 返回处理的结果信息 |
| data | object | 返回结果的对象 |
| data.resumeUrl | string | 原始简历链接(客户在MOKA配置了允许推送原始简历且存在原始简历时 值非空) |
| data.standardResumeUrl | string | 标准简历链接(客户在MOKA配置了允许推送标准简历时 值非空) |
I.回传背调订单信息
请求样例
$ curl --location --request POST 'https://app.mokahr.com/api-platform/v2/open-platform/survey/orderCallback' \
--header 'Authorization: Bearer 6cdc13de41c5e76e020d403cb227cf7754962786' \
--header 'Content-Type: application/json' \
--data-raw '{
"menuId": "s2test1",
"menuName": "S2测试套餐",
"uniqueId": "f67cd05d67294e8b86c55eee5f3587da17a01b6c39ed4374ba7c2784aaa573e7",
"detailLink": "https://beidiao.com/orderDetail?token=XXX"
}'
返回样例
{
code: 0,
msg: "success",
data: {
surveyId: "***"
}
}
请求地址: https://api.mokahr.com/api-platform/v2/open-platform/survey/orderCallback
请求方式: POST
body类型: raw-JSON(application/json)
请求参数:
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| menuId | 是 | string | 套餐Id |
| menuName | 是 | string | 套餐名称 |
| uniqueId | 是 | string | 唯一ID |
| detailLink | 否 | string | 背调详情链接 (用于从MOKA跳转到服务商查看背调详情) |
---------------------------------------------------------------------------------------
mokaAPI返回结果:
| 字段 | 类型 | 描述 |
|---|---|---|
| code | number | 非0代表错误 |
| msg | string | 返回处理的结果信息 |
| data | object | 返回结果的对象 |
| data.surveyId | string | 返回MOKA侧背调ID,用于背调结果回传结果的链接 |
视频面试
Moka请求第三方供应商API
a.创建视频面试
请求样例
$ curl --request POST \
--url 'http://vendor.com/creat?appId=E8iWPLYYQq8dB5Lu3PEbTQwYLlyzaVOu&clientId=9734f2bc-beff-4439-9497-0aa11fcc932c&time=1547100372&sign=08b6a2f880c697bdee9b6069cbed81ceb7300ea4' \
--header 'Content-Type: application/json' \
--data '{
"id": "070e67b4e1104daca596059898c31e9b",
"event": "createInterview",
"triggeredAt": 1614675195,
"data": {
"applicationId": 418430746,
"name": "test2",
"email": "wangliwei@mokahr.com",
"phone": "17657685768",
"typeId": "1379",
"interviewTime": "2021-03-02 17:00:00",
"hireMode": 1,
"appId": "836474a1-cdaf-4fab-9bfd-047bd29b0c3b",
"jobTitle": "自动化测试-飞飞",
"interviews": [
{
"startTime": "2021-03-02 17:00:00",
"duration": 30,
"interviewers": [
{
"name": "石越",
"email": "shiyue@mokahr.com",
"phone": "15001371285"
}
]
},
{
"startTime": "2021-03-02 17:30:00",
"duration": 30,
"interviewers": [
{
"name": "王立伟2",
"email": "3300352025@qq.com",
"phone": "17857685760"
},
{
"name": "shuobin",
"email": "wangshuobin@mokahr.com",
"phone": "18746574657"
}
]
}
]
}
}'
请求方式: POST
body类型: raw-JSON(application/json)
请求query
| 字段 | 描述 |
|---|---|
| appId | 与moka绑定成功后返回的appId |
| clientId | 对接前提供的clientId |
| time | 当前时间戳 |
| sign | sha1(clientId +clientSecret + appId + time + 请求体body) |
请求格式
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| id | 是 | String | moka生成的id(随机数) |
| event | 是 | String | 事件名称如: createExam |
| triggeredAt | 是 | Number | 触发的时间戳 |
| data | 是 | Object | 请求的具体内容 |
| data.applicationId | 是 | Number | 候选人ID |
| data.name | 是 | String | 候选人名字 |
| data.email | 是 | String | 候选人邮件 |
| data.phone | 否 | String | 候选人手机号 |
| data.typeId | 是 | String | 类型Id |
| data.interviewTime | 是 | String | 面试时间 YYYY-MM-DD HH:mm:ss |
| data.hireMode | 是 | Number | 1-社招 2-校招 |
| data.appId | 是 | String | 绑定成功后第一次获取accessToken时moka返回 |
| data.jobTitle | 是 | String | 职位名称 |
| data.interviews | 是 | Array | 面试信息 |
| data.interviews[].startTime | 是 | String | 面试开始时间 |
| data.interviews[].duration | 是 | Number | 面试时长 |
| data.interviews[].interviewers | 是 | Array | 面试官信息 |
| data.interviews[].interviewers[].email | 是 | String | 面试官邮箱 |
| data.interviews[].interviewers[].name | 是 | String | 面试官信息 |
| data.interviews[].interviewers[].phone | 是 | String | 面试官电话 |
返回结果:
statusCode: 200
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| videoId | 是 | String | vendor保证唯一uid |
| interviewerUrl | 是 | String | 面试官地址 |
| intervieweeUrl | 是 | String | 候选人面试地址 |
b.创建面试V2版本
请求样例
$ curl --request POST \
--url 'http://www.test.com/interview/creat?appId=E8iWPLYYQq8dB5Lu3PEbTQwYLlyzaVOu&clientId=9734f2bc-beff-4439-9497-0aa11fcc932c&time=1547100372&sign=08b6a2f880c697bdee9b6069cbed81ceb7300ea4' \
--header 'Content-Type: application/json' \
--data '{
"appId": "6542335467",
"typeId": "324354657",
"hireMode": 1,
"groupId": "6542335467",
"candidates": [
{
"applicationId": 12345,
"name": "张三",
"email": "zhangsan@test.com",
"phone": "15012345678",
"countryCallingCode": "+86",
"jobTitle": ""
}
],
"interviews": [
{
"interviewId": 12345,
"roundId": 1,
"roundName": "第一轮",
"startTime": "2020-01-01",
"duration": 30,
"interviewers": [
{
"interviewInterviewerId": 3456,
"email": "lisi@test.com",
"name": "李四",
"phone": "15012345678"
}
]
}
],
}'
请求方式: POST
body类型: raw-JSON(application/json)
请求query
| 字段 | 描述 |
|---|---|
| appId | 与moka绑定成功后返回的appId |
| clientId | 对接前提供的clientId |
| time | 当前时间戳 |
| sign | sha1(clientId +clientSecret + appId + time) |
请求格式
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| candidates | 是 | Array | 候选人信息 |
| candidates[].applicationId | 是 | Number | 候选人申请ID |
| candidates[].name | 是 | String | 候选人名字 |
| candidates[].email | 是 | String | 候选人邮件 |
| candidates[].phone | 否 | String | 候选人手机号 |
| candidates[].countryCallingCode | 否 | String | 候选人电话区号 |
| candidates[].jobTitle | 是 | String | 职位名称 |
| appId | 是 | String | 与moka绑定成功后返回的appId |
| typeId | 是 | String | 类型Id |
| hireMode | 是 | Number | 1-社招 2-校招 |
| groupId | 是 | String | 面试组ID |
| interviewCreatorEmail | 否 | String | 面试创建人邮箱 |
| interviews | 是 | Array | 面试信息 |
| interviews[].interviewId | 是 | String | 面试id |
| interviews[].roundId | 是 | Number | 轮次id |
| interviews[].roundName | 是 | String | 轮次名称 |
| interviews[].startTime | 是 | String | 面试开始时间 |
| interviews[].duration | 是 | Number | 面试时长(单位:分) |
| interviews[].interviewers | 是 | Array | 面试官信息 |
| interviews[].interviewers[].interviewInterviewerId | 是 | Number | 面试的面试官ID |
| interviews[].interviewers[].email | 是 | String | 面试官邮箱 |
| interviews[].interviewers[].name | 是 | String | 面试官姓名 |
| interviews[].interviewers[].phone | 否 | String | 面试官电话 |
返回结果:
statusCode: 200
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| code | 是 | Number | 0: 成功 非0:失败 |
| msg | 否 | String | 返回信息描述 |
| data | 是 | Object | 返回信息 |
| data.videoId | 是 | String | vendor保证唯一uid |
| data.intervieweeUrls | 是 | Array | 候选人面试地址 |
| data.intervieweeUrls[].applicationId | 是 | Number | 申请ID |
| data.intervieweeUrls[].interviewId | 是 | Number | 面试ID |
| data.intervieweeUrls[].url | 是 | String | 候选人面试地址 |
| data.interviewerUrls | 是 | Array | 面试官面试地址 |
| data.interviewerUrls[].interviewInterviewerId | 是 | Number | 面试的面试官ID |
| data.interviewerUrls[].url | 是 | String | 面试官面试地址 |
c.修改面试V2版本
与V2的创建面试接口配套使用
请求样例
$ curl --request POST \
--url 'http://www.test.com/interview/uodate?appId=E8iWPLYYQq8dB5Lu3PEbTQwYLlyzaVOu&clientId=9734f2bc-beff-4439-9497-0aa11fcc932c&time=1547100372&sign=08b6a2f880c697bdee9b6069cbed81ceb7300ea4' \
--header 'Content-Type: application/json' \
--data '{
"videoId": "6542335467",
"groupId": "324354657",
"interviews": [
{
"interviewId": 12345,
"roundId": 1,
"roundName": "第一轮",
"startTime": "2020-01-01",
"duration": 30,
"interviewers": [
{
"interviewInterviewerId": 3456,
"email": "lisi@test.com",
"name": "李四",
"phone": "15012345678"
}
]
}
],
}'
请求方式: POST
body类型: raw-JSON(application/json)
请求query
| 字段 | 描述 |
|---|---|
| appId | 与moka绑定成功后返回的appId |
| clientId | 对接前提供的clientId |
| time | 当前时间戳 |
| sign | sha1(clientId +clientSecret + appId + time) |
请求格式
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| videoId | 是 | String | 创建面试后vendor返回的值 |
| groupId | 是 | String | 面试组ID |
| interviewModifierEmail | 否 | String | 面试修改人邮箱 |
| interviews | 是 | Array | 面试信息 |
| interviews[].interviewId | 是 | String | 面试id |
| interviews[].roundId | 是 | Number | 轮次id |
| interviews[].roundName | 是 | String | 轮次名称 |
| interviews[].startTime | 是 | String | 面试开始时间 |
| interviews[].duration | 是 | Number | 面试时长(单位:分) |
| interviews[].interviewers | 是 | Array | 面试官信息 |
| interviews[].interviewers[].interviewInterviewerId | 是 | Number | 面试的面试官ID |
| interviews[].interviewers[].email | 是 | String | 面试官邮箱 |
| interviews[].interviewers[].name | 是 | String | 面试官姓名 |
| interviews[].interviewers[].phone | 否 | String | 面试官电话 |
返回结果:
statusCode: 200
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| code | 是 | Number | 0: 成功 非0:失败 |
| msg | 否 | String | 返回信息描述 |
| data | 是 | Object | 返回信息 |
| data.videoId | 是 | String | vendor保证唯一uid |
| data.intervieweeUrls | 是 | Array | 候选人面试地址 |
| data.intervieweeUrls[].applicationId | 是 | Number | 申请ID |
| data.intervieweeUrls[].interviewId | 是 | Number | 面试ID |
| data.intervieweeUrls[].intervieweeurl | 是 | String | 候选人面试地址 |
| data.interviewerUrls | 是 | Array | 面试官面试地址 |
| data.interviewerUrls[].interviewInterviewerId | 是 | Number | 面试的面试官ID |
| data.interviewerUrls[].url | 是 | String | 面试官面试地址 |
d.取消面试
与V2的创建面试接口配套使用
请求样例
$ curl --request POST \
--url 'http://www.test.com/interview/delete?appId=E8iWPLYYQq8dB5Lu3PEbTQwYLlyzaVOu&clientId=9734f2bc-beff-4439-9497-0aa11fcc932c&time=1547100372&sign=08b6a2f880c697bdee9b6069cbed81ceb7300ea4' \
--header 'Content-Type: application/json' \
--data '{
"appId": "6542335467",
"typeId": "324354657",
"hireMode": 1,
"groupId": "6542335467",
"interviewIds": [123, 345],
"applicationIds": [45678, 87654],
}'
请求方式: POST
body类型: raw-JSON(application/json)
请求query
| 字段 | 描述 |
|---|---|
| appId | 与moka绑定成功后返回的appId |
| clientId | 对接前提供的clientId |
| time | 当前时间戳 |
| sign | sha1(clientId +clientSecret + appId + time) |
请求格式
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| videoId | 是 | String | 创建面试后vendor返回的值 |
| groupId | 是 | String | 面试组ID |
| interviewIds | 否 | Array | 面试id列表 如果不传或者数组为空 则取消该面试组 |
| applicationIds | 否 | Array | 候选人申请ID列表 只在集体面试下取消某个候选人的面试时非空 |
返回结果:
statusCode: 200
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| code | 是 | Number | 0: 成功 非0:失败 |
| msg | 否 | String | 返回信息描述 |
| data | 是 | Object | 返回信息 |
补充
为了安全性,请验证time的实效性,建议5分钟内有效。
第三方供应商请求Moka API
a.余额
请求样例
$ curl --request POST \
--url https://api.mokahr.com/api-platform/v1/open-platform/interview/balance \
--header 'Authorization: Bearer 6efe04cbc4b00ed85e2d8e9d3e8e622de435e55a' \
--header 'Content-Type: application/json' \
--data '{"discount": 0.4,"balance": "100","freeCount": 5}'
请求地址: https://api.mokahr.com/api-platform/v1/open-platform/interview/balance
请求方式: POST
body类型: raw-JSON(application/json)
请求参数:
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| discount | 否 | Number | 折扣(0-10) 不传或超出范围均当无折扣计算 |
| balance | 是 | Number | 账户余额 |
| freeCount | 否 | Number | 不计余额剩余次数 |
| appId | 是 | String | 绑定成功后第一次获取accessToken时moka返回 |
---------------------------------------------------------------------------------------
b.自定义成绩
请求样例
$ curl --request POST \
--url http://api2.mokahr.com:3000/v1/open-platform/interview/custom-result \
--header 'Authorization: Bearer 6efe04cbc4b00ed85e2d8e9d3e8e622de435e55a' \
--header 'Content-Type: application/json' \
--data '{"resultList":["满意","不错","还行"]}'
请求地址: https://api.mokahr.com/api-platform/v1/open-platform/interview/custom-result
请求方式: POST
body类型: raw-JSON(application/json)
请求参数:
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| resultList | 是 | Array | 自定义成绩 |
---------------------------------------------------------------------------------------
c.全量套餐列表
请求样例
$ curl --request POST \
--url https://api.mokahr.com/api-platform/v1/open-platform/interview/types \
--header 'Authorization: Bearer 6efe04cbc4b00ed85e2d8e9d3e8e622de435e55a' \
--header 'Content-Type: application/json' \
--data '{"typeList": [{"typeId": "1112","name": "2222222","price": 2}],"appId": "a5fb37d3-f2d1-4121-b59f-b1ca385096b0"}'
请求地址: https://api.mokahr.com/api-platform/v1/open-platform/interview/types
请求方式: POST
body类型: raw-JSON(application/json)
请求参数:
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| typeList | 是 | Array | 套餐列表 |
| typeList[].typeId | 是 | String | 类型ID |
| typeList[].name | 是 | String | 套餐名称 |
| typeList[].price | 是 | Number | 套餐价格 |
| appId | 是 | String | 绑定成功后第一次获取accessToken时moka返回 |
---------------------------------------------------------------------------------------
d.更新套餐
请求样例
$ curl --request POST \
--url https://api.mokahr.com/api-platform/v1/open-platform/interview/type \
--header 'Authorization: Bearer 6efe04cbc4b00ed85e2d8e9d3e8e622de435e55a' \
--header 'Content-Type: application/json' \
--data '{"typeId": "1112","name": "test","price": 0,"appId": "a5fb37d3-f2d1-4121-b59f-b1ca385096b0"}'
请求地址: https://api.mokahr.com/api-platform/v1/open-platform/interview/type
请求方式: POST
body类型: raw-JSON(application/json)
请求参数:
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| typeId | 是 | String | 类型ID |
| name | 是 | String | 套餐名称 |
| price | 是 | Number | 试卷消耗 |
| appId | 是 | String | 绑定成功后第一次获取accessToken时moka返回 |
---------------------------------------------------------------------------------------
e.删除套餐
请求样例
$ curl --request DELETE \
--url https://api.mokahr.com/api-platform/v1/open-platform/interview/type \
--header 'Authorization: Bearer 6efe04cbc4b00ed85e2d8e9d3e8e622de435e55a' \
--header 'Content-Type: application/json' \
--data '{"typeId": "1","appId": "a5fb37d3-f2d1-4121-b59f-b1ca385096b0"}'
请求地址: https://api.mokahr.com/api-platform/v1/open-platform/interview/type
请求方式: DELETE
body类型: raw-JSON(application/json)
请求参数:
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| typeId | 是 | String | 类型Id |
| appId | 是 | String | 绑定成功后第一次获取accessToken时moka返回 |
---------------------------------------------------------------------------------------
f.结果回传
请求样例
$ curl --request POST \
--url http://api.mokahr.com/v1/open-platform/interview/result \
--header 'Authorization: Bearer 6efe04cbc4b00ed85e2d8e9d3e8e622de435e55a' \
--header 'Content-Type: application/json' \
--data '{"feedback": "棒", "score": "100", "videoId": "12345"}'
请求地址: https://api.mokahr.com/api-platform/v1/open-platform/interview/result
请求方式: POST
body类型: raw-JSON(application/json)
请求参数:
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| feedback | 是 | String | 面试反馈 |
| score | 是 | String | 成绩,可与moka系统中的面试结果做匹配 |
| videoId | 是 | String | 与创建视频面试时返回的背调结果相同 |
---------------------------------------------------------------------------------------
mokaAPI返回结果:
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| success | 是 | boolean | 返回结果是否成功 |
g.结果回传v2版本
请求样例
$ curl --request POST \
--url https://api.mokahr.com/api-platform/v2/open-platform/interview/result \
--header 'Authorization: Bearer 6efe04cbc4b00ed85e2d8e9d3e8e622de435e55a' \
--header 'Content-Type: application/json' \
--data '{
"interviewInterviewerId": 12345,
"applicationId": 6789,
"score": "100",
"feedback": "面试反馈"
}'
请求地址: https://api.mokahr.com/api-platform/v2/open-platform/interview/result
请求方式: POST
body类型: raw-JSON(application/json)
请求参数:
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| interviewInterviewerId | 是 | Number | 面试的面试官ID |
| applicationId | 是 | String | 申请ID |
| score | 是 | String | 成绩,可与moka系统中的面试结果做匹配 |
| feedback | 是 | String | 面试反馈 |
---------------------------------------------------------------------------------------
mokaAPI返回结果:
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| code | 是 | Number | 返回结果是否成功。0: 成功 |
| msg | 否 | String | 返回信息描述 |
| data | 是 | Object | 返回信息 |
叫号面试
业务流程图
ps:若用户在服务商修改面试,目前不会同步Moka。
Moka请求第三方供应商API
a.创建视频面试
请求样例
$ curl --location --request POST 'https://dhr.nowcoder.com/v1/partners/moka/create-scene?appId=46dc1350-3dd2-444c-acab-02ef5a94d374&clientId=aUX4cI0lfhtkXTBmlXED1g0ra9xqKvDZ&time=1646311615&sign=fbeef2b972ac6b2955311899abafc3b0101a5ea6' \
--header 'Content-Type: application/json' \
--data-raw '{
"projectType": "1",
"projectName": "0303-2",
"projectId": "5b4b2319da2a485ba5e71bae3b52cb0ee435f34900804d4ead4cf19c65c",
"startDate": 1646312400000,
"rounds": [
{
"roundNumber": 1,
"round": 4,
"roundName": "初试",
"rows": [
{
"jobIds": [],
"interviewers": [
{
"interviewerEmail": "shiyue@mokahr.com",
"interviewerMobile": "15001371285",
"interviewerId": 410050593,
"InterviewerName": "石越"
}
],
"mainInterviewerId": 410050593
}
]
}
],
"applications": [
{
"jobName": "sy校招职位3",
"resumeUrl": "https://staging-1.mokahr.com/forward/candidate/info?access_token=17750f2a081d46909ded95d8dead2dc479aa43dea64b40a3aa51b38093133e77",
"jobId": "947f77cd-bb13-487b-ae8c-d96078ce8e78",
"phone": "14592000013",
"name": "sys1xz185",
"startTime": 1646312400000,
"applicationId": 422059002,
"email": "1009417583@qq.com"
}
]
}'
请求方式: POST
body类型: raw-JSON(application/json)
请求query
| 字段 | 描述 |
|---|---|
| appId | 与moka绑定成功后返回的appId |
| clientId | 对接前提供的clientId |
| time | 当前时间戳 |
| sign | sha1(clientId +clientSecret + appId + time + 请求体body) |
请求格式
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| projectId | 是 | String | MOKA的叫号面试项目ID |
| projectName | 是 | String | 叫号面试项目名称 |
| projectType | 是 | String | 项目类型 |
| startDate | 是 | number | 开始时间(叫号面试当天时间0点的时间戳 单位:ms) |
| rounds | 是 | array | 轮次信息 |
| rounds[].round | 否 | number | 轮次 |
| rounds[].roundName | 是 | String | 轮次名称 |
| rounds[].roundNumber | 是 | Number | 轮次顺序 |
| rounds[].rows | 是 | array | 分组 |
| rounds[].rows[].jobIds[] | 是 | array |
可面试的职位id列表(传空不限职位) |
| rounds[].rows[].mainInterviewerId | 是 | Number | 主面试官ID(与面试官ID一致) |
| rounds[].rows[].interviewers | 是 | array | 所有面试官信息 |
| rounrounds[].rows[].interviewers[].interviewerIdds | 是 | Number | 面试官ID |
| rounds[].rows[].interviewers[].InterviewerName | 是 | String | 面试官姓名 |
| rounds[].rows[].interviewers[].interviewerMobile | 否 | string | 面试官电话 |
| rounds[].rows[].interviewers[].interviewerEmail | 否 | string | 面试官email |
| applications | 是 | array | 候选人申请信息 |
| applications[].applicationId | 是 | number | 申请id |
| applications[].startTime | 是 | number | 开始时间戳(单位:ms) |
| applications[].name | 否 | string | 候选人姓名 |
| applications[].email | 否 | string | 候选人email |
| applications[].phone | 否 | string | 候选人phone |
| applications[].jobId | 是 | string | 职位id |
| applications[].jobName | 是 | string | 职位名称 |
| applications[].resumeUrl | 是 | string | 职位简历 |
返回结果:
statusCode: 200
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| code | 是 | number | 0: 成功 非0:失败 |
| msg | 否 | String | 返回信息描述 |
| data | 是 | object | 返回信息 |
b.修改叫号面试
请求样例
$ curl --location --request POST 'https://dhr.nowcoder.com/v1/partners/moka/update-scene?appId=46dc1350-3dd2-444c-acab-02ef5a94d374&clientId=aUX4cI0lfhtkXTBmlXED1g0ra9xqKvDZ&time=1646311366&sign=6296090bbc0638959e8706c36cf6ca9d0d0a78bb' \
--header 'Content-Type: application/json' \
--data-raw '{
"vendorProjectId": "2382",
"projectType": "1",
"projectName": "0303牛客叫号",
"projectId": "c9ccdeebcfde4fd58b58e545ee30c1b0a727e372ee9a4a6d9da06be13eaf0bda",
"startDate": 1646314200000,
"rounds": [
{
"roundNumber": 1,
"round": 4,
"roundName": "初试",
"rows": [
{
"jobIds": [],
"interviewers": [
{
"interviewerEmail": "shiyue@mokahr.com",
"interviewerMobile": "15001371285",
"interviewerId": 410050593,
"InterviewerName": "石越"
}
],
"mainInterviewerId": 410050593
}
]
}
],
"applications": [
{
"jobName": "sy校招职位3",
"resumeUrl": "https://staging-1.mokahr.com/forward/candidate/info?access_token=db8583715cb949f4af7e030c62b43733ee4ea1fff7844d60933ede7aa36aba84",
"jobId": "947f77cd-bb13-487b-ae8c-d96078ce8e78",
"phone": "14592000015",
"name": "sys1xz187",
"startTime": 1646314200000,
"applicationId": 422059004,
"email": "1009417583@qq.com"
}
]
}'
请求方式: POST
body类型: raw-JSON(application/json)
请求query
| 字段 | 描述 |
|---|---|
| appId | 与moka绑定成功后返回的appId |
| clientId | 对接前提供的clientId |
| time | 当前时间戳 |
| sign | sha1(clientId +clientSecret + appId + time) |
请求格式
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| vendorProjectId | 是 | string | 服务商的叫号面试项目ID |
| projectId | 是 | String | MOKA的叫号面试项目ID |
| projectName | 是 | String | 叫号面试项目名称 |
| projectType | 是 | String | 项目类型 |
| startDate | 是 | number | 开始时间(叫号面试当天时间0点的时间戳 单位:ms) |
| rounds | 是 | array | 轮次信息 |
| rounds[].round | 否 | number | 轮次 |
| rounds[].roundName | 是 | String | 轮次名称 |
| rounds[].roundNumber | 是 | Number | 轮次顺序 |
| rounds[].rows | 是 | array | 分组 |
| rounds[].rows[].jobIds[] | 是 | array |
可面试的职位id列表(传空不限职位) |
| rounds[].rows[].mainInterviewerId | 是 | Number | 主面试官ID(与面试官ID一致) |
| rounds[].rows[].interviewers | 是 | array | 所有面试官信息 |
| rounrounds[].rows[].interviewers[].interviewerIdds | 是 | Number | 面试官ID |
| rounds[].rows[].interviewers[].InterviewerName | 是 | String | 面试官姓名 |
| rounds[].rows[].interviewers[].interviewerMobile | 否 | string | 面试官电话 |
| rounds[].rows[].interviewers[].interviewerEmail | 否 | string | 面试官email |
| applications | 是 | array | 候选人申请信息 |
| applications[].applicationId | 是 | number | 申请id |
| applications[].startTime | 是 | number | 开始时间戳(单位:ms) |
| applications[].name | 否 | string | 候选人姓名 |
| applications[].email | 否 | string | 候选人email |
| applications[].phone | 否 | string | 候选人phone |
| applications[].jobId | 是 | string | 职位id |
| applications[].jobName | 是 | string | 职位名称 |
| applications[].resumeUrl | 是 | string | 职位简历 |
返回结果:
statusCode: 200
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| code | 是 | number | 0: 成功 非0:失败 |
| msg | 否 | String | 返回信息描述 |
| data | 是 | object | 返回信息 |
c.取消叫号面试
请求样例
$ curl --location --request POST 'https://dhr.nowcoder.com/v1/partners/moka/cancel-scene?appId=46dc1350-3dd2-444c-acab-02ef5a94d374&clientId=aUX4cI0lfhtkXTBmlXED1g0ra9xqKvDZ&time=1646311517&sign=9c9930c66583e132ffb0ca32ce7b61bf77651300' \
--header 'Content-Type: application/json' \
--data-raw '{
"vendorProjectId": "2382",
"projectId": "c9ccdeebcfde4fd58b58e545ee30c1b0a727e372ee9a4a6d9da06be13eaf0bda"
}'
请求方式: POST
body类型: raw-JSON(application/json)
请求query
| 字段 | 描述 |
|---|---|
| appId | 与moka绑定成功后返回的appId |
| clientId | 对接前提供的clientId |
| time | 当前时间戳 |
| sign | sha1(clientId +clientSecret + appId + time) |
请求格式
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| projectId | 是 | String | MOKA叫号面试的项目ID |
| vendorProjectId | 是 | String | 服务商叫号面试的项目ID |
返回结果:
statusCode: 200
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| code | 是 | Number | 0: 成功 非0:失败 |
| msg | 否 | String | 返回信息描述 |
| data | 是 | Object | 返回信息 |
补充
为了安全性,请验证time的实效性,建议5分钟内有效。
第三方供应商请求Moka API
a.面试结果回传
请求样例
$ curl --location --request POST 'https://api.mokahr.com/v1/open-platform/interview/interview-queues/syncFeedback' \
--header 'Content-Type: application/json' \
--data-raw '{
"projectId": "70ca990041dd4791ab691476cf4256f77458b04c63794fcda622316b22567522",
"vendorProjectId": "2222222222222",
"applicationId": 419165734,
"total": "4.0",
"comment": "tttttt....",
"interviewerId": 410112436,
"startTime": 1642754689429,
"signedInAt": 1642754679429,
"duration": 30,
"roundNumber": 1,
"videoId": "fdsafdsafsaewrewre"
}'
请求地址: https://api.mokahr.com/api-platform/v1/open-platform/interview/interview-queues/syncFeedback
请求方式: POST
body类型: raw-JSON(application/json)
请求body参数:
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| projectId | 是 | string | moka的叫号面试项目id |
| vendorProjectId | 是 | string | 服务商的叫号面试项目名称 |
| applicationId | 是 | Number | 申请ID |
| total | 是 | String | 分数 |
| comment | 否 | String | 评价 |
| reportUrl | 否 | String | 报告链接 |
| interviewerId | 是 | number | 面试官id |
| startTime | 是 | nunber | 实际开始时间 时间戳(单位:毫秒) |
| duration | 否 | number | 面试时长(单位:分钟) |
| round | 否 | number | 轮次 |
| roundNumber | 是 | number | 轮次顺序 |
| signedInAt | 否 | number | 签到时间 (单位:毫秒) |
| videoId | 是 | string | 视频面试ID |
返回结果:
statusCode: 200
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| code | 是 | number | 0: 成功 非0:失败 |
| msg | 否 | String | 返回信息描述 |
| data | 是 | object | 返回信息 |
---------------------------------------------------------------------------------------
b.创建结果回调接口
请求样例
$ curl --location --request POST 'https://api.mokahr.com/v1/open-platform/interview/interview-queues/syncSaveResult' \
--header 'Content-Type: application/json' \
--data-raw '{
"projectId": "1e414b24e478472d88f4c87c2b8c4a39d20d53cbc3914057a72daea282a04a5c",
"vendorProjectId": "",
"code": 1,
"errorMsg": "",
"applicationErrors": [
{
"applicationId": 1,
"name": "要结束了么",
"errorInfo": ""
}
],
"interviewerErrors": [
{
"interviewerId": 410050593,
"name": "石越",
"errorInfo": ""
}
]
}'
请求地址: https://api.mokahr.com/api-platform/v1/open-platform/interview/interview-queues/syncSaveResult
请求方式: POST
body类型: raw-JSON(application/json)
请求参数:
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| projectId | 是 | string | moka的叫号面试项目id |
| vendorProjectId | 是 | string | 服务商的叫号面试项目名称 |
| code | 是 | number | 0: 全部成功 非0:失败 |
| errorMsg | 是 | string | 错误信息 |
| applicationErrors | 否 | array | 候选人报错信息 |
| errorapplicationErrors[].applicationIdMsg | 是 | number | 申请ID |
| applicationErrors[].name | 否 | string | 候选人姓名 |
| applicationErrors[].errorInfo | 否 | string | 错误信息 |
| interviewerErrors | 是 | array | 面试官报错信息 |
| interviewerErrors[].interviewerId | 是 | number | 面试官id |
| interviewerErrors[].name | 否 | string | 面试官姓名 |
| interviewerErrors[].errorInfo | 否 | string | 错误信息 |
返回结果:
statusCode: 200
| 字段 | 必填 | 类型 | 描述 |
|---|---|---|---|
| code | 是 | number | 0: 成功 非0:失败 |
| msg | 否 | String | 返回信息描述 |
| data | 是 | object | 返回信息 |
---------------------------------------------------------------------------------------