API
面板的全部功能都可以通过两套独立的 API 使用。两者用的是同一个账户、同一份余额、同一个服务目录,区别在于格式和能力。
面板的全部功能都可以通过两套独立的 API 使用。两者用的是同一个账户、同一份余额、同一个服务目录,区别在于格式和能力。
为什么有两套 API
整个行业通用的经典分销商 API (v2) 向单一端点提交表单,并且始终返回 HTTP 200。现成的面板软件期待的正是这种格式,所以它原封不动地保留下来。而自己写系统的开发者一直卡在这种格式的限制上:错误无法区分,服务目录整块返回,订单状态只能不停地轮询。v3 就是为这类需求而写的。
对比
| 特性 | 旧版 (v2) | 新版 (v3) |
|---|---|---|
| 格式 | 单一端点、表单提交、action 参数 | 面向资源的 REST,JSON 正文 |
| HTTP 状态码 | 即使失败也始终是 200 | 真实状态码(400、401、402、404、409、429、502) |
| 错误 | 自由文本 | type + 固定的 code + 本地化消息 + param + doc_url |
| 订单状态 | 只有本地化文本 | 固定的机器值,另外还有单独的展示标签 |
| 服务说明 | 没有 | 10 种语言的说明、平均耗时、平台、分类 |
| 订单字段 | 靠类型名称推测 | 每个服务发布自己的字段结构 |
| 价格单位 | 未标明(套餐类服务出现 1000 倍误差的根源) | 明确标为 per_1000 或 per_order |
| 服务目录 | 一次响应返回全部服务 | 筛选条件加游标分页 |
| 重复下单防护 | 没有 | Idempotency-Key |
| 状态通知 | 持续轮询 | 带签名的 Webhook 或事件流 |
| 接口描述 | 没有 | OpenAPI 3.1 |
| 语言 | 英语和土耳其语(分属不同地址) | 10 种语言(用标头或参数指定) |
我该选哪一个
如果你用的是现成的面板软件、机器人或分销面板,请选旧版 API。多数软件只要求你改一下 API 地址和密钥,几分钟就能跑起来。
如果你在写自己的应用、商店或自动化流程,请选 v3。错误处理、重复下单防护和通知机制都是现成的,订单表单也可以直接由服务字段结构生成。
开始使用
- 1在“密钥”标签页创建一个 API 密钥。
- 2拉取服务列表,查看要用的服务的 id 和字段结构。
- 3先用 preview 校验订单,然后再正式创建。
- 4注册一个 Webhook,或读取事件流,来跟踪状态变化。
为自建系统的开发者设计的 REST API:面向资源的路径、真实的 HTTP 状态码、机器可读的错误、带签名的通知。
基础地址
所有路径都接在这个地址后面。版本写在路径里:如果哪天需要做破坏性改动,会发布一条新路径(v4),而现有路径原样继续工作。接口约定的发布日期会在每个响应的 X-Api-Version 标头里返回。
https://panelfollows.com/api/v3身份验证
把 API 密钥作为 Bearer 令牌放在 Authorization 标头里发送。另外也接受 X-Api-Key 标头。
GET https://panelfollows.com/api/v3/account
Authorization: Bearer pf_live_...你现有的旧版密钥在 v3 里同样可用,所以可以马上试。生产环境请改用 v3 密钥:它可以打标签、可以逐个吊销,而且不会以明文形式存放。
快速上手
curl https://panelfollows.com/api/v3/services?limit=5 \
-H "Authorization: Bearer YOUR_API_KEY"语言
响应语言由 Accept-Language 标头或 ?lang= 参数决定,参数优先于标头。服务名称、服务说明、分类名称、订单状态标签、订单字段标签和错误消息,都会用你选定的语言返回。
机器值在任何语言下都不会变:error.code、order.status、service.type 和 currency 始终一致。把判断条件写在这些值上,把文本展示给用户。
Accept-Language: tr
# veya
GET https://panelfollows.com/api/v3/services?lang=tr请求与响应格式
请求正文是 JSON(application/json);快速试用时也接受 form-urlencoded。响应是 JSON:单个资源是一个普通对象,列表则包在带 data、has_more 和 next_cursor 的信封里。每个对象都带一个 object 字段,用来说明自己的类型。
金额以十进制字符串("1.2340")返回,不是浮点数。请在客户端也用十进制类型处理,避免丢失零头。币种为 USD。
时间戳采用 RFC 3339 格式(2026-08-21T00:24:45.255Z)。
错误
出错时会返回真实的 HTTP 状态码,正文里带一个 error 对象。你的代码应该根据 error.code 分支:这个值是固定的,不随语言变化。
HTTP/1.1 400 Bad Request
Content-Type: application/json
X-Request-Id: req_0c858d8af7f65eca001b2f5a
{
"object": "error",
"error": {
"type": "invalid_request_error",
"code": "quantity_out_of_range",
"message": "Miktar, bu servisin izin verdiği aralığın dışında.",
"param": "quantity",
"doc_url": "https://panelfollows.com/api-docs#error-quantity_out_of_range",
"request_id": "req_0c858d8af7f65eca001b2f5a"
}
}| type | 大类:说明是否值得重试,还是调用方自己出了问题。 |
| code | 固定的机器值。判断条件请写在它上面。 |
| message | 用你选定语言写的、给人看的说明。 |
| param | 引发错误的字段名(如果有)。 |
| doc_url | 指向本文档中对应小节的链接。 |
| request_id | 联系技术支持时需要提供的唯一凭据。 |
请求限制
每个密钥每分钟 600 次请求,另外每个 IP 每分钟 900 次。每个响应都会带上 RateLimit-Limit、RateLimit-Remaining 和 RateLimit-Reset 标头,你可以在撞到上限之前自行减速。超出限制会返回 429 以及 Retry-After 标头。
分页
列表按游标分页。用 limit 指定每页条数(最多 500),用 starting_after 传上一页最后一条记录的 id。一直翻到 has_more 为 false 为止;next_cursor 直接给出下一次请求要用的游标。超出范围的 limit 不会被悄悄截断,而是返回错误:悄悄截断会让客户端误以为“已经全部取完了”。
重复下单防护(Idempotency-Key)
创建订单时,请在请求里加一个随机的 Idempotency-Key 标头。如果网络中断后你用同一个密钥重试,不会产生第二笔订单:第一次请求的响应会原样返回,并带上 Idempotent-Replay: true 标头。记录保留 24 小时。
用同一个键配上不同的正文发送,会返回 409 idempotency_key_reuse。这几乎总是说明客户端这边的键生成逻辑坏了。失败的请求不会烧掉这个键:修好问题后可以用同一个键继续重试。
创建订单
curl -X POST https://panelfollows.com/api/v3/orders \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 8f14e45f-ea3a-4b1c-9c1e-2b0d5c6a7e91" \
-d '{
"service": 1234,
"link": "https://instagram.com/username",
"quantity": 1000
}'服务字段结构
每个服务都会在 fields 数组里发布下单时需要哪些字段:字段名、类型、是否必填、取值范围,以及用户所用语言的标签和说明。如果某个字段的 determines_quantity 为 true,数量就按该字段里的行数计算。
// Servisin kendi alan şemasından formu OTOMATİK üretmek:
// hiçbir servis tipini koda gömmeniz gerekmez.
const res = await fetch("https://panelfollows.com/api/v3/services/1234", {
headers: { Authorization: "Bearer YOUR_API_KEY", "Accept-Language": "tr" },
});
const service = await res.json();
for (const field of service.fields) {
renderInput({
name: field.name,
label: field.label, // kullanıcının dilinde
hint: field.description, // kullanıcının dilinde
required: field.required,
type: field.type, // url | integer | string | text_lines
min: field.min,
max: field.max,
// true ise miktarı bu alanın satır sayısı belirler
countsLines: field.determines_quantity === true,
});
}服务对象
{
"object": "service",
"id": 1234,
"name": "Instagram Takipçi | Türk | 30 gün telafi",
"description": "Gerçek hesaplardan Türk takipçi. Başlangıç 0-1 saat.",
"type": "default",
"platform": "instagram",
"category": { "slug": "instagram-takipci", "name": "Instagram Takipçi" },
"pricing": {
"rate": "1.2340",
"currency": "USD",
"unit": "per_1000",
"unit_note": "Fiyat 1000 adet içindir."
},
"limits": { "min": 100, "max": 100000 },
"features": { "refill": true, "cancel": false, "dripfeed": true },
"average_time_seconds": 4320,
"fields": [
{
"name": "link",
"type": "url",
"required": true,
"label": "Bağlantı",
"description": "Gönderimin yapılacağı profilin herkese açık adresi."
},
{
"name": "quantity",
"type": "integer",
"required": true,
"label": "Miktar",
"description": "Kaç adet gönderileceği.",
"min": 100,
"max": 100000
}
],
"is_active": true,
"updated_at": "2026-08-20T09:15:00.000Z"
}订单预览(试运行)
POST /orders/preview 会在不创建订单的前提下完成校验并算出费用。你可以把价格展示给客户,也可以提前确认余额是否够用。不会扣除余额,也不会发给供应商。
批量下单
用 POST /orders/batch 一次调用最多可以提交 50 笔订单。各条目按顺序处理,每条各自返回结果:即使其中一条失败,其余的照样创建,并且能从该条目的结果里看到是哪一条失败、为什么失败。
内嵌关联对象
在订单相关端点上传 include=service,服务对象就会内嵌在响应里,省掉第二次请求。
端点参考
| 方法 | 端点 | 说明 |
|---|---|---|
| GET | /api/v3 | Discovery document: version, endpoints, limits and event types. |
| GET | /api/v3/openapi.json | OpenAPI 3.1 schema for this API. |
| GET | /api/v3/account | Account balance, currency and current rate-limit window. |
| PATCH | /api/v3/account | Set the low balance alert threshold that triggers account.low_balance. |
| GET | /api/v3/services | List services with filters and cursor pagination. |
| GET | /api/v3/services/{id} | Retrieve one service, including its order field schema. |
| GET | /api/v3/categories | List categories with their active service counts. |
| GET | /api/v3/platforms | List platform keys usable as the ?platform= filter, with counts. |
| POST | /api/v3/orders | Create an order. Supports the Idempotency-Key header. |
| POST | /api/v3/orders/preview | Validate an order and compute its charge without creating it. |
| POST | /api/v3/orders/batch | Create up to 50 orders in one call; each item reports its own result. |
| GET | /api/v3/orders | List your orders, newest first. |
| GET | /api/v3/orders/{id} | Retrieve one order. |
| POST | /api/v3/orders/{id}/cancel | Request cancellation. Only for services whose features.cancel is true. |
| POST | /api/v3/orders/{id}/refill | Request a refill for a completed order. |
| GET | /api/v3/refills | List your refill requests, newest first. |
| GET | /api/v3/refills/{id} | Retrieve one refill; refreshes its status from the provider. |
| GET | /api/v3/events | Read your event stream oldest-first; the polling alternative to webhooks. |
| GET | /api/v3/webhooks | List your webhook endpoints. |
| POST | /api/v3/webhooks | Register a webhook endpoint. The signing secret is returned once. |
| GET | /api/v3/webhooks/{id} | Retrieve one webhook endpoint. |
| PATCH | /api/v3/webhooks/{id} | Update a webhook endpoint's url, events, description or active state. |
| DELETE | /api/v3/webhooks/{id} | Delete a webhook endpoint and its delivery log. |
| POST | /api/v3/webhooks/{id}/test | Send a test event to this endpoint, ignoring its event filter. |
| POST | /api/v3/webhooks/{id}/rotate_secret | Generate a new signing secret. The old one stops working immediately. |
| GET | /api/v3/webhooks/{id}/deliveries | Delivery log for one endpoint: attempts, response codes and errors. |
OpenAPI 规范
所有端点的机器可读定义。把这个文件交给客户端生成器(openapi-generator、Kiota)或 Postman,就能直接得到你自己所用语言的客户端。
https://panelfollows.com/api/v3/openapi.json常见问题
我的旧版密钥能在 v3 上用吗
能。想试用不必另外生成新密钥。不过生产环境还是请换成 v3 密钥:它可以吊销,而且不会以明文保存。
价格为什么是字符串
浮点数在处理小数金额时会丢失精度。把金额以字符串返回、在客户端转成十进制类型处理,可以彻底消除这一类舍入差异。
unit 字段为什么重要
多数服务按每 1000 个计价(per_1000),但套餐类服务是按单件出售的(per_order),价格对应的是整个套餐。没有区分这一点的对接,把套餐价格算错了 1000 倍。
订单创建了,但状态一直停在 pending,是怎么回事
转交给供应商的过程可能延迟了。你的余额已经冻结,订单不会丢失;我们会自动重新发送。响应里的 processing_delayed 字段标示的就是这种状态。
所有服务都支持取消和补单吗
不是。请查看服务对象上的 features.cancel 和 features.refill。在不支持的服务上调用对应端点会返回 400。
我可以同时用两套 API 吗
可以。同一个账户、同一份余额、同一批订单。用 v2 创建的订单,可以用 v3 查询。
行业里通行的经典分销商 API。现成的面板软件期待的就是这种格式。
端点
POST https://panelfollows.com/api/v2
POST https://panelfollows.com/api/v2/tr身份验证
每个请求都要带上 key 参数。请把密钥保管好,一旦泄露立即重新生成。
请求与响应格式
请求用 POST 以表单形式(application/x-www-form-urlencoded)发送,响应是 JSON。即使出错也返回 HTTP 200,正文里是 { "error": "..." }。
还有一些以往没有写进文档但同样支持的用法:你可以用 GET 调用,也可以把正文按 application/json 发送。
请求限制
每个密钥每分钟 240 次请求,另外每个 IP 每分钟 300 次。超出的请求会以 429 拒绝。
操作与参数
| action | 参数 | 说明 |
|---|---|---|
| services | key, action | 列出所有在售服务(id、名称、分类、价格、最小 / 最大、补单、取消、分批发送)。 |
| add | key, action, service, link, quantity[, runs, interval, comments, username, posts, min, max] | 创建订单。service 是服务目录中的服务 id。分批发送请加上 runs 和 interval,特殊类型请传对应字段。 |
| status | key, action, order | orders | 订单状态。查单笔用 order,查多笔用逗号分隔的 orders。 |
| balance | key, action | 账户余额与币种。 |
| refill | key, action, order | orders | 创建补单申请,申请会直接转给供应商。 |
| refill_status | key, action, refill | refills | 查询补单状态。 |
| cancel | key, action, orders | 取消订单。仅在供应商支持取消的服务上有效。 |
示例
curl -X POST https://panelfollows.com/api/v2 \
-d "key=YOUR_API_KEY" \
-d "action=add" \
-d "service=1234" \
-d "link=https://instagram.com/username" \
-d "quantity=1000"
# Yanıt: { "order": 23501 }土耳其语响应
在地址末尾加上 /tr,就能收到土耳其语的服务名称、分类、订单状态和错误消息。参数、操作和响应结构完全一致,你的密钥在两个地址上都能用。技术性字段(type、refill_status、currency)为保持标准兼容仍是英文。
迁移到 v3
迁移不是必须的。如果你打算迁移,由于参数名称没变,业务逻辑的大部分都能保留;变化的是传输方式和读取错误的方法。
- 1把密钥从正文的 key 字段挪到 Authorization: Bearer 标头。
- 2改为调用资源路径,不再用 action=...(用 POST /orders 代替 add)。
- 3判断失败时看 HTTP 状态码和 error.code,而不是问“有没有 error 字段”。
- 4比较订单状态时用 status 机器值,而不是展示文本。
- 5创建订单时加上 Idempotency-Key。
- 6用 Webhook 取代轮询查询状态。
密钥可以访问你账户的全部内容。不要分享,不要嵌进客户端代码,也不要上传到公开仓库。
v3 密钥
你想创建多少密钥都可以,每个都能打标签,也能逐个吊销。服务器上只保存密钥的加密摘要。
创建免费账户旧版密钥
经典分销商 API (v2) 所用的唯一密钥。它在 v3 上同样可用。重新生成后,旧密钥会立刻失效。
安全
- 把密钥放在环境变量里,不要写进源代码。
- 不要把密钥放进在浏览器里运行的代码;请让请求经过你自己的服务器中转。
- 为每个系统单独创建一个密钥,这样吊销其中一个不会影响其他。
- 怀疑泄露时,先让新密钥投入使用,再吊销旧的那个。
订单状态一有变化,我们就会向你的服务器发送一条带签名的通知,你不必为了查状态而不停地请求。
为什么用 Webhook
轮询既慢又浪费:每分钟查询上千笔订单会吃光你的请求额度,而且你仍然要等上几分钟才知道变化。用 Webhook,变化发生的那一刻就会送到你手上。
配置
- 1准备一个公网可访问的 https 地址(本地地址和内网地址不被接受)。
- 2在下面添加地址,并保存只显示一次的签名密钥。
- 3在接收端校验签名,并返回 2xx。
- 4用测试发送按钮做一次端到端验证。
我们发送的请求
POST /hooks/pf HTTP/1.1
Content-Type: application/json
Webhook-Id: evt_7f910fba7cd042ef9d9069ba5c074fa0
Webhook-Timestamp: 1787261223
Webhook-Signature: t=1787261223,v1=9c1e2b0d5c6a7e91...
{
"object": "event",
"id": "evt_7f910fba7cd042ef9d9069ba5c074fa0",
"type": "order.completed",
"created_at": "2026-08-21T00:27:03.531Z",
"data": {
"previous_status": "in_progress",
"order": {
"object": "order",
"id": 23501,
"status": "completed",
"status_label": "Tamamlandı",
"service": 1234,
"quantity": 1000,
"start_count": 4210,
"remains": 0,
"charge": "1.2340",
"currency": "USD"
}
}
}校验签名
每个请求都带有 Webhook-Signature 标头:t 是时间戳,v1 是签名。签名是用你的密钥对 "<时间戳>.<原始正文>" 这个字符串计算出的 HMAC-SHA256。
- 1从标头中解析出 t 和 v1 两个值。
- 2确认 t 距现在不超过 5 分钟,以防重放攻击。
- 3用你的密钥计算 "<t>.<原始正文>" 的 HMAC-SHA256。
- 4把结果与 v1 做恒定时间比较,不一致就拒绝该请求。
校验示例
import crypto from "node:crypto";
import express from "express";
const app = express();
// ÖNEMLİ: imza HAM gövde üzerinden hesaplanır. JSON'a çevirip yeniden
// dizeye dönüştürürseniz boşluklar değişir ve imza tutmaz.
app.post("/hooks/pf", express.raw({ type: "application/json" }), (req, res) => {
const raw = req.body.toString("utf8");
const header = req.get("Webhook-Signature") ?? "";
const m = /t=(\d+),v1=([0-9a-f]+)/.exec(header);
if (!m) return res.sendStatus(400);
const [, timestamp, signature] = m;
// Tekrar saldırısına karşı: 5 dakikadan eski damgayı reddet.
if (Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return res.sendStatus(400);
const expected = crypto
.createHmac("sha256", process.env.WEBHOOK_SECRET)
.update(`${timestamp}.${raw}`, "utf8")
.digest("hex");
const ok =
expected.length === signature.length &&
crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature));
if (!ok) return res.sendStatus(401);
const event = JSON.parse(raw);
// 2xx dönmezseniz gönderim artan aralıklarla tekrar denenir.
res.sendStatus(200);
if (event.type === "order.completed") {
// ... siparişi kendi sisteminizde tamamlandı olarak işaretleyin
}
});重试
第一次投递在事件发生时立即进行。如果返回的不是 2xx,或者连接不上,会在 1 分钟、5 分钟、30 分钟、2 小时和 6 小时后再次尝试。总共 6 次之后仍未成功,该次投递会被标记为失败,并出现在投递日志中。
事件类型
你可以只订阅关心的类型,也可以全部接收。订单状态变化时只会产生一个事件,系统会挑选最贴合新状态的类型。
| order.created | 订单已创建。 |
| order.processing | 供应商已开始处理该订单。 |
| order.completed | 订单已完成。 |
| order.partial | 订单只完成了一部分,剩余部分已退款。 |
| order.canceled | 订单已取消或已退款。 |
| order.updated | 状态以上述之外的方式发生了变化。 |
| refill.created | 补单申请已创建。 |
| refill.updated | 补单状态发生了变化。 |
| account.low_balance | 你的余额已低于通过 PATCH /account 设置的阈值。仅在跨越阈值时触发一次,而非每笔订单都触发;余额回到阈值以上后会重新启用。 |
如果你没法搭建 Webhook
同样的事件可以用游标从 GET /api/v3/events 读取。本地开发时、没有固定 IP 时,或者处在防火墙后面时,请走这条路。
// Webhook kuramıyorsanız (yerelde geliştirme, sabit IP yok) aynı bilgiyi
// imleçle çekebilirsiniz. İmleci kendi tarafınızda saklayın.
let cursor = loadCursor(); // en son işlediğiniz olayın "cursor" değeri
const url = new URL("https://panelfollows.com/api/v3/events");
url.searchParams.set("limit", "100");
if (cursor) url.searchParams.set("starting_after", String(cursor));
const res = await fetch(url, { headers: { Authorization: "Bearer YOUR_API_KEY" } });
const { data, has_more } = await res.json();
for (const event of data) {
handle(event); // sizin işleyiciniz
cursor = event.cursor; // imleci ilerlet
}
saveCursor(cursor);错误 (48)
| 代码 | 状态 | 说明 |
|---|---|---|
| missing_api_key | 401 | 未提供 API 密钥。请通过 'Authorization: Bearer <key>' 发送。 |
| invalid_api_key | 401 | 提供的 API 密钥无效。 |
| revoked_api_key | 401 | 该 API 密钥已被吊销,无法再使用。 |
| account_banned | 403 | 该账户已被封禁。 |
| account_suspended | 403 | 该账户已被暂停。 |
| insufficient_scope | 403 | 该 API 密钥没有访问此端点的权限。 |
| invalid_json | 400 | 请求体不是有效的 JSON。 |
| unsupported_content_type | 415 | 不支持的 Content-Type。请使用 application/json 或 application/x-www-form-urlencoded。 |
| method_not_allowed | 405 | 此端点不允许使用该 HTTP 方法。 |
| payload_too_large | 413 | 请求体过大。 |
| missing_parameter | 400 | 缺少必填参数。 |
| invalid_parameter | 400 | 参数值无效。 |
| invalid_link | 400 | 链接缺失或不是有效的 http(s) 网址。 |
| invalid_quantity | 400 | 数量不是有效的正整数。 |
| quantity_out_of_range | 400 | 数量超出该服务允许的范围。 |
| invalid_comments | 400 | 评论字段为空或行数过多。 |
| invalid_username | 400 | 该用户名对此服务无效。 |
| invalid_subscription | 400 | 订阅参数无效。 |
| invalid_runs | 400 | 分批投放的 'runs' 值无效。 |
| invalid_interval | 400 | 分批投放的 'interval' 值无效。 |
| dripfeed_not_supported | 400 | 该服务不支持分批投放。 |
| missing_required_field | 400 | 此服务类型所需的字段缺失或无效。 |
| service_inactive | 400 | 该服务当前无法下单。 |
| invalid_cursor | 400 | 分页游标无效。 |
| invalid_limit | 400 | 'limit' 参数超出允许范围。 |
| invalid_webhook_url | 400 | Webhook 网址必须是公开的 https:// 地址。 |
| invalid_events | 400 | 请求的事件类型中有一个或多个未知。 |
| batch_too_large | 400 | 单次批量请求中的条目过多。 |
| cancel_not_supported | 400 | 该服务不支持取消。 |
| refill_not_supported | 400 | 该服务不提供补量。 |
| unknown_endpoint | 404 | 未知端点。可用路由请参阅 API 参考文档。 |
| service_not_found | 404 | 不存在该 id 的服务。 |
| order_not_found | 404 | 您的账户中不存在该 id 的订单。 |
| refill_not_found | 404 | 您的账户中不存在该 id 的补量记录。 |
| webhook_not_found | 404 | 您的账户中不存在该 id 的 Webhook 端点。 |
| order_not_cancelable | 409 | 由于当前状态,该订单已无法取消。 |
| cancel_rejected | 409 | 供应商拒绝了取消请求。 |
| order_not_completed | 409 | 只能为已完成的订单申请补量。 |
| duplicate_link | 409 | 该链接已有进行中的订单。请等待其完成。 |
| idempotency_key_reuse | 409 | 该 Idempotency-Key 已用于其他请求体。 |
| idempotency_in_progress | 409 | 使用该 Idempotency-Key 的请求仍在处理中。请稍后重试。 |
| webhook_limit_reached | 409 | 您已达到 Webhook 端点数量上限。 |
| insufficient_balance | 402 | 余额不足以支付该订单。 |
| rate_limit_exceeded | 429 | 超出速率限制。请参阅 Retry-After 响应头。 |
| provider_error | 502 | 供应商返回了错误。请重试。 |
| refill_failed | 502 | 补量请求被供应商拒绝。 |
| service_temporarily_unavailable | 503 | 该服务暂时不可用。请稍后重试。 |
| internal_error | 500 | 我方发生了意外错误。 |