三步接入:注册获取密钥 → 调用创建接口 → 调用换址接口。认证通过 X-API-Key 请求头完成。
curl -X POST /api/v1/codes \
-H "X-API-Key: yq_xxx" \
-H "Content-Type: application/json" \
-d '{"name":"菜单","target_url":"https://example.com/menu"}'交互式测试
核心参数
| 字段 | 说明 | 约束 |
|---|---|---|
| name | 活码名称 | 1-80 字符 |
| target_url | 目标 URL | HTTP/HTTPS,创建和换址均做安全检测 |
| slug | 短链标识 | 可选,4-24 位字母数字连字符 |
| group_name | 分组名称 | 可选,用于控制台筛选 |
| tags | 标签数组 | 可选,用于检索和归类 |
查询参数
| 字段 | 说明 | 约束 |
|---|---|---|
| limit | 分页数量 | 活码列表默认 50、最大 500;扫码明细默认 100、最大 500 |
| offset | 分页偏移量 | 默认 0;负数按 0 处理 |
| format | 导出格式 | 扫码明细支持 csv/xlsx;二维码图片支持 svg |
状态与限制
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /api/v1/codes | 创建活码 |
| GET | /api/v1/codes | 查询活码列表 |
| GET | /api/v1/codes/{id} | 查询活码详情 |
| PUT | /api/v1/codes/{id} | 更新活码 |
| PATCH | /api/v1/codes/{id}/target-url | 更换目标 URL |
| POST | /api/v1/codes/{id}/pause | 暂停活码 |
| POST | /api/v1/codes/{id}/resume | 恢复活码 |
| DELETE | /api/v1/codes/{id} | 归档活码 |
| GET | /api/v1/codes/{id}/stats | 获取统计 |
| GET | /api/v1/codes/{id}/scans | 获取扫码明细 |
| POST | /api/v1/codes/batch | 批量创建 |
| PATCH | /api/v1/codes/batch/target-url | 批量换址 |
| GET | /api/v1/codes/{id}/qrcode | 获取二维码图片 |
POST /api/v1/codes
创建活码
请求
curl -X POST /api/v1/codes \
-H "X-API-Key: yq_xxx" \
-H "Content-Type: application/json" \
-d '{"name":"菜单","target_url":"https://example.com/menu"}'Python
import requests
r = requests.request("POST", "/api/v1/codes",
headers={"X-API-Key": "yq_xxx"},
json={"name": "菜单", "target_url": "https://example.com/menu"})
print(r.status_code, r.text)响应
{"code":{"id":1,"slug":"abc123","short_url":"https://qr.example/s/abc123"}}常见错误
API_KEY_REQUIRED / API_KEY_INVALID / BAD_JSON / BODY_TOO_LARGE / RATE_LIMITED / INVALID_URL / URL_BLOCKED / CODE_QUOTA_EXCEEDED / NOT_FOUND
GET /api/v1/codes
查询活码列表
请求
curl -X GET /api/v1/codes \ -H "X-API-Key: yq_xxx"
Python
import requests
r = requests.request("GET", "/api/v1/codes",
headers={"X-API-Key": "yq_xxx"})
print(r.status_code, r.text)响应
{"code":{"id":1,"slug":"abc123","short_url":"https://qr.example/s/abc123"}}常见错误
API_KEY_REQUIRED / API_KEY_INVALID / BAD_JSON / BODY_TOO_LARGE / RATE_LIMITED / INVALID_URL / URL_BLOCKED / CODE_QUOTA_EXCEEDED / NOT_FOUND
GET /api/v1/codes/{id}
查询活码详情
请求
curl -X GET /api/v1/codes/{id} \
-H "X-API-Key: yq_xxx"Python
import requests
r = requests.request("GET", "/api/v1/codes/{id}",
headers={"X-API-Key": "yq_xxx"})
print(r.status_code, r.text)响应
{"code":{"id":1,"slug":"abc123","short_url":"https://qr.example/s/abc123"}}常见错误
API_KEY_REQUIRED / API_KEY_INVALID / BAD_JSON / BODY_TOO_LARGE / RATE_LIMITED / INVALID_URL / URL_BLOCKED / CODE_QUOTA_EXCEEDED / NOT_FOUND
PUT /api/v1/codes/{id}
更新活码
请求
curl -X PUT /api/v1/codes/{id} \
-H "X-API-Key: yq_xxx" \
-H "Content-Type: application/json" \
-d '{"name":"菜单","target_url":"https://example.com/menu"}'Python
import requests
r = requests.request("PUT", "/api/v1/codes/{id}",
headers={"X-API-Key": "yq_xxx"},
json={"name": "菜单", "target_url": "https://example.com/menu"})
print(r.status_code, r.text)响应
{"code":{"id":1,"slug":"abc123","short_url":"https://qr.example/s/abc123"}}常见错误
API_KEY_REQUIRED / API_KEY_INVALID / BAD_JSON / BODY_TOO_LARGE / RATE_LIMITED / INVALID_URL / URL_BLOCKED / CODE_QUOTA_EXCEEDED / NOT_FOUND
PATCH /api/v1/codes/{id}/target-url
更换目标 URL
请求
curl -X PATCH /api/v1/codes/{id}/target-url \
-H "X-API-Key: yq_xxx" \
-H "Content-Type: application/json" \
-d '{"name":"菜单","target_url":"https://example.com/menu"}'Python
import requests
r = requests.request("PATCH", "/api/v1/codes/{id}/target-url",
headers={"X-API-Key": "yq_xxx"},
json={"name": "菜单", "target_url": "https://example.com/menu"})
print(r.status_code, r.text)响应
{"code":{"id":1,"slug":"abc123","short_url":"https://qr.example/s/abc123"}}常见错误
API_KEY_REQUIRED / API_KEY_INVALID / BAD_JSON / BODY_TOO_LARGE / RATE_LIMITED / INVALID_URL / URL_BLOCKED / CODE_QUOTA_EXCEEDED / NOT_FOUND
POST /api/v1/codes/{id}/pause
暂停活码
请求
curl -X POST /api/v1/codes/{id}/pause \
-H "X-API-Key: yq_xxx" \
-H "Content-Type: application/json" \
-d '{"name":"菜单","target_url":"https://example.com/menu"}'Python
import requests
r = requests.request("POST", "/api/v1/codes/{id}/pause",
headers={"X-API-Key": "yq_xxx"},
json={"name": "菜单", "target_url": "https://example.com/menu"})
print(r.status_code, r.text)响应
{"code":{"id":1,"slug":"abc123","short_url":"https://qr.example/s/abc123"}}常见错误
API_KEY_REQUIRED / API_KEY_INVALID / BAD_JSON / BODY_TOO_LARGE / RATE_LIMITED / INVALID_URL / URL_BLOCKED / CODE_QUOTA_EXCEEDED / NOT_FOUND
POST /api/v1/codes/{id}/resume
恢复活码
请求
curl -X POST /api/v1/codes/{id}/resume \
-H "X-API-Key: yq_xxx" \
-H "Content-Type: application/json" \
-d '{"name":"菜单","target_url":"https://example.com/menu"}'Python
import requests
r = requests.request("POST", "/api/v1/codes/{id}/resume",
headers={"X-API-Key": "yq_xxx"},
json={"name": "菜单", "target_url": "https://example.com/menu"})
print(r.status_code, r.text)响应
{"code":{"id":1,"slug":"abc123","short_url":"https://qr.example/s/abc123"}}常见错误
API_KEY_REQUIRED / API_KEY_INVALID / BAD_JSON / BODY_TOO_LARGE / RATE_LIMITED / INVALID_URL / URL_BLOCKED / CODE_QUOTA_EXCEEDED / NOT_FOUND
DELETE /api/v1/codes/{id}
归档活码
请求
curl -X DELETE /api/v1/codes/{id} \
-H "X-API-Key: yq_xxx"Python
import requests
r = requests.request("DELETE", "/api/v1/codes/{id}",
headers={"X-API-Key": "yq_xxx"})
print(r.status_code, r.text)响应
{"code":{"id":1,"slug":"abc123","short_url":"https://qr.example/s/abc123"}}常见错误
API_KEY_REQUIRED / API_KEY_INVALID / BAD_JSON / BODY_TOO_LARGE / RATE_LIMITED / INVALID_URL / URL_BLOCKED / CODE_QUOTA_EXCEEDED / NOT_FOUND
GET /api/v1/codes/{id}/stats
获取统计
请求
curl -X GET /api/v1/codes/{id}/stats \
-H "X-API-Key: yq_xxx"Python
import requests
r = requests.request("GET", "/api/v1/codes/{id}/stats",
headers={"X-API-Key": "yq_xxx"})
print(r.status_code, r.text)响应
{"code":{"id":1,"slug":"abc123","short_url":"https://qr.example/s/abc123"}}常见错误
API_KEY_REQUIRED / API_KEY_INVALID / BAD_JSON / BODY_TOO_LARGE / RATE_LIMITED / INVALID_URL / URL_BLOCKED / CODE_QUOTA_EXCEEDED / NOT_FOUND
GET /api/v1/codes/{id}/scans
获取扫码明细
请求
curl -X GET /api/v1/codes/{id}/scans \
-H "X-API-Key: yq_xxx"Python
import requests
r = requests.request("GET", "/api/v1/codes/{id}/scans",
headers={"X-API-Key": "yq_xxx"})
print(r.status_code, r.text)响应
{"code":{"id":1,"slug":"abc123","short_url":"https://qr.example/s/abc123"}}常见错误
API_KEY_REQUIRED / API_KEY_INVALID / BAD_JSON / BODY_TOO_LARGE / RATE_LIMITED / INVALID_URL / URL_BLOCKED / CODE_QUOTA_EXCEEDED / NOT_FOUND
POST /api/v1/codes/batch
批量创建
请求
curl -X POST /api/v1/codes/batch \
-H "X-API-Key: yq_xxx" \
-H "Content-Type: application/json" \
-d '{"name":"菜单","target_url":"https://example.com/menu"}'Python
import requests
r = requests.request("POST", "/api/v1/codes/batch",
headers={"X-API-Key": "yq_xxx"},
json={"name": "菜单", "target_url": "https://example.com/menu"})
print(r.status_code, r.text)响应
{"code":{"id":1,"slug":"abc123","short_url":"https://qr.example/s/abc123"}}常见错误
API_KEY_REQUIRED / API_KEY_INVALID / BAD_JSON / BODY_TOO_LARGE / RATE_LIMITED / INVALID_URL / URL_BLOCKED / CODE_QUOTA_EXCEEDED / NOT_FOUND
PATCH /api/v1/codes/batch/target-url
批量换址
请求
curl -X PATCH /api/v1/codes/batch/target-url \
-H "X-API-Key: yq_xxx" \
-H "Content-Type: application/json" \
-d '{"name":"菜单","target_url":"https://example.com/menu"}'Python
import requests
r = requests.request("PATCH", "/api/v1/codes/batch/target-url",
headers={"X-API-Key": "yq_xxx"},
json={"name": "菜单", "target_url": "https://example.com/menu"})
print(r.status_code, r.text)响应
{"code":{"id":1,"slug":"abc123","short_url":"https://qr.example/s/abc123"}}常见错误
API_KEY_REQUIRED / API_KEY_INVALID / BAD_JSON / BODY_TOO_LARGE / RATE_LIMITED / INVALID_URL / URL_BLOCKED / CODE_QUOTA_EXCEEDED / NOT_FOUND
GET /api/v1/codes/{id}/qrcode
获取二维码图片
请求
curl -X GET /api/v1/codes/{id}/qrcode \
-H "X-API-Key: yq_xxx"Python
import requests
r = requests.request("GET", "/api/v1/codes/{id}/qrcode",
headers={"X-API-Key": "yq_xxx"})
print(r.status_code, r.text)响应
image/png 或 image/svg+xml
常见错误
API_KEY_REQUIRED / API_KEY_INVALID / BAD_JSON / BODY_TOO_LARGE / RATE_LIMITED / INVALID_URL / URL_BLOCKED / CODE_QUOTA_EXCEEDED / NOT_FOUND
频率限制
免费版 500 次/日,超限返回 HTTP 429,响应头包含 Retry-After。