Check Number

API to check a prepaid phone number: which operator it belongs to, whether it is a registered subscriber of that operator, and (optionally) how many packages the subscriber can buy. This helps verify a customer's number before a transaction and reduces fail rates from wrong destination numbers.

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

Path

MethodPath
POSTapi/check-number

Package catalog

api/check-number answers whether the number has packages (has_package, package_count) but not which ones. To list the packages themselves, use:

MethodPath
POSTapi/check-number-packages

Request Body

AttributesTypeDescriptionMandatory
customer_idStringSubscriber number: 08… or 62… formatYes
operatorStringOperator hint: telkomsel or smartfrenNo
usernameStringYour registered usernameYes
signStringSignature. Value: md5(username+api_key+cnp)Yes

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

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
usernameStringYour registered username (alphanumeric, dots, underscores, hyphens only)Yes
signStringSignature. Value: md5(username+api_key+cnp)Yes
{
  "customer_id": "081200000001",
  "operator": "telkomsel",
  "username": "your_username",
  "sign": "your_signature"
}
<?xml version="1.0"?>
<mp>
  <customer_id>081200000001</customer_id>
  <operator>telkomsel</operator>
  <username>your_username</username>
  <sign>your_signature</sign>
</mp>

Response

Valid subscriber

AttributesTypeDescriptionMandatory
customer_idStringThe checked number (normalised)Yes
operatorStringDetected operator, lowercase: telkomsel or smartfrenYes
is_subscriberBooleantrue = registered subscriber of the operator. null is reserved for "cannot be determined", which the backend reports as a retryable answer — you then receive rc 103 instead of a success bodyYes
cust_typeStringSubscriber type: PREPAID or POSTPAID. Telkomsel only; null for SmartfrenNo
productStringSubscriber product: SIMPATI or HALO. Telkomsel only; null for SmartfrenNo
has_packageBooleanWhether the subscriber has purchasable packages. null = not checked or could not be determinedNo
package_countDoubleNumber of purchasable packages. null = not checked or could not be determinedNo
retryableBooleanAlways false in a success body: a retryable upstream answer is reported as rc 103 (retry with backoff)No
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,
    "cust_type": "PREPAID",
    "product": "SIMPATI",
    "has_package": true,
    "package_count": 2,
    "retryable": false,
    "cached": false,
    "message": "SUCCESS",
    "rc": "00"
  }
}
<?xml version="1.0"?>
<mp>
  <customer_id>6281200000001</customer_id>
  <operator>telkomsel</operator>
  <is_subscriber>true</is_subscriber>
  <cust_type>PREPAID</cust_type>
  <product>SIMPATI</product>
  <has_package>true</has_package>
  <package_count>2</package_count>
  <retryable>false</retryable>
  <cached>false</cached>
  <message>SUCCESS</message>
  <rc>00</rc>
</mp>

Non-subscriber number

{
  "data": {
    "customer_id": "6288100000001",
    "operator": "smartfren",
    "is_subscriber": false,
    "cust_type": null,
    "product": null,
    "has_package": false,
    "package_count": 0,
    "retryable": false,
    "cached": false,
    "message": "SUCCESS",
    "rc": "00"
  }
}

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 answer cannot be determined103Retry later with a delay between attempts. The backend also uses this code when it flags an answer as retryable.

Live Testing

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