API v1 — YTMarket

批发客户的 REST API:目录、订单、余额、Webhook。

Base URL: https://ytmarket.pro/api/v1

⚡ Quick Start — 从密钥到首单仅需 5 分钟

开始使用 API 的最简链路:

  1. 联系 Telegram 客服 — 拿到 `X-API-Key` +(可选)HMAC `secret`。请保存到密码管理器。
  2. 用该密钥试一下 `GET /v1/health` — 必须返回 200。
  3. 浏览目录:`GET /v1/products?min_qty=10&max_price=2` — 看到所有商品 + `min_quantity` 字段(供应商最低数量)。
  4. 充值:`POST /v1/balance/topup` → 把 USDT 发到返回的地址。链上确认后 5-10 秒,余额自动入账。
  5. 下单:`POST /v1/orders` 使用 `payment_method:"balance"`。获得 `order_id` + `status: "processing"`。
  6. 每 5 秒轮询 `GET /v1/orders/{id}`,直到 `status` 变为 `completed`(`items[]` 返回账号凭据)或 `failed`(余额自动退还)。
  7. 可选:在 POST /orders 中传入 `webhook_url` 以推送通知代替轮询。

1. 获取 API 密钥

密钥仅由管理员签发 — 无自助注册。请联系 Telegram 客服,主题 "API key",附上您的邮箱/项目。限流:每密钥每分钟 60 次请求(超出 HTTP 429)。密钥 + HMAC secret 会一起签发并只显示一次 — 请立即保存。 客服.

2. 鉴权

X-API-Key: YOUR_KEY_HERE

每个请求都需要该 header。缺失或无效 → HTTP 401 Unauthorized。

3. 目录(只读)

GET /v1/health

密钥校验 + 可用性探针。

curl -H "X-API-Key: $KEY" https://ytmarket.pro/api/v1/health
# {"status":"ok","timestamp":1779497200}

GET /v1/products

带筛选的目录。Query 参数:

  • category, sku
  • min_price, max_price (float, USDT)
  • min_qty (default 1), page (default 1), page_size (default 50, max 200)
curl -H "X-API-Key: $KEY" \
  "https://ytmarket.pro/api/v1/products?min_price=1&page=1&page_size=50"

GET /v1/products/{id}

单个商品详情(按 ID)。

GET /v1/categories

类目列表,含商品数量 + 最低价。

4. 余额与充值

GET /v1/balance

当前密钥余额 + 已花费/已充值/已退款总额。

curl -H "X-API-Key: $KEY" https://ytmarket.pro/api/v1/balance
# {"balance_usdt": 50.0, "total_spent_usdt": 12.5,
#  "total_topup_usdt": 62.5, "total_refunded_usdt": 1.2,
#  "currency": "USDT"}

POST /v1/balance/topup

创建充值意向 → 获取 USDT 地址。客户选择金额和网络。请求体:

curl -X POST -H "X-API-Key: $KEY" -H "Content-Type: application/json" \
  -d '{"amount_usdt": 100, "network": "usdt_trc_20"}' \
  https://ytmarket.pro/api/v1/balance/topup

# {"topup_id": "abc123...", "payment_address": "TYz...",
#  "payment_network": "usdt_trc_20", "amount_usdt": 100.0,
#  "expires_at": 1779500800}

USDT 到账后 — 余额自动入账(cron 每 5 秒扫描入账 TX)。地址与网站购买共用(每个网络一个主钱包),意向通过金额区分。

完整充值生命周期

  1. T+0:00 — 客户:POST /v1/balance/topup {amount_usdt: 100, network: "usdt_trc_20"}
  2. T+0:00 — API 创建 `topup_id`,返回 `payment_address`(你的主钱包)+ `amount_usdt: 100` + `expires_at: now+1h`
  3. T+0:30 — 客户从自己的钱包发送 100 USDT(TRC-20)到该地址
  4. T+0:55 — TRC-20 确认(~20 秒 / 3-5 块)
  5. T+1:00 — backend(每 5 秒)发现入账 TX,按精确金额查找待匹配充值意向
  6. T+1:05 — backend 按 amount ±$0.01 匹配存款与你的意向 → BAL +100,status=credited_auto
  7. T+1:05 — 客户:GET /v1/balance → balance_usdt: 100.0 ✓

