Device reachability status

The Device Status reachability feature allows querying and reporting information on several aspects of data reachability for a device, so you can monitor its status updates, such as when it goes online or offline.

Subscribe to Reachability Status eventsheader link

The snippet below will show you how to create a Device Status reachability subscription.

Note that the snippet below require you to identify your mobile network device.

import network_as_code as nac
from network_as_code.models.device import DeviceIpv4Addr
from network_as_code.models.device_status import EventType, AccessTokenCredential

 # We begin by creating a Network as Code client
client = nac.NetworkAsCodeClient(
    token="<your-application-key-here>"
)
# Then, we create an object for the mobile device we want to use
my_device = client.devices.get(
    phone_number="+99999991000"
)

# Then we subscribe your device to reachability status events.
my_subscription = client.device_status.subscribe(
    device=my_device,
    event_type=[EventType.REACHABILITY_DATA],
    # Use HTTPS to send notifications
    sink="https://endpoint.example.com/sink",
    # You can also add optional parameters
    max_num_of_reports=5,
    subscription_expire_time=datetime.now(timezone.utc) + timedelta(days=1),
    sink_credential=AccessTokenCredential(
        access_token= "some-access-token",
        access_token_expires_utc= datetime.now(timezone.utc) + timedelta(days=1),
        access_token_type="bearer"
    ),
    initial_event=True
)

# Use this to show the reachability subscription status
print(my_subscription)

Reachability subscription parametersheader link

ParametersTypeDescriptionMandatory or Optional
event_typeobject/stringArray containing the status type you want to check. For example [EventType.REACHABILITY_DATA] or ["org.camaraproject.device-reachability-status-subscriptions.v0.reachability-data"].Mandatory
deviceobjectThe device object created for the mobile device we want to use.Mandatory
sinkstringThe recipient's HTTP endpoint, which is a web server configured to receive POST requests.Mandatory
sink_credentialobjectContains authorization information for delivery of notifications.Optional
credential_typestringThe type of credential. If provided, must be set to "ACCESSTOKEN".Optional
access_tokenstringPreviously acquired access token.Optional
access_token_typestringThe type of the access token. If provided, must be set to "bearer".Optional
access_token_expires_utcobject/stringWhen the access token expires. Can be either a date-time object or RFC 3339 formatted date string, for example "2025-12-03T12:27:08.312Z". Must have a time zone.Optional
initial_eventbooleanShould be set to true, if a notification should be sent when the subscription is created and the status reflects the event request.Optional
subscription_max_eventsintegerMaximum amount of notifications to be sent. Once this amount is reached, the subscription ends. If a notification is sent due to initial_event being set to true, this counts towards the subscription_max_events.Optional
subscription_expire_timeobject/stringWhen the subscription should expire. Can be either a date-time object or ISO 8601 formatted date string, for example "2025-08-28T12:40:20.398Z".Optional

Reachability event typesheader link

Event typeTypeDescription
reachability-dataobject/stringEventType.REACHABILITY_DATA or org.camaraproject.device-reachability-status-subscriptions.v0.reachability-data - Used for checking if the device is connected to the network for data usage.
reachability-smsobject/stringEventType.REACHABILITY_SMS or org.camaraproject.device-reachability-status-subscriptions.v0.reachability-sms - Used for checking if the device is connected to the network for SMS usage.
reachability-disconnectedobject/stringEventType.REACHABILITY_DISCONNECTED or org.camaraproject.device-reachability-status-subscriptions.v0.reachability-disconnected - Used for checking that the device is not connected to the network.

Simulated Device Reachability scenariosheader link

The Network as Code simulators have been configured to provide specific device reachability results for specific simulated devices based on their device identifier. This will be helpful in testing your code against the different responses, including possible errors, by simply substituting the device identifier in your code.

The device identifiers and their responses can be found in the following table:

