DEVELOPER API · V1

API Reference

验证码邮箱 · 25 个平台 / 27 种商品 · 完整 Gmail 账号

本地测试http://localhost:3000/v1
正式域名https://gmail.sanqianke.xyz/v1
鉴权Bearer 或 X-API-Key
API Key:用户中心创建,仅显示一次。金额:CNY 整数分;价格按所属用户计算。 订单权限按创建 Key 隔离。Key 仅通过请求头传递。
iCloud 商品仅交付对应平台的邮箱地址与验证码,不含 Apple ID、密码或云服务权限。购买前检查 GET /products 返回的 api_enabled 和 available。

/v1 使用 API Key 鉴权;网页 /api 使用登录态。API 取消操作仅限订单创建 Key;网页订单不开放手动退款。

provider_code 为匿名通道标识(MAIL_CHANNEL_A / MAIL_CHANNEL_B)。权益以 code_limit_mode、max_codes、refund_policy、replacement.kind 为准,不按通道值推断。

export BASE_URL="https://gmail.sanqianke.xyz/v1"
export API_KEY="YOUR_API_KEY"

完整 Gmail 账号 API

GMAIL_ACCOUNT 提供两种格式:账号密码 URL(支持快捷登录)与账号密码(手工登录)。使用独立账号接口,共用账户余额与 API Key;仍是一种商品、一个 GACC CDK 兑换入口。

接口作用
GET /v1/account-products本人账号单价、库存及可售状态
POST /v1/account-orders购买1–50个完整账号,必填 Idempotency-Key
GET /v1/account-orders本Key账号订单,每页20条;可按 client_reference 查询
GET /v1/account-orders/{id}原订单进度与已交付资料

网页与 API 同价,采用账号标准价或用户专属价,不参与接码折扣及消费累计。购买前检查 /account-products 的 price_cents、api_enabled、available。受理时锁价并冻结余额与 Key 额度,按子项结算。

curl -X POST "$BASE_URL/account-orders" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Idempotency-Key: account-order-001" \
  -H "Content-Type: application/json" \
  -d '{"product_code":"GMAIL_ACCOUNT","quantity":2,"client_reference":"YOUR_ORDER_001","max_unit_price_cents":220}'

quantity默认1、上限50;max_unit_price_cents为可选最高单价,单位分,省略即接受受理时本人价格。新单返回202,找回原单返回200,均含 order、billing、status_url、poll_after_seconds:5。按返回订单号间隔至少5秒查询进度。

选择交付格式,旧请求保持不变

省略 delivery_format 或明确传 QUICK_LOGIN,仍交付账号、密码和快捷登录 URL。需要账号密码时,明确传 PASSWORD_ONLY。空串、null 和未知值返回400。每批统一一种格式,缺货不会自动切换;两种格式共用本站售价和用户专属价,库存及开放状态独立。

GET /v1/account-products?delivery_format=PASSWORD_ONLY
Authorization: Bearer API_KEY

目录省略格式仍返回原快捷 URL 规格;每次只有一个 GMAIL_ACCOUNT 条目。使用对应规格的 available 和库存确认后购买:

curl -X POST "$BASE_URL/account-orders" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Idempotency-Key: password-account-order-001" \
  -H "Content-Type: application/json" \
  -d '{"product_code":"GMAIL_ACCOUNT","delivery_format":"PASSWORD_ONLY","quantity":2,"client_reference":"YOUR_PASSWORD_ORDER_001","max_unit_price_cents":220}'

订单、子项和交付均返回实际 delivery_format。账号密码交付省略 URL 字段,text 恰为两个字段:

{"delivery_format":"PASSWORD_ONLY","account":"[email protected]","password":"YOUR_PASSWORD","text":"[email protected]_PASSWORD"}

原幂等键及客户订单号持续有效。省略格式与明确 QUICK_LOGIN 找回同一原订单;改成另一格式返回409,不新增采购或扣费。格式关闭不影响已购资料找回;另一格式须由客户确认创建新单。

查询及响应节选:

GET /v1/account-orders/aso_EXAMPLE
Authorization: Bearer API_KEY

{
  "order": {
    "id": "aso_EXAMPLE", "status": "COMPLETED", "quantity": 1,
    "unit_price_cents": 220, "total_price_cents": 220,
    "settled_cents": 220, "held_cents": 0, "released_cents": 0,
    "summary": {"delivered":1,"queued":0,"purchasing":0,"review":0,"released":0},
    "items": [{
      "id": "asi_EXAMPLE", "sequence": 1, "status": "DELIVERED",
      "delivery": {
        "account": "[email protected]", "password": "YOUR_PASSWORD",
        "quick_login_url": "https://mailapi.sanqianke.xyz/google/login?uid=YOUR_UID",
        "text": "[email protected]_PASSWORD----https://mailapi.sanqianke.xyz/google/login?uid=YOUR_UID"
      }
    }]
  }
}

text 为 TXT 导出格式,程序读取独立字段。详情仅创建 Key 可读,轮换不改变归属;网页登录可查看本人网页/API订单。列表返回脱敏摘要,详情返回交付凭据。