📋 响应字段 — 每个的含义

topup_id意向 UUID(Redis 中保留 24h)。用于状态轮询或审计。
payment_address所选网络的主钱包。与网站购买相同。 不会为每次充值生成新地址。
payment_network回显:usdt_trc_20 / usdt_bep_20 / usdt_polygon / usdt_arbitrum / usdt_ton / usdt_solana。
amount_usdt匹配关键标记。 Backend 查找精确金额(±$0.01)的入账 TX。
expires_atUnix epoch +1h。若客户 1h 内未发送 TX → 意向过期;存款等待人工入账(联系 support)。

⚠️ Edge cases — 不一致时的处理

要求 $100,发送 $100.00
✅ 5-10 秒自动入账
要求 $100,发送 $99.99
✅ 入账(tolerance ±$0.01)
要求 $100,发送 $98
❌ 不会自动匹配。请联系 support — 按实际金额手动入账。
要求 $100,发送 $200
❌ 不匹配(超过 tolerance),需要手动入账
要求 $100,2h 后发送(已过期)
❌ 意向已过期;存款等待人工入账(联系 support)。
金额与网站订单在 15 分钟窗口内冲突
✅ 防护:dynamic pricing +1%/hit 使金额唯一。冲突概率 <1%。网站订单优先。
客户发错网络(usdt_bep_20 而非 usdt_trc_20)
❌ Deposit 到达 EVM 主钱包,但意向等待 TRC-20 → 不匹配。手动入账 + 联系客户。

5. 订单(余额扣款)

POST /v1/orders

创建订单 + 自动扣款 + 系统履约。失败/过期/取消时 — 余额自动退还(响应和 webhook 中的 `refunded` 字段)。

curl -X POST -H "X-API-Key: $KEY" -H "Content-Type: application/json" \
  -d '{"product_id": 12345, "quantity": 10,
       "payment_method": "balance",
       "webhook_url": "https://your.app/api-cb"}' \
  https://ytmarket.pro/api/v1/orders

# {"order_id": 789, "status": "processing",
#  "price_usdt": 12.34, "quantity": 10, "refunded": false,
#  "created_at": 1779497200, "updated_at": 1779497200}

若余额 < 价格 → HTTP 402 Payment Required + 充值指引。

⚠️ 每个商品的最低批量由 `min_quantity` 字段指定。若请求的 `quantity` 低于该值 → HTTP 400,提示所需最低数量。

GET /v1/orders/{id}

订单状态 + 完成时返回 items[] 凭据。仅限创建该订单的密钥访问(404 表示非本人)。

curl -H "X-API-Key: $KEY" https://ytmarket.pro/api/v1/orders/789

# {"order_id": 789, "status": "completed", "refunded": false,
#  "price_usdt": 12.34, "quantity": 10,
#  "items": [{"login": "...", "password": "...", ...}],
#  "created_at": 1779497200, "updated_at": 1779497500}

6. Webhook 通知

POST /v1/orders 中传入 `webhook_url` — 状态变更时(completed/partial/failed/expired/cancelled/refunded)我们 POST JSON 到该地址。

POST $YOUR_WEBHOOK_URL
Content-Type: application/json

{
  "order_id": 789,
  "status": "completed",
  "price_usdt": 12.34,
  "quantity": 10,
  "product_id": 12345,
  "items": [{"login": "...", "password": "...", ...}],
  "error_message": null,
  "refunded": false,
  "fired_at": 1779497200
}

期望 HTTP 2xx 响应。5xx/超时 — 最多 5 次指数退避重试。5 次失败后标记为 fired。

7. 使用统计

GET /v1/usage

按密钥统计:请求数、最近活跃、累计花费、累计退款。

curl -H "X-API-Key: $KEY" https://ytmarket.pro/api/v1/usage
# {"request_count": 1234, "last_used_at": 1779497200,
#  "first_used_at": 1779480000, "last_endpoint": "/api/v1/products",
#  "total_spent_usdt": 125.50}

8. 账号交付

交付时长:`status=processing` 之后 30 秒 — 10 分钟。异步处理 — 轮询 GET /v1/orders/{id} 或注册 webhook。

  1. POST /v1/orders → status=processing
  2. 异步处理(30s-10min)
  3. 成功 → status=completed
  4. GET /v1/orders/{id} → items[]
  5. Webhook 触发(如已注册)

9. USDT 网络与手续费

网络手续费时间推荐
usdt_trc_20$0.5-11-3 min默认
usdt_bep_20$0.2-0.530 sec - 2 min便宜快速
usdt_polygon$0.01-0.051-3 min最便宜
usdt_arbitrum$0.1-0.330 sec已在 Arbi 时
usdt_ton$0.05-0.15-15 sec快速
usdt_solana$0.01-0.025-30 sec便宜快速

10. 限制与计费

  • 限流:每密钥每分钟 60 次(HTTP 429 + Retry-After)
  • API 价格 = 网站价格(无加价)
  • page_size:1-200(默认 50)
  • 订单 quantity:1-10000
  • 充值:1-100000 USDT
  • Webhook 超时 10s,最多 5 次重试
  • 自动退款:failed/expired/cancelled 时余额自动返还(cron 每 30s)

11. 错误码

  • 401无效的 X-API-Key
  • 402余额不足
  • 404商品/订单未找到
  • 409库存不足
  • 422请求体非法
  • 429触发限流(60/min)
  • 501发票模式未实现
  • 503Redis 不可用

11.5 安全(HMAC + IP 白名单)

生产密钥的可选额外防护。通过联系管理员开启。

HMAC 请求体签名(POST /orders + /topup)

签发密钥时管理员可附带 HMAC secret(仅显示一次)。密钥有 secret 时,POST 请求需要两个额外 header。公式:

X-Timestamp = Unix 时间戳秒(与服务器漂移 ≤5 分钟)
X-Signature = hmac_sha256(secret, f"{timestamp}\n{request_body}").hex()
# Python example
import hmac, hashlib, time, json, requests
KEY = "..."; SECRET = "..."
BASE = "https://ytmarket.pro/api/v1"
body = json.dumps({"product_id": 12345, "quantity": 1, "payment_method": "balance"})
ts = str(int(time.time()))
sig = hmac.new(SECRET.encode(), f"{ts}\n{body}".encode(), hashlib.sha256).hexdigest()
r = requests.post(f"{BASE}/orders", data=body, headers={
    "X-API-Key": KEY,
    "Content-Type": "application/json",
    "X-Timestamp": ts,
    "X-Signature": sig,
})
print(r.status_code, r.json())

防护对象:重放攻击、MITM 篡改、密钥意外泄露(没有 secret 无法生成签名)。若未签发 secret — 向后兼容,不要求签名。

IP 白名单

可为密钥配置 允许的 IP。白名单为空时不校验 IP(默认)。若有至少一个 IP,其他来源返回 HTTP 403。

审计日志

所有 admin 操作(mint/revoke/credit/topup credited/rotate secret/whitelist)写入数据库表 `api_audit_log`。管理员可通过 bot 命令 `/api_audit` 或接口 `GET /api/admin/api-audit` 查看最近 50 条。

🧪 立即试用 — 交互式 Playground

在下方粘贴你的 X-API-Key,点击任意按钮 — 请求将直接从本页发送到 API。POST 端点的 HMAC 签名会在浏览器自动计算(如果你的密钥有 secret)。

GET https://ytmarket.pro/api/v1/health
🔒 Запрос отправляется напрямую с твоего браузера на https://ytmarket.pro/api/v1. Ключ нигде не сохраняется на сервере.

