All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- The API base URL is now addressed as
https://api.sendly.link(same host as the formermsg-api.actio.pl, renamed for brand consistency). Override it withSENDLY_BASE_URLif you need the old hostname. - License changed from Apache-2.0 to MIT.
- Fixed the
SENDLY_*/ACTIO_*environment variable fallback so that an empty string is treated as unset, instead of shadowing a real legacyACTIO_*value. - Added typed errors for unexpected 200 responses (non-JSON body, or a body
missing the documented
message_id/message_idsfields), instead of a rawJSONDecodeErrororKeyError. - Fixed validation in
send_sms_multiso an unhashable element into(e.g. a nested list) raisesSendlyValidationErrorinstead of a rawTypeError. - Disabled following HTTP redirects, so a redirect response now surfaces as
a typed
SendlyApiErrorinstead of being silently followed with theAuthorizationheader attached to the new host. - An empty explicit
tokenargument now falls back to the environment (consistent with the other clients), instead of raising immediately.
- Rebranding actio -> sendly (breaking change): the pip package
actio-clientis nowsendly-client, the import packageactiois nowsendly, and the classesActioClient/ActioError/ActioValidationError/ActioApiErrorare now namedSendlyClient/SendlyError/SendlyValidationError/SendlyApiError. - The
User-Agentheader now has the formsendly-python-client/<version> (Python/<major>.<minor>), e.g.sendly-python-client/2.0.0 (Python/3.14). - The package version now comes from
sendly.__version__(the setuptools dynamic version now points at the new import package). - The REST endpoint remains unchanged:
https://msg-api.actio.pl.
- Environment variables
SENDLY_TOKEN/SENDLY_BASE_URLwith a fallback to the legacyACTIO_TOKEN/ACTIO_BASE_URL: the legacy variable is read only when the correspondingSENDLY_*variable is not set; when both are set,SENDLY_*wins. Tests cover the fallback and precedence.
ActioClientwithsend_sms(POST /api/sms) andsend_sms_multi(POST /api/sms-multi) methods, typed results (SendResult,MultiSendResult).parse_webhookreturning typed modelsIncomingMessage/DeliveryNotification.- Client-side validation (
ActioValidationError) and typed API errors (ActioApiErrorwithstatus_code, a parsederrorsmap, and the rawrawbody). - Configuration via constructor arguments or the
ACTIO_TOKEN/ACTIO_BASE_URLenvironment variables; configurable HTTP timeout (30 s by default); no automatic retries. User-Agent: actio-python-client/<version> (Python/<major>.<minor>)header on every outgoing request to the API.X-Request-Idheader with a fresh UUID v4 on every outgoing request to the API (a correlation identifier for support purposes and clarifying suspected double-sends).- Per-call overridable
timeoutinsend_smsandsend_sms_multi, falling back to the client's default value. - Single source of truth for the package version:
actio.__version__wired into the package metadata via the setuptools dynamic version. - GitHub Actions CI workflow (pytest on Python 3.10-3.14).