Skip to content

Options API

Returns selectable items for select fields defined in the Catalog API. This is a unified endpoint — all product types use the same request/response structure.

Migrating from /v2/subproducts?

See the Migration Guide for field renames and a checklist.

Endpoint

http
GET https://api.iimmpact.com/v2/options

Headers

HeaderDescriptionRequired
X-Api-KeyYour API keyYes
X-TimestampUnix timestamp in secondsYes
X-NonceUnique request identifierYes
X-SignatureHMAC-SHA256 signature (v1=...)Yes

See API Key Authentication for signing details.

Query Parameters

ParameterTypeRequiredDescription
product_codestringYesProduct code (e.g., D, HI, JOMPAY)
field_idstringYesField identifier from catalog (e.g., amount, plan, biller)
account_numberstringConditionalRequired by many dynamic fields (phone number, NRIC, etc.)
biller_codestringNoFilter by specific biller code (JomPAY only)
limitnumberNoItems per page (default: 100, max: 25,000)
per_pagenumberNoAlias for limit
pagenumberNoPage number for pagination (default: 1)
is_activebooleanNoFilter active status (applies to static options)
include_hiddenbooleanNoInclude hidden products when resolving options
include_inactivebooleanNoInclude inactive products when resolving options

Example Request

bash
curl -X GET "https://api.iimmpact.com/v2/options?product_code=D&field_id=amount" \
  -H "X-Api-Key: YOUR_API_KEY" \
  -H "X-Timestamp: 1704067200" \
  -H "X-Nonce: req-1704067200-a1b2c3d4e5f6" \
  -H "X-Signature: v1=BASE64_HMAC_SIGNATURE"

Response

json
{
  "product_code": "D",
  "field_id": "amount",
  "items": [
    {
      "code": "30",
      "label": "RM 30",
      "price": { "amount": "30.00", "currency": "MYR" },
      "cost": { "amount": "29.2500", "currency": "MYR" }
    }
  ],
  "meta": {
    "current_page": 1,
    "last_page": 1,
    "per_page": 100,
    "total": 5
  }
}
FieldTypeDescription
product_codestringEchoed product code
field_idstringEchoed field identifier
itemsarrayList of selectable items
metaobjectPagination metadata

Item Schema

Items have a consistent base structure with optional fields depending on product type:

FieldTypeDescriptionPresent For
codestringStable identifier for fulfillmentAll items
labelstringDisplay text. For eligible Mobile Data Plan options, Plan Validity is removed from label and returned separately in validity.All items
validitystringPlan Validity, e.g. 7 days, 30 daysMobile Data Plan options when available
featuresarrayPlan feature labels, e.g. included quota, validity, or pass nameMobile Data Plan options when available
descriptionstringAdditional detailsOptional
priceMoneyEffective selling price after reseller adjustmentsPriced items
costMoneyYour wholesale costPriced items
rrpMoneyRecommended retail priceOptional
has_loss_riskbooleantrue when adjustment can produce a lossPriced items
account_numberstringAccount identifier for fulfillmentPTPTN accounts
min_amountMoneyMinimum payment amountJomPAY billers
max_amountMoneyMaximum payment amountJomPAY billers

Money objects have { "amount": "30.00", "currency": "MYR" } shape.

Pricing Fields

Three pricing fields support flexible pricing strategies:

  • cost — Your wholesale cost (what you pay us). B2B only — do not expose to end users.
  • rrp — Recommended retail price (our suggested selling price)
  • price — Effective selling price after your reseller adjustment rules

For eligible Mobile Data Plan options, Plan Validity is returned separately in validity when available. Some Mobile Data Plan options, including Hotlink Internet (HI) plans, also return features as an array of display labels describing the plan. The code remains unchanged for fulfillment.

Example Mobile Data Plan option:

json
{
  "code": "Pantas RM10 10GB 7D",
  "label": "Pantas RM10 10GB",
  "validity": "7 days",
  "price": {
    "amount": "10",
    "currency": "MYR"
  },
  "cost": {
    "amount": "9.7000",
    "currency": "MYR"
  },
  "rrp": {
    "amount": "10",
    "currency": "MYR"
  },
  "has_loss_risk": false,
  "features": ["Pantas RM10 10GB", "7D"]
}

price and cost are returned on all priced items. rrp is included when a recommended retail price is configured for the product. All three fields are omitted from the response when null. See Product Examples for complete responses per product type.

Pagination

For large lists (e.g. JomPAY with 21,000+ billers), use limit and page. Iterate until current_page equals last_page.

TIP

Generate fresh auth headers (timestamp, nonce, signature) for each paginated request.

Caching Large Lists

For JomPAY billers and similar large reference lists, cache the full list locally and refresh daily. This reduces API calls and improves lookup speed.

Error Responses

400 — Missing Parameters

json
{
  "message": "The given data was invalid.",
  "errors": {
    "product_code": ["The product_code field is required."],
    "field_id": ["The field_id field is required."]
  }
}

400 — Missing Account Number

When a dynamic field requires account_number:

json
{
  "message": "The given data was invalid.",
  "errors": {
    "account_number": [
      "This field depends on phone and requires account_number parameter."
    ]
  }
}

404 — Invalid Product or Field

json
{
  "message": "Options not found for INVALID/amount",
  "errors": {}
}

Product-Specific Examples

See Catalog Product Examples for complete end-to-end flows showing catalog fields, options responses, and resulting payment requests for each product type.

IIMMPACT API Documentation