Skip to main content

semaphore-sms

CI codecov PyPI Python 3.7+

API wrapper for Semaphore SMS Gateway. The documentation for their API can be found here.

Installation

This library supports Python versions >= 3.7.

Install from PyPi using pip via

pip install semaphore-sms

Don't have pip installed? Refer to this documentation

Usage

‼️ For all these calls, you can see sample responses in tests/test_semaphore_client.py ‼️

Initializing the client

from semaphore_sms import SemaphoreClient

client = SemaphoreClient(
    api_key='your_api_key',
    sender_name='sender_name',
)

Note: SemaphoreClient will try to pull api_key from os.environ if not supplied. If it still can't a value then, a SemaphoreException will be raised

Sending SMS

For sending a basic single message,

client.send(
    message='Your text here',
    recipients=['09980101010', ]
)

To send one message to several numbers in bulk, simply provide multiple numbers under recipients

client.send(
    message='Your text here',
    recipients=['09980101010', '09980202020', ]
)

Sending out priority messages and OTP messages will look very similar

client.priority(
    message='Your text here',
    recipients=['09980101010', '09980202020', ]
)

client.otp(
    message='Your OTP is: {otp}',  # refer to Semaphore's docs for details
    recipients=['09980101010', ],
    code=123456,  # refer to Semaphore's docs for details
)

Fetching messages

https://semaphore.co/docs#retrieving_messages

client.messages(
    limit=100,  # optional
    page=1,  # optional
    start_date='2023-11-06',  # optional
    end_date='2023-12-25',  # optional
    network='smart',  # optional
    status='succcess'  # optional
)

Retrieving account information

https://semaphore.co/docs#retrieving_account

account_information = client.account
transactions = client.transactions(
    limit=100,  # optional
    page=1  # optional
)
sender_names = client.sender_names(
    limit=100,  # optional
    page=1  # optional
)
users = client.users(
    limit=100,  # optional
    page=1  # optional
)

Again, you can see sample responses in tests/test_semaphore_client.py

Error Handling

The library provides a comprehensive exception hierarchy for handling different error scenarios:

SemaphoreException (base)
├── AuthenticationError     # Missing or invalid API credentials
├── ValidationError         # Client-side validation failures
│   ├── InvalidPhoneNumberError  # Invalid Philippine phone format
│   └── EmptyMessageError        # Blank message content
└── APIError               # Server returned an error response
    ├── AuthorizationError # 401/403 responses
    ├── RateLimitError     # 429 responses (includes retry_after)
    ├── ServerError        # 5xx responses
    └── NetworkError       # Connection/timeout failures

Example Usage

from semaphore_sms import SemaphoreClient
from semaphore_sms.exceptions import (
    AuthenticationError,
    InvalidPhoneNumberError,
    RateLimitError,
    SemaphoreException,
)

try:
    client = SemaphoreClient(api_key='your_api_key')
    client.send(message='Hello', recipients=['09991234567'])
except AuthenticationError:
    print("Invalid API key")
except InvalidPhoneNumberError as e:
    print(f"Invalid phone numbers: {e.recipients}")
except RateLimitError as e:
    if e.retry_after:
        print(f"Rate limited. Retry after {e.retry_after} seconds")
except SemaphoreException as e:
    print(f"Semaphore error: {e}")

All exceptions inherit from SemaphoreException, so you can catch all library errors with a single except block for backward compatibility.

Tests

Clone the repo and run

PYTHONPATH=src python -m unittest

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/sbenemerito/semaphore-sms/

Note: Yes, I'm currently pushing directly to main - I know, I know. When contributors come around, I'll enforce proper branch protection and PR workflows 🙇‍♂️

License

The library is available as open source under the terms of the MIT License.

Metadata

Release files for semaphore-sms 1.0.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for semaphore-sms 1.0.1
File Size Uploaded
semaphore_sms-1.0.1.tar.gz 15.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for semaphore-sms 1.0.1
File Interpreter ABI Platform
semaphore_sms-1.0.1-py3-none-any.whl Python 3 none any Details

Total release size: 26.7 kB

Release files / semaphore_sms-1.0.1.tar.gz

Download URL semaphore_sms-1.0.1.tar.gz
Size 15.5 kB
Tags Source
SHA-256 checksum
How to use checksums
3e7c73d9ba248f0ebf6ddf2fe50c982c456fe43b3fa53a54c4502fcfb74d67eb
BLAKE2b-256 checksum
How to use checksums
c035c06554f86d4095a0c3aaaf0c415de2820af7198a1cf52b8798b315a11f41
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jan 28, 2026.

Transparency log

Release files / semaphore_sms-1.0.1-py3-none-any.whl

Download URL semaphore_sms-1.0.1-py3-none-any.whl
Size 11.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
248f794a04321914f1ffe342669a647f2a2ce4e08f602af9125bd1caadf84e0d
BLAKE2b-256 checksum
How to use checksums
37c769d5aafd2aad22c478dae79d42852e9b8658dc0f51cfe99a2fd46066076f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jan 28, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

1.0.1 This release

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page