ooeex API
Browse listings, place orders paid from your balance, fetch your keys, and manage per-key disputes — all over a simple REST API.
Authentication
Create a key under Account → Settings → API Keys. It is shown once. Send it on every request via the x-api-key header. Keys spend only your account balance — top up on the site first.
curl https://ooeex.com/api/v1/balance \
-H "x-api-key: hb_live_your_key_here"Rate limit: 120 requests/minute per key. Write requests (POST /orders, POST /disputes) require an Idempotency-Key header so a retry never charges or disputes twice.
Ordering
/api/v1/balance/api/v1/collections/api/v1/products/api/v1/products/:id/api/v1/orders/api/v1/orders/:id/keysCollections group listings the way the storefront does. Filter by collectionId for an exact match, or collection with a slug or name. Both match one collection exactly — “Gmail Accounts” will not return “Aged Gmail Accounts”. Listings that belong to no collection come back with collectionId: null and are excluded when you filter.
# discover the collections
curl https://ooeex.com/api/v1/collections -H "x-api-key: $KEY"
# then list everything in one of them
curl "https://ooeex.com/api/v1/products?collection=aged-gmail-accounts&pageSize=50" \
-H "x-api-key: $KEY"curl -X POST https://ooeex.com/api/v1/orders \
-H "x-api-key: $KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "content-type: application/json" \
-d '{ "items": [ { "productId": "PRODUCT_UUID", "quantity": 5 } ] }'Per-key disputes
Dispute the exact keys that don't work, with evidence per key, and fetch replacement keys the seller provides. All disputed keys in one dispute must be from the same seller.
/api/v1/uploads/presign/api/v1/disputes/api/v1/disputes/:id/api/v1/disputes/:id/replacements/api/v1/disputes/:id/messagescurl -X POST https://ooeex.com/api/v1/disputes \
-H "x-api-key: $KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "content-type: application/json" \
-d '{
"orderId": "ORDER_UUID",
"reason": "invalid_key",
"description": "5 of 100 keys already redeemed",
"disputedKeys": [
{ "orderItemId": "ITEM_UUID", "productKeyId": "KEY_UUID",
"evidenceText": "shows already used" }
]
}'Errors
Errors return { "error": { "code", "message", "details?" } } with a matching HTTP status — e.g. 402 insufficient_balance, 401 unauthorized, 429 rate_limited, 409 idempotency_conflict.