Number Portability Lookup HLR HTTP API
Example code for using the Number Portability Lookup API is available for programmers using Java, Perl, PHP, and AGI.
We also have plug-and-play scripts to integrate carrier lookups into your Asterisk dialplan - no coding required!
API Details - v3.3
Introduction to the API
Our API (Application Programming Interface) is designed to make it easy to integrate our number portability lookup service into your own application, with the minimum amount of additional programming.
Connectivity to the service
https://api.numberportabilitylookup.com/npl
You can make an HTTP GET, or HTTP POST request; the latter is recommended if you are looking up a large quantity of numbers in a single request. There is a maximum of 100 numbers per request, and a maximum of one concurrent connection per account. Note that SS7 querying can take a while to process, so a large batch of numbers may take a while to return fully return.
Performing an HLR Lookup
In order to perform an HLR query on one or more mobile numbers, pass the following parameters:
user | Your account username |
pass | Your account password |
msisdn | The number(s) to look up in E.164 format. Separate multiple numbers with commas |
format | Use format=json for the most comprehensive response. If omitted, the system will revert to a legacy CSV format with basic data points for compatibility with older API clients. New integrations should always use the 'json' format. |
msc | Pass msc=1 to request serving MSC address (if feature is enabled on your account), otherwise omit.
Note: Querying the serving MSC address is increasingly blocked due to its use in SS7 messaging fraud. Please contact us if you have a legitimate need for this data field and we can confirm availability for the networks you need. |
Example Request:
https://api.numberportabilitylookup.com/npl?user=bob&pass=123&msisdn=447788450450,447810701702&format=json
Number Formatting
Numbers should be specified in the standard E.164 international format. i.e. Country Code, and National Significant Number without National prefixing if any exist. The leading '+' symbol is not required by our service. Example: UK 07788 450 450 -> 447788450450 Example: USA 704 451 8989 -> 17044518989 Example: AUS 0449100123 -> 61449100123
If you need help on how to format a number for a specific country, please [ Contact us ].
Errors which could prevent your HLR lookup being run
If there is a problem that prevents our system from running your HLR lookup you'll receive one of these error strings:
FAIL Invalid password | The username or password you supplied were not correct. |
FAIL Insufficient credit | Your account balance is too low. please add funds. |
No numbers specified | You did not include an msisdn parameter in your query. |
Request too long | More than ten msisdn numbers were included in a single query |
ERR RATE_LIMIT_EXCEEDED | You've made more than the allowed number of concurrent connections to the server |
Example Responses
Example JSON Format Response
You'll receive a JSON array containing a data block for each MSISDN queried.
[
{
"countrycode":"44",
"countryiso":"GB",
"countryname":"United Kingdom",
"errorcode":"0",
"errortext":"OK",
"imsi":"234158341040126",
"localformat":"07788 450450",
"mcc":"234",
"mnc":"15",
"msc":"44778",
"msisdn":"447788450450",
"operatorname":"Vodafone",
"originalmcc":"234",
"originalmnc":"15",
"originaloperatorname":"Vodafone",
"plmn":"23415",
"ported":"false",
"reachable":"true",
"transactioncost":"1.20",
"validnumber":"true"
}
]
Example Legacy CSV Format Response
The fields in the CSV response are: msisdn plmn,imsi,msc:
QUERYOK
447788450450 23415,234158341040126,44778
ENDBATCH
No other data points are available when using this format. We recommend using format=json for all new integrations.
Description of data fields contained in response
GSM / Worldwide HLR Query Response fields:
countrycode | country code of number's home country |
countryiso | ISO 3166 country code of number's home country |
countryname | Name of number's home country |
errorcode | an error number if any error, otherwise 0 |
errortext | a description of the error code (otherwise "OK") |
imsi | the international mobile subscriber id of the subscriber ** |
landline | true if the number is a landline (fixed) number |
lrn | location routing number for PSTN calls (NANP) |
localformat | the number formatted as it would be written in its home country |
mobile | true if the number is a mobile number |
mcc | the mobile country code of the home network |
mnc | the mobile network code of the home network |
msisdn | the mobile number to which this query pertains |
numbertype | the type of number (MOBILE,LANDLINE,VOIP,TOLLFREE) |
ocn | operating carrier number (NANP) |
operatorname | the name of the home network operator |
originalmcc | the mcc of the original operator (if ported) |
originalmnc | the mnc of the original operator (if ported) |
originalcarrier | the name of the original carrier (if ported) |
originaloperatorname | the name of the original operator (if ported) |
plmn | public land mobile network code of home network (mcc+mnc) |
ported | whether the number has been ported (true/false) |
reachable | (meta) whether the number is in coverage and reachable (true/false/undetermined) |
spid | Service Profile ID |
timezone | time zone where the number is registered |
transactioncost | cost of this lookup in credits (eg 1.00) |
validnumber | (meta) whether the number is a valid subscriber (true/false/undetermined) |
**Note on IMSI field:
The last digits of the IMSI are typically masked or converted to zeros to prevent messaging fraud. If you have a legitimate need to query the full IMSI please contact us with you use case and required destination networks and we can check for availability.
Notes on meta flags:
The 'reachable' flag is a convenience flag computed on our system based on whether a full reachable IMSI was returned from the HLR subsystem - indicating that a call or text should be able to reach the subscriber equipment at this moment. If an error response is received (including temporary errors such as "Absent Subscriber" - which indicates the handset is off) then reachable will show 'false'. This is a realtime status, and does not indicate that the number might not be reachable in a few hours (maybe it's turned off overnight, or for a flight). In the event that an HLR exception occurs, or the destination number is not in a full HLR zone (such as NANP numbers), then "undetermined" will be returned to indicate that the realtime reachability status of this number could not be determined with certainty.
The 'validnumber' flag is a convenience flag computed on our system to indicate whether the MSISDN is a valid number assigned to an active subscriber (as opposed to an unassigned, or deactivated number). The "validnumber" flag will show "true" if a full IMSI (>5 digits) is returned (indicating a full realtime HLR reply), or if the remote HLR indicates a temporary error condition that could only be indicated if that subscriber were one of its own - such as, Absent Subscriber (in which case "reachable" will indicate "false" to show that the number, while it appears to belong to a subscriber, is not currently reachable for SMS). In the event that an HLR exception occurs, a security IMSI-Prefix-Only route is used, or the number is not in a full HLR zone (such as NANP numbers), then "undetermined" will be returned to indicate that it was not possible to determine with certainty that this number is assigned to an active subscriber.
Note that reachable and validnumber fields are not returned by the HLR subsystem, but calculated based on a set of conditions in the IMSI, Errorcode, and MSC responses we receive in order to make an informed decision as to the current status of the number. In the event that we cannot guarantee that status we will return "undetermined" for these fields. This does not indicate the query has failed or that there is any technical problem - for example NANP numbers will show undetermined due to the OCN lookup method used in the US, which does not need to perform a realtime HLR query.
Serving MSC (Mobile Switching Centre)
The MSC value is only returned if requested by passing parameter msc=1 in your request. Adding the serving MSC address prefix to your HLR request will increase the cost to 1.2 credits for that HLR query. Be aware that we will only return the prefix of the MSC (up to 5 digits) and not the full MSC address in order to reduce the possibility of clients engaging in messaging fraud, and this is not negotiable.
North American Number Lookup Response fields:
- msisdn - the number queried
- ocn - the carrier's OCN Code
- carrier - the carrier's name
- numbertype - the type of number (eg MOBILE, PCS, WIRELESS) for mobile, (LANDLINE, CLEC, RBOC) for landline
List of possible error codes
The following is a list of response codes that can be returned in the errorcode and errortext fields:
Code | Message | Description / Possible Cause |
0 | Lookup Complete | HLR returned valid SM routing data in response to SRI query |
1 | Unknown Subscriber | there is no directory number for the mobile subscriber (GSM 09.02) |
5 | Unidentified Subscriber | MAP response from MSC/VLR returned a negative response (GSM 03.07) |
6 | Absent Subscriber (SM) | Subscriber record is marked as unavailable as there was no paging response from the handset. May be switched off, in low coverage, or subject to roaming restrictions. |
7 | Unknown Equipment | Subscriber's mobile device has not been recognised (EIR) |
8 | Roaming Not Allowed | Subscriber is roaming on another network where roaming agreements may not be fully in place |
9 | Illegal Subscriber | mobile station failed authentication |
11 | Teleservice Not Provisioned | the recipient mobile station has no SMS subscription (GSM 09.02) |
12 | Illegal Equipment | mobile station was black-listed |
13 | Call Barred | rejected due to barring of the mobile station (see GSM 09.02, description of the Barring supplementary service, GSM 02.04 and 03.11, and description of Operator Determined Barring, GSM 02.41 and 03.15). |
21 | Facility not Supported | SMS is not provisioned in the VPLMN (GSM 09.02). |
27 | Absent Subscriber | VLR has no IMSI record, or if the record is marked "Subscriber Data Not Confirmed by HLR" (GSM 03.07) |
31 | Subscriber Busy for MT SMS | rejected because of congestion encountered at the remote MSC |
32 | SM Delivery Failure | SM Delivery Failure has occurred |
33 | Message Waiting List Full | rejected because the mobile station is out of storage |
34 | Partner System Failure | the network partner encountered an error performing this operation |
35 | Data Missing or Unroutable | no routing exists to reach this prefix at the current time |
36 | Lookup Failure | network or protocol failure, or invalid numbering plan prefix |
38 | Rejected | hlr subsystem rejected number - non-mobile or unsupported carrier |
Checking your account balance
To query the balance of your account via the API pass the following parameters:
user | Your account username |
pass | Your account password |
query | balance |
Example Request:
http://api.numberportabilitylookup.com/npl?user=bob&pass=123&query=balance
The response will give your remaining account balance as the number of lookups that can be performed before your account is depleted.
Example Response
HTTP/1.1 200 OK
45999564
Multiple Simultaneous Connections
By default your account allows a maximum of 5 simultaneous HTTP connections to our API from the same user at the same time. Any additional connections will be rejected with ERR RATE_LIMIT_EXCEEDED.We recommend that if you have a high volume of traffic you send two or more queries (up to ten) per HTTP call by separating MSISDN numbers by commas. This increases the efficiency of the traffic as you are not making a socket connection and sending HTTP headers for every individual number, but spreading that overhead across multiple lookups. In the event that you have a high volume of traffic and five threads is not sufficient please contact your account manager.
Coverage Check API
For Further Assistance
For further assistance with the API, please [ Contact us ]
For an instant-setup account to try our API - [ click here ]
Usage of this API implies agreement with our terms and conditions for use [ View Terms]
|