USSD Gateway API

Technical reference — TCP/XML, HTTP MO/MT, MAP USSD, ATI

USSD Gateway API Documentation

Table of Contents

  1. Overview
  2. Interfaces
  3. Message Types
  4. Operations
  5. Procedures
  6. Protocol Details
  7. Examples

Overview

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.

Key Features

Architecture

SS7/M3UA Network <--> SigWay Gateway <--> Applications
                            |
                      [TCP/XML | HTTP MO | HTTP MT]

Interfaces

TCP/XML Interface

The TCP/XML interface provides a persistent TCP connection for bidirectional XML-based communication.

Connection

Connection Lifecycle

  1. Connect: Application establishes TCP connection to gateway
  2. Hello: Application sends registration message with optional shortcode
  3. Communication: Exchange XML messages
  4. Keep-Alive: Ping/Pong messages for connection health
  5. Disconnect: Connection closed (graceful or timeout)

Hello Message (Registration)

Applications must send a hello message upon connection to register:

<siggw>
  <msg type="hello">
    <ussd_shortcode_request v="*123#"/>
  </msg>
</siggw>

Ping/Pong (Keep-Alive)

Ping (app → gateway):

<siggw>
  <msg type="ping"></msg>
</siggw>

Pong (gateway → app):

<siggw>
  <msg type="pong"></msg>
</siggw>

Message Format

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>

Dialog ID Ranges

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 (Mobile Originated) Interface

HTTP MO is used when the gateway needs to send messages to applications via HTTP GET requests.

Configuration

Request Format

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:

Example:

GET http://app.example.com/service.php?transactionID=0x00001234&dialogId=32768&number=1234567890&text=Hello&status=begin

Response Format

Application must respond with HTTP 200 OK and a response body containing:

Format: <control_char><text>

Control Characters:

GSM7 Encoding:

UCS2 Encoding:

Examples:

GSM7 End:

0Thank you

UCS2 Continue:

300480065006C006C006F

Transaction Management

When HTTP MO is Used


HTTP MT (Mobile Terminated) Interface

HTTP MT allows applications to initiate USSD sessions by sending HTTP requests to the gateway.

Configuration

/begin Endpoint

Initiates a dialog-oriented USSD session.

Request:

GET /begin?dialogId=<id>&number=<msisdn>&text=<text>&text2=<ucs2_hex>

Parameters:

Response:

Example:

GET /begin?dialogId=1000&number=1234567890&text=Hello%20World

/notify Endpoint

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

Text Encoding

GSM7 (text parameter):

UCS2 (text2 parameter):


Message Types

Begin

Initiates a new USSD dialog.

SS7 → App:

App → SS7:

Continue

Continues an existing dialog.

SS7 → App:

App → SS7:

End

Terminates a dialog.

SS7 → App:

App → SS7:

Abort

Aborts a dialog (error condition).

SS7 → App:

Format:

<siggw>
  <msg type="abort">
    <user id="<app_id>"/>
    <dialog id="<dialog_id>"/>
  </msg>
</siggw>

Operations

process_ussd_request (Operation Code 59)

Standard USSD request processing.

Context: 04000001001302 (USSD context)

Parameters:

ussd_request (Operation Code 60)

USSD request operation.

Context: 04000001001302 (USSD context)

Parameters: Same as process_ussd_request

ussd_notify / unstructured_ss_notify (Operation Code 61)

Notification-only USSD message (no response expected).

Context: 04000001001302 (USSD context)

Parameters: Same as process_ussd_request

any_time_interrogation (Operation Code 71)

ATI operation for subscriber location queries.

Context: 04000001001D03 (ATI context)

Request Parameters:

Response Parameters:


Procedures

SS7-Initiated Sessions

Flow:

  1. SS7 Begin → Gateway
    • Gateway receives Begin from SS7
    • Extracts shortcode from USSD text
    • Creates session with dialog ID (32768-65535)
    • Finds eligible apps (shortcode match or no filter)
  2. Gateway → App(s)
    • Sends Begin XML to all eligible apps
    • Apps receive dialog ID and can respond
  3. App → Gateway (Continue/End)
    • App sends Continue/End with same dialog ID
    • Gateway routes to SS7 using stored SS7 transaction ID
  4. SS7 → Gateway (Continue/End)
    • Gateway receives Continue/End from SS7
    • Routes to apps subscribed to dialog
    • On End, session is closed

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>

App-Initiated Sessions

Flow:

  1. App Begin → Gateway
    • App sends Begin with dialog ID (0-32767)
    • Gateway creates session using app's dialog ID
    • Routes to SS7 using dialog ID as transaction ID
  2. SS7 → Gateway (Continue/End)
    • Gateway receives Continue/End from SS7
    • Stores SS7 transaction ID (OTID)
    • Routes to app using app's dialog ID
  3. App → Gateway (Continue/End)
    • App sends Continue/End with same dialog ID
    • Gateway routes to SS7 using stored SS7 transaction ID

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>

ATI (Any Time Interrogation)

Flow:

  1. App ATI Request → Gateway
    • App sends Begin with ATI operation
    • Includes MSISDN and optional GSM SCF address
    • Gateway routes to SS7
  2. SS7 ATI Response → Gateway
    • Gateway receives End with ATI response
    • Parses location information
    • Routes to app as End message with ATI data

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>

Protocol Details

Dialog ID Management

Component ID

Text Encoding

Hex Encoding (XML):

GSM7 vs UCS2:

User Info (MAP Open/Accept)

MAP Open (SS7-initiated Begin):

MAP Accept (App End with accept):

Session Timeout

Rate Limiting

Shortcode Extraction


Examples

Example 1: SS7-Initiated USSD Session (TCP/XML)

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>

Example 2: HTTP MO Session

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)

Example 3: HTTP MT Session

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):

Example 4: ATI Query

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>

Error Handling

Connection Errors

Invalid Messages

Timeouts


Best Practices

  1. Dialog ID Management: Use consistent dialog IDs within sessions
  2. Component IDs: Applications manage component IDs themselves - gateway passes through whatever ID the app provides
  3. Text Encoding: Use GSM7 when possible, UCS2 for special characters
  4. Error Handling: Always handle abort messages
  5. Connection Management: Implement ping/pong for TCP/XML connections
  6. Shortcode Registration: Register specific shortcodes to reduce unnecessary traffic
  7. Session Cleanup: Properly close sessions with End messages

Configuration Reference

See config.json.example for complete configuration options:


Support

For issues or questions, refer to the gateway logs: