UPI · INDIA · INR
UPI-GIT5 API 接入文档
通过提链 CDK 建立隔离会话,批量创建提链任务,并在同一租户作用域内跟踪任务和自动支付状态。
BASE URL
https://rustupi.agiapi.top
- 当前协议
- HTTPS
- 当前端口
- 443
- 请求格式
- application/json
- 字符编码
- UTF-8
- 批次上限
- 5000 个任务
- 异步响应
- HTTP 202
所有公开接口统一使用固定入口。代码示例、OpenAPI 定义与第三方项目均以 https://rustupi.agiapi.top 为基础 URL。
AUTHENTICATION
鉴权与租户隔离
每个提链 CDK 对应一个独立租户。先创建 12 小时页面会话,再将返回的令牌放入后续请求头。
1验证 CDK
POST /api/link-cdk/status2创建会话
POST /api/link-cdk/session3携带令牌
X-Link-CDK-Session4访问本租户任务
/api/upi-git5/*创建提链 CDK 会话
curl -X POST 'https://rustupi.agiapi.top/api/link-cdk/session' \
-H 'Content-Type: application/json' \
-d '{"code":"LINK_CDK"}'
后续请求头
X-Link-CDK-Session: SESSION_TOKENQUICK START
批量提链完整流程
- 创建会话使用提链 CDK 换取
SESSION_TOKEN。 - 保存支付 CDK调用
/api/payment/configure登录选定支付平台并读取额度。 - 开启自动支付调用
/api/payment/settings,提交布尔值enabled: true。 - 创建批次提交 Access Token、代理列表及同一个
payment_provider_id。 - 轮询进度使用返回的
batch_id获取提链和支付状态。 - 处理结果读取
jobs[].result和jobs[].payment,直到支付进入终态。
关键请求参数
| 接口 | 参数 | 类型 | 要求 | 说明 |
|---|---|---|---|---|
/link-cdk/session | code | string | 必填 | 有效且未禁用的提链 CDK |
/payment/configure | provider_id | string | 必填 | foarge、xxsyun、astrascan 或 cdkscan |
/payment/configure | cdk | string | 必填 | 对应支付平台的支付 CDK |
/payment/settings | provider_id | string | 必填 | 必须与已配置平台及批次平台一致 |
/payment/settings | enabled | boolean | 必填 | 传入 JSON 布尔值 true 开启自动支付 |
/upi-git5/batch | tokens | string[] | 必填 | Access Token 数组,最多 5000 条 |
/upi-git5/batch | entry_proxies | string[] | 必填 | 代理数组,最多 5000 条 |
/upi-git5/batch | link_cdk | string | 必填 | 必须与请求头会话绑定的提链 CDK 一致 |
/upi-git5/batch | payment_provider_id | string | 自动支付必填 | 必须与配置并开启的平台一致,默认 foarge |
/upi-git5/batch | use_promo | boolean | 选填 | 严格 0 元模式固定为 true;传 false 将拒绝请求 |
/upi-git5/batch | promo_campaign | string | 选填 | 默认 plus-1-month-free |
/batch/{id}/progress | summary_only | boolean | 选填 | 只返回批次计数,不返回任务数组;大批次轮询优先使用 |
/batch/{id}/progress | since | number | 选填 | 传入上次响应的 cursor,只返回之后变化的任务 |
/batch/{id}/progress | result | string | 选填 | none、compact 或 full;高并发轮询使用 compact |
/batch/{id}/progress | include_payment | boolean | 选填 | 是否携带 payment;只看提链状态时设为 false |
/batch/{id}/progress | offset | integer | 选填 | 稳定变化集的分页偏移,默认 0 |
/batch/{id}/progress | limit | integer | 选填 | 每页最多 1000 条;终态批次分页导出时读取 next_offset |
JavaScript 提链 + 自动支付完整示例
const BASE_URL = 'https://rustupi.agiapi.top';
const LINK_CDK = 'LINK_CDK';
const PAYMENT_PROVIDER_ID = 'foarge';
const sessionResponse = await fetch(`${BASE_URL}/api/link-cdk/session`, {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({code: LINK_CDK})
});
const session = await sessionResponse.json();
if (!sessionResponse.ok) throw new Error(session.error?.message || '会话创建失败');
const headers = {
'Content-Type': 'application/json',
'X-Link-CDK-Session': session.token
};
async function scopedRequest(path, options = {}) {
const response = await fetch(`${BASE_URL}${path}`, {
...options,
headers: {...headers, ...(options.headers || {})}
});
const data = await response.json();
if (!response.ok) {
throw new Error(data.error?.message || data.error || `HTTP ${response.status}`);
}
return {response, data};
}
// 1. 保存并登录支付平台 CDK,同时取得剩余次数。
const configured = await scopedRequest('/api/payment/configure', {
method: 'POST',
body: JSON.stringify({
provider_id: PAYMENT_PROVIDER_ID,
cdk: 'PAYMENT_CDK'
})
});
if (!configured.data.quota_known || configured.data.quota_blocked) {
throw new Error('支付 CDK 额度不可用');
}
// 2. 开启当前提链 CDK 租户的自动支付。
await scopedRequest('/api/payment/settings', {
method: 'POST',
body: JSON.stringify({
provider_id: PAYMENT_PROVIDER_ID,
enabled: true
})
});
// 3. 创建提链批次。平台标识必须与上面配置的平台一致。
const batchResponse = await fetch(`${BASE_URL}/api/upi-git5/batch`, {
method: 'POST',
headers,
body: JSON.stringify({
tokens: ['ACCESS_TOKEN'],
entry_proxies: ['socks5://HOST:PORT'],
link_cdk: LINK_CDK,
payment_provider_id: PAYMENT_PROVIDER_ID,
use_promo: true,
promo_campaign: 'plus-1-month-free'
})
});
const batch = await batchResponse.json();
if (batchResponse.status !== 202) {
throw new Error(batch.error?.message || batch.error || '批次创建失败');
}
// 4. 使用游标增量轮询。Map 保存本地状态,不创建任务卡片 DOM。
const paymentTerminal = new Set([
'completed', 'failed', 'expired', 'cancelled',
'quota_insufficient', 'submit_failed', 'tracking_failed'
]);
const jobs = new Map(batch.jobs.map(job => [job.job_id, job]));
let cursor = 0;
let snapshot;
let finished;
do {
await new Promise(resolve => setTimeout(resolve, 3000));
({data: snapshot} = await scopedRequest(
`/api/upi-git5/batch/${batch.batch_id}/progress?`
+ new URLSearchParams({
since: String(cursor),
result: 'compact',
include_payment: 'true'
}),
{method: 'GET'}
));
for (const job of snapshot.jobs) jobs.set(job.id, {...jobs.get(job.id), ...job});
cursor = snapshot.cursor;
finished = !snapshot.running && snapshot.payment_active === 0;
} while (!finished);
for (const job of jobs.values()) {
console.log({
email: job.account_email,
link_status: job.status,
payment_status: job.payment?.status,
payment_order_id: job.payment?.order_id,
payment_error: job.payment?.error
});
}
超大批次低开销轮询
只需要批次完成度时使用汇总模式;该请求不序列化任务结果、支付对象和日志,适合 1000 至 5000 任务批次。活动批次读取任务变化时不设置分页参数,避免任务持续更新导致分页窗口变化;批次进入终态后再使用 offset 与 limit 分页导出。
汇总轮询请求
GET /api/upi-git5/batch/BATCH_ID/progress?summary_only=true&result=none&include_payment=false
X-Link-CDK-Session: SESSION_TOKEN
{
"batch_size": 5000,
"completed": 3200,
"succeeded": 2810,
"failed": 390,
"running": true,
"payment_active": 146,
"jobs": []
}
ENDPOINT REFERENCE
接口目录
没有匹配的接口。
STATE MACHINE
状态枚举
| 对象 | 状态 | 含义 |
|---|---|---|
| 提链任务 | queued | 等待全站及当前 CDK 并发调度 |
| 提链任务 | running | 任务正在执行 |
| 提链任务 | done | 成功出链,结果位于 result |
| 提链任务 | error | 任务失败,原因位于 error |
| 提链任务 | cancelled | 任务已停止 |
| 支付 | not_submitted | 尚未提交或自动提交关闭 |
| 支付 | queued / submission_waiting | 进入支付队列或等待平台限速 |
| 支付 | submitting | 正在向支付平台创建订单 |
| 支付 | tracking_retrying | 订单状态查询处理中 |
| 支付 | completed | 支付成功 |
| 支付 | failed / expired / cancelled | 支付终态 |
| 支付 | quota_insufficient / submit_failed / tracking_failed | 额度、提交或查询失败 |
ERROR HANDLING
错误处理
优先读取结构化错误的 error.message;兼容少数参数校验接口返回的字符串型 error。
结构化错误
{
"ok": false,
"error": {
"code": "ERROR_CODE",
"message": "错误说明"
}
}
兼容错误
{
"error": "错误说明"
}
| HTTP | 处理方式 |
|---|---|
400 | 修正请求字段、平台标识或 CDK 配置 |
401 | 重新创建提链 CDK 页面会话 |
403 | 当前 CDK 不可用,或资源不属于当前租户 |
404 | 任务、批次、CDK 或二维码不存在 |
409 | 额度正在占用、CDK 正忙或状态冲突 |
429 | 读取 Retry-After 后重新提交 |
502 | 支付平台网络错误或返回内容无效 |
INTEGRATION NOTES
接入约定
- Rust API v1.2 兼容 Python
upi_server实际注册的 24 个公开操作;现有项目保留方法、路径、请求字段、响应码和X-Link-CDK-Session,只需将 Base URL 指向 Rust 服务。旧文档另外列出的姓名 GET/POST 与 CAPTCHA 入口也已兼容;未注册到upi_server的POST /api/checkout,Rust 以提链 CDK 会话兼容入口提供。 - 第三方程序统一使用公开服务地址
https://rustupi.agiapi.top。 - 创建批次时,请求体的
link_cdk必须与X-Link-CDK-Session对应的 CDK 一致。 - 任务、批次、支付配置和支付 CDK 均按提链 CDK 隔离,跨租户访问返回
403。 - 批次创建和支付手动提交返回
202 Accepted,需要继续轮询状态。 - 支付平台标识为
foarge、xxsyun、astrascan、cdkscan,默认使用foarge。 GET /api/checkout-qr成功时返回image/png,不要按 JSON 解析。- 批次轻量轮询使用
/progress;只有需要完整日志时才读取批次详情。 - 高并发客户端先用
summary_only=true读取计数;需要任务变化时传入上次cursor作为since。 - 实时任务回收使用
result=compact;仅在诊断单个任务时调用/checkout-progress或完整批次详情。 - 轮询间隔使用 3 至 5 秒并加入随机抖动;收到
429时严格遵循Retry-After。 - 不可融合 CDK 可以作为目标 CDK 接收额度,但不能作为来源 CDK 转出额度。
- 同一支付订单会绑定提交时的平台和支付 CDK,后续更换当前支付 CDK 不影响既有订单查询。