BURSTPRO UPIAPI
API 檢測中 返回生成頁
PUBLIC REST API

UPI 生成 API

使用 CDK 與 ChatGPT Access Token 建立非同步 UPI 任務,透過輪詢或 SSE 取得進度,完成後讀取 Stripe UPI 付款連結。

HTTPSJSONSSETask Token
BASE URL https://upi.burstpro-ai.online

公開端點使用 /api

01
QUICK START

三步取得付款連結

校驗 CDK、建立任務,最後使用任務讀取憑證查詢結果。

1

檢查 CDK

POST /api/check-cdk
2

建立任務

POST /api/activate
3

查詢結果

GET /api/tasks/{id}
POST/api/activate
curl --request POST 'https://upi.burstpro-ai.online/api/activate' \
  --header 'Content-Type: application/json' \
  --data '{
    "cdk": "BURSTUPI-XXXX-XXXX-XXXX-XXXX",
    "access_token": "YOUR_CHATGPT_ACCESS_TOKEN"
  }'
02
AUTHENTICATION

兩層憑證,分開保管

CDK

建立與重新生成

CDK 放在 JSON 請求內容中。成功任務消耗一次;失敗任務會釋放原先鎖定的次數。

TOKEN

讀取任務

建立任務後只會回傳一次 read_token。後續請放入 X-Task-Token 請求標頭。

請勿公開 Access Token 或 read_tokenAccess Token 僅用於任務執行;API 不會將其寫入任務資料庫。重新生成憑證最多保留 30 分鐘。
GET/api/health
無需認證

健康狀態

確認服務、代理池、任務佇列及目前 worker 數量。

{
  "ok": true,
  "service": "burstpro-upi-public",
  "workers": 32,
  "queue_depth": 0,
  "queue_max": 300,
  "queue_ready": true,
  "proxy_ready": true
}
POST/api/check-cdk
每 IP 60 次/分鐘

校驗 CDK 與查詢額度

此操作不扣減額度。回傳總次數、已使用、鎖定中及剩餘次數。

欄位類型必填說明
cdkstringBurstPro UPI CDK
REQUEST
{"cdk":"BURSTUPI-XXXX-XXXX-XXXX-XXXX"}
200 RESPONSE
{
  "ok": true,
  "valid": true,
  "max_uses": 999,
  "used_count": 29,
  "reserved_count": 2,
  "remaining": 968
}
POST/api/activate
CDK

建立 UPI 任務

成功時回傳 HTTP 202,並原子鎖定一次 CDK 額度。請立即保存 task_idread_token

欄位類型必填說明
cdkstring有效 CDK
access_tokenstring / JSONJWT、Bearer Token 或 Session JSON
emailstringToken 無法取得信箱時的備用值
202 RESPONSE
{
  "ok": true,
  "task_id": "upi_pub_0123456789abcdef",
  "read_token": "SAVE_THIS_TOKEN",
  "status": "queued",
  "queue_position": 1,
  "email": "user@example.com"
}
GET/api/tasks/{task_id}
X-Task-Token

查詢任務狀態

建議每 2–5 秒輪詢一次。完成後的 result_url 即 Stripe UPI 付款連結。

REQUEST
curl 'https://upi.burstpro-ai.online/api/tasks/TASK_ID' \
  --header 'X-Task-Token: READ_TOKEN'
{
  "ok": true,
  "task": {
    "task_id": "upi_pub_...",
    "status": "completed",
    "stage": "completed",
    "progress": 100,
    "attempt": 2,
    "max_attempts": 6,
    "result_url": "https://payments.stripe.com/...",
    "expires_at": "2026-07-25T09:05:00Z",
    "expired": false,
    "can_regenerate": true
  }
}
GET/api/tasks/{task_id}/events
一次性 Ticket

SSE 即時進度

先取得 60 秒有效的一次性 ticket,再使用 EventSource 訂閱。SSE 中斷時請回退到狀態輪詢。

1. 取得 Ticket
POST /api/tasks/{id}/events-ticket
X-Task-Token: READ_TOKEN

{"events_url":"/api/tasks/{id}/events?ticket=..."}
2. 訂閱
const stream = new EventSource(
  base + ticket.events_url
)
stream.onmessage = event => {
  console.log(JSON.parse(event.data).task)
}
POST/api/tasks/{task_id}/regenerate
CDK + X-Task-Token

重新生成

任務結束後 30 分鐘內可沿用加密暫存的 Access Token,不必再次傳送。回應會提供新的 task_idread_token

curl --request POST 'https://upi.burstpro-ai.online/api/tasks/TASK_ID/regenerate' \
  --header 'X-Task-Token: READ_TOKEN' \
  --header 'Content-Type: application/json' \
  --data '{"cdk":"BURSTUPI-XXXX-XXXX-XXXX-XXXX"}'
POST/api/qr
X-Task-Token

取得 QR Code

只允許已完成且屬於該讀取憑證的任務。成功回傳 image/png

curl --request POST 'https://upi.burstpro-ai.online/api/qr' \
  --header 'X-Task-Token: READ_TOKEN' \
  --header 'Content-Type: application/json' \
  --data '{"task_id":"TASK_ID"}' \
  --output upi-qr.png
03
STATUS & RESULT

任務狀態

queuedrunningcompletedfailed/cancelled

queued 為排隊中,running 為處理中。只有 completed 會回傳有效的 result_url;詳細上游日誌不會透過公開 API 洩漏。

04
ERROR REFERENCE

常見錯誤碼

400access_token_invalid

Access Token 或 Session JSON 格式不正確。

403cdk_invalid / cdk_unavailable

CDK 不存在、停用、到期或無可用次數。

404task_not_found

任務不存在,或 X-Task-Token 不正確。

409active_task

原任務仍在排隊或執行,不能重新生成。

410credential_expired

30 分鐘重新生成憑證已失效。

429rate_limited / queue_full

請求過於頻繁或佇列已滿。

503service_unavailable / queue_failed

UPI、代理或任務佇列暫時未就緒。

05
LIMITS & SECURITY

限制與安全規則

32同步任務 workers
300最大排隊任務
8/min建立/重新生成,每 IP
128 KiB最大 JSON 請求
  • 建議只從後端伺服器呼叫,不要把 Access Token 寫入前端程式碼、URL 或日誌。
  • 請把 read_token 視為任務專用密碼;遺失後無法重新讀取該任務。
  • UPI QR 時效短,收到 completed 後應立即呈現付款連結與 QR Code。
  • CDK 在任務建立時鎖定一次;成功才扣除,失敗會自動釋放。
06
CLIENT EXAMPLE

Python 完整輪詢範例

Python requests
import time
import requests

base = "https://upi.burstpro-ai.online"
created = requests.post(f"{base}/api/activate", json={
    "cdk": "BURSTUPI-XXXX-XXXX-XXXX-XXXX",
    "access_token": "YOUR_CHATGPT_ACCESS_TOKEN",
}, timeout=30)
created.raise_for_status()
job = created.json()

headers = {"X-Task-Token": job["read_token"]}
while True:
    response = requests.get(
        f"{base}/api/tasks/{job['task_id']}",
        headers=headers,
        timeout=20,
    )
    response.raise_for_status()
    task = response.json()["task"]
    if task["status"] == "completed":
        print(task["result_url"])
        break
    if task["status"] in {"failed", "cancelled"}:
        raise RuntimeError(task["status"])
    time.sleep(2)