API reference
Sell digital goods from your own bot or website. You order over HTTP, we deliver the codes in the same response, and your wallet balance covers the cost.
Base URL
https://api.geminipro7.store
Every response is JSON and carries a success boolean. All prices are in USD.
Authentication
Send your key in the X-API-Key header on every request. Get one in the bot under Profile → API. Keys start with hd_.
X-API-Key: hd_your_key_here
A Bearer token in the Authorization header also works if that fits your HTTP client better.
Rate limits
| Limit | Default | What counts |
|---|---|---|
| Requests | 60 per minute | Every call, including reads |
| Orders | 500 per day | Items purchased, not requests |
Going over the request limit returns 429; the counter clears at the start of the next minute. Need more? Ask in the bot and we'll raise it on your key.
Errors
Failures return a non-2xx status with a plain-language message. Nothing is charged when an order fails.
{
"success": false,
"error": "Insufficient balance. Required: $1.50, available: $0.73"
}
| Status | Meaning | What to do |
|---|---|---|
| 401 | Key missing or invalid | Check the X-API-Key header. |
| 403 | Key disabled or account blocked | Regenerate the key, or contact support. |
| 404 | Unknown service or order | Re-read /products — IDs change when a product is retired. |
| 429 | Rate or daily limit hit | Back off and retry. |
| 400 | Bad input, low balance, or out of stock | The message names which one. |
Balance
Returns your wallet balance and the limits on your key. Cheap to call — use it as a health check.
{
"success": true,
"user": "your_username",
"balance": 12.40,
"currency": "USD",
"rate_per_min": 60,
"daily_limit": 500
}
Products
Everything currently on sale, with live stock. Prices here are your API prices — one flat rate per item, no bulk tiers.
{
"success": true,
"services": [
{
"service_id": "gp_12",
"name": "Gemini Pro 18 months #2",
"price": 0.68,
"stock": 488
}
]
}
| Field | Type | Notes |
|---|---|---|
| service_id | string | Pass this to /order. |
| price | number | Per item, in USD. |
| stock | integer | 9999 means the supplier didn't report a count — treat it as available. |
Place order
Buys and delivers in one call. The cost leaves your balance immediately.
Request
{
"service_id": "gp_12",
"quantity": 2
}
| Field | Type | Notes |
|---|---|---|
| service_id | string, required | From /products. |
| quantity | integer | 1 to 100. Defaults to 1. |
Response
{
"success": true,
"order_id": "GP2184",
"service_id": "gp_12",
"quantity": 2,
"total_cost": 1.36,
"new_balance": 11.04,
"products": [
"GEMINI-18M-7F3A-91KD",
"GEMINI-18M-2B8C-40XQ"
],
"pending": 0
}
products — not in order_id.order_id (e.g. GP234) is a receipt number for looking the order up later. The thing your buyer pays for is every element of the products array.Store the codes before you reply to your buyer — this is the only response that carries them all at once. If you lose them, GET /order/{order_id} returns them again at no cost.
quantity in the response, not the one you sent.Order status
Re-read a single order. Useful when an order came back pending, or when you need to hand a buyer their code again. Free — re-reading never charges you.
GET /order/GP2184
{
"success": true,
"order_id": "GP2184",
"status": "delivered",
"total_cost": 0.68,
"products": ["GEMINI-18M-7F3A-91KD"],
"created_at": "2026-08-13 11:42:08"
}
| Status | Meaning |
|---|---|
| delivered | Done. Codes are in products. |
| pending | Supplier hasn't released it yet. Poll this endpoint. |
| failed | Didn't go through. You were refunded. |
Order history
Your API orders, newest first. Paginated.
| Query | Default | Notes |
|---|---|---|
| page | 1 | |
| limit | 50 | Max 100. |
{
"success": true,
"page": 1,
"limit": 50,
"total_orders": 124,
"total_pages": 3,
"orders": [
{
"order_id": "GP2184",
"name": "Gemini Pro 18 months #2",
"total_cost": 0.68,
"status": "delivered",
"products": ["GEMINI-18M-7F3A-91KD"],
"created_at": "2026-08-13 11:42:08"
}
]
}
Pending orders
Most orders come back delivered with the codes attached. Occasionally a supplier queues one instead — then products is short and pending is greater than zero.
When that happens, poll /order/{order_id} every 30 seconds or so. It usually resolves within a couple of minutes. If it turns failed, the money is already back in your balance — nothing to reclaim.
Code examples
Placing an order and reading the codes back.
curl -X POST https://api.geminipro7.store/order \ -H "X-API-Key: hd_your_key_here" \ -H "Content-Type: application/json" \ -d '{"service_id":"gp_12","quantity":1}'
<?php $ch = curl_init('https://api.geminipro7.store/order'); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_HTTPHEADER => [ 'X-API-Key: hd_your_key_here', 'Content-Type: application/json', ], CURLOPT_POSTFIELDS => json_encode([ 'service_id' => 'gp_12', 'quantity' => 1, ]), ]); $res = json_decode(curl_exec($ch), true); curl_close($ch); if (empty($res['success'])) { throw new Exception($res['error'] ?? 'Order failed'); } foreach ($res['products'] as $code) { // hand $code to your buyer }
import requests r = requests.post( "https://api.geminipro7.store/order", headers={"X-API-Key": "hd_your_key_here"}, json={"service_id": "gp_12", "quantity": 1}, timeout=30, ) data = r.json() if not data.get("success"): raise RuntimeError(data.get("error", "Order failed")) for code in data["products"]: print(code) # hand it to your buyer
const res = await fetch("https://api.geminipro7.store/order", { method: "POST", headers: { "X-API-Key": "hd_your_key_here", "Content-Type": "application/json", }, body: JSON.stringify({ service_id: "gp_12", quantity: 1 }), }); const data = await res.json(); if (!data.success) throw new Error(data.error); for (const code of data.products) { // hand code to your buyer }