RESELLER API
Sell HSC accounts from your own shop
Server-to-server API. Authenticate with a user-scoped key. Orders charge the key owner’s balance and refund automatically if delivery fails. Never put the key in browser code.
RESELLER API
Quick start
Point HTTP at api.hotschool.club, get accounts back. Four steps to first sale:
- 1Enable API accessSign up, then grab your X-API-Key from the dashboard. Save it — anyone with it can drain your balance.
- 2Check balanceGET /v1/balance — make sure you have enough before you sell.
- 3Load catalogGET /v1/prices + GET /v1/stock, cache 30–60s.
- 4Place & pollPOST /v1/generate, then poll GET /v1/order/{id} every 3–5s until completed or failed.
curl -X POST "https://api.hotschool.club/v1/generate" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"amount": 100}'curl -H "X-API-Key: YOUR_API_KEY" "https://api.hotschool.club/v1/order/$ORDER_ID"Authentication
Every endpoint expects your X-API-Key header. Grab yours from the dashboard after signing up — Enable API up top handles both in one hop.
curl -H "X-API-Key: YOUR_API_KEY" "https://api.hotschool.club/v1/balance"Missing or invalid key → 401. Anyone with your key can drain your balance — treat it like a secret.
List products
Current per-tier prices and per-tier stock, one call each.
curl -H "X-API-Key: YOUR_API_KEY" "https://api.hotschool.club/v1/prices"curl -H "X-API-Key: YOUR_API_KEY" "https://api.hotschool.club/v1/stock"Product detail
Three product families, all sharing the same shape (tier / variant strings).
Who am I
There’s no dedicated /v1/me — the key IS the identity. If you need your account context, hit /v1/balance which returns your balance + total-spent counter under the key you called with.
curl -H "X-API-Key: YOUR_API_KEY" "https://api.hotschool.club/v1/balance"Balance
Live balance in USD. Every order deducts from this — top up via the dashboard.
curl -H "X-API-Key: YOUR_API_KEY" "https://api.hotschool.club/v1/balance"Place an order
Fires an OnlyFans balance-loaded account order at the given tier. Async — a real account is generated for you and delivered on the poll endpoint.
curl -X POST "https://api.hotschool.club/v1/generate" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"amount": 100}'Miscellaneous — Bomber & VPN
curl -X POST "https://api.hotschool.club/v1/misc/buy" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"product_id":"emailbomber","variant_id":"7days","qty":1}'curl -X POST "https://api.hotschool.club/v1/misc/buy" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"product_id":"expressvpn","variant_id":"1m","qty":1}'Poll an order
Poll /v1/order/<id> until status is completed or failed. ~3s interval is friendly; don’t hit it faster or you’ll trip the rate limit. Bomber and VPN buys return the credentials in the create response — no polling needed.
curl -H "X-API-Key: YOUR_API_KEY" "https://api.hotschool.club/v1/order/$ORDER_ID"Order history
Every order you’ve ever fired against your key, keyed by order_id. Handy for reconciling against your own DB.
curl -H "X-API-Key: YOUR_API_KEY" "https://api.hotschool.club/v1/history"Status & refunds
Order lifecycle: processing → completed (credentials in result) or → failed (auto-refund to balance). A completed OF order is auto-replaceable inside its warranty window:
curl -X POST "https://api.hotschool.club/v1/replacement" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"order_id": "of-a1b2c3d4"}'Success returns new_order_id to poll (or stock_out_credited when we can’t source a swap — the cost is credited back to your balance the same tick). Common blocks: 404 (not yours), 429 (cooldown / streak cap), 400 (expired window / already replaced).
Rate limits
Poll /v1/order/<id> at ~3s intervals — anything faster than 1/s trips the rate limiter. The rest of the endpoints are unmetered for normal traffic; industrial-scale abuse gets 429’d automatically.
POST /v1/generate no fixed cap · balance-gated
GET /v1/prices|stock ≥ 30s recommended — cache client-side
POST /v1/replacement 1 per original (single-use)
Errors
JSON body on non-2xx. Ranges follow HTTP semantics — 4xx is your problem, 5xx is ours.
| HTTP | Reason code | When |
|---|---|---|
| 401 | INVALID_API_KEY | Missing or invalid X-API-Key header |
| 402 | INSUFFICIENT_BALANCE | Not enough balance for the tier — current balance echoed in the body |
| 409 | OUT_OF_STOCK | Requested tier below the stock threshold — retry in a few minutes |
| 429 | RATE_LIMITED | Polled faster than 1/s or hit warranty cooldown / streak cap |
| 404 | NOT_FOUND | Order id doesn’t exist or doesn’t belong to your key |
| 400 | FULFILLMENT_FAILED | Order flipped to failed after retries — full refund already credited |
| 500 | INTERNAL_ERROR | Our side — safe to retry after a short delay |
{
"error": "Insufficient balance",
"balance": 3.12 // present when 402
}Build a storefront
End-to-end: a customer paid you (however you take money) for a $100 OF account. You fire our order, wait until it’s completed, then hand the credentials over.
- 1Page loadGET /v1/prices + /v1/stock, cache 30–60s. Render your tiers with your markup on top.
- 2Product clickOptional — hit /v1/stock again to confirm the tier is still available before you accept payment.
- 3BuyPOST /v1/generate after the customer pays you. On completed → email credentials. On pending → poll every 3–5s.
- 4FailedShow “retry with a different tier” — the full cost is already back on your balance, no ticket needed.
- 5Wallet & audit/v1/balance for live balance, /v1/history to reconcile against your own DB.
# Real workflow — customer buys $100 OF from your shop,
# you pull an account and email it to them.
ORDER=$(curl -sX POST "https://api.hotschool.club/v1/generate" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"amount":100}' | jq -r .order_id)
while true; do
DONE=$(curl -s -H "X-API-Key: YOUR_API_KEY" "https://api.hotschool.club/v1/order/$ORDER" | jq -r .status)
[ "$DONE" = "completed" ] && break
[ "$DONE" = "failed" ] && { echo "refunded"; exit 1; }
sleep 3
done
curl -s -H "X-API-Key: YOUR_API_KEY" "https://api.hotschool.club/v1/order/$ORDER" \
| jq -r '.result | "email: \(.email)\npass: \(.password)"'Errors: wrap the poll in a try/catch — a failed status means we already refunded you, so tell the customer to pick a different tier (or offer a full refund). For batches: fan out multiple /v1/generate calls in parallel, poll each individually. Our stock handles it.
Ready to plug in?