子项状态含义和处理
QUEUED / PURCHASING保留原单,等待交付
DELIVERED立即保存资料,以子项id防止重复发货
REVIEW采购结果待核实,对应金额仍占款;保留原请求
RELEASED明确未交付,已退回对应余额及Key额度

COMPLETED:全部交付;PARTIAL:部分交付且其余终止;FAILED:全部未交付。summary.queued/purchasing/review 非零时继续查询;人工核实阶段降低频率,终态停止轮询。

请求结果不明:以原 Key、原幂等键和相同参数重试。同 Key 的 client_reference 唯一,参数冲突返回409。幂等映射持久保留;重试及资料清理均不触发补购。

资料保留30天,不代表账号或链接有效期。首次登录异常须在交付后30分钟内提交人工售后;不提供自动换号或无码退款。快捷链接应在无痕或未登录 Google 的浏览器使用,授权结果以目标站为准。交付响应禁止缓存,凭据不得写入日志。

字段定义:Markdown · OpenAPI。

平台与商品代码:25个平台 / 27种邮箱商品

通过 POST /v1/mailboxes 的 product_code 选择商品。OpenAI、GitHub 支持 Gmail / iCloud,其余平台提供 Gmail。

查询本人价格与实时状态 · 新增平台调用示例

平台、邮箱类型与 product_code 对照;窄屏可左右滑动
平台邮箱类型product_code整单码数上限使用期配置
OpenAIGmailGMAIL_24H按 code_limit_mode:最多3码或不限次数本站最长1小时
OpenAIiCloudICLOUD_24H最多5码24小时
GitHubGmailGITHUB_GMAIL1码,收到即完成本站最长1小时
GitHubiCloudGITHUB_ICLOUD最多5码本站最长1小时
TelegramGmailWB_TELEGRAM_GMAIL最多3码本站最长1小时
InstagramGmailINSTAGRAM_GMAIL本站最多5码,按订单快照执行读取商品及订单快照
FacebookGmailFACEBOOK_GMAIL本站最多5码,按订单快照执行读取商品及订单快照
WalmartGmailWB_WALMART_GMAIL最多1码本站最长1小时
TikTokGmailWB_TIKTOK_GMAIL最多2码本站最长1小时
AmazonGmailWB_AMAZON_GMAIL最多2码本站最长1小时
TinderGmailWB_TINDER_GMAIL最多1码本站最长1小时
VintedGmailWB_VINTED_GMAIL最多2码本站最长1小时
LeboncoinGmailWB_LEBONCOIN_GMAIL最多2码本站最长1小时
KleinanzeigenGmailWB_KLEINANZEIGEN_GMAIL最多1码本站最长1小时
ShopeeGmailWB_SHOPEE_GMAIL最多2码本站最长1小时
X / TwitterGmailWB_TWITTER_GMAIL最多1码本站最长1小时
WeChatGmailWB_WECHAT_GMAIL最多1码本站最长1小时
DiscordGmailWB_DISCORD_GMAIL最多1码本站最长1小时
FiverrGmailWB_FIVERR_GMAIL最多1码本站最长1小时
TrendyolGmailWB_TRENDYOL_GMAIL最多1码本站最长1小时
SnapchatGmailWB_SNAPCHAT_GMAIL最多1码本站最长1小时
AppleGmailWB_APPLE_GMAIL最多5码本站最长1小时
AWSGmailWB_AWS_GMAIL最多1码本站最长1小时
RedditGmailWB_REDDIT_GMAIL最多1码本站最长1小时
HingeGmailWB_HINGE_GMAIL最多1码本站最长1小时
KolotibabloGmailWB_KOLOTIBABLO_GMAIL最多2码本站最长1小时
NielsenGmailWB_NIELSEN_GMAIL最多1码本站最长1小时

实时价格、销售状态和权益读取 GET /v1/products 的 price_cents、api_enabled、available、max_codes、code_limit_mode、duration_hours;已购订单使用成交快照。码数为整单上限,实际发信由目标平台决定,下一码不延长截止。

WB_* 仅支持余额/API,CDK 关闭。ICLOUD_24H 使用期为24小时;表内1小时为本站上限,上游提前结束以订单状态为准。

Facebook / Instagram 新接入使用 FACEBOOK_GMAIL / INSTAGRAM_GMAIL,支持 CDK、网页余额和 API。后台每个平台一个总开关,同时控制三个入口;关闭只阻止新订单,历史订单继续按原快照收码和结算。旧 WB_FACEBOOK_GMAIL / WB_INSTAGRAM_GMAIL 继续兼容原接入,历史订单权益保持。

Facebook / Instagram Gmail 接码

原路径、鉴权和幂等方式保持。省略 product_code 仍购买 GMAIL_24H;新品显式填写平台商品编码。

POST /v1/mailboxes
Authorization: Bearer YOUR_API_KEY
Idempotency-Key: YOUR_UNIQUE_FB_ORDER
Content-Type: application/json

{"product_code":"FACEBOOK_GMAIL","client_reference":"FB-001"}

