面向需要把码到后端接入现有系统、脚本或测试平台的开发者。本文档侧重场景示例和快速上手;完整路由参考见 daemon-api.md。
基础地址:http://127.0.0.1:7822(桌面 app 内嵌的 HTTP 服务使用相同地址)
典型调用链路:
- 查询可用 provider 和运行时状态:
GET /api/providers - 读取或更新 provider manifest:
GET/PUT /api/providers/{id}/manifest - 清空指定 provider 的本地复用池:
POST /api/providers/{id}/reuse-pool - 动态发现资源:
countries → operators → services - 发起接码:
POST /api/acquire - 轮询或回调收码:
POST /api/poll或POST /api/tickets/{ticket_id}/callbacks - 结束 / 取消:
POST /api/release
GET /api/providers 返回的 RuntimeSnapshot 包含复用相关状态(reuse_capabilities、acquire_path、same_activation_retry_supported、reuse_pool[] 等)。该接口是生产运行态视图,只返回可用于真实下单的 provider;mock provider 通过 manifest 管理接口读取。
Manifest 复用控制字段:defaults.reuse_phone、defaults.reuse_max、defaults.reuse_ttl_hours
国家字段约定:系统对外 country 主字段使用 ISO 3166-1 alpha-2 大写码(如 US、GB)。local / any 是合法 sentinel。旧 slug、国家名、provider 数字值仍可兼容读取,新写入统一落 canonical 值。
- 公开端点:
GET /health、GET /auth/status、GET /auth/check、POST /auth/login、POST /auth/logout、GET /api/access-info - 其余
/api/*端点需要鉴权 - 推荐方式:
Authorization: Bearer <http_secret> - 备选方式:先
POST /auth/login,再复用madao_http_sessioncookie
完整机器可读规范见 docs/openapi/daemon.openapi.yaml。
GET /healthGET /api/providersGET /api/provider-manifestsPOST /api/provider-manifests/reloadGET /api/settings/runtimePOST /api/settings/runtimeGET /api/settings/option-cache
GET /api/providers/{provider}/countriesPOST /api/providers/{provider}/operatorsPOST /api/providers/{provider}/servicesPOST /api/providers/{provider}/pricesGET /api/providers/{provider}/balance
资源项统一语义:value(MaDao canonical 主键)、label(英文显示名)、label_zh(国家项中文名)、provider_value(provider 原生值)。
价格项中 country 使用 canonical 值,display_name / display_name_zh 提供显示名,provider_country 保留原生值。
POST /api/acquirePOST /api/pollPOST /api/releaseGET /api/ticketsGET /api/tickets/{ticket_id}GET /api/tickets/{ticket_id}/callbacksPOST /api/tickets/{ticket_id}/callbacks
更完整的接口说明见 docs/daemon-api.md。
curl -X POST http://127.0.0.1:7822/api/acquire \
-H 'Authorization: Bearer YOUR_HTTP_SECRET' \
-H 'Content-Type: application/json' \
-d '{
"provider": "mock",
"service": "openai",
"country": "local"
}'返回示例:
{
"ticket_id": "0196c7c5-4c44-7e8a-a73f-0fe476df3e89",
"provider": "mock",
"service": "openai",
"country": "local",
"phone_number": "+15550001234"
}随后轮询:
curl -X POST http://127.0.0.1:7822/api/poll \
-H 'Authorization: Bearer YOUR_HTTP_SECRET' \
-H 'Content-Type: application/json' \
-d '{
"ticket_id": "0196c7c5-4c44-7e8a-a73f-0fe476df3e89"
}'如果拿到验证码,再结束订单:
curl -X POST http://127.0.0.1:7822/api/release \
-H 'Authorization: Bearer YOUR_HTTP_SECRET' \
-H 'Content-Type: application/json' \
-d '{
"ticket_id": "0196c7c5-4c44-7e8a-a73f-0fe476df3e89",
"action": "finish"
}'如果你希望 码到 主动把验证码推回业务系统,可以为 ticket 注册 callback:
curl -X POST http://127.0.0.1:7822/api/tickets/0196c7c5-4c44-7e8a-a73f-0fe476df3e89/callbacks \
-H 'Authorization: Bearer YOUR_HTTP_SECRET' \
-H 'Content-Type: application/json' \
-d '{
"url": "https://example.com/madao/callback",
"secret": "demo"
}'收到验证码后,daemon 会向你的 URL 发送 JSON:
{
"ticket_id": "0196c7c5-4c44-7e8a-a73f-0fe476df3e89",
"provider": "mock",
"service": "openai",
"country": "local",
"phone_number": "+15550001234",
"code": "123456",
"message": "mock code ready",
"received_at": "2026-05-08T00:00:00Z"
}适用场景:
- 自动化注册 / 登录测试
- 内部风控 / 验证码中台
- 手工平台和本地桌面 app 联动
读取 manifest:
curl http://127.0.0.1:7822/api/providers/herosms/manifest更新 manifest:
curl -X PUT http://127.0.0.1:7822/api/providers/herosms/manifest \
-H 'Content-Type: application/json' \
-d @manifest.json这会触发:
- manifest 持久化到用户配置目录
ProviderRegistry重载- UI 与运行时快照刷新
如果你要手动清空某个 provider 的本地复用池,可以调用:
curl -X POST http://127.0.0.1:7822/api/providers/herosms/reuse-pool \
-H 'Authorization: Bearer YOUR_HTTP_SECRET'这意味着你可以把 码到 当作本地 provider orchestration service 使用,而不是只能手工点 UI。
通过 POST /api/settings/runtime 调整运行时行为:
{
“routing_strategy”: “ordered_priority”,
“auto_fallback”: true,
“option_cache_enabled”: true,
“option_cache_poll_interval_minutes”: 30,
“only_show_openai_sms_countries”: false,
“check_updates_on_launch”: true
}设置持久化到用户配置目录下的 runtime-settings.json。
only_show_openai_sms_countries 语义:排除 whatsapp-only 国家,保留 sms_regions 中的国家。同时存在于两者中的国家仍然显示。
- 所有非
2xx响应都应读取 JSONmessage字段或原始文本 handler_api与five_sim的上游错误会被归一化后透传- 资源发现接口依赖有效
api_key,未配置时返回invalid request - Callback 当前不是持久化重试队列,接入方需自行处理幂等