OpenAI OAuth 卡密兑换 · 质保 1 小时
卡密是一串类似 OPENAI-XXXX-XXXX-XXXX 的兑换码,每张可以兑换一个 OpenAI (ChatGPT) OAuth 账号。
提卡后享有 1 小时 质保。号不可用时:
最多换号 5 次 · 超时卡密失效
提卡返回两种格式:
account_info.cpa) — 保存为 .json 放入 cpa 的 auths/ 目录account_info.sub2api) — 直接导入 sub2api 等代理工具提卡 / 质保换号。
| 请求字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| card_key | string | 是 | 卡密 |
| note | string | 否 | 备注 |
curl -X POST https://team.cat68.com/api/redeem \ -H "Content-Type: application/json" \ -d '{"card_key":"OPENAI-XXXX-XXXX-XXXX"}'
import httpx, asyncio async def redeem(card_key: str): async with httpx.AsyncClient() as c: r = await c.post("https://team.cat68.com/api/redeem", json={"card_key": card_key}) return r.json() result = asyncio.run(redeem("OPENAI-XXXX-XXXX-XXXX")) print(result["account_info"]["cpa"]) # cpa 格式 print(result["account_info"]["sub2api"]) # sub2api 格式
const resp = await fetch("https://team.cat68.com/api/redeem", { method: "POST", headers: {"Content-Type": "application/json"}, body: JSON.stringify({ card_key: "OPENAI-XXXX-XXXX-XXXX" }), }); const data = await resp.json(); console.log(data.account_info.cpa); // cpa 格式 console.log(data.account_info.sub2api); // sub2api 格式
package main import ( "bytes" "encoding/json" "fmt" "net/http" ) func main() { body, _ := json.Marshal(map[string]string{ "card_key": "OPENAI-XXXX-XXXX-XXXX", }) resp, _ := http.Post( "https://team.cat68.com/api/redeem", "application/json", bytes.NewReader(body), ) defer resp.Body.Close() var result map[string]any json.NewDecoder(resp.Body).Decode(&result) fmt.Println(result["account_info"]) }
$ch = curl_init("https://team.cat68.com/api/redeem"); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_HTTPHEADER => ["Content-Type: application/json"], CURLOPT_POSTFIELDS => json_encode([ "card_key" => "OPENAI-XXXX-XXXX-XXXX", ]), CURLOPT_RETURNTRANSFER => true, ]); $data = json_decode(curl_exec($ch), true); curl_close($ch); print_r($data["account_info"]["cpa"]); // cpa 格式 print_r($data["account_info"]["sub2api"]); // sub2api 格式
| 响应字段 | 类型 | 说明 |
|---|---|---|
| success | bool | 是否成功 |
| message | string | 提示信息 |
| account_info.cpa | object | cpa 格式,含 access_token / refresh_token / email / account_id / plan_type |
| account_info.sub2api | object | sub2api 格式,含 credentials / concurrency / priority |
| is_warranty_replacement | bool | 是否为质保换号 |
| warranty_remaining | string | 质保剩余,"45分钟" / null |
| replacement_count | int | 已换号次数 |
校验卡密(不消耗)。
| 请求字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| card_key | string | 是 | 卡密 |
curl -X POST https://team.cat68.com/api/verify-card \ -H "Content-Type: application/json" \ -d '{"card_key":"OPENAI-XXXX-XXXX-XXXX"}'
import httpx, asyncio async def verify(card_key: str): async with httpx.AsyncClient() as c: r = await c.post("https://team.cat68.com/api/verify-card", json={"card_key": card_key}) return r.json() result = asyncio.run(verify("OPENAI-XXXX-XXXX-XXXX")) print(result["valid"], result["mode"])
const resp = await fetch("https://team.cat68.com/api/verify-card", { method: "POST", headers: {"Content-Type": "application/json"}, body: JSON.stringify({ card_key: "OPENAI-XXXX-XXXX-XXXX" }), }); const { valid, mode } = await resp.json(); console.log(valid, mode);
func verify(cardKey string) (map[string]any, error) { body, _ := json.Marshal(map[string]string{ "card_key": cardKey, }) resp, _ := http.Post( "https://team.cat68.com/api/verify-card", "application/json", bytes.NewReader(body), ) defer resp.Body.Close() var result map[string]any json.NewDecoder(resp.Body).Decode(&result) return result, nil }
$ch = curl_init("https://team.cat68.com/api/verify-card"); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_HTTPHEADER => ["Content-Type: application/json"], CURLOPT_POSTFIELDS => json_encode([ "card_key" => "OPENAI-XXXX-XXXX-XXXX", ]), CURLOPT_RETURNTRANSFER => true, ]); $data = json_decode(curl_exec($ch), true); curl_close($ch); echo $data["valid"] ? "有效" : "无效"; echo " [" . $data["mode"] . "]";
| 响应字段 | 类型 | 说明 |
|---|---|---|
| valid | bool | 是否有效 |
| message | string | 状态描述 |
| mode | string | new / warranty / expired / disabled / invalid |
| summary.email | string? | 若已提卡,显示分配的邮箱 |
| summary.warranty_remaining | string? | 质保剩余时间 |
Q: 提卡返回 429 是不是没额度了?
不是。Codex token 不走 api.openai.com 开发 API,429 是正常的。通过 cpa 代理使用即可。
Q: 质保期内怎么换号?
用同一张卡密再次调用 /api/redeem,系统自动检测 → 死号换新、存活提示无需换。
Q: 怎么批量自动化提卡?
写好卡密列表,循环调 /api/redeem。先调 /api/verify-card 预检避免无效请求。