Instagram 使用 {"product_code":"INSTAGRAM_GMAIL","client_reference":"IG-001"}。先读取 GET /v1/products 的本人价格、库存、api_enabled、available、有效期和收码规则。默认标价人民币1.00元,实扣以本人价格和建单锁价为准。

  • LIMITED:最多交付 max_codes 个有效新码,本商品固定码数线路为5码;重复码不累计,达到上限后完成。
  • UPSTREAM:按实际下一码开放状态处理,不承诺无限交付;无额外安全上限时 max_codes: null。不要把 null 当成0。
  • 沿用 /mailboxes/{id}/codes 和 /next-code。首码到达后按能力请求下一码,随后继续轮询;明确结束或到期后停止。
  • 缺货且确认未采购时恢复余额和 Key 额度;ALLOCATION_UNKNOWN 保留原单核实。已收任意码后不按无码退款。
  • 商品切换只影响新订单,历史订单保留原截止时间、收码模式和换号权益。相同幂等键或客户订单号找回原单,内容冲突返回409。

接口错误格式保持;商品关闭返回原暂停类错误,取消、换号和完成继续使用原路径。Markdown · OpenAPI

多平台接入

默认商品:GMAIL_24H(OpenAI Gmail)。适用于 GET /product 及省略 product_code 的创建请求。

POST /v1/mailboxes
Authorization: Bearer YOUR_API_KEY
Idempotency-Key: YOUR_UNIQUE_ORDER_ID
Content-Type: application/json

{
  "product_code": "WB_TELEGRAM_GMAIL",
  "client_reference": "YOUR_ORDER_ID",
  "max_price_cents": 80
}

示例商品:WB_TELEGRAM_GMAIL。替换 product_code 选择其他平台;购买条件为 api_enabled 与 available。WB_* 的 cdk_enabled=false。

launch_policy:VERIFIED_ONLY 或 OPERATOR_ACCEPTED;policy_verified 表示规则已核实,operator_accepted 表示运营批准带待核项开放,二者独立。duration_hours 为本站使用期上限(新品默认1小时),max_codes 为整单上限;实际期限及后续码资格以订单状态为准。

max_price_cents:可选成交价上限(分),超限不采购;省略使用用户当前价。幂等重放返回原成交回执。超时或 ALLOCATION_UNKNOWN 须沿用原请求核实;冻结资金不代表已交付。

POST /v1/mailboxes/MAILBOX_ID/next-code
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json

{"target_sequence": 2}

WB_* 及采用上游下一码模式的 Facebook / Instagram 新商品必须提交 target_sequence,整数从 2 开始。持续读取模式没有独立的上游下一码开启接口,target_sequence 可省略;若提交则必须是当前下一序号且不超过5。固定5码线路最多到本单5码;采用 code_limit_mode=UPSTREAM 且未配置本站安全上限的线路由上游决定是否继续,本站接口校验上限为100,配置安全上限后不超过该上限。同一目标重试不递增;待开放或待核实时保持原目标,超限返回 409 CODE_LIMIT_REACHED。后续码包含在整单价内,不延长截止;已收码不适用无码退款。

等级累计:启用后的已结算合格净消费;退款冲减,充值、冻结款及直接CDK标价不计。库存档位:0暂无、1–99很少、100–999一般、≥1000很多;未知库存不等于0,库存不保证交付。

接入流程

  1. 创建邮箱POST /mailboxes,通过 product_code 选择上表任一已开放邮箱商品。
  2. 触发验证码在目标平台触发邮件验证码。
  3. 长轮询取码GET /mailboxes/{id}/codes?wait_seconds=60,验证码到达后立即返回。
  4. 下一码第一码到达后,先 POST /next-code,再继续轮询,直到商品上限。
  5. 结束订单已交付验证码用 complete;首码交付前满足订单条件后可用 cancel 退款。服务端也会周期核对未结束订单。
GET/products
查询用户价格与销售状态
curl "$BASE_URL/products" \
  -H "Authorization: Bearer $API_KEY"

200 响应示例(节选)

{
  "items": [
    {
      "product_code": "GMAIL_24H",
      "name": "Gmail 1小时短效邮箱",
      "domain": "gmail.com",
      "duration_hours": 1,
      "max_codes": 3,
      "code_limit_mode": "LIMITED",
      "price_cents": 50,
      "currency": "CNY",
      "cdk_enabled": true,
      "balance_enabled": true,
      "api_enabled": true,
      "available": true
    },
    {
      "product_code": "ICLOUD_24H",
      "name": "iCloud 24小时邮箱",
      "domain": "icloud.com",
      "duration_hours": 24,
      "max_codes": 5,
      "price_cents": 20,
      "currency": "CNY",
      "cdk_enabled": true,
      "balance_enabled": true,
      "api_enabled": true,
      "available": true
    },
    {
      "product_code": "GITHUB_GMAIL",
      "name": "GitHub 专用 Gmail 接码",
      "domain": "gmail.com",
      "duration_hours": 1,
      "max_codes": 1,
      "code_limit_mode": "LIMITED",
      "price_cents": 50,
      "currency": "CNY",
      "cdk_enabled": true,
      "balance_enabled": true,
      "api_enabled": true,
      "available": true
    },
    {
      "product_code": "GITHUB_ICLOUD",
      "name": "GitHub 专用 iCloud 接码",
      "domain": "icloud.com",
      "duration_hours": 1,
      "max_codes": 5,
      "code_limit_mode": "LIMITED",
      "price_cents": GITHUB_20,
      "currency": "CNY",
      "cdk_enabled": false,
      "balance_enabled": GITHUB_true,
      "api_enabled": GITHUB_true,
      "available": GITHUB_true
    }
  ]
}

