An SMPP connection to eSMS Africa is an SMPP 3.4 bind to smpp.esmsafrica.io on port 2775 over plain TCP, made from a server whose public IP address is on your bind's allowlist. You request the bind in the SMPP portal at smpp.esmsafrica.io, our team approves it, and you connect with the system ID and password shown under My Credentials.

Last reviewed: 29 October 2026

How to set up an SMPP connection

  1. Request a bind

    In the SMPP portal open Request Credentials in the sidebar. On the Request a bind page choose the Country you will send to, and in Note to our team describe your use case, expected volume, the sender IDs you need and the public IP addresses of the servers that will connect. Click Submit request. Each bind is set up for one country, so request one per destination country. Our team usually replies within one business day.

  2. Get your credentials

    When the request is approved you receive an email and the bind appears under My Credentials. Its page shows the connection details: Host smpp.esmsafrica.io, Port 2775, your System ID and password, the bind's SMS balance and its Sender IDs. Treat the password like an API key.

  3. Make sure your IP is allowlisted

    Port 2775 only accepts connections from the IP addresses on your bind's allowlist. If your servers change, or you add a backup server, send the new public IPv4 addresses to our team through Support Chat in the portal before you switch. A connection from an address that is not listed will simply fail to connect.

  4. Connect and bind

    Use bind type transceiver (TRX) so one session sends messages and receives delivery receipts and replies. Transmitter (TX, send only) and receiver (RX, receive only) binds are also supported. Send enquire_link at least every 30 seconds; idle sessions are disconnected. A minimal Python example:

    import smpplib.client
    import smpplib.consts
    import smpplib.gsm
    
    client = smpplib.client.Client("smpp.esmsafrica.io", 2775)
    
    # submit_sm_resp gives you the message id; deliver_sm brings the delivery receipt
    client.set_message_sent_handler(
        lambda pdu: print("accepted", pdu.message_id))
    client.set_message_received_handler(
        lambda pdu: print("receipt", pdu.short_message))
    
    client.connect()
    client.bind_transceiver(system_id="YOUR_SYSTEM_ID", password="YOUR_PASSWORD")
    
    parts, coding, esm_class = smpplib.gsm.make_parts("Hello from eSMS Africa over SMPP")
    for part in parts:
        client.send_message(
            source_addr_ton=smpplib.consts.SMPP_TON_ALNUM,
            source_addr="YOURBRAND",            # an approved sender ID on this bind
            dest_addr_ton=smpplib.consts.SMPP_TON_INTL,
            destination_addr="254712345678",    # country code + number, no leading 0
            short_message=part,
            data_coding=coding,
            esm_class=esm_class,
            registered_delivery=True,           # ask for a delivery receipt
        )
    
    client.listen()   # keeps the session open, answers enquire_link, reads receipts
  5. Request and read delivery receipts

    Set registered_delivery to 1 in each submit_sm. The receipt arrives as a deliver_sm on a transceiver or receiver session, with the final state in the message text (for example stat:DELIVRD, UNDELIV, EXPIRED or REJECTD) and the message id you got in submit_sm_resp. query_sm is not supported, so rely on receipts, or check the Messages page in the portal.

  6. Stay inside your throughput

    Each bind has a throughput limit in messages per second, set when it is approved; higher limits are available on request. If you submit faster, the gateway answers the extra submit_sm with ESME_RTHROTTLED (0x58). Pace your client to the limit, and when you get a throttle response wait briefly and resubmit that message.

  7. Top up and watch the bind

    Each bind has its own balance. Add to it under Top up in the portal by mobile money, Mukuru or crypto, and follow traffic on the Dashboard and Messages pages.

Common errors and how to fix them

What you seeWhat it meansHow to fix it
Connection times out or is refusedYour server's public IP is not on the bind's allowlist, or an outbound firewall blocks port 2775.Confirm the public IP your server really uses and send it to our team; allow outbound TCP 2775.
Bind fails with an invalid password or system IDThe credentials are wrong or the password was changed.Copy them again from My Credentials. If the password is not shown, click Set password and choose Request password from admin.
ESME_RTHROTTLED (0x58)You are sending faster than the bind's throughput.Slow down to the limit and resubmit throttled messages after a short wait.
Session drops after a quiet periodNo enquire_link was sent.Send enquire_link at least every 30 seconds.
No delivery receiptsregistered_delivery is 0, or the bind is a transmitter.Set registered_delivery to 1 and use a transceiver (or add a receiver bind).
Messages stay at sentSome networks do not return a final receipt for every message.Treat sent as accepted by the network; only failures mean it did not go through.
Submit rejected for the senderThe source address is not an approved sender ID for the bind.Use a sender listed on the bind, or request a new one in the portal.

Frequently asked questions

Which SMPP version do you support?

SMPP 3.4, with transceiver, transmitter and receiver binds.

Is the SMPP connection encrypted?

No. SMPP on port 2775 is plain TCP with IP allowlisting. Use a VPN or private link for encryption, or the HTTPS API.

Can I use query_sm to check a message?

No, query_sm is not supported. Request delivery receipts with registered_delivery and read the deliver_sm PDUs.

Can one bind send to several countries?

Each bind is set up for one country. Request a bind for each country you send to.

Should I use SMPP or the HTTP API?

SMPP suits platforms that already speak it and need a persistent high-volume session. For most apps the HTTPS API with webhooks is simpler; see SMS API vs SMPP.

Ready? Sign in to the SMPP portal and request your first bind, or create a free eSMS account first.