Virtual Operator
The Virtual Operator provides predefined and deterministic API responses within the Vonage Playground when using phone numbers associated with the unassigned country code +990. It can be used as a simulated operator for discovery, development and testing of Network Features in scenarios where access to a live operator is unavailable.
To use the Virtual Operator, simply select 'Playground' in your application configuration. All API calls directed to phone numbers with the +990 prefix will automatically be redirected to the Virtual Operator.
All API calls made using the Virtual Operator require to implement the same authentication flows as those made through a regular mobile operator.
Availability
The Virtual Operator is available by default to any application configured for Network Features in a Playground mode. No further configuration is necessary to use the Virtual Operator.
After setting up the application, go to the Playground configuration page and click on "View Available Operators" to expand the list of available Network Features. The first entry corresponds with the Virtual Operator.

It is not necessary to add +990 numbers to your allowlist. Simply make an API call to any of the supported Network Features.
Responses
The Virtual Operator provides deterministic API responses based on specific parameters in the API request.
SIM Swap
The Virtual Operator always returns a response indicating that the last SIM swap event for any requested number (starting with +990) occurred exactly 500 hours before the request date. As such, the developer can send the following parameters:
| Endpoint | Parameters | Response |
|---|---|---|
/check | phoneNumber = +990XXXXXX and maxAge > 500 | swapped = true |
/check | phoneNumber = +990XXXXXX and maxAge < 500 | swapped = false |
/retrieve-date | phoneNumber = +990XXXXXX | latestSimChange 500 hours in the past |
| both | phoneNumber = +990XXXX99 | error |
Device Location Retrieval
The responses are determined by the trailing digits of the phone number provided; all other fields can be set to any value. In all responses, the lastLocationTime field will show the current time:
| Phone Number | Response |
|---|---|
| Last two digits are "11", e.g. "+9902345611" | Receive a circle response. "latitude": "50.707815" "longitude": "7.128740" "radius": 200 |
| Last two digits are "22", e.g. "+9902345622" | Receive a circle response. "latitude": "50.722112" "longitude": "7.113625" "radius": 200 |
| Last two digits are "33", e.g. "+9902345633" | Receive a circle response. "latitude": "50.737057" "longitude": "7.101254" "radius": 200 |
| Last two digits are "44", e.g. "+9902345644" | Receive a circle response. "latitude": "50.724535" "longitude": "7.093150" "radius": 200 |
| Last two digits are "55", e.g. "+9902345655" | Receive a circle response. "latitude": "50.701605" "longitude": "7.103051" "radius": 200 |
| Last two digits are "66", e.g. "+9902345666" | Receive a polygon response. {"latitude": 50.732896, "longitude": 7.102896},{"latitude": 50.731849, "longitude": 7.104989 },{"latitude": 50.732545, "longitude": 7.105906},{"latitude": 50.733659, "longitude": 7.103809} |
| Last two digits are "99", e.g. "+9902345699" | Operator Error: "status": 400 "code": "INVALID_INPUT" "message": "Virtual Operator predefined error for numbers ending with 99." |
Device Status
The responses for both the connectivity and roaming endpoints are determined by the trailing digits of the phone number provided:
/roaming
| Phone Number | Response |
|---|---|
| Last two digits are even, e.g. "+9902345600" | "roaming": true "countryCode": 234 "countryName": ["GB"] |
| Last two digits are odd, e.g. "+9902345601" | "roaming": false |
| Last two digits are "11", e.g. "+9902345611" | No country name: "roaming": true "countryCode": 901 "countryName": [] |
| Last two digits are "22", e.g. "+9902345622" | Single country name (Germany): "roaming": true "countryCode": 262 "countryName": ["DE"] |
| Last two digits are "33", e.g. "+9902345633" | Single country name (USA): "roaming": true "countryCode": 310 "countryName": ["US"] |
| Last two digits are "44", e.g. "+9902345644" | Multiple country names: "roaming": true "countryCode": 340 "countryName": ["BL", "GF", "GP", "MF", "MQ"] |
| Last two digits are "99", e.g. "+9902345699" | Operator Error: "status": 400 "code": "INVALID_INPUT" "message": "Virtual Operator predefined error for numbers ending with 99." |
/connectivity
| Phone Number | Response |
|---|---|
| Last two digits are even, e.g. "+9902345600" | Device is connected to the network via mobile data: "roaming": "CONNECTED_DATA" |
| Last two digits are odd, e.g. "+9902345601" | Device is not connected to the network: "roaming": "NOT_CONNECTED" |
| Last two digits are "11", e.g. "+9902345611" | Device is connected to the network via SMS usage: "roaming": "CONNECTED_SMS" |
| Last two digits are "99", e.g. "+9902345699" | Operator Error: "status": 400 "code": "INVALID_INPUT" "message": "Virtual Operator predefined error for numbers ending with 99." |
QoD
Responses to the Virtual Operator will always be successful, for examples of responses and callbacks see the QoD Webhooks guide.
Identity Insights
Using any of these phone numbers will give the same response: +990123400, +990123411, +990123422, +990123433, +990123444, +990123455, +990123466, +990123477, +990123488, +990123499
{
"name": "Virtual CSP",
"network_type": "MOBILE",
"country_code": "XX",
"network_code": "00101",
"status": {
"code": "OK",
"message": "Success"
}
}
Using any other +990 number will return an error:
{
"status": {
"code": "INVALID_NUMBER_FORMAT",
"message": "Invalid number. Only the following Virtual Operator numbers are allowed: 990123400, 990123411, 990123422, 990123433, 990123444, 990123455, 990123466, 990123477, 990123488, 990123499. For further information refer to https://developer.vonage.com/en/getting-started-network/concepts/virtual-operator."
}
}
Using any of these phone numbers will give the same response: +990123400, +990123411, +990123422, +990123433, +990123444, +990123455, +990123466, +990123477, +990123488, +990123499
{
"name": "Virtual CSP",
"network_type": "MOBILE",
"country_code": "XX",
"network_code": "00101",
"status": {
"code": "OK",
"message": "Success"
}
}
Using any other +990 number will return an error:
{
"status": {
"code": "INVALID_NUMBER_FORMAT",
"message": "Invalid number. Only the following Virtual Operator numbers are allowed: 990123400, 990123411, 990123422, 990123433, 990123444, 990123455, 990123466, 990123477, 990123488, 990123499. For further information refer to https://developer.vonage.com/en/getting-started-network/concepts/virtual-operator."
}
}
Using any of these phone numbers will give the same response: +990123400, +990123411, +990123422, +990123433, +990123444, +990123455, +990123466, +990123477, +990123488, +990123499
{
"country_code": "XX",
"country_name": "Virtual",
"country_prefix": "990",
"offline_location": "Virtual",
"time_zones": ["UTC"],
"number_international": "+990123411",
"number_national": "123411",
"format_valid": true,
"status": {
"code": "OK",
"message": "Success"
}
}
Using any other +990 number will return an error:
{
"status": {
"code": "INVALID_NUMBER_FORMAT",
"message": "Invalid number. Only the following Virtual Operator numbers are allowed: 990123400, 990123411, 990123422, 990123433, 990123444, 990123455, 990123466, 990123477, 990123488, 990123499. For further information refer to https://developer.vonage.com/en/getting-started-network/concepts/virtual-operator."
}
}
Using any of these phone numbers will give the same response: +990123400, +990123411, +990123422, +990123433, +990123444, +990123455, +990123466, +990123477, +990123488
{
"latest_sim_swap_at": "2017-11-14T01:07:28Z" // 500 hours ago
"swapped": false, // true if period < 500 hours, false if period > 500 hours
"status": {
"code": "OK",
"message": "Success"
}
}
Using the phone number +990123499 will return an unknown phone number response:
{
"status": {
"code": "NOT_FOUND",
"message": "Unknown phone number."
}
}
Using any other +990 number will return an error:
{
"status": {
"code": "INVALID_NUMBER_FORMAT",
"message": "Invalid number. Only the following Virtual Operator numbers are allowed: 990123400, 990123411, 990123422, 990123433, 990123444, 990123455, 990123466, 990123477, 990123488, 990123499. For further information refer to https://developer.vonage.com/en/getting-started-network/concepts/virtual-operator."
}
}
The responses are preconfigured according to the phone number provided; the request should also contain any value for given_name, family_name, and birthdate.
Phone number: +990123400
{
"given_name_match": "DATA_UNAVAILABLE",
"family_name_match": "DATA_UNAVAILABLE",
"birthdate_match": "DATA_UNAVAILABLE",
"status": {
"code": "PARTIAL_SUCCESS",
"message": "Unable to retrieve data for some fields."
}
}
Phone number: +990123411 or +990123477
{
"given_name_match": "EXACT",
"family_name_match": "EXACT",
"birthdate_match": "EXACT",
"status": {
"code": "OK",
"message": "Success."
}
}
Phone number: +990123422
{
"given_name_match": "HIGH",
"family_name_match": "HIGH",
"birthdate_match": "HIGH",
"status": {
"code": "OK",
"message": "Success."
}
}
Phone number: +990123433
{
"given_name_match": "PARTIAL",
"family_name_match": "PARTIAL",
"birthdate_match": "PARTIAL",
"status": {
"code": "OK",
"message": "Success."
}
}
Phone number: +990123444
{
"given_name_match": "LOW",
"family_name_match": "LOW",
"birthdate_match": "LOW",
"status": {
"code": "OK",
"message": "Success."
}
}
Phone number: +990123455, +990123466 or +990123488
{
"given_name_match": "NONE",
"family_name_match": "NONE",
"birthdate_match": "NONE",
"status": {
"code": "OK",
"message": "Success."
}
}
Phone number: +990123499
{
"status": {
"code": "NOT_FOUND",
"message": "Unknown phone number."
}
}
Any other +990 number
{
"status": {
"code": "INVALID_NUMBER_FORMAT",
"message": "Invalid number. Only the following Virtual Operator numbers are allowed: 990123400, 990123411, 990123422, 990123433, 990123444, 990123455, 990123466, 990123477, 990123488, 990123499. For further information refer to https://developer.vonage.com/en/getting-started-network/concepts/virtual-operator."
}
}
The responses are determined by the phone number provided; all other fields can be set to any value. An explanation of what each verification result means can be found in the API specification:
Phone number: +990123400
{
"latest_location_at": "2023-09-07T10:40:52Z",
"verified": "TRUE",
"status": {
"code": "OK",
"message": "Success"
}
}
Phone number: +990123411
{
"latest_location_at": "2023-09-07T10:40:52Z",
"verified": "PARTIAL",
"match_rate": 50,
"status": {
"code": "OK",
"message": "Success"
}
}
Phone number: +990123422
{
"verified": "UNKNOWN",
"status": {
"code": "PARTIAL_SUCCESS",
"message": "Unable to retrieve data for some fields"
}
}
Phone number: +990123433
{
"latest_location_at": "2023-09-07T10:40:52Z",
"verified": "FALSE",
"status": {
"code": "OK",
"message": "Success"
}
}
Phone number: +990123444
{
"latest_location_at": "2023-09-07T10:40:52Z",
"verified": "TRUE",
"status": {
"code": "OK",
"message": "Success"
}
}
Phone number: +990123455
{
"latest_location_at": "2023-09-07T10:40:52Z",
"verified": "FALSE",
"status": {
"code": "OK",
"message": "Success"
}
}
Phone number: +990123466
{
"latest_location_at": "2023-09-07T10:40:52Z",
"verified": "TRUE",
"status": {
"code": "OK",
"message": "Success"
}
}
Phone number: +990123477
{
"latest_location_at": "2023-09-07T10:40:52Z",
"verified": "FALSE",
"status": {
"code": "OK",
"message": "Success"
}
}
Phone number: +990123488
{
"latest_location_at": "2023-09-07T10:40:52Z",
"verified": "TRUE",
"status": {
"code": "OK",
"message": "Success"
}
}
Phone number: +990123499
{
"status": {
"code": "NOT_FOUND",
"message": "Unknown phone number."
}
}
Any other +990 number
{
"status": {
"code": "INVALID_NUMBER_FORMAT",
"message": "Invalid number. Only the following Virtual Operator numbers are allowed: 990123400, 990123411, 990123422, 990123433, 990123444, 990123455, 990123466, 990123477, 990123488, 990123499. For further information refer to https://developer.vonage.com/en/getting-started-network/concepts/virtual-operator."
}
}