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

GET/api/v1/products

Request Headers

Headers

ParameterTypeRequiredDescription
X-Api-KeyStringYesYour API Key.
X-TimestampStringYesCurrent Unix timestamp in ms.
X-SignatureStringYesHMAC-SHA256 signature. For GET requests, sign the timestamp only: HMAC(timestamp, apiSecret).

Query Parameters

Query Params

ParameterTypeRequiredDescription
category_slugStringNoFilter by game slug (e.g., "mobile-legends", "free-fire"). Get slugs from GET /api/v1/categories.
pageNumberNoPage number (1-based, default: 1).
limitNumberNoItems per page (1-100, default: 50).

Response

200OK
json
{
"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

ParameterTypeRequiredDescription
codeStringNoThe product code to pass as product_code when you call POST /order.
nameStringNoDenomination name.
categoryStringNoThe game's DISPLAY name. It can be renamed at any time, use it for labels, never as a key.
category_slugStringNoNEW: 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.
priceNumberNoYour tier price, already resolved across every catalog assigned to you.
statusStringNoNOW 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

  1. Call GET /categories to get the list of games and their form fields.
  2. Call GET /products?category_slug=mobile-legends to get available denominations and prices.
  3. Display the form fields from step 1 and the products from step 2 to the end-user.
  4. 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.

PreviousCategoriesNextCreate Order