Language

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.

AUTH
X-API-Key: hsc_…
MONEY
USD · JSON · UTC times
IDS
8-hex order IDs
BASE URL
https://api.hotschool.club/v1
For AI / codegen
Download a spec and drop it into Cursor, ChatGPT, or your agent so it can call this API correctly.
OpenAPIAI JSON

RESELLER API

Quick start

Point HTTP at api.hotschool.club, get accounts back. Four steps to first sale:

  1. 1
    Enable API access
    Sign up, then grab your X-API-Key from the dashboard. Save it — anyone with it can drain your balance.
  2. 2
    Check balance
    GET /v1/balance — make sure you have enough before you sell.
  3. 3
    Load catalog
    GET /v1/prices + GET /v1/stock, cache 30–60s.
  4. 4
    Place & poll
    POST /v1/generate, then poll GET /v1/order/{id} every 3–5s until completed or failed.
POSTFire the order
curl -X POST "https://api.hotschool.club/v1/generate" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"amount": 100}'
GETPoll every 3 seconds until status = completed
curl -H "X-API-Key: YOUR_API_KEY" "https://api.hotschool.club/v1/order/$ORDER_ID"
Response on completed carries the account under resultemail / password / balance. If we can’t source it in 40 min the order flips to failed and the cost is auto-refunded to your balance. No ticket needed.

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.

HEADEREvery call sends the same header
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.

GETPrices
curl -H "X-API-Key: YOUR_API_KEY" "https://api.hotschool.club/v1/prices"
GETStock
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).

OnlyFans
$10$20$50$100$200$400
Bomber
1day7days30dayslifetime
ExpressVPN
1m6m1ylifetime

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.

GETYour account state — anchored to your key
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.

GETBalance
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.

POSTCreate
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

POSTBuy a Bomber key (instant)
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}'
POSTBuy an ExpressVPN account (instant)
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.

GETPoll
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.

GETHistory
curl -H "X-API-Key: YOUR_API_KEY" "https://api.hotschool.club/v1/history"

Status & refunds

Order lifecycle: processingcompleted (credentials in result) or → failed (auto-refund to balance). A completed OF order is auto-replaceable inside its warranty window:

10 min cooldown · 120 min warranty window · 2-replacement streak cap · single-use per original
POSTFire a warranty replacement
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.

GET /v1/order/<id> ≈ 1 req / 3s per order
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.

HTTPReason codeWhen
401INVALID_API_KEYMissing or invalid X-API-Key header
402INSUFFICIENT_BALANCENot enough balance for the tier — current balance echoed in the body
409OUT_OF_STOCKRequested tier below the stock threshold — retry in a few minutes
429RATE_LIMITEDPolled faster than 1/s or hit warranty cooldown / streak cap
404NOT_FOUNDOrder id doesn’t exist or doesn’t belong to your key
400FULFILLMENT_FAILEDOrder flipped to failed after retries — full refund already credited
500INTERNAL_ERROROur side — safe to retry after a short delay
JSONError shape (identical on every non-2xx)
{
  "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.

  1. 1
    Page load
    GET /v1/prices + /v1/stock, cache 30–60s. Render your tiers with your markup on top.
  2. 2
    Product click
    Optional — hit /v1/stock again to confirm the tier is still available before you accept payment.
  3. 3
    Buy
    POST /v1/generate after the customer pays you. On completed → email credentials. On pending → poll every 3–5s.
  4. 4
    Failed
    Show “retry with a different tier” — the full cost is already back on your balance, no ticket needed.
  5. 5
    Wallet & audit
    /v1/balance for live balance, /v1/history to reconcile against your own DB.
PROGRAMFull storefront workflow
# 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.