Device Identifier TypeDevice IdentifierHTTP Status CodeHTTP Status Code DescriptionReponse Body
Phone Number+99999991000200SuccessDevice is connected to SMS
Phone Number+99999991001200SuccessDevice has a data connection
Phone Number+99999991002200SuccessDevice has both a data and SMS connection
Phone Number+99999991003200SuccessDevice has lost connectivity
Phone Number+99999990400400Bad Request
Phone Number+99999990404404Not found
Phone Number+99999990422422Unprocessable Content
Phone Number+99999990500500Internal Server Error
Phone Number+99999990502502Bad Gateway
Phone Number+99999990503503Service Unavailable
Phone Number+99999990504504Gateway Timeout

Getting a device reachability subscriptionheader link

The snippet below will show you how to retrieve a reachability subscription. If you need to modify or delete your subscription, you can easily retrieve it by its ID.

# Get the subscription previously created by its ID
subscription = client.device_status.get_reachability_subscription("<my-subscription-id>")

You can also get a list of active Device Status subscriptions for a client:

subscriptions = client.device_status.get_subscriptions()

Deleting a Device Status reachability subscriptionheader link

Use the following snippet to delete a Device Status reachability subscription, if you wish to stop receiving the previously configured status notifications.


# Get a previously created subscription by its ID
subscription = client.device_status.get_reachability_subscription("<my-subscription-id>")

# And delete it:
subscription.delete()

Getting a devices reachability statusheader link

You can check the device reachability status like so:

  print(my_device.get_reachability())

Getting device reachability status responsesheader link

ResponseTypeDescription
connectivityarrayIf present, indicates the connectivity type throught which the device is reachable from the network. One of the following: ["DATA"], ["SMS"] or ["DATA", "SMS"]. If absent, indicates that the device is not reachable.
reachablebooleanIndicates, whether or not the device is reachable from the network. Either true or false.
lastStatusTimestringIf present, specifies the time when the status was last updated. A date-time string, for example "2025-12-20T10:41:38.657Z". If absent, indicates that the information may be outdated or the freshness uncertain.

Getting reachability notificationsheader link

The code snippet below will set up an HTTP server with a POST endpoint. This will allow receiving device reachability status updates. For example, you can learn if a device is available (reachable from the network) or not. Learn more about the notification URL/auth token and how to create an HTTP server with a POST endpoint for reachability notifications.

Reachability notification handlerheader link

# status_handler.py

# run with: uvicorn status_handler:app

from fastapi import FastAPI, Header
from pydantic import BaseModel

from typing_extensions import Annotated
from typing import Optional


app = FastAPI()

class Device(BaseModel):
    phoneNumber: Optional[str] | None
    networkAccessIdentifier: Optional[str] | None
    ipv4Address: Optional[str] | None
    ipv6Address: Optional[str] | None

class ReachabilityEventDetail(BaseModel):
    device: Device
    subscriptionId: str
    connectivity: List[str] | None
    reachable: bool | None
    lastStatusTime: str | None
    terminationReason: str

class Event(BaseModel):
    eventType: str
    eventTime: str
    eventDetail: ReachabilityEventDetail

class Data(BaseModel):
    device: Device
    subscriptionId: str
    terminationReason: str

class Notification(BaseModel):
    id: str
    source: str
    type: str
    specversion: str
    datacontenttype: str
    time: str
    eventSubscriptionId: str
    event: Event
    data: Data

@app.post("/notifications")
def receive_notification(
    notification: Notification,
    authorization: Annotated[Union[str, None], Header]
):
    if authorization == "Bearer my-token":
        # We can now react to the notifications
        # based on the Notification object
        print(notification)

Reachability notification detailsheader link

This notification JSON schema is used for notifications about device reachability.

Remember that the string values represented below are just examples that can be used. So, they should contain your real device-status values.

