Check Number Packages

API to list the packages a prepaid subscriber can actually buy: name, price, pre-discount price (strike-through price), validity, quota and category. Use it after Check Number confirms the number, or directly when you need the catalog.

Supported operators: Telkomsel and Smartfren. Both endpoints are served for isolated (IDSL-only) accounts — non-isolated accounts receive HTTP 404.

Path

MethodPath
POSTapi/check-number-packages

Request Body

AttributesTypeDescriptionMandatory
customer_idStringSubscriber number, 08… or 62… format (digits only, max 20 characters)Yes
operatorStringOperator hint: telkomsel or smartfren. A supplied hint wins over the prefix-based detectionNo
refreshBooleantrue = bypass the backend cache and fetch a fresh catalog (the fresh result re-populates the cache). Default falseNo
usernameStringYour registered username (alphanumeric, dots, underscores, hyphens only)Yes
signStringSignature. Value: md5(username+api_key+cnp)Yes
{
  "customer_id": "081200000001",
  "operator": "telkomsel",
  "refresh": false,
  "username": "your_username",
  "sign": "your_signature"
}
<?xml version="1.0"?>
<mp>
  <customer_id>081200000001</customer_id>
  <operator>telkomsel</operator>
  <refresh>false</refresh>
  <username>your_username</username>
  <sign>your_signature</sign>
</mp>

Test Case

Use below test case in development environment only.

customer_idResponse StatusDescription
0812000000011Telkomsel subscriber with two packages
0881000000011Non-Smartfren number (not a Smartfren subscriber)
Other numbers1Default valid response

Response

Valid subscriber with packages

AttributesTypeDescriptionMandatory
customer_idStringThe checked number (normalised)Yes
operatorStringDetected operator, lowercase: telkomsel or smartfrenYes
is_subscriberBooleantrue = registered subscriber of the operatorYes
has_packageBooleanWhether the subscriber has purchasable packages. null is reserved for "cannot be determined", which the backend reports as a retryable answer — you then receive rc 103 instead of a success bodyNo
package_countDoubleTotal purchasable packages. See has_package for the null caseNo
packagesArrayThe catalog. Each item: code, name, price, base_price, validity, quota, categoryNo
truncatedBooleantrue = the list was capped and is not the complete catalogNo
retryableBooleanAlways false in a success body: a partially readable catalog (or an unreachable operator) is reported as rc 103; retry with backoffNo
cachedBooleantrue = served from the backend cache (result may be up to 30 minutes old)No
messageStringResponse messageYes
rcStringResponse code. See response code listYes
{
  "data": {
    "customer_id": "6281200000001",
    "operator": "telkomsel",
    "is_subscriber": true,
    "has_package": true,
    "package_count": 2,
    "packages": [
      {
        "code": "DUMMY-TSEL-1",
        "name": "Dummy Package 1",
        "price": 50000,
        "base_price": 65000,
        "validity": "30 days",
        "quota": "10 GB",
        "category": "Internet"
      },
      {
        "code": "DUMMY-TSEL-2",
        "name": "Dummy Package 2",
        "price": 15000,
        "base_price": null,
        "validity": "7 days",
        "quota": "3 GB",
        "category": "Internet"
      }
    ],
    "truncated": false,
    "retryable": false,
    "cached": false,
    "message": "SUCCESS",
    "rc": "00"
  }
}

Non-subscriber number

{
  "data": {
    "customer_id": "6288100000001",
    "operator": "smartfren",
    "is_subscriber": false,
    "has_package": false,
    "package_count": 0,
    "packages": [],
    "truncated": false,
    "retryable": false,
    "cached": false,
    "message": "SUCCESS",
    "rc": "00"
  }
}

Field notes

  • price is the selling price and base_price the pre-discount price (Telkomsel originalPrice, Smartfren basePrice). base_price is absent or null when there is no promo — do not treat a missing base_price as an error.
  • code, quota and category are operator-specific: Telkomsel returns opaque package ids, a per-quota-bucket quota and product-taxonomy category; Smartfren returns short SKUs, a total benefit quota and tab names. Do not compare or sum them across operators.
  • The catalog is cached per number for 30 minutes; set refresh: true only when you truly need a fresh one (it triggers the upstream fetch and is slower).
  • A number that is not a subscriber of the detected operator answers is_subscriber: false with an empty packages list — that is a valid answer, not an error.

Error Responses

ConditionrcWhat to do
Number rejected by the operator14The number is not a valid prepaid number for that operator.
Operator not supported yet16Only telkomsel and smartfren are supported today.
Invalid body107Fix the request — error_details lists the offending fields.
Upstream throttled, unavailable, or the catalog could not be read in full103Retry later with a delay between attempts. A partially readable catalog is reported this way too, so no partial list is returned.

Live Testing

Request URL
https://api-sandbox.irongatedigital.com/api/check-number-packages
Request Method
Request Header
Content-Type: application/json
Body
Result