API v1
Integrate supply, pricing and delivery in one afternoon
REST over HTTPS, JSON in and out, Bearer keys, webhooks for every trade event. The sandbox mirrors production so your first call is the same as your thousandth.
Quick start
- 01
Get a key
After verification your dashboard shows a sandbox key (sk_test_…) and a production key (sk_live_…).
- 02
List items
GET /v1/items returns the same 50 public items you see on Live supply plus your full allocation.
- 03
Create an order
POST /v1/orders with an item id and your Steam trade URL. The bot sends the offer within a minute.
Example requests
# List AK-47s in Field-Tested, cheapest first curl "https://api.supplyskins.com/v1/items?q=AK-47&wear=field-tested&sort=price&limit=50" \ -H "Authorization: Bearer sk_live_7f3a9c2e" # Create an order (reserves balance, bot sends the trade offer) curl -X POST https://api.supplyskins.com/v1/orders \ -H "Authorization: Bearer sk_live_7f3a9c2e" \ -H "Content-Type: application/json" \ -d '{"item_id":"ss_0025","trade_url":"https://steamcommunity.com/tradeoffer/new/?partner=…"}'
import { SupplySkins } from "@supplyskins/sdk"; const api = new SupplySkins({ apiKey: process.env.SUPPLYSKINS_KEY }); const { items } = await api.items.list({ q: "AK-47", wear: "field-tested", sort: "price", limit: 50, }); const order = await api.orders.create({ itemId: items[0].id, tradeUrl: "https://steamcommunity.com/tradeoffer/new/?partner=…", maxPrice: items[0].price * 1.02, // tolerate a refresh between list and buy }); console.log(order.status); // "offer_sent"
import os, requests BASE = "https://api.supplyskins.com/v1" H = {"Authorization": f"Bearer {os.environ['SUPPLYSKINS_KEY']}"} items = requests.get(f"{BASE}/items", headers=H, params={ "q": "AK-47", "wear": "field-tested", "sort": "price", "limit": 50, }).json()["items"] order = requests.post(f"{BASE}/orders", headers=H, json={ "item_id": items[0]["id"], "trade_url": "https://steamcommunity.com/tradeoffer/new/?partner=…", }).json() print(order["status"]) # offer_sent
Endpoints
| Method | Path | Description | Auth |
|---|---|---|---|
| GET | /v1/items | List inventory. Filters: q, category, wear, float_min, float_max, price_min, price_max, stattrak. Sort: price, float, updated_at. | key |
| GET | /v1/items/{id} | One item with float, pattern index, stickers and current price. | key |
| POST | /v1/orders | Reserve and buy an item. Body: item_id, trade_url, max_price (optional). | key |
| GET | /v1/orders/{id} | Order status: reserved, paid, offer_sent, accepted, failed, expired. | key |
| GET | /v1/balance | Available and reserved balance in USD, deposit addresses. | key |
| POST | /v1/webhooks | Register an endpoint for order.* and item.price_changed events. HMAC-SHA256 signed. | key |
Auth, limits and errors
Authentication
Authorization: Bearer sk_live_… Keys are shown once; rotate from the dashboard at any time.
Rate limits
600 requests per minute per key, 60 order creations per minute. Headers X-RateLimit-Remaining and Retry-After are always present.
Errors
Standard HTTP codes with a JSON body: { "error": { "code": "item_unavailable", "message": "…" } }. 4xx are yours to fix, 5xx are ours.
Sandbox
Base URL https://sandbox.api.supplyskins.com. Same schema, mirrored inventory, fake balance of $10,000.
Full documentation
The complete reference with schemas, webhook payloads and SDK snippets opens after verification, together with your keys.