12. SDK 示例

Python (requests)

import requests
KEY = "YOUR_API_KEY"
BASE = "https://ytmarket.pro/api/v1"
headers = {"X-API-Key": KEY}

# 1. List products
products = requests.get(f"{BASE}/products", headers=headers,
                         params={"min_price": 1, "page_size": 50}).json()

# 2. Check balance
bal = requests.get(f"{BASE}/balance", headers=headers).json()
print(f"Balance: {bal['balance_usdt']} USDT")

# 3. Create order (balance-debit)
order = requests.post(f"{BASE}/orders", headers=headers, json={
    "product_id": products["items"][0]["id"],
    "quantity": 1,
    "payment_method": "balance",
    "webhook_url": "https://your.app/cb",
}).json()
print(f"Order #{order['order_id']} {order['status']}")

# 4. Poll until final
import time
while True:
    o = requests.get(f"{BASE}/orders/{order['order_id']}", headers=headers).json()
    if o["status"] in ("completed", "failed", "expired", "cancelled"):
        break
    time.sleep(5)
print(f"Final: {o['status']}, items={o.get('items')}, refunded={o.get('refunded')}")

Node.js (axios)

import axios from "axios";

const KEY = process.env.API_KEY;
const api = axios.create({
  baseURL: "https://ytmarket.pro/api/v1",
  headers: { "X-API-Key": KEY },
});

// 1. List products
const { data: products } = await api.get("/products", { params: { min_price: 1 } });

// 2. Create order
const { data: order } = await api.post("/orders", {
  product_id: products.items[0].id,
  quantity: 1,
  payment_method: "balance",
  webhook_url: "https://your.app/cb",
});

// 3. Poll
let o;
while (true) {
  o = (await api.get(`/orders/${order.order_id}`)).data;
  if (["completed", "failed", "expired", "cancelled"].includes(o.status)) break;
  await new Promise(r => setTimeout(r, 5000));
}
console.log("Final:", o.status, "items:", o.items, "refunded:", o.refunded);

Go (net/http)

package main

import (
  "bytes"; "encoding/json"; "fmt"; "io"; "net/http"
)

func main() {
  body, _ := json.Marshal(map[string]any{
    "product_id": 12345, "quantity": 1, "payment_method": "balance",
  })
  req, _ := http.NewRequest("POST", "https://ytmarket.pro/api/v1/orders", bytes.NewReader(body))
  req.Header.Set("X-API-Key", "YOUR_KEY")
  req.Header.Set("Content-Type", "application/json")
  resp, _ := http.DefaultClient.Do(req)
  defer resp.Body.Close()
  b, _ := io.ReadAll(resp.Body); fmt.Println(string(b))
}

curl

# Full flow in 4 curls
KEY=YOUR_API_KEY
BASE=https://ytmarket.pro/api/v1

curl -H "X-API-Key: $KEY" "$BASE/products?min_price=1&page_size=5"
curl -H "X-API-Key: $KEY" "$BASE/balance"
curl -X POST -H "X-API-Key: $KEY" -H "Content-Type: application/json" \
  -d '{"product_id":12345,"quantity":1,"payment_method":"balance"}' \
  "$BASE/orders"
curl -H "X-API-Key: $KEY" "$BASE/orders/789"

🙋 FAQ — 常见问题

X-API-Key 与 HMAC Secret 有什么区别?

X-API-Key 是公开的客户端标识,每个请求都在 header 中发送。Secret 是用于 HMAC-SHA256 签名 POST 请求体的私钥,**永远不发送** 到请求中(仅本地用于计算 X-Signature)。若仅泄露 key,攻击者只能读取目录/余额,无法 POST orders/topup。

什么时候需要 HMAC Secret?

若 admin 与 key 一起签发了 secret(默认),那么 POST /orders 和 /topup 必须包含签名,否则返回 HTTP 401。GET 端点(health/products/balance 等)只需 X-API-Key,不需要 secret。