{
    "id": "9884b8d2-5392-4ed7-8cde-0ce25bf58df3",
    "source": "/device-status/device-reachability-status-subscriptions/v0.7/subscriptions/83b1eaae-4533-4bff-a0af-e805cb8a2940",
    "type": "org.camaraproject.device-reachability-status-subscriptions.v0.reachability-data",
    "specversion": "1.0",
    "datacontenttype": "application/json",
    "time": "2026-04-17T07:31:01.416474Z",
    "data": {
        "device": {
            "phoneNumber": "+99999991000",
            "networkAccessIdentifier": "[email protected]",
            "ipv4Address": {
                "publicAddress": "233.252.0.2",
                "privateAddress": "192.0.2.25",
                "publicPort": 80
            },
            "ipv6Address": "2001:db8:1234:5678:9abc:def0:fedc:ba98"
        },
        "subscriptionId": "83b1eaae-4533-4bff-a0af-e805cb8a2940"
    }
}

Subscription-ends notificationheader link

This is the notification JSON schema for monitoring why a device's subscription ended.

{
   "id":"2628b42e-8789-4fcd-942a-841f16f52897",
   "source":"/device-status/device-reachability-status-subscriptions/v0.7/subscriptions/f76c90dd-3f68-4c69-bbdc-57bddfd0f910",
   "type":"org.camaraproject.device-reachability-status-subscriptions.v0.subscription-ends",
   "specversion":"1.0",
   "datacontenttype":"application/json",
   "time":"2027-04-17T07:31:01.416474Z",
      "data":{
      "device":{
         "phoneNumber":"+99999991000",
            "ipv4Address": {
                "publicAddress": "233.252.0.2",
                "privateAddress": "192.0.2.25",
                "publicPort": 80
            },
            "ipv6Address": "2001:db8:1234:5678:9abc:def0:fedc:ba98"
      },
      "subscriptionId":"f76c90dd-3f68-4c69-bbdc-57bddfd0f910",
      "terminationReason":"SUBSCRIPTION_EXPIRED"
   }
}

Supported event typesheader link

Notification typeTypeDescription
subscription-endsstringorg.camaraproject.device-reachability-status-subscriptions.v0.subscription-ends - Device Status reachability notification subscription has expired.

Subscription-ends keywordsheader link

Subscription-ends-keyword valuesTypeDescription
terminationReasonstringValue containing the termination reason. For example if subscription expire time has been reached "SUBSCRIPTION_EXPIRED" or if the API server has stopped sending notifications "NETWORK_TERMINATED".

Shared-keyword valuesheader link

Check the table below for further information on mandatory, optional values and their types. The values described here are common to all the Device-Status notification JSON schemas:

Keyword valuesTypeDescription
subscriptionIdstringThe event subscription identifier.
sourcestringIdentifies the source where the event happened. It contains the Network as Code API implementation and subscription ID.
typestringThe status type being checked and returned by the API. For example reachability-data.
specversionstringRepresenting the specification version.
datacontenttypestringIndicates the media type for the event payload encoding. It must be "application/json" in the context of CAMARA APIs
timestringThe time the event occurred. Date and time are specified in ISO 8601 format, e.g.: "2023-08-20T21:01:02.345Z".

Device identifiersheader link

Keyword valuesTypeDescriptionMandatory or Optional
dataobjectObject that will contain other objects or strings. Contains multiple device status data, e.g. the subscription id.Mandatory
deviceobjectObject that will contain other objects or strings. Contains multiple device identifiers, e.g. the devices phone number.Mandatory
phoneNumberstringPhone number of the device, with a pattern that matches "^[+]?[0-9]{5,15}$" or a null value.Optional
ipv4AddressobjectContains an object for IPv4 address values or a null value. It refers to the IPv4 address of the device. An IP address is needed for some flow-oriented services, such as QoD.Optional
publicAddressstringEither the device's public IPv4 address, the Network Address Translation (NAT) behind it or a null value. Learn more about NAT..Optional
privateAddressstringThe device's private IPv4 address if it is behind NAT or a null value.Optional
publicPortintegerThe public port used by the device or a null value. A port is necessary, as private address ranges overlap, and public port is used to extend the range for Carrier-grade NAT (CGNAT), a type of large-scale NAT.Optional
ipv6AddressstringContains the device's IPv6 address or a null value. An IP address is needed for some flow-oriented services, such as QoD.Optional

Last updated December 19, 2025