{% extends 'partials/base.html' %} {% load humanize %} {% block content %}
Browse categories and products, buy logs, and check your balance
••••••••••••••••••••••••
Send this key as a header on every request: Authorization: Bearer <API_KEY>.
Regenerating immediately invalidates the current key.
Your current key stops working right away. Any app using it will need the new key.
All endpoints are served under the base URL below. Requests and responses are JSON. Authenticate with your API key in the Authorization header.
BASE URL https://{{ request.get_host|default:"api.thespeedkeys.com" }}/api/v1 HEADER Authorization: Bearer <API_KEY>
/categories
Response 200
{
"count": 3,
"results": [
{ "id": 1, "name": "Facebook", "slug": "facebook", "product_count": 42 },
{ "id": 2, "name": "Instagram", "slug": "instagram", "product_count": 87 },
{ "id": 3, "name": "Tiktok", "slug": "tiktok", "product_count": 25 }
]
}/products
Query Parameters
| category | int · optional | Filter by category id |
| in_stock | bool · optional | Only products with keys available |
| page | int · optional | Page number (default 1) |
Response 200
{
"count": 42,
"results": [
{
"id": 128,
"name": "Facebook 2025",
"category_id": 1,
"price": "3500.00",
"stock": 57,
"in_stock": true
}
]
}/buy
Body (JSON)
| product | int | Product id to purchase |
| quantity | int · optional | Number of keys (default 1) |
{
"product": 128,
"quantity": 2
}Response 201
{
"order_id": 77213,
"product": "Facebook 2025",
"quantity": 2,
"charge": "7000.00",
"keys": [
"XXXXX-XXXXX-XXXXX-XXXXX-11111",
"XXXXX-XXXXX-XXXXX-XXXXX-22222"
]
}The purchased keys are returned once, in this response. Store them — retrieve later from your order history.
/balance
Response 200
{
"balance": "12500.00",
"currency": "NGN"
}{
"error": "insufficient_balance",
"detail": "Wallet balance is too low for this order."
}| 401 | Missing or invalid API key |
| 402 | Insufficient wallet balance |
| 404 | Product or category not found |
| 409 | Out of stock / not enough keys |
| 429 | Rate limit exceeded |