我丢失了 secret 怎么办?

请 admin 调用 `POST /api/admin/api-keys/{fp}/rotate-secret` — 签发新 secret,旧 secret 立即失效。key 本身保持不变。

能否仅充值余额而不下单?

可以,这两个流程互不相关。`POST /v1/balance/topup` → 获取地址 → 发送 USDT → 余额增加。无需下单。可以充值一次用几个月。

如果发错金额会怎样?

若差额 ≤ $0.01 — 自动入账。若超出 — 请联系 support,按实际金额手动入账。详见第 4 节 edge cases 表。

充值地址与网站共用吗?

是的。每个网络(TRC-20/EVM/TON/Solana)的钱包同时服务 API 客户和网站买家。意向通过精确金额区分。网站订单优先。

为什么最低数量不是 1?

业务规则:每个商品有 `min_quantity` 字段 + 订单总额 floor(~600₽)。目的是过滤无法覆盖网络费用的小额"试单"。API 价格与网站相同(无加价)。

如何知道订单已完成?

两种方式:(1) 每 5 秒轮询 `GET /v1/orders/{id}` 直到 status 变为 `completed`/`failed`/`expired`/`cancelled` — completed 时返回 `items[]`;(2) webhook — POST /orders 中传入 `webhook_url`,会推送同样的 JSON。

订单失败会怎样?

余额**自动退还**(`/orders/{id}` 和 webhook 中 `refunded: true`)。Refund-cron 每 30 秒扫描。可以稍后重试或换同类 `product_id`。

在哪里查看最近的请求 / 消费?

`GET /v1/usage` 显示 request_count、last_used_at、total_spent_usdt。`GET /v1/balance` 显示 total_spent_usdt + total_topup_usdt + total_refunded_usdt。

跨平台动态定价如何工作?

若 15 分钟窗口内已有相同金额的订单(任意 marketplace + API 中),下一单价格 +1%(封顶 +10%)。目的是保证金额唯一以匹配存款。订单的 `raw_data.dp_hits` 字段可见。

Webhook 是否签名?

是的,若你的 key 有 HMAC secret,webhook payload 用同一 secret 签名。Headers: `X-Webhook-Timestamp`、`X-Webhook-Signature`、`X-Webhook-Algorithm: HMAC-SHA256`。接收方校验:`hmac_sha256(secret, f"{ts}\n{request.body}").hex() == X-Webhook-Signature` 且 drift ≤ 5 分钟。

如果我的 webhook URL 不响应?

Backend 用指数退避最多重试 5 次(每次 10 秒超时)。5 次失败后标为 fired(不再重试)。建议你的接收方实现幂等(按 order_id + status)。

可以取消订单吗?

当前没有 user-facing 取消。订单要么 `completed`,要么 provider-side 标为 `failed`/`expired`(触发自动退款)。如确需取消请联系 support,admin 可手动标 `cancelled`(也会退款)。

13. Postman / Changelog / 支持

Postman 集合

下载所有 endpoints 的现成 Postman 集合: 下载 .postman_collection.json

变更日志

  • v1.4 (2026-05-23) — 最低批量限制(600₽ 或供应商 min_quantity);自动入账 cron 120s→5s;跨平台动态定价 +1%/15分钟 同样适用于 API;Webhook HMAC 签名(X-Webhook-Signature header);/api/docs 中加入 Try-it playground。
  • v1.3 (2026-05-23) — failed/expired/cancelled 自动退款,新增 `refunded` 字段,paid→processing 映射,响应含 `created_at`/`updated_at`。
  • v1.2 (2026-05-23) — 余额系统,POST /orders 余额扣款,webhook cron。
  • v1.1 (2026-05-23) — 限流 60/min/key,按密钥统计。
  • v1.0 (2026-05-23) — 只读目录接口(products/categories/health)。

支持

API 问题:Telegram 客服。SLA:工作时段 30 分钟(08:00-22:00 MSK)。 Telegram.

YTMarket API v1 • ytmarket.pro