Overview
The IXO USSD gateway exposes a single session endpoint that telecom gateways call for each user interaction, plus debug and health endpoints for operators. All endpoints accept and return JSON unless otherwise noted. The main session endpoint returns plain text in the USSD response format.Authentication
The/api/ussd endpoint does not require authentication by default. It is intended to be called by your telecom gateway server, not directly from a browser. Restrict access at the network or reverse-proxy layer in production.
Base URL
3000. Set PORT in your environment to override.
Session endpoint
POST /api/ussd
Processes a USSD interaction. Called by the telecom gateway once per user input during a session. Request`sessionId`
`sessionId`
- Type:
string - Required: yes
- Description: Unique session identifier assigned by the telecom gateway.
`serviceCode`
`serviceCode`
- Type:
string - Required: yes
- Description: USSD service code the user dialled, for example
*1234#.
`phoneNumber`
`phoneNumber`
- Type:
string - Required: yes
- Description: User phone number in E.164 international format, for example
+260971234567.
`text`
`text`
- Type:
string - Required: yes
- Description: User input accumulated during the session; empty string on initial dial.
phoneNumbermust be E.164 formatserviceCodemust match USSD format, e.g.*1234#or*123*456#textmaximum 182 characters (USSD protocol limit)sessionIdmaximum 100 characters
`CON`
`CON`
- Meaning: Session continues; display the menu and wait for the next input.
`END`
`END`
- Meaning: Session closed; display the message and end the USSD session.
Debug endpoints
GET /api/ussd/debug/:sessionId
Returns the current state and context for an active session. Intended for operator debugging only — do not expose publicly. ResponseGET /api/ussd/sessions
Returns all currently active session IDs.Health endpoints
GET /health
Returns application health with database connectivity status.GET /
Basic health check for platform-as-a-service health probes.Errors
`END Invalid input. Please try again.`
`END Invalid input. Please try again.`
- Cause: Request failed validation.
- What to do: Check phone number is E.164, service code format, and text length.
`END Service temporarily unavailable. Please try again later.`
`END Service temporarily unavailable. Please try again later.`
Session not found on `GET /debug/:sessionId`
Session not found on `GET /debug/:sessionId`
- Cause: Session expired or never started.
- What to do: Sessions expire after inactivity; the user must dial again.
5xx, client errors), see Error handling. For environment-specific service URLs and auth, see Networks and endpoints and Authentication matrix.
Security notes
- User PINs are encrypted at rest with AES-256 using the
PIN_ENCRYPTION_KEYenvironment variable. - All inputs are validated and sanitised before processing.
- Set
TRUST_PROXY_ENABLED=truewhen running behind a reverse proxy so rate limiting uses the real client IP.
Related guides
Deploy the IXO USSD gateway
Set up environment configuration and telecom gateway integration.
IXO USSD gateway overview
Review architecture and the integration model.