available 表示至少一个入口开放;API 仍须检查 api_enabled。CDK / 余额入口分别为 cdk_enabled / balance_enabled。GET /product 返回默认 Gmail 商品;示例价格不作报价。

上例Gmail展示有限码模式。API商品也可能返回 "code_limit_mode":"UNLIMITED","max_codes":null,仍受本站1小时截止及实际可用状态约束;网页余额和单次CDK的Gmail仍最多3码。应使用订单返回的模式、码数与截止时间处理后续请求。

GET/balance
查询账户可用余额
curl "$BASE_URL/balance" \
  -H "Authorization: Bearer $API_KEY"

200 响应

{
  "balance_cents": 1000,
  "frozen_balance_cents": 0,
  "currency": "CNY"
}
POST/mailboxes
申请邮箱并从账户余额扣款

Idempotency-Key 必填,长度 8–200,只接受字母、数字和 ._:-。网络重试必须继续使用原值与原请求体。

GMAIL_24H是保留的兼容编号。新Gmail使用期为1小时,已激活旧单以原订单截止时间为准。

product_code可传完整平台表中的原四种商品或已开放的WB_*新平台代码;以GET /products返回为准。不传时继续申请原OpenAI Gmail,兼容现有客户端。

client_reference 可选,最长 120 字符,外部业务订单号。

采购队列配置(部署参数及响应提示优先):

新分配队列并发采购最多排队等待上限
OpenAI Gmail专用队列(按当前线路)2或55030秒
GitHub Gmail25030秒
GitHub iCloud25030秒
OpenAI iCloud250150秒
23个新增平台共用邮箱采购队列25030秒
原Gmail兼容队列12500150秒

网关并发、Key/IP限频与采购队列独立。429 按 Retry-After 退避;排队超时沿用原请求。客户端超时须覆盖排队和采购,长轮询超时须大于 wait_seconds。

订单固定创建时的线路、成交价及截止时间。适用到期核对退款时,仅退最后一笔合格收费权益;查询异常保持待核。客户退款与上游回款独立记账。

幂等键须跨进程持久化。重放返回原回执,含历史订单状态、balance_after_cents 和 Key 额度快照。实时状态查询订单详情,实时余额查询 GET /balance。

REQUEST_PROCESSING、ALLOCATION_UNKNOWN、REPLACEMENT_PROCESSING或网络失败时保留原请求核实,不另建采购。明确收到ALLOCATION_RESOLVED_FAILED且原费用已释放后,才为下一次明确采购建立新业务请求及新键;ALLOCATION_RESOLVED_CLOSED先查看原单,不默认再买。

curl -X POST "$BASE_URL/mailboxes" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: order_20260723_0001" \
  -d '{"product_code":"ICLOUD_24H","client_reference":"YOUR_ORDER_0001"}'

201 响应

{
  "mailbox": {
    "id": "mbx_xxx",
    "product_code": "ICLOUD_24H",
    "product_name": "iCloud",
    "domain": "icloud.com",
    "status": "ACTIVE",
    "email": "[email protected]",
    "price_cents": 20,
    "currency": "CNY",
    "received_codes": 0,
    "max_codes": 5,
    "created_at": "2026-07-23T13:00:00.000Z",
    "expires_at": "2026-07-24T13:00:00.000Z"
  },
  "billing": {
    "order_price_cents": 20,
    "charged_cents": 20,
    "refunded_cents": 0,
    "net_charge_cents": 20,
    "balance_after_cents": 980,
    "frozen_balance_cents": 0,
    "key_limit_cents": 500,
    "key_spent_cents": 20,
    "key_remaining_cents": 480,
    "currency": "CNY"
  }
}
GET/mailboxes/{MAILBOX_ID}
查询订单状态,不触发取码
curl "$BASE_URL/mailboxes/$MAILBOX_ID" \
  -H "Authorization: Bearer $API_KEY"

返回 mailbox、billing、已保存 codes 及 replacement。仅读取本地记录;采购待核实的 mailbox.email 可为 null。

GET/mailboxes/{MAILBOX_ID}/codes
向上游查询验证码

wait_seconds 为0–60秒;after_sequence 传客户端已经处理的最后序号。新验证码到达、订单结束或等待超时都会返回。重复查询同一验证码不会增加次数。

after_sequence只控制等待唤醒,不过滤结果。items含该邮箱全部已保存验证码,按mailbox.id + sequence去重,不用items.length判断新增。换号响应可能返回新mailbox.id,下次改用新ID并重置游标为0;若已含新邮箱验证码,保存其实际最大序号,不沿用旧邮箱游标。错误响应不更新游标。

/codes 查询上游,不触发目标平台发信;订单详情仅读取本地记录。

curl "$BASE_URL/mailboxes/$MAILBOX_ID/codes?wait_seconds=60&after_sequence=0" \
  -H "Authorization: Bearer $API_KEY"

200 响应

