zeno-channel-sendblue
Sendblue iMessage webhook channel for Zeno. The first
webhook-style channel — use it as the template for any Channel that
hosts its own HTTP inbound transport.
Hosts a Starlette + uvicorn server for Sendblue's inbound webhook and posts outbound messages to Sendblue's REST API. Verifies the shared-secret header, enforces a phone-number allowlist, and fires a typing indicator per accepted inbound message.
Install
uv add 'zeno-framework[sendblue]'
# or, without the AI package:
uv add zeno-channel-sendblue
Minimal usage
from zeno.channels.sendblue.channel import SendblueChannel
channel = SendblueChannel(
api_key_id="...",
api_secret="...",
from_number="+15550001111",
signing_secret="...", # shared with Sendblue dashboard
allowed_numbers=("+31600000000",),
host="127.0.0.1",
port=8080,
webhook_path="/webhook",
)
# Then pass it to ZenoApp(channels=[channel]) exactly like any Channel.
See apps/zeno-example-imessage
for the complete runnable reference app, including ngrok / Cloudflare
Tunnel setup notes.
Behavior
- Signature verification: Sendblue echoes the configured secret in
the
sb-signing-secretheader. Bad or missing signature →401. Every other drop (non-iMessage service, group message, unallowlisted sender, malformed JSON, queue full) returns200so Sendblue doesn't retry and so the 401 audit signal stays meaningful. - Inbound →
IncomingMessage:user_id = from_number(E.164),text = content,thread_key = from_numberso replies route back. A non-emptymedia_urlbecomes an imageAttachment. - Outbound: text + optional single image via
POST /api/send-message. Content over 18,996 chars is truncated (WARNING log) to fit Sendblue's limit. - Capabilities:
supports_images=True,supports_typing=True, others False.
Testing
uv run pytest packages/zeno-channel-sendblue
Tests use httpx.MockTransport for outbound and the Starlette
TestClient for the router. No Sendblue secrets required in CI.
See also
zeno-channel-cli,zeno-channel-email— other first-party channels.docs/adapters.md— writing your ownChannel.
Part of the Zeno framework.
Metadata
Release files for zeno-channel-sendblue 1.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| zeno_channel_sendblue-1.1.0.tar.gz | 13.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| zeno_channel_sendblue-1.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 25.2 kB
Release files / zeno_channel_sendblue-1.1.0.tar.gz
| Download URL | zeno_channel_sendblue-1.1.0.tar.gz |
|---|---|
| Size | 13.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
81a8209ee22805730d44c52dc184af8fb5100253d8329a6299f594b60c072664
|
|
BLAKE2b-256 checksum How to use checksums |
5dd7fb58411917ba993cd1a1888d395aea08dec5adf3fdfb003f86ac2f6edfca
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 May 1, 2026.
Transparency logRelease files / zeno_channel_sendblue-1.1.0-py3-none-any.whl
| Download URL | zeno_channel_sendblue-1.1.0-py3-none-any.whl |
|---|---|
| Size | 11.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7006a5a3e9f25a3a3fb3bafddbd4cceb79d3950f8e7110d48e457781f107f423
|
|
BLAKE2b-256 checksum How to use checksums |
e465446688dbf7796407e0a1c6294692101ba8d0d8f9eaac91f2d9547db257da
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 May 1, 2026.
Transparency log