开放 API 供企业系统对接密令管理能力,支持:批量申请密令、查询密令(含可投放的推广链接)、续期、触发审核状态同步、统计。
/open/v1/ping 免鉴权/open/v1 前缀区分http://127.0.0.1:8321;生产环境请联系管理员获取正式域名(建议 HTTPS)。kl_xxxxxxxxxxxxxxxx)GET /open/v1/accounts 获取可用的 account_id,调用 GET /open/v1/keywords 确认连通性POST /open/v1/keywords/apply 申请密令,之后轮询 GET /open/v1/keywords?status=approved 获取生效密令及推广链接POST /open/v1/sync 主动同步 → 查询 status=approved 的密令拿 promotion_link。除 /open/v1/ping 外,所有请求必须携带 API Key,支持以下两种方式(任选其一):
| 方式 | 请求头 | 示例 |
|---|---|---|
| 方式一(推荐) | X-API-Key | X-API-Key: kl_nWn0yJTp... |
| 方式二 | Authorization | Authorization: Bearer kl_nWn0yJTp... |
所有接口统一返回三段式结构:
{"code": 0, "message": "ok", "data": { ... } }
code:0 表示成功;失败时为对应的 HTTP 状态码(401 / 404 / 422 / 429 等),此时 data 为空、message 为错误说明code 保持一致,可按 HTTP 状态码做统一拦截ISO 8601 本地时间字符串,例如 2026-11-14T08:30:00;days_left 为距离有效期结束的剩余天数(整数,负数表示已过期)。
page 从 1 开始;page_size 默认 20,最大 100total / page / page_size / list每个 API Key 每分钟 60 次。超出返回 429,请降低频率或合并批量操作(如批量申请一次提交多个关键词)。建议轮询间隔不低于 30 秒。
POST 接口请求体为 JSON,务必携带 Content-Type: application/json;GET 接口参数放 URL query。
用于探活与连通性验证,不消耗限流配额。
响应示例:
{
"code": 0,
"message": "ok",
"data": { "service": "kouling", "version": "v1", "time": "2026-10-11T00:54:12" }
}
获取系统中可用的投放账号,其 id 用于申请密令时指定 account_id。
响应 data:
[
{ "id": 1, "name": "测试账号", "status": "ok" }
]
| 字段 | 说明 |
|---|---|
| id | 账号 ID,申请密令时使用 |
| name | 账号名称 |
| status | ok 凭证正常 / expired 凭证失效 / unknown 未验证 |
批量提交密令申请,逐条独立处理,部分失败不影响其余条目。
请求体:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| account_id | int | 否 | 投放账号 ID;不传时使用系统第一个账号 |
| items | array | 是 | 申请条目列表,至少 1 条 |
| items[].keyword | string | 是 | 密令关键词(用户在美团 App 搜索的词) |
| items[].sub_media_id | string | 是 | 推广媒体 ID,如 "1000499921" |
| items[].sub_media_name | string | 否 | 媒体名称(可省略,系统自动补全) |
| items[].promotion_bit_id | string | 是 | 推广位 ID,如 "6431480" |
| items[].promotion_bit_name | string | 否 | 推广位名称(可省略) |
| items[].material_id | int | 是 | 素材 ID,如 866 |
| items[].city_list | string[] | 否 | 限定城市列表,默认 ["全部"] |
| items[].valid_days | int | 否 | 有效天数,默认 30,范围 1~90 |
请求示例:
curl -X POST "{BASE}/open/v1/keywords/apply" \
-H "X-API-Key: kl_xxx" -H "Content-Type: application/json" \
-d '{
"account_id": 1,
"items": [
{ "keyword": "618大促", "sub_media_id": "1000499921", "promotion_bit_id": "6431480", "material_id": 866 },
{ "keyword": "外卖红包", "sub_media_id": "1000499921", "promotion_bit_id": "6431480", "material_id": 866, "valid_days": 30 }
]
}'
响应 data(逐条结果):
[
{ "keyword": "618大促", "ok": true, "message": "申请已提交", "order_id": 9 },
{ "keyword": "外卖红包", "ok": false, "message": "推广位不存在,请先同步推广位", "order_id": 10 }
]
applying(审核中)。平台审核通常数秒内完成,但需等待系统同步后才能查到最终状态:提交约 1 分钟后调 POST /open/v1/sync,再查询 status=approved。分页查询密令。要获取可直接投放的链接,请传 status=approved,取结果中的 promotion_link。
Query 参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| status | string | 否 | 按状态过滤:applying / approved / expired / apply_failed |
| keyword | string | 否 | 按关键词模糊搜索 |
| promotion_bit_id | string | 否 | 按推广位 ID 过滤 |
| account_id | int | 否 | 按账号过滤 |
| page | int | 否 | 页码,默认 1 |
| page_size | int | 否 | 每页条数,默认 20,最大 100 |
响应 data:
{
"total": 8, "page": 1, "page_size": 20,
"list": [
{
"id": 2,
"keyword": "测试1122311",
"platform": "meituan",
"status": "approved",
"sub_media_name": "e推联盟",
"promotion_bit_name": "自营测试",
"material_id": 7,
"valid_start": "2026-10-17T08:30:00",
"valid_end": "2026-11-13T08:30:00",
"days_left": 33,
"promotion_link": "imeituan://www.meituan.com/takeout/browser?inner_url=...",
"created_at": "2026-10-11T00:54:12"
}
]
}
| 字段 | 说明 |
|---|---|
| id | 密令记录 ID(详情/续期接口使用) |
| status | 见 状态说明 |
| promotion_link | 美团推广跳转链接,审核通过并同步后返回;applying 状态下为 null |
| days_left | 剩余有效天数,负数表示已过期 |
| valid_start / valid_end | 生效起止时间 |
返回单条密令,字段同 5.4 列表项。密令不存在返回 404。
对指定密令以相同配置(关键词/推广位/素材/城市)重新申请新一期有效期,生成一条新记录并关联原记录。
请求体:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| valid_days | int | 是 | 新有效期天数,范围 1~90(由调用方按业务明确给出,系统不设默认值) |
source=jhtg 的记录(经 5.9 apply-by-sid 创建)只能经本开放 API 续期:管理后台手动续期与系统自动续期均不处理source=manual)的记录生效;jhtg 来源是否续期、何时续由调用方按订单门槛决定响应 data:
{
"order_id": 12,
"status": "applying",
"valid_start": "2026-10-26T10:00:00",
"valid_end": "2026-11-25T10:00:00"
}
order_id 为新生成记录的编号,valid_start / valid_end 为新有效期起止(ISO 时间)。
从平台拉取最新审核记录:更新已有密令状态、导入平台新增记录。系统每 30 分钟自动执行一次,对接方在申请后可主动调用以尽快拿到审核结果。
Query 参数:account_id(可选,不传则同步全部账号)。
响应 data:
[
{ "account": "测试账号", "ok": true, "message": "同步完成:更新 0 条,导入 2 条" }
]
"cookie_expired": true,表示平台登录凭证失效,已通知管理员处理,请稍后重试。响应 data:
{
"total": 8, "applying": 0, "approved": 2,
"expired": 6, "expiring_7d": 0
}
供聚合推广系统等消费方使用:调用方只知道自己侧的媒体 ID 与推广位 sid,由本系统反查账号与推广位后代为提交申请。六步流程:校验平台 → 按 sub_media_id 反查绑定账号 → 按 sid 查推广位(找不到先刷新该媒体推广位再找一次)→ 占用判重(过期记录先置 expired,同账号同词在途/生效则拒绝)→ 调平台申请 → 落库(source=jhtg)并返回新记录编号与有效期。
请求体:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| platform | string | 是 | 平台,当前仅支持 meituan |
| sub_media_id | string | 是 | 推广媒体 ID(须已绑定到系统内某账号) |
| sid | string | 是 | 推广位标识;取链新建的推广位可能尚未同步,系统会自动刷新一次再找 |
| keyword | string | 是 | 密令词,2~20 个字符且不含空白 |
| material_id | int | 是 | 素材 ID |
| valid_days | int | 是 | 有效天数,范围 1~90 |
| city_list | string[] | 否 | 限定城市列表,默认 ["全部"] |
响应 data(形同 5.6 续期,返回新记录):
{
"order_id": 15,
"status": "applying",
"valid_start": "2026-10-26T10:00:00",
"valid_end": "2026-11-25T10:00:00"
}
业务错误统一返回 {"code": 状态码, "message": "说明", "data": {"error": "错误码"}},错误码如下:
| HTTP | 错误码 | 触发条件 | 处理建议 |
|---|---|---|---|
| 400 | PLATFORM_UNSUPPORTED | platform 不是 meituan | 当前仅支持美团,核对 platform 取值 |
| 404 | ACCOUNT_NOT_FOUND | sub_media_id 未绑定任何账号 | 核对媒体 ID,或联系管理员绑定账号并同步媒体 |
| 404 | BIT_NOT_FOUND | 刷新后仍找不到该 sid 对应的推广位 | 核对 sid;确认取链侧推广位确已生成 |
| 409 | KEYWORD_OCCUPIED | 同账号下该密令词已有在途/生效记录 | 更换密令词,或待原记录过期后再申请 |
| 401 | CREDENTIAL_EXPIRED | 平台接口调用失败(按 Cookie 失效处理,账号会被置为 expired) | 联系管理员更新账号 Cookie 后重试 |
申请前预检:查询密令词是否已被任一账号的在途(applying)或生效(approved)记录占用(全局视角,与 5.9 的同账号判重口径不同)。已过有效期、被驳回或申请失败的记录不算占用;查询会先把过期记录置为 expired,与申请判重同口径。
Query 参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| keyword | string | 是 | 密令词,2~20 个字符且不含空白(与申请同规则) |
| platform | string | 是 | 平台,当前仅支持 meituan,其他值返回 400 PLATFORM_UNSUPPORTED |
响应 data:
{ "occupied": false }
请求示例:
curl "{BASE}/open/v1/keywords/check?keyword=外卖红包&platform=meituan" -H "X-API-Key: kl_xxx"
按记录编号批量查询密令状态:按传入 ids 的顺序返回存在的记录,不存在的编号自动跳过(不报错)。适合消费方申请后轮询终态。
请求体:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| ids | int[] | 是 | 密令记录编号列表,一次最多 100 个(超出返回 400) |
请求示例:
curl -X POST "{BASE}/open/v1/keywords/batch-get" \
-H "X-API-Key: kl_xxx" -H "Content-Type: application/json" \
-d '{ "ids": [12, 15, 999] }'
响应 data(上例中 999 不存在,返回 2 条):
[
{
"order_id": 12,
"keyword": "外卖红包",
"platform": "meituan",
"status": "approved",
"valid_start": "2026-10-26T10:00:00",
"valid_end": "2026-11-25T10:00:00",
"reject_reason": null,
"renewal_of_id": null,
"source": "jhtg"
},
{
"order_id": 15,
"keyword": "618大促",
"platform": "meituan",
"status": "rejected",
"valid_start": null,
"valid_end": null,
"reject_reason": "素材不合规",
"renewal_of_id": 12,
"source": "manual"
}
]
| 字段 | 说明 |
|---|---|
| order_id | 密令记录编号(即申请/续期响应里的 order_id) |
| status | 见 状态说明(另有 rejected 审核驳回) |
| valid_start / valid_end | 有效期起止(ISO 时间),在途记录可能为 null |
| reject_reason | 驳回/申请失败原因,无则为 null |
| renewal_of_id | 续期记录的原记录编号,非续期记录为 null |
| source | manual 后台手动创建 / jhtg 经开放 API 创建 |
| status | 含义 | 对接建议 |
|---|---|---|
applying | 审核中 | 等待,稍后调 sync 后再查 |
approved | 审核通过、生效中 | 可取 promotion_link 投放;关注 days_left 及时续期 |
expired | 已过期 / 已失效 | 不可用,如需继续投放调 renew 重新申请 |
apply_failed | 申请提交失败 | 根据 message 排查后重新提交 |
unknown | 平台返回了未知状态码 | 联系管理员确认 |
| code | 含义 | 处理建议 |
|---|---|---|
| 0 | 成功 | — |
| 400 | 参数错误 / 业务规则不允许(如重复续期) | 阅读 message |
| 401 | API Key 缺失、无效或已禁用 | 检查请求头;联系管理员确认 Key 状态 |
| 404 | 资源不存在(密令记录 / 账号) | 核对 ID;账号列表先调 5.2 |
| 422 | 参数校验失败 | message 会指明具体字段,如 items: Field required |
| 429 | 触发限流(60 次/分钟) | 降低频率、合并批量调用,等待 1 分钟后重试 |
| 502 | 上游平台接口异常 | 稍后重试;持续出现联系管理员 |
错误响应示例:
HTTP 401
{ "code": 401, "message": "API Key 无效或已禁用" }
import requests
BASE = "{BASE}"
HEADERS = {"X-API-Key": "kl_xxx"}
# 1) 拉取生效中的密令
r = requests.get(f"{BASE}/open/v1/keywords",
params={"status": "approved", "page": 1, "page_size": 50},
headers=HEADERS, timeout=15).json()
assert r["code"] == 0, r["message"]
for item in r["data"]["list"]:
print(item["keyword"], item["promotion_link"], f"剩余{item['days_left']}天")
# 2) 批量申请(如需要)
r = requests.post(f"{BASE}/open/v1/keywords/apply",
headers=HEADERS, timeout=30,
json={"account_id": 1, "items": [{
"keyword": "618大促",
"sub_media_id": "1000499921",
"promotion_bit_id": "6431480",
"material_id": 866,
}]}).json()
print(r["data"])
const BASE = "{BASE}";
const res = await fetch(`${BASE}/open/v1/keywords?status=approved`, {
headers: { "X-API-Key": "kl_xxx" },
});
const body = await res.json();
if (body.code !== 0) throw new Error(body.message);
for (const item of body.data.list) {
console.log(item.keyword, item.promotion_link);
}
# 1. 申请
curl -X POST "{BASE}/open/v1/keywords/apply" -H "X-API-Key: kl_xxx" \
-H "Content-Type: application/json" \
-d '{"items":[{"keyword":"618大促","sub_media_id":"1000499921","promotion_bit_id":"6431480","material_id":866}]}'
# 2. 等 1 分钟后同步
curl -X POST "{BASE}/open/v1/sync" -H "X-API-Key: kl_xxx"
# 3. 查询生效密令
curl "{BASE}/open/v1/keywords?status=approved" -H "X-API-Key: kl_xxx"
平台审核通常数秒完成,但需等系统同步后才能查到。建议:申请 → 约 1 分钟后调 POST /open/v1/sync → 查 status=approved 拿 promotion_link。系统另每 30 分钟自动同步一次。
可以。它是美团联盟生成的跳转链接(imeituan://...),用户在美团 App 内打开即跳转对应活动页。请勿自行拼接或修改参数。
同一关键词 + 同一推广位在有效期内不建议重复申请(平台会占用审核资源)。到期需要继续使用时调 renew 接口;系统到期前 3 天的自动续期仅针对后台手动来源(source=manual)的记录,jhtg 来源是否续期由调用方决定。
已触发限流(每 Key 每分钟 60 次)。轮询间隔建议 ≥30 秒;批量申请合并为一次调用(items 数组)。
联系管理员:管理台「开放 API」页签可查看完整 Key、禁用或重建。泄漏请立即禁用。
由管理员在管理台提供(管理台「申请密令」页可选择媒体与推广位并看到对应 ID)。素材 ID 为美团联盟素材编号。
| 版本 | 日期 | 内容 |
|---|---|---|
| v1 | 2026-10-11 | 首批 8 个端点上线:ping / accounts / keywords/apply / keywords / keywords/{id} / keywords/{id}/renew / sync / stats;支持 API Key 鉴权与限流 |
后续新平台(淘宝联盟 / 京东联盟)接入时,将在现有端点上增加 platform 参数或新增前缀,届时在此页更新变更记录。