{
  "mailbox": {
    "id": "mbx_xxx",
    "status": "CODE_RECEIVED",
    "received_codes": 1,
    "max_codes": 3
  },
  "items": [
    {
      "sequence": 1,
      "code": "482913",
      "received_at": "2026-07-23T13:01:20.000Z"
    }
  ],
  "next_after_sequence": 1,
  "waited_seconds": 12.43,
  "poll_after_seconds": 5
}
POST/mailboxes/{MAILBOX_ID}/next-code
开始接收商品允许的下一码

UPSTREAM 模式按实际下一码状态处理,不承诺无限交付;max_codes 可为 null。Facebook / Instagram 本站最多5码;以本单模式、上限和截止时间为准。

订单返回 code_limit_mode:LIMITED 时最多收 max_codes 条;UNLIMITED 时 max_codes: null,在订单有效期内不限次数。程序应按模式判断,避免把 null 当成零或写死3次。

OpenAI Gmail API新订单使用期最长1小时,码数以订单模式为准;GitHub Gmail固定1码、收到即完成。OpenAI Gmail单次CDK和网页余额购买均为1小时、最多3码;OpenAI iCloud为24小时、最多5码,GitHub iCloud为1小时、最多5码。实际可用性以查询结果为准。

GitHub Gmail没有第二码,调用本接口返回409 CODE_LIMIT_REACHED,不会请求开启下一码。其他多码商品首码到达后调用。成功后状态为 WAITING_NEXT_CODE,随后继续查询 /codes,处理尚未保存的更大sequence。

curl -X POST "$BASE_URL/mailboxes/$MAILBOX_ID/next-code" \
  -H "Authorization: Bearer $API_KEY"
POST/mailboxes/{MAILBOX_ID}/replace
余额/API换邮箱

先查询原订单的replacement。kind: BALANCE为原订单链换号模式:未收码、等待期结束且原使用期内,每笔原订单3次成功免费换号,随后按当前用户商品价确认扣款,截止不延长。kind: BALANCE_REPURCHASE为退款重购模式:核对未收码并确认旧单退款,再按当前用户价购买同类邮箱,新单从成功分配起重新计时。CDK和短信规则保持。

请求必带Idempotency-Key,免费请求体为{}。付费时先展示replacement.next_price_cents并确认,再提交下列字段;当前价改变返回REPLACEMENT_PAYMENT_REQUIRED,余额/Key不足不会采购。超时继续使用原键及原请求体,不重新下单。

curl -X POST "$BASE_URL/mailboxes/$MAILBOX_ID/replace" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Idempotency-Key: replace-ORDER-0001" \
  -H "Content-Type: application/json" \
  -d '{"accept_charge":true,"expected_price_cents":50}'

返回最新邮箱及replacement/billing。旧订单ID也可找回最新成功邮箱;OpenAI Gmail API按订单码数模式处理,GitHub Gmail始终1码。allocation_price_cents是本次增量,免费为0;total_charge_cents及账务的chain_*保留累计费用。合格退款仅退当前关联成交价,不退此前已弃用的付费采购;人工双证据退款要求不变。结果待核实时原邮箱仍可查看,冻结金额核实前不额外采购。

BALANCE_REPURCHASE重购始终提交accept_charge: true与当前expected_price_cents,价格为0也需确认;refund_price_cents是旧单待退金额。退款不明确返回UPSTREAM_CANCELLATION_PENDING且不采购;退款已确认而新单缺货时保留旧单退款,稍后可继续分配。采购未知保留原请求;查询、退款核对和页面刷新不自动采购。只在用户再次确认时继续。GitHub Gmail1码,OpenAI iCloud和GitHub iCloud最多5码。

POST/mailboxes/{MAILBOX_ID}/cancel
首码交付前取消并退款

仅在 received_codes = 0 且符合本单refund_policy时成功。MANUAL_VERIFIED_ONLY须人工核实实际触发目标平台发信及邮箱风控失效,购买满30分钟并复查最终无码后办理;未发码、闲置或仅普通无码不退。UPSTREAM_CONFIRMED_NO_CODE须核查收码并确认取消退款结果,结果未确认不提前退余额。refund_eligible_at只表示最低等待时间,到点不代表审核已通过。成功后状态变为 REFUNDED,售价退回账户余额并回退 Key 已用额度;响应同时返回最新 billing,重复操作不重复退款。查码、普通无码或闲置不等于人工售后审核通过。

curl -X POST "$BASE_URL/mailboxes/$MAILBOX_ID/cancel" \
  -H "Authorization: Bearer $API_KEY"
POST/mailboxes/{MAILBOX_ID}/complete
验证码使用完成后结束订单

GitHub Gmail首码保存后自动完成,无需额外调用;其他商品至少收到一条验证码后调用。重复调用保持 COMPLETED。

curl -X POST "$BASE_URL/mailboxes/$MAILBOX_ID/complete" \
  -H "Authorization: Bearer $API_KEY"

状态说明

ALLOCATING正在分配邮箱
ALLOCATION_UNKNOWN采购结果待核实,保留原订单和幂等键
REPLACED原邮箱已更换,使用新订单取码
ACTIVE邮箱已分配,等待目标网站发码
CODE_RECEIVED已收到验证码
WAITING_NEXT_CODE等待当前商品允许的下一码
COMPLETED订单已完成
CANCELED已取消,账务以订单快照为准
REFUND_PENDING退款核对中,尚未确认余额退款
REFUNDED无码取消,余额已退回
FAILED分配失败,扣费已自动退回
EXPIRED订单已过期

