API 参考
自动化代理购买与续订。
简介
用于查询套餐、查看订阅、购买新代理、续订有效订阅以及配置自动 IP 轮换的编程接口。
API 使用单一端点:/api/proxy。对于 GET 操作,请在 query string 中传递 op;对于 POST 操作,请在 JSON body 中传递 op。
快速开始
在 Dashboard -> API Keys 创建 API key,并在每个请求的 header 中携带该 key。
BASE="https://makeadsafe.com"
API_KEY="rk_your_long_lived_api_key" 所有 ID 均为小写字母和数字。
通过
POST /api/proxy携带{"op":"trial","planId":"..."}申请试用,仅对部分 API key 开放。如需为你的 key 启用该能力,请联系支持。试用使用情况会被监控,如有滥用,可能会被限制或关闭。
可用套餐
返回 API key 所有者可用的有效代理套餐。
curl -sS
-H "x-api-key: $API_KEY"
"$BASE/api/proxy?op=plans" {
"ok": true,
"plans": [
{
"id": "k17m3q5v7n9p1r2t4w6y8z0a",
"connectionType": "private",
"durationMs": 2592000000,
"priceAmountCents": 1200,
"popular": true,
"remainingProxies": 20,
"network": {
"name": "NL-AMS",
"city": "Amsterdam",
"country": "NL",
"networkType": "mobile"
}
}
]
} 有效订阅
返回你的订阅信息,包括凭据、协议 URL 以及 IP 轮换数据。
curl -sS
-H "x-api-key: $API_KEY"
"$BASE/api/proxy?op=subscriptions" {
"ok": true,
"subscriptions": [
{
"subscriptionId": "j97b2f6m1k4n8p3r5t7v9x0z",
"status": "active",
"activeUntil": 1762592000000,
"userNote": "Client A",
"rotationPolicy": 10,
"label": "12001 - NL - Private",
"networkLabel": "NL-AMS Amsterdam",
"credentials": {
"username": "u_6k8s9d",
"password": "p_2n4m6q"
},
"protocols": {
"http": "http://u_6k8s9d:[email protected]:12001",
"socks5": "socks5://u_6k8s9d:[email protected]:12001",
"vless": "vless://...",
"shadowsocks": "ss://..."
},
"rotate": {
"rotatePath": "/r/abcd1234",
"available": true
}
}
]
} 续费套餐
返回可用于续订指定订阅的套餐。
SUB_ID="j97b2f6m1k4n8p3r5t7v9x0z"
curl -sS
-H "x-api-key: $API_KEY"
"$BASE/api/proxy?op=renewal-plans&subscriptionId=$SUB_ID" {
"ok": true,
"renewalPlans": [
{
"id": "k17m3q5v7n9p1r2t4w6y8z0a",
"connectionType": "private",
"durationMs": 2592000000,
"priceAmountCents": 1200
}
]
} 可用网络
返回可用于切换特定订阅的网络。
SUB_ID="j97b2f6m1k4n8p3r5t7v9x0z"
curl -sS
-H "x-api-key: $API_KEY"
"$BASE/api/proxy?op=available-networks&subscriptionId=$SUB_ID" {
"ok": true,
"networks": [
{
"id": "b1c2d3e4f5g6h7j8k9m0n1p2",
"networkLabel": "DE-BER Berlin",
"country": "DE"
}
]
} 在 switch-network 请求中,将 networks[].id 用作 targetNetwork。
购买订阅
使用所选套餐从你的余额创建一个或多个新订阅。
可选字段:
couponCode:为购买应用有效优惠券。repeatCount:正整数,默认值为1;会按倍数增加每个新订阅的时长和价格。quantity:正整数,默认值为1;允许一次请求创建多个订阅。os:应用于所有新建代理的被动操作系统指纹;可选值为ios、macos、android、win10或win11。不适用于multi套餐。
{
"op": "purchase",
"planId": "k17m3q5v7n9p1r2t4w6y8z0a",
"couponCode": "MYCODE",
"repeatCount": 3,
"os": "ios",
"quantity": 2
} curl -sS -X POST
-H "x-api-key: $API_KEY"
-H "Content-Type: application/json"
-d '{"op":"purchase","planId":"k17m3q5v7n9p1r2t4w6y8z0a","repeatCount":3,"os":"ios","quantity":2}'
"$BASE/api/proxy" {
"ok": true,
"subscriptionId": "j97b2f6m1k4n8p3r5t7v9x0z",
"subscriptionIds": [
"j97b2f6m1k4n8p3r5t7v9x0z",
"n38k2f6m1k4n8p3r5t7v9x0z"
],
"subscriptions": [
{
"subscriptionId": "j97b2f6m1k4n8p3r5t7v9x0z",
"status": "active",
"activeUntil": 1767776000000,
"label": "12001 - NL - Private",
"networkLabel": "NL-AMS Amsterdam"
},
{
"subscriptionId": "n38k2f6m1k4n8p3r5t7v9x0z",
"status": "active",
"activeUntil": 1767776000000,
"label": "12002 - NL - Private",
"networkLabel": "NL-AMS Amsterdam"
}
]
} 如果只创建了一个订阅,网关可能返回 subscription 而不是 subscriptions。subscription/subscriptions 中的项目结构与 GET /api/proxy?op=subscriptions 返回的结构相同。
续订订阅
使用符合条件的续费套餐续订现有订阅。
可选字段:
couponCode:为续订应用有效优惠券。repeatCount:正整数,默认值为1;会同时按倍数增加续订时长和价格。
{
"op": "renew",
"subscriptionId": "j97b2f6m1k4n8p3r5t7v9x0z",
"planId": "q2w4e6r8t0y2u4i6o8p0a2s4",
"couponCode": "MYCODE",
"repeatCount": 3
} curl -sS -X POST
-H "x-api-key: $API_KEY"
-H "Content-Type: application/json"
-d '{"op":"renew","subscriptionId":"j97b2f6m1k4n8p3r5t7v9x0z","planId":"q2w4e6r8t0y2u4i6o8p0a2s4","repeatCount":3}'
"$BASE/api/proxy" {
"ok": true,
"subscriptionId": "j97b2f6m1k4n8p3r5t7v9x0z",
"endAt": 1770368000000
} 更改连接凭据
为已认证用户(JWT)或 API Key 拥有者名下的有效订阅重新生成连接凭据。
{
"op": "change-credentials",
"subscriptionId": "j97b2f6m1k4n8p3r5t7v9x0z"
} curl -sS -X POST
-H "x-api-key: $API_KEY"
-H "Content-Type: application/json"
-d '{"op":"change-credentials","subscriptionId":"j97b2f6m1k4n8p3r5t7v9x0z"}'
"$BASE/api/proxy" {
"ok": true,
"password": "q7N3x9Lp",
"vpn": "7f3d9d4a-8b9f-4a93-9f55-2d5e3b7f1c24"
} 设置自动轮换策略
为活跃订阅配置自动 IP 轮换。该设置仅适用于带有 "rotate": { "available": true } 的连接。
rotationPolicy 允许的值为 0、5、10、15、30、60(分钟)。传 0 可关闭自动轮换。
{
"op": "set-rotation-policy",
"subscriptionId": "j97b2f6m1k4n8p3r5t7v9x0z",
"rotationPolicy": 10
} curl -sS -X POST
-H "x-api-key: $API_KEY"
-H "Content-Type: application/json"
-d '{"op":"set-rotation-policy","subscriptionId":"j97b2f6m1k4n8p3r5t7v9x0z","rotationPolicy":10}'
"$BASE/api/proxy" {
"ok": true
} 更改连接网络
将活跃订阅迁移到另一个可用网络。
{
"op": "switch-network",
"subscriptionId": "j97b2f6m1k4n8p3r5t7v9x0z",
"targetNetwork": "b1c2d3e4f5g6h7j8k9m0n1p2"
} curl -sS -X POST
-H "x-api-key: $API_KEY"
-H "Content-Type: application/json"
-d '{"op":"switch-network","subscriptionId":"j97b2f6m1k4n8p3r5t7v9x0z","targetNetwork":"b1c2d3e4f5g6h7j8k9m0n1p2"}'
"$BASE/api/proxy" {
"ok": true,
"subscription": {
"subscriptionId": "j97b2f6m1k4n8p3r5t7v9x0z",
"status": "active",
"activeUntil": 1762592000000,
"userNote": "Client A",
"rotationPolicy": 10,
"label": "12001 - DE - Private",
"networkLabel": "DE-BER Berlin",
"credentials": {
"username": "u_6k8s9d",
"password": "p_2n4m6q"
},
"protocols": {
"http": "http://u_6k8s9d:[email protected]:12001",
"socks5": "socks5://u_6k8s9d:[email protected]:12001",
"vless": "vless://...",
"shadowsocks": "ss://..."
},
"rotate": {
"rotatePath": "/r/abcd1234",
"available": true
}
}
} 网关错误
400JSON body 无效400Body 必须是对象400缺少或未知op400planId/subscriptionId/targetNetwork/rotationPolicy缺失或无效400repeatCount或quantity无效400os无效401Unauthorized402余额不足403Forbidden404未找到订阅409当前订阅不支持该轮换策略设置409已售罄、套餐/网络未激活,或订阅状态无效409multi套餐不支持选择操作系统429Rate limited500Internal error