验证码下发
本接口由 EngageLab 平台生成验证码,并按照模板中指定的通道策略下发。
如果您希望自行生成验证码而不通过 EngageLab 平台生成,可以调用 EngageLab OTP 自定义验证码下发 接口。
调用地址
POST https://otp.api.engagelab.cc/v1/messages
调用验证
请参考 调用验证 了解如何进行 API 鉴权。
请求示例
请求头
POST /v1/messages HTTP/1.1
Content-Type: application/json
Authorization: Basic amlndWFuZ2RldjpkZXZfc2VjcmV0
POST /v1/messages HTTP/1.1
Content-Type: application/json
Authorization: Basic amlndWFuZ2RldjpkZXZfc2VjcmV0
此代码块在浮窗中显示
请求体
{
"to": "+6591234567",
"template":{
"id":"test-template-1",
"language": "default",
"params": {
"key1": "value1",
"key2": "value2"
}
}
}
{
"to": "+6591234567",
"template":{
"id":"test-template-1",
"language": "default",
"params": {
"key1": "value1",
"key2": "value2"
}
}
}
此代码块在浮窗中显示
请求参数
一个请求对象以 JSON 格式表达,因此请求头需要带 Content-Type: application/json 。
| 参数 | 类型 | 选项 | 说明 |
|---|---|---|---|
| to | String | 必填 | 发送目标,手机号或邮箱地址,+6598765432,support@engagelab.com |
| end_user_ip | String | 可选 | 终端用户的 IP 地址,当需要限制同一 IP 地址的在不同时间维度的请求上限时使用,如:10.3.5.7 |
| channel | String | 可选 | 指定首发通道,取值 sms/voice/zalo/viber;不传则按模板 send_channel_strategy 路由 |
| template | JSON Object | 必填 | 模板信息,所含二级参数见下方 |
| |_ id | String | 必填 | 模板 ID |
| |_ language | String | 可选 | 模板语言,支持以下几种语言: default 默认语言 zh_CN 简体中文 zh_HK 繁体中文 en 英语 ja 日语 th 泰语 es 西班牙语 若不传则默认为 default(默认语言) |
| |_ params | JSON Object | 可选 | 自定义模板变量 Key 的取值 |
| 如果您在创建模板时自定义了变量,则在此为它们传值,若不传,则将直接以变量 Key 下发,如{{var}} |
对于params的说明
- 对于模版有预设的字段如 from_id,若不传 params 字段值,则消息下发时使用模版预设的 from_id;
- 若传递了 params 字段值,如
params:{"from_id":"12345"},则消息下发时,模版的 from_id 将会替换成 12345; - 同时对于创建模版时模版内容有自定义的变量字段,也都通过 params 进行赋值,如模版内容
Hi {{name}}, your verify code is {{code}},此时需要赋值参数params:{"name":"Bob"} - Email 通道特殊变量:对于 Email 通道,支持通过
params动态覆盖邮件主题(subject)、发件人名称(from_name)、发件人邮箱(from_mail)等。详细的高级用法请参考 创建模板 - Email 模板变量高级用法。
返回参数
成功返回
| 字段 | 类型 | 选项 | 描述 |
|---|---|---|---|
| message_id | String | 必填 | 消息 ID,唯一标识某一条消息 |
| send_channel | String | 必填 | 表示当前下发的通道,取值有 whatsapp/sms/email/voice/zalo/viber |
{
"message_id": "1725407449772531712",
"send_channel": "sms"
}
{
"message_id": "1725407449772531712",
"send_channel": "sms"
}
此代码块在浮窗中显示
注意,返回的**send_channel**值不代表最终下发到用户的通道,仅代表现阶段使用的通道;如模版配置的策略中配置了 WhatsApp 通道送达失败然后自动补发 SMS 通道,则接口返回将返回 whatsapp 值,一定时间后感知到送达失败,系统将采用 SMS 通道发送
失败返回
http 状态码为 4xx 或者 5xx,响应体包含字段如下:
| 字段 | 类型 | 选项 | 描述 |
|---|---|---|---|
| code | int | 必填 | 错误码,详见错误码说明 |
| message | String | 必填 | 错误详情 |
{
"code": 5001,
"message": "sms send fail"
}
{
"code": 5001,
"message": "sms send fail"
}
此代码块在浮窗中显示
错误码
下表仅描述本接口在鉴权、发送前校验和同步提交阶段返回的错误。供应商受理后的异步送达失败不通过本接口返回,请通过消息状态查询或回调获取。
调用方应以 code 判断错误类型,message 用于展示具体原因或辅助排查,不建议依赖固定的 message 文案编写业务逻辑。
| 错误码 | http code | 说明 |
|---|---|---|
| 1000 | 500 | 内部错误 |
| 2001 | 401 | 鉴权失败,未携带正确的 token |
| 2002 | 401 | 鉴权失败,token 已过期或已被禁用 |
| 2003 | 403 | 该 IP 不允许发送消息 |
| 2004 | 403 | 无调用此 API 的权限 |
| 3001 | 400 | 请求参数格式无效,请检查是否符合参数格式的 JSON 内容 |
| 3002 | 400 | 请求参数有误,请检查请求参数是否符合要求 |
| 3003 | 400 | 请求参数有误,相关业务校验失败,详情参考 message 字段的错误描述 |
| 3004 | 400 | 超出频率限制,针对同一模版以及同一目标用户,在验证码的有效期内无法再次下发 |
| 3005 | 400 | 账户可用余额不足 |
| 3013 | 400 | 模板未审核通过或当前不可用 |
| 4001 | 400 | 相关资源不存在,如模版消息下发时使用了不存在的模版 |
| 5001 | 400 | 发送失败(通用/其他) |
| 5011 | 400 | 手机号格式无效 |
| 5012 | 400 | 目标不可达 |
| 5013 | 400 | 号码被加入黑名单 |
| 5014 | 400 | 内容不符合规范 |
| 5015 | 400 | 消息被拦截/拒绝 |
| 5016 | 400 | 发送内部错误 |
| 5017 | 400 | 无中国地区发送权限 |
| 5018 | 400 | 手机故障(关机/停机) |
| 5019 | 400 | 用户已退订 |
| 5020 | 400 | 号码未注册/空号 |
| 6001 | 429 | 同一手机号发送频率超过限制,限制窗口可能为分钟、小时或自然日 |
| 6002 | 429 | 同一终端用户 IP 发送频率超过限制,限制窗口可能为分钟或小时;仅在请求传入 end_user_ip 时检查 |
| 6003 | 429 | 应用全局日发送量或月发送量达到上限 |
| 6006 | 403 | 当前国家或地区不允许发送 |
| 6007 | 403 | 短信验证码发送服务已暂停,可能是全部国家/地区暂停或当前国家/地区暂停 |
| 6008 | 429 | 当前国家或地区的日发送量或月发送量达到上限 |
限流及发送量错误说明
3004是模板验证码下发频控,限制窗口以模板配置为准,不一定等于验证码有效期。6001、6002是号码或终端用户 IP 维度的安全频控。6003、6008表示本次请求触发了发送量上限;达到上限并进入暂停状态后,后续请求可能返回6007。- 收到 HTTP 429 时,请勿立即连续重试;请稍后重试,如持续出现,请联系管理员或技术支持。
5011至5019只表示同步提交阶段能够识别的失败。供应商受理后产生的空号、关机、运营商拒绝等状态,仍可能通过异步消息状态或回调返回。