错误格式与常见错误

{
  "error": {
    "code": "INSUFFICIENT_BALANCE",
    "message": "账户余额不足",
    "request_id": "req_xxx"
  }
}
HTTP错误码含义
400IDEMPOTENCY_REQUIRED / INVALID_IDEMPOTENCY_KEY / UNSUPPORTED_PRODUCT / INVALID_POLL_PARAMETERS / INVALID_PAYMENT_CONFIRMATION / INVALID_PRICE参数校验失败:幂等键、商品、游标或金额
401 / 403INVALID_API_KEY / USER_NOT_FOUNDKey或所属用户停用;恢复后继续核实原请求,不另建采购
402INSUFFICIENT_BALANCE / KEY_LIMIT_EXCEEDED余额或 Key 消费额度不足
403KEY_IP_REJECTED调用 IP 不在白名单
404MAILBOX_NOT_FOUND订单不存在或创建 Key 不匹配
409IDEMPOTENCY_CONFLICT幂等参数冲突;核对原请求
409 / 503REQUEST_PROCESSING / REPLACEMENT_PROCESSING / ALLOCATION_UNKNOWN / MAILBOX_BUSY保留原请求、原键和订单,退避核实,不重复采购
409ALLOCATION_RESOLVED_FAILED / ALLOCATION_RESOLVED_CLOSED先核对原订单费用,只有明确未采购及费用释放才新建业务请求
409FIRST_CODE_REQUIRED / NO_FIRST_CODE / CODE_LIMIT_REACHED / NO_CODE_TO_COMPLETE / ORDER_CLOSED / CODE_ALREADY_DELIVERED订单状态或码数不满足操作条件
409UPSTREAM_NEXT_CODE_NOT_READY上游下一码尚未开放,等待约30秒后核查原订单资格
409CUSTOMER_POLL_REQUIRED / REFUND_WAIT / REFUND_REVIEW_REQUIRED / REFUND_EVIDENCE_INCOMPLETE退款前置条件未满足:查码、等待期或人工证据
409REPLACEMENT_PAYMENT_REQUIRED / BALANCE_REPLACEMENT_WAIT / BALANCE_REPLACEMENT_CLOSED重新读取换号资格和报价;金额变化需再次确认,等待或关闭不立即采购
409UPSTREAM_CANCELLATION_PENDING / UPSTREAM_STATE_CONFLICT / UPSTREAM_ALREADY_CHARGED上游状态待核实;保留原订单
429KEY_RATE_LIMITED / RATE_LIMITED按Retry-After退避,限制并发及重试次数
502UPSTREAM_STATUS_UNKNOWN / UPSTREAM_CANCEL_ERROR / UPSTREAM_CANCEL_UNKNOWN / UPSTREAM_NEXT_CODE_STATUS_ERROR / UPSTREAM_NEXT_CODE_PENDING上游结果待核实;原单退避复查
503PRODUCT_API_PAUSED / SALES_PAUSED新购暂停;已有订单仍可查询
503UPSTREAM_UNAVAILABLE / PROVIDER_QUERY_FAILED / PROVIDER_BUSY / PROVIDER_QUEUE_TIMEOUT / ALLOCATION_QUEUE_FULL / ALLOCATION_QUEUE_TIMEOUT / ICLOUD_ALLOCATION_QUEUE_FULL / ICLOUD_ALLOCATION_QUEUE_TIMEOUT / GITHUB_ALLOCATION_QUEUE_FULL / GITHUB_ALLOCATION_QUEUE_TIMEOUT / GITHUB_ICLOUD_ALLOCATION_QUEUE_FULL / GITHUB_ICLOUD_ALLOCATION_QUEUE_TIMEOUT产品队列或上游繁忙,限次退避,创建重试保持原键及原请求体

相关CDK接口还可返回410 CDK_EXPIRED或CDK_USAGE_EXPIRED;不是公开邮箱API统一过期返回。邮箱API已结束操作通常返回409 ORDER_CLOSED或终态订单。

GitHub · iCloud:余额与 API 专用

GITHUB_ICLOUD交付GitHub专用icloud.com邮箱,本站最长1小时、最多5码。仅开放网页余额和API,cdk_enabled=false;BAL余额卡仍可充值共用账户。下一码资格及实际结束时间以订单实时状态为准,1小时为本站上限。

POST /v1/mailboxes
Authorization: Bearer API_KEY
Idempotency-Key: github-icloud-order-0001
Content-Type: application/json

{"product_code":"GITHUB_ICLOUD","client_reference":"YOUR_ORDER_ID"}

售价读取当前Key的GET /products。首码后为CODE_RECEIVED,需要后续码时提交目标序号,同一目标重试保持原序号:

POST /v1/mailboxes/MAILBOX_ID/next-code
Authorization: Bearer API_KEY
Content-Type: application/json

{"target_sequence":2}

