Get Products
Retrieve available products with tier-specific pricing, filterable by category.
Returns the catalog of all available products assigned to your reseller account. The prices returned are already resolved according to your assigned tier (Gold, Platinum, or Diamond) across all assigned catalogs.
Endpoint
Request Headers
Headers
| Parameter | Type | Required | Description |
|---|---|---|---|
X-Api-Key | String | Yes | Your API Key. |
X-Timestamp | String | Yes | Current Unix timestamp in ms. |
X-Signature | String | Yes | HMAC-SHA256 signature. For GET requests, sign the timestamp only: HMAC(timestamp, apiSecret). |
Query Parameters
Query Params
| Parameter | Type | Required | Description |
|---|---|---|---|
category_slug | String | No | Filter by game slug (e.g., "mobile-legends", "free-fire"). Get slugs from GET /api/v1/categories. |
page | Number | No | Page number (1-based, default: 1). |
limit | Number | No | Items per page (1-100, default: 50). |
Response
{
"success": true,
"data": {
"products": [
{
"code": "ALGAN-MLBB-86",
"name": "Mobile Legends 86 Diamonds",
"category": "Mobile Legends: Bang Bang",
"category_slug": "mobile-legends",
"price": 25000,
"status": "active"
},
{
"code": "ALGAN-MLBB-172",
"name": "Mobile Legends 172 Diamonds",
"category": "Mobile Legends: Bang Bang",
"category_slug": "mobile-legends",
"price": 49500,
"status": "inactive"
},
{
"code": "ALGAN-FF-70",
"name": "Free Fire 70 Diamonds",
"category": "Free Fire",
"category_slug": "free-fire",
"price": 10000,
"status": "active"
}
]
},
"meta": {
"total": 142,
"page": 1,
"limit": 50,
"total_pages": 3,
"has_more": true
}
}Field Behavior
Fields
| Parameter | Type | Required | Description |
|---|---|---|---|
code | String | No | The product code to pass as product_code when you call POST /order. |
name | String | No | Denomination name. |
category | String | No | The game's DISPLAY name. It can be renamed at any time, use it for labels, never as a key. |
category_slug | String | No | NEW: the game's stable slug, identical to the slug in GET /categories and to the category_slug query parameter. Group and match on this, not on category. |
price | Number | No | Your tier price, already resolved across every catalog assigned to you. |
status | String | No | NOW MEANINGFUL: "active" or "inactive". See below. |
status now reflects real availability
status used to be "active" on every row. It is now computed: a product reads "active" only when we can currently source it, and "inactive" when no live supply route exists for it right now. Skip inactive rows when you sync your catalog; ordering one will fail and be refunded.
If our availability check itself cannot run, every product is reported active; we would rather let one order fail and refund it than blank out your entire catalog.
category_slug is additive
category keeps its exact previous meaning and position. category_slug was added alongside it; nothing was renamed or removed.
Example cURL
# Get all products (paginated)
API_KEY="algan_live_..."
API_SECRET="sk_live_..."
TIMESTAMP=$(python3 -c "import time; print(int(time.time() * 1000))")
SIGNATURE=$(echo -n "${TIMESTAMP}" | \
openssl dgst -sha256 -hmac "${API_SECRET}" | awk '{print $2}')
curl -s "https://algan.id/api/v1/products?page=1&limit=10" \
-H "X-Api-Key: ${API_KEY}" \
-H "X-Timestamp: ${TIMESTAMP}" \
-H "X-Signature: ${SIGNATURE}"
# Filter by category
curl -s "https://algan.id/api/v1/products?category_slug=mobile-legends&page=1&limit=20" \
-H "X-Api-Key: ${API_KEY}" \
-H "X-Timestamp: ${TIMESTAMP}" \
-H "X-Signature: ${SIGNATURE}"
Typical Integration Flow
Recommended Flow
- Call
GET /categoriesto get the list of games and theirformfields. - Call
GET /products?category_slug=mobile-legendsto get available denominations and prices. - Display the
formfields from step 1 and the products from step 2 to the end-user. - When the user selects a product and fills in the form, call
POST /order.
Caching
Performance
Cache-Control: private, max-age=60, must-revalidate · Vary: X-Api-Key
Do not cache this on a shared CDN
Every price in this response is resolved against your tier and your assigned catalogs. The response is marked private for that reason. If you put a shared proxy or CDN in front of this endpoint, key it on X-Api-Key, otherwise one reseller’s tier prices can be served to another.