TS.43 Entitlement Configuration
OmniSEP implements GSMA TS.43 Service Entitlement Configuration, enabling mobile devices to query their service entitlements (VoWiFi, VoLTE, SMS, etc.) from the carrier network.
Overview
Request Flow
Initial Authentication (EAP-AKA)
Fast Re-Authentication (Token)
HTTP Interface
Endpoint
| Method | Path | Content-Type |
|---|---|---|
| GET | / | Query parameters |
| POST | / | application/json |
Required Parameters
| Parameter | Type | Description |
|---|---|---|
terminal_id | String | Device IMEI (15 digits) |
terminal_vendor | String | Device manufacturer (max 4 chars per RCC.14) |
terminal_model | String | Device model (max 10 chars per RCC.14) |
terminal_sw_version | String | Software version (max 20 chars per RCC.14) |
entitlement_version | String | Protocol version (e.g., "2.0") |
app | String/List | Application ID(s) to query |
Authentication Parameters
One of these authentication methods is required:
| Parameter | Description |
|---|---|
EAP_ID | Root NAI for EAP-AKA: 0<IMSI>@nai.epc.mnc<MNC>.mcc<MCC>.3gppnetwork.org |
token | Authentication token from previous response |
temporary_token | Temporary token |
operator_token | Operator-issued token |
Optional Parameters
| Parameter | Type | Description |
|---|---|---|
IMSI | String | Required with token for fast re-auth |
app_name | String | Application name |
app_version | String | Application version |
notif_action | Integer | Notification action (0=disable, 1=GCM, 2=FCM) |
notif_token | String | Push notification token |
vers | Integer | Configuration version for change detection |
Request Examples
GET with Token:
GET /?terminal_id=123456789012345&terminal_vendor=Goog&terminal_model=Pixel8&terminal_sw_version=14.0&entitlement_version=2.0&app=ap2004&token=abc123&IMSI=310410123456789
POST with EAP-AKA:
{
"terminal_id": "123456789012345",
"terminal_vendor": "Goog",
"terminal_model": "Pixel8",
"terminal_sw_version": "14.0",
"entitlement_version": "2.0",
"app": "[ap2003,ap2004]",
"EAP_ID": "0310410123456789@nai.epc.mnc410.mcc310.3gppnetwork.org"
}
Response Formats
Accept Header
| Accept Header | Response Format |
|---|---|
text/vnd.wap.connectivity-xml | XML (default) |
application/json | JSON |
application/vnd.gsma.eap-relay.v1.0+json | EAP relay JSON |
XML Response
<?xml version="1.0"?>
<wap-provisioningdoc version="1.1">
<characteristic type="VERS">
<parm name="version" value="2"/>
<parm name="validity" value="86400"/>
</characteristic>
<characteristic type="TOKEN">
<parm name="token" value="eyJ0eXAi..."/>
<parm name="validity" value="86400"/>
</characteristic>
<characteristic type="APPLICATION">
<parm name="AppID" value="ap2004"/>
<characteristic type="ap2004">
<parm name="EntitlementStatus" value="1"/>
<parm name="AddrStatus" value="2"/>
<parm name="TC_Status" value="2"/>
<parm name="ProvStatus" value="1"/>
</characteristic>
</characteristic>
</wap-provisioningdoc>
JSON Response
{
"Vers": {
"version": "2",
"validity": "86400"
},
"Token": {
"token": "eyJ0eXAi...",
"validity": "86400"
},
"ap2004": {
"EntitlementStatus": "1",
"AddrStatus": "2",
"TC_Status": "2",
"ProvStatus": "1"
}
}
EAP Challenge Response
When EAP-AKA authentication is in progress:
{
"eap-relay-packet": "AQEALBcBAAAn..."
}
Application IDs
Supported Applications
| App ID | Service | Reference |
|---|---|---|
| ap2003 | Voice-over-Cellular (VoLTE/VoNR) | TS.43 Section 4 |
| ap2004 | Voice-over-WiFi (VoWiFi) | TS.43 Section 3 |
| ap2005 | SMS-over-IP | TS.43 Section 5 |
| ap2006 | ODSA Companion | TS.43 Section 6 |
| ap2009 | ODSA Primary | TS.43 Section 6 |
| ap2010 | Data Plan Boost | TS.43 Section 7 |
| ap2011 | Server Initiated Requests | TS.43 Section 8 |
| ap2012 | Direct Carrier Billing | TS.43 Section 9 |
| ap2013 | Private User Identity | TS.43 Section 10 |
| ap2014 | Phone Number Information | TS.43 Section 11 |
| ap2016 | Satellite Entitlement | TS.43 Section 12 |
VoWiFi (ap2004) Response Fields
| Field | Type | Values | Description |
|---|---|---|---|
EntitlementStatus | Integer | 0-3 | Service availability |
AddrStatus | Integer | 0-3 | E911 address verification status |
TC_Status | Integer | 0-3 | Terms & Conditions status |
ProvStatus | Integer | 0-3 | Provisioning status |
ServiceFlow_URL | String | URL | Service flow URL |
ServiceFlow_UserData | String | - | Data for service flow |
Status Values:
| Value | EntitlementStatus | AddrStatus/TC_Status/ProvStatus |
|---|---|---|
| 0 | Disabled | Not Available |
| 1 | Enabled | Available |
| 2 | Incompatible | Not Required |
| 3 | Provisioning | In Progress |
VoLTE (ap2003) Response Fields
VoLTE uses an array of entries per access technology:
| Field | Type | Values | Description |
|---|---|---|---|
AccessType | Integer | 1=LTE, 2=NR | Radio access technology |
HomeRoamingNWType | Integer | 1-3 | Network scope |
EntitlementStatus | Integer | 0-1 | Service availability |
NetworkVoiceIRATCapability | String | - | Voice capability (5G only) |
HomeRoamingNWType Values:
| Value | Meaning |
|---|---|
| 1 | Home and Roaming |
| 2 | Home Only |
| 3 | Roaming Only |
Error Responses
| HTTP Status | Meaning | Description |
|---|---|---|
| 400 | Bad Request | Missing required parameters |
| 403 | Forbidden | Authentication failed |
| 406 | Not Acceptable | Unsupported protocol version |
| 511 | Network Authentication Required | Token invalid or EAP-AKA required |
Error Response Format
HTTP/1.1 400 Bad Request
Content-Type: text/plain
Bad Request: Missing parameters ["terminal_id"]
Custom Entitlements
Setting Custom Entitlements
Use the management API to set custom entitlements for specific subscribers:
POST /api/entitlements/{imsi}
Content-Type: application/json
{
"app_id": "ap2004",
"entitlement": {
"entitlement_status": 0,
"addr_status": 1,
"tc_status": 1,
"prov_status": 0,
"service_flow_url": "https://activate.example.com/vowifi",
"message_for_incompatible": "VoWiFi requires address verification"
}
}
Retrieving Entitlements
GET /api/entitlements/{imsi}
Returns all custom entitlements for the subscriber:
{
"imsi": "310410123456789",
"entitlements": {
"ap2004": {
"entitlement_status": 1,
"addr_status": 2,
"tc_status": 2,
"prov_status": 1
}
}
}
Activity Logging
All entitlement requests are logged for audit purposes.
Searching Activity
GET /api/activity?imsi=310410123456789&from=1704067200&to=1704153600&limit=100
| Parameter | Type | Description |
|---|---|---|
imsi | String | Filter by subscriber IMSI |
terminal_id | String | Filter by device terminal ID |
from | Integer | Start timestamp (Unix epoch) |
to | Integer | End timestamp (Unix epoch) |
limit | Integer | Maximum records to return |
offset | Integer | Pagination offset |
Activity Record
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2024-01-15T10:30:00Z",
"imsi": "310410123456789",
"terminal_id": "123456789012345",
"terminal_vendor": "Google",
"terminal_model": "Pixel8",
"app_ids": ["ap2003", "ap2004"],
"client_ip": "192.168.1.100",
"user_agent": "PRD-TS43 Goog/Pixel8 client-IMS-Entitlement/1.0 OS-Android/14.0",
"auth_method": "TOKEN",
"response_code": 200
}
Android Client Compatibility
OmniSEP is tested against the Android AOSP service_entitlement library.
User-Agent Format
Android devices use this User-Agent format:
PRD-TS43 term-<vendor>/<model> <client_ts43>/<app_version> OS-Android/<sw_version>
Example:
PRD-TS43 term-Google/Pixel8 client-IMS-Entitlement/1.0 OS-Android/14.0
Multiple App IDs
Android sends multiple app IDs in POST requests as a bracket-enclosed string:
{
"app": "[ap2003,ap2004]"
}
OmniSEP parses both formats:
"ap2003,ap2004"- Comma-separated"[ap2003,ap2004]"- Bracket-enclosed (Android format)["ap2003", "ap2004"]- JSON array
Reference Specifications
| Specification | Description |
|---|---|
| GSMA TS.43 | Service Entitlement Configuration |
| GSMA RCC.14 | IMS Device Configuration Guidelines |
| 3GPP TS 33.220 | Generic Bootstrapping Architecture (GBA) |
| 3GPP TS 29.273 | EPS AAA Interfaces (SWm) |