后续依次申请3、4、5并继续查码;按邮箱ID和sequence去重,重复返回的既有码不重复计数。第5码保存后完成;达到上限返回409 CODE_LIMIT_REACHED,已收码也可主动完成。

target_sequence缺失或格式错误返回400 INVALID_TARGET_SEQUENCE,跳过未交付序号返回409 NEXT_CODE_SEQUENCE_CONFLICT。遇到UPSTREAM_NEXT_CODE_PENDING或UPSTREAM_NEXT_CODE_STATUS_ERROR时,查询原订单的next_code_request及验证码,并用同一目标序号重试;不要新建订单或擅自递增目标。UPSTREAM_NEXT_CODE_NOT_READY表示上游尚未开放,等待后核查原订单。

网页余额没有手动退款,无码可申请换邮箱:先核对收码并确认旧邮箱退款,再按当前用户本商品价重购同类邮箱,新单重新计时。外接API保留原Key的取消及换号接口。到期仍无码由后台核对,上游确认取消退款后才回退人民币和Key已用额度;结果不明保持REFUND_PENDING,重复核对只结算一次。已收到任意验证码后不适用无码退款或换号。

本商品独立定价及开关;暂停新购买仍可处理已有订单。交付只有iCloud邮箱地址和GitHub验证码,不含Apple ID、邮箱密码或iCloud登录权限。

POST/mailboxes
GitHub专用Gmail · 仅1码

GitHub Gmail

价格读取 GET /products。duration_hours: 1、max_codes: 1、code_limit_mode: "LIMITED";CDK / 余额 / API 开关独立。设置变更仅影响新单,既有订单及换号链使用原快照。

POST /v1/mailboxes
Authorization: Bearer API_KEY
Idempotency-Key: github-order-000001
Content-Type: application/json

{"product_code":"GITHUB_GMAIL","client_reference":"YOUR_ORDER_ID"}

创建响应仍包含mailbox与billing;product_code、product_name、domain和expires_at标明订单用途与权益。未传商品代码仍申请原ChatGPT Gmail。

最长1小时是本站使用期上限。上游单个邮箱实际持续时间仍待实单验证;提前结束时按真实状态处理,不把expires_at当作上游在线承诺。
  1. 在 GitHub 触发邮件验证码。
  2. 调用GET /mailboxes/{MAILBOX_ID}/codes?wait_seconds=60&after_sequence=0。
  3. 首码保存后,订单直接返回COMPLETED,已收码数为1,原截止时间内可再次查看验证码。
  4. 没有第二码;next-code返回409 CODE_LIMIT_REACHED。待确认的完成任务由后台处理,已交付验证码保留。

无码退款按本单refund_policy判断:UPSTREAM_CONFIRMED_NO_CODE沿用取消退款及到期核查,核对收码并确认取消退款后,才退客户人民币及Key已用额度。结果不明显示REFUND_PENDING,继续核对原订单,重复请求只结算一次。MANUAL_VERIFIED_ONLY的普通无码、闲置或到期不自动退款;若另有expiry_refund_mode: LAST_CHARGE_NO_CODE_REVIEW,到期时以该字段规则为准,核查最后一次收费权益及关联免费换号均未收码后仅退该次实际扣款及原Key已用额度,查询异常继续核对不立即退款;没有该字段时,需人工核实实际触发GitHub发信与邮箱风控失效两项证据。

重试:创建超时沿用原幂等键和请求体;同键更换商品返回 409 IDEMPOTENCY_CONFLICT。503 PRODUCT_API_PAUSED 仅暂停该商品新购,已有订单仍可查码与退款。

单次CDK:GHMAIL-卡仍在/gmail兑换。30秒无码可换同类邮箱、最多成功10次、首次1小时截止不延长,换号链按原快照处理。先核查收码,并按原订单规则处理旧邮箱,不以普通无码代替人工售后证据;分配失败不扣成功换号次数。CDK换号不产生客户人民币退款,也不恢复到期卡密。

余额/API换号:BALANCE_REPURCHASE确认旧单退款后按当前用户价重购并重新计时;BALANCE原订单链3次成功免费,其后每次按当前用户GitHub商品价确认扣费,首次截止不延长。本商品只交付1码,先查看订单replacement返回的资格及金额。

Node.js 自动取码示例

Node.js ≥22;文件名 receive-code.mjs。必填环境变量:API_KEY、持久化 ORDER_KEY;可选:PRODUCT_CODE、CLIENT_REFERENCE。重跑使用原值。示例仅取首码,不自动取消、换号或重复采购;目标平台发信需单独触发。

const BASE_URL = process.env.BASE_URL || "https://gmail.sanqianke.xyz/v1";
const API_KEY = process.env.API_KEY;
const ORDER_KEY = process.env.ORDER_KEY;
if (!API_KEY || !ORDER_KEY) throw new Error("请设置API_KEY及持久保存的ORDER_KEY");
const headers = { "X-API-Key": API_KEY };
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
let deadline = Date.now() + 60 * 60_000;

async function pause(ms) {
  const remaining = deadline - Date.now();
  if (remaining <= 0) throw new Error("已到示例总超时或订单截止,请查看原订单");
  await sleep(Math.min(ms, remaining));
  if (Date.now() >= deadline) throw new Error("已到示例总超时或订单截止,请查看原订单");
}

