The SigWay USSD Gateway is a signaling gateway that bridges SS7/M3UA networks with application servers. It provides multiple interfaces for applications to interact with USSD (Unstructured Supplementary Service Data) and ATI (Any Time Interrogation) services.
SS7/M3UA Network <--> SigWay Gateway <--> Applications
|
[TCP/XML | HTTP MO | HTTP MT]
The TCP/XML interface provides a persistent TCP connection for bidirectional XML-based communication.
0xFF 0x00 0x00 0x00Applications must send a hello message upon connection to register:
<siggw>
<msg type="hello">
<ussd_shortcode_request v="*123#"/>
</msg>
</siggw>
Ping (app → gateway):
<siggw>
<msg type="ping"></msg>
</siggw>
Pong (gateway → app):
<siggw>
<msg type="pong"></msg>
</siggw>
All USSD messages use the following XML structure:
<siggw>
<msg type="begin|continue|end|abort">
<stack id="0"/>
<user id="<app_id>"/>
<dialog id="<dialog_id>"/>
<context v="<context_hex>"/>
<component type="invoke|return_l" id="<component_id>" op="<operation>">
<param name="ussd_string" v="<hex_encoded_text>"/>
<param name="msisdn" number="<msisdn>" nai="1" npi="1"/>
<param name="data_coding_scheme" v="15"/>
</component>
<user_info>
<object_identifier v="04000001010101"/>
<map op="open|accept">
<param name="destination_reference" number="<imsi>" nai="1" npi="1"/>
<param name="origination_reference" number="<msisdn>" nai="1" npi="1"/>
</map>
</user_info>
</msg>
</siggw>
SS7-Initiated Sessions: Gateway assigns dialog IDs 32768-65535
App-Initiated Sessions: App provides dialog IDs 0-32767
Dialog ID Consistency: Within a session, the same dialog ID is used throughout
HTTP MO is used when the gateway needs to send messages to applications via HTTP GET requests.
config.json (http.mo.base_url)Gateway sends HTTP GET requests to the configured base URL with query parameters:
GET <base_url>?transactionID=0x<hex>&dialogId=<id>&number=<msisdn>&text=<text>&status=<status>
Parameters:
transactionID: 32-bit transaction ID in hex format (e.g., 0x00001234)dialogId: 16-bit dialog ID (decimal)number: MSISDN (subscriber phone number)text: USSD text payload (plain text)status: Message status - "begin", "continue", or "end"Example:
GET http://app.example.com/service.php?transactionID=0x00001234&dialogId=32768&number=1234567890&text=Hello&status=begin
Application must respond with HTTP 200 OK and a response body containing:
Format: <control_char><text>
Control Characters:
0: End message with GSM7 encoding1: Continue message with GSM7 encoding2: End message with UCS2 encoding3: Continue message with UCS2 encodingGSM7 Encoding:
UCS2 Encoding:
00480065006C006C006FExamples:
GSM7 End:
0Thank you
UCS2 Continue:
300480065006C006C006F
HTTP MT allows applications to initiate USSD sessions by sending HTTP requests to the gateway.
config.json (http.mt.listen_port)/begin and /notifyInitiates a dialog-oriented USSD session.
Request:
GET /begin?dialogId=<id>&number=<msisdn>&text=<text>&text2=<ucs2_hex>
Parameters:
dialogId: 16-bit dialog ID (0-32767, provided by application)number: MSISDN (destination phone number)text: GSM7-encoded text (optional, use if GSM7)text2: UCS2 hex-encoded text (optional, use if UCS2)text or text2 must be providedResponse:
Example:
GET /begin?dialogId=1000&number=1234567890&text=Hello%20World
Sends a notification-only message (no dialog expected).
Request:
GET /notify?dialogId=<id>&number=<msisdn>&text=<text>&text2=<ucs2_hex>
Parameters: Same as /begin
Response:
Example:
GET /notify?dialogId=2000&number=1234567890&text=Notification
GSM7 (text parameter):
UCS2 (text2 parameter):
00480065006C006C006FInitiates a new USSD dialog.
SS7 → App:
App → SS7:
Continues an existing dialog.
SS7 → App:
App → SS7:
Terminates a dialog.
SS7 → App:
App → SS7:
Aborts a dialog (error condition).
SS7 → App:
Format:
<siggw>
<msg type="abort">
<user id="<app_id>"/>
<dialog id="<dialog_id>"/>
</msg>
</siggw>
Standard USSD request processing.
Context: 04000001001302 (USSD context)
Parameters:
ussd_string: Hex-encoded USSD textmsisdn: Subscriber MSISDNdata_coding_scheme: Encoding scheme (typically 15)USSD request operation.
Context: 04000001001302 (USSD context)
Parameters: Same as process_ussd_request
Notification-only USSD message (no response expected).
Context: 04000001001302 (USSD context)
Parameters: Same as process_ussd_request
ATI operation for subscriber location queries.
Context: 04000001001D03 (ATI context)
Request Parameters:
msisdn: Subscriber MSISDN (in subscriber_identity nested param)gsm_scf_address: GSM SCF address (optional)Response Parameters:
subscriber_info:
location_information:
age_of_location_information: Age in secondsgeographical_information: Hex-encoded geographical datavlr_number: VLR numbercell_glob_id_or_lai:
cell_glob_id_or_serv_area_fixed_length:
mcc: Mobile Country Codemnc: Mobile Network Codelca: Location Area Code (LAC)cid: Cell ID (CI)Flow:
Example XML Flow:
SS7 Begin → App:
<siggw>
<msg type="begin">
<stack id="0"/>
<user id="1"/>
<dialog id="32768"/>
<context v="04000001001302"/>
<component type="invoke" id="1" op="process_ussd_request">
<param name="data_coding_scheme" v="15"/>
<param name="ussd_string" v="48656C6C6F"/>
<param name="msisdn" number="1234567890" nai="1" npi="1"/>
</component>
<user_info>
<object_identifier v="04000001010101"/>
<map op="open">
<param name="destination_reference" number="123456789012345" nai="1" npi="1"/>
<param name="origination_reference" number="1234567890" nai="1" npi="1"/>
</map>
</user_info>
</msg>
</siggw>
App Continue → SS7:
<siggw>
<msg type="continue">
<stack id="0"/>
<user id="1"/>
<dialog id="32768"/>
<context v="04000001001302"/>
<component type="invoke" id="2" op="process_ussd_request">
<param name="data_coding_scheme" v="15"/>
<param name="ussd_string" v="576F726C64"/>
</component>
</msg>
</siggw>
Flow:
Example XML Flow:
App Begin → SS7:
<siggw>
<msg type="begin">
<stack id="0"/>
<user id="1"/>
<dialog id="1000"/>
<context v="04000001001302"/>
<component type="invoke" id="1" op="ussd_request">
<param name="data_coding_scheme" v="15"/>
<param name="ussd_string" v="48656C6C6F"/>
<param name="msisdn" number="1234567890" nai="1" npi="1"/>
</component>
</msg>
</siggw>
Flow:
Example XML:
App ATI Request:
<siggw>
<msg type="begin">
<stack id="0"/>
<user id="1"/>
<dialog id="2000"/>
<context v="04000001001D03"/>
<component type="invoke" id="1" op="any_time_interrogation">
<param name="subscriber_identity">
<param name="msisdn" number="1234567890" nai="1" npi="1"/>
</param>
<param name="gsm_scf_address" number="1234567890" nai="1" npi="1"/>
</component>
</msg>
</siggw>
SS7 ATI Response → App:
<siggw>
<msg type="end">
<user id="1"/>
<dialog id="2000"/>
<context v="04000001001D03"/>
<component type="return_l" id="1" op="any_time_interrogation">
<param name="subscriber_info">
<param name="location_information">
<param name="age_of_location_information" v="30"/>
<param name="geographical_information" v="01020304"/>
<param name="vlr_number" number="9876543210" nai="1" npi="1"/>
</param>
<param name="cell_glob_id_or_lai">
<param name="cell_glob_id_or_serv_area_fixed_length" mcc="250" mnc="01" lca="1234" cid="5678"/>
</param>
</param>
</component>
</msg>
</siggw>
Hex Encoding (XML):
48656C6C6FGSM7 vs UCS2:
MAP Open (SS7-initiated Begin):
destination_reference (IMSI)origination_reference (MSISDN or origination reference)MAP Accept (App End with accept):
<user_info><map op="accept"> in End message*123#)1. SS7 sends Begin:
Shortcode: *123#
MSISDN: 1234567890
Text: "Hello"
2. Gateway → App (XML):
<siggw>
<msg type="begin">
<stack id="0"/>
<user id="1"/>
<dialog id="32768"/>
<context v="04000001001302"/>
<component type="invoke" id="1" op="process_ussd_request">
<param name="data_coding_scheme" v="15"/>
<param name="ussd_string" v="48656C6C6F"/>
<param name="msisdn" number="1234567890" nai="1" npi="1"/>
</component>
<user_info>
<object_identifier v="04000001010101"/>
<map op="open">
<param name="destination_reference" number="123456789012345" nai="1" npi="1"/>
<param name="origination_reference" number="1234567890" nai="1" npi="1"/>
</map>
</user_info>
</msg>
</siggw>
3. App responds with Continue:
<siggw>
<msg type="continue">
<stack id="0"/>
<user id="1"/>
<dialog id="32768"/>
<context v="04000001001302"/>
<component type="invoke" id="2" op="process_ussd_request">
<param name="data_coding_scheme" v="15"/>
<param name="ussd_string" v="576F726C64"/>
</component>
</msg>
</siggw>
4. SS7 sends Continue:
Text: "World"
5. Gateway → App (XML):
<siggw>
<msg type="continue">
<stack id="0"/>
<user id="1"/>
<dialog id="32768"/>
<context v="04000001001302"/>
<component type="return_l" id="2" op="process_ussd_request">
<param name="data_coding_scheme" v="15"/>
<param name="ussd_string" v="576F726C64"/>
</component>
</msg>
</siggw>
6. App sends End:
<siggw>
<msg type="end">
<stack id="0"/>
<user id="1"/>
<dialog id="32768"/>
<context v="04000001001302"/>
<component type="invoke" id="3" op="process_ussd_request">
<param name="data_coding_scheme" v="15"/>
<param name="ussd_string" v="5468616E6B20796F75"/>
</component>
</msg>
</siggw>
1. SS7 sends Begin:
Shortcode: *456#
MSISDN: 9876543210
Text: "Balance"
2. Gateway → App (HTTP GET):
GET http://app.example.com/service.php?transactionID=0x00001234&dialogId=32769&number=9876543210&text=Balance&status=begin
3. App responds:
HTTP 200 OK
Body: "1Your balance is $100"
(Continue with GSM7 encoding)
4. Gateway → SS7:
Continue: "Your balance is $100"
5. SS7 sends End:
Text: "Thank you"
6. Gateway → App (HTTP GET):
GET http://app.example.com/service.php?transactionID=0x00001234&dialogId=32769&number=9876543210&text=Thank%20you&status=end
7. App responds:
HTTP 200 OK
Body: "0"
(End with GSM7, empty text)
1. App sends Begin (HTTP GET):
GET /begin?dialogId=5000&number=1112223333&text=Hello%20World
2. Gateway → SS7:
Begin: Dialog ID 5000, MSISDN 1112223333, Text "Hello World"
3. SS7 responds with Continue:
Text: "Response"
4. Gateway → App (via TCP/XML or HTTP MO):
1. App sends ATI Request (XML):
<siggw>
<msg type="begin">
<stack id="0"/>
<user id="1"/>
<dialog id="3000"/>
<context v="04000001001D03"/>
<component type="invoke" id="1" op="any_time_interrogation">
<param name="subscriber_identity">
<param name="msisdn" number="1234567890" nai="1" npi="1"/>
</param>
</component>
</msg>
</siggw>
2. SS7 responds with ATI data:
MCC: 250
MNC: 01
LAC: 1234
CI: 5678
VLR: 9876543210
Age: 30 seconds
3. Gateway → App (XML End):
<siggw>
<msg type="end">
<user id="1"/>
<dialog id="3000"/>
<context v="04000001001D03"/>
<component type="return_l" id="1" op="any_time_interrogation">
<param name="subscriber_info">
<param name="location_information">
<param name="age_of_location_information" v="30"/>
<param name="vlr_number" number="9876543210" nai="1" npi="1"/>
</param>
<param name="cell_glob_id_or_lai">
<param name="cell_glob_id_or_serv_area_fixed_length" mcc="250" mnc="01" lca="1234" cid="5678"/>
</param>
</param>
</component>
</msg>
</siggw>
See config.json.example for complete configuration options:
tcp_xml.enabled, tcp_xml.listen_porthttp.mo.enabled, http.mo.base_url, http.mo.timeout_sechttp.mt.enabled, http.mt.listen_portussd.session_timeout_secrate_limiting.enabled, rate_limiting.per_minute, rate_limiting.burst_sizeFor issues or questions, refer to the gateway logs:
ussd-gateway.log (default)sigwayTraffic.log (if enabled)