async function request(path, options = {}, timeoutMs = 75_000) {
  for (let attempt = 0; attempt < 6; attempt++) {
    let retryAfterMs = 0;
    try {
      const remaining = deadline - Date.now();
      if (remaining <= 0) throw Object.assign(new Error("已到请求截止"), { fatal: true });
      const response = await fetch(`${BASE_URL}${path}`, {
        ...options, headers: { ...headers, ...options.headers },
        signal: AbortSignal.timeout(Math.min(timeoutMs, remaining))
      });
      let data;
      try { data = await response.json(); }
      catch {
        if (response.ok) throw Object.assign(new Error("响应不是JSON,保留原请求核实"), { fatal: true });
      }
      if (response.ok) {
        if (!data || typeof data !== "object" || data.error) {
          throw Object.assign(new Error("响应结构异常,保留原请求核实"), { fatal: true });
        }
        return data;
      }
      const code = data?.error?.code || `HTTP_${response.status}`;
      const transient = [429, 500, 502, 503, 504].includes(response.status)
        || ["REQUEST_PROCESSING", "REPLACEMENT_PROCESSING", "MAILBOX_BUSY", "ALLOCATION_UNKNOWN"].includes(code);
      const value = response.headers.get("Retry-After");
      const wait = /^\d+(\.\d+)?$/.test(value || "")
        ? Number(value) * 1000 : Date.parse(value) - Date.now();
      if (Number.isFinite(wait)) retryAfterMs = Math.max(0, wait);
      const requestId = data?.error?.request_id;
      throw Object.assign(new Error(`${code}${requestId ? ` (${requestId})` : ""}`), {
        fatal: !transient || ["PRODUCT_API_PAUSED", "SALES_PAUSED"].includes(code)
      });
    } catch (error) {
      if (error.fatal || attempt === 5) throw error;
    }
    await pause(Math.max(retryAfterMs, Math.min(30_000, 1000 * 2 ** attempt)));
  }
}

function validateMailbox(mailbox) {
  if (!mailbox || typeof mailbox.id !== "string" || !mailbox.id
      || typeof mailbox.status !== "string" || !Number.isFinite(Date.parse(mailbox.expires_at))) {
    throw new Error("邮箱响应不完整,保留原请求核实");
  }
}

const created = await request("/mailboxes", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Idempotency-Key": ORDER_KEY
  },
  body: JSON.stringify({
    product_code: process.env.PRODUCT_CODE || "GMAIL_24H",
    client_reference: process.env.CLIENT_REFERENCE || ORDER_KEY
  })
}, 180_000);

validateMailbox(created.mailbox);
let mailboxId = created.mailbox.id;
deadline = Math.min(deadline, Date.parse(created.mailbox.expires_at));
console.log("邮箱:", created.mailbox.email, "订单:", mailboxId);

let afterSequence = 0;
const seen = new Set();
const ended = new Set(["COMPLETED", "REFUNDED", "REFUND_PENDING", "CANCELED", "FAILED", "EXPIRED"]);
while (Date.now() < deadline) {
  const result = await request(`/mailboxes/${encodeURIComponent(mailboxId)}/codes?wait_seconds=60&after_sequence=${afterSequence}`);
  validateMailbox(result.mailbox);
  if (!Array.isArray(result.items) || !Number.isSafeInteger(result.next_after_sequence)
      || result.next_after_sequence < 0 || result.items.some(item =>
        !item || typeof item !== "object" || !Number.isSafeInteger(item.sequence)
        || item.sequence < 1 || typeof item.code !== "string" || !item.code)) {
    throw new Error("查码响应不完整,保留原游标和订单核实");
  }
  const changed = result.mailbox.id !== mailboxId;
  if (changed) { mailboxId = result.mailbox.id; afterSequence = 0; }
  deadline = Math.min(deadline, Date.parse(result.mailbox.expires_at));
  let received = false;
  for (const item of result.items) {
    const key = `${mailboxId}:${item.sequence}`;
    if (!seen.has(key)) {
      seen.add(key);
      console.log("验证码:", item.code, "序号:", item.sequence);
      received = true;
    }
  }
  const lastSaved = Math.max(0, ...result.items.map(item => item.sequence));
  afterSequence = changed ? lastSaved : Math.max(afterSequence, lastSaved, result.next_after_sequence);
  if (received || ended.has(result.mailbox.status)) break;
  const pollMs = Number(result.poll_after_seconds) * 1000;
  await pause(Number.isFinite(pollMs) ? Math.max(1000, pollMs) : 5000);
}

重试上限6次,优先按 Retry-After 退避。运行上限为1小时与 expires_at 的较早者,停止不触发退款。后续码调用 /next-code 后按原邮箱游标继续查询。

到期退款补充规则

若订单返回 expiry_refund_mode: LAST_CHARGE_NO_CODE_REVIEW,它补充旧版 refund_policy:取消请求只结束使用并等待到期核对,不立即返款;到期确认最后收费权益及其关联免费换号均未收码后,仅退该权益实际扣款及原 Key 已用额度。查询异常保持待核,有码不按无码退款。未返回此字段的订单沿用原规则,CDK不折算余额。