This release is a pre-release and may not be stable for production use.
Stormedo Python SDK
This package sends durable HTTP requests through Stormedo and authenticates or verifies signed deliveries from Stormedo. It supports Python 3.10 and newer.
Install
uv add stormedo
Send requests
Use Stormedo in synchronous applications:
import os
from datetime import timedelta
from stormedo import Stormedo
stormedo = Stormedo(os.environ["STORMEDO_TOKEN"])
request = stormedo.send(
"https://example.com/webhook",
body={"message": "hello from Stormedo"},
delay=timedelta(minutes=5),
max_attempts=5,
)
Use AsyncStormedo when the application already runs an event loop:
import os
from stormedo import AsyncStormedo
async_stormedo = AsyncStormedo(os.environ["STORMEDO_TOKEN"])
request = await async_stormedo.send(
"https://example.com/webhook",
body={"message": "hello from Stormedo"},
)
Create one client, reuse it, and call close() or aclose() during application
shutdown.
Use raw_body when bytes must be sent unchanged. Headers supplied in headers
are sent to the destination. Stormedo never forwards the project API key.
request = stormedo.send(
"https://example.com/events",
raw_body=b"event=created",
content_type="application/x-www-form-urlencoded",
headers={"Authorization": "Bearer destination-token"},
)
Batch items use BatchRequest values instead of dictionaries:
from datetime import timedelta
from stormedo import BatchRequest
requests = stormedo.send_batch(
[
BatchRequest(
url="https://example.com/orders",
body={"order_id": "ord_123"},
),
BatchRequest(
url="https://example.com/inventory",
body={"warehouse_id": "wh_7"},
delay=timedelta(hours=1),
),
]
)
delay and timeout accept timedelta. deliver_at accepts a timezone-aware
datetime.
The synchronous and asynchronous clients expose the same operations:
sendandsend_batchlist_requests,get_request,list_request_attempts,cancel_request, andreplay_requestcreate_schedule,list_schedules,get_schedule,update_schedule,pause_schedule,resume_schedule, anddelete_schedule
Create schedules with a timing helper instead of constructing the API payload:
from datetime import timedelta
from stormedo import cron_timing, interval_timing
schedule = stormedo.create_schedule(
name="sync-inventory",
timing=cron_timing("0 */6 * * *", "Asia/Kolkata"),
url="https://example.com/inventory/sync",
body={"full_sync": True},
max_attempts=4,
)
stormedo.update_schedule(
schedule.id,
timing=interval_timing(timedelta(hours=4)),
)
cron_timing accepts a five-field cron expression and an IANA timezone.
interval_timing accepts a timedelta containing a whole number of minutes
from one minute through 30 days. Pass a future timezone-aware datetime as
starts_at to choose the first run time.
Configure delivery verification
Create one verifier with the project ID and reuse it across requests:
import os
from stormedo import DeliveryVerifier
project_id = os.environ["STORMEDO_PROJECT_ID"]
verifier = DeliveryVerifier(project_id)
For asynchronous applications:
from stormedo import AsyncDeliveryVerifier
async_verifier = AsyncDeliveryVerifier(project_id)
Authenticate without checking the body
Use authenticate_delivery when the platform cannot provide the raw body. It
authenticates Stormedo and the request context but does not prove payload
integrity.
delivery = verifier.authenticate_delivery(
signature=signature,
request_id=request_id,
expected_url="https://example.com/webhooks/stormedo",
method="POST",
)
assert delivery.payload_integrity == "unchecked"
Verify the exact body
Use verify_delivery when the receiver can capture the exact raw bytes before
a JSON or form parser changes them:
delivery = verifier.verify_delivery(
signature=signature,
request_id=request_id,
expected_url="https://example.com/webhooks/stormedo",
method="POST",
raw_body=raw_body,
)
assert delivery.payload_integrity == "verified"
Receiver responsibilities
- Reject missing or duplicated
Stormedo-SignatureandStormedo-Request-Idheaders before calling the core verifier. - Supply the complete public destination URL from trusted configuration. Do not trust forwarded request headers unless the application has an explicit proxy trust boundary.
- Authenticate or verify at ingress while the delivery token is current.
- Parse the application body only after
verify_deliverysucceeds when payload integrity is required.
Errors
Stormedo API and network failures raise StormedoError. Use code for program
logic and request_id when contacting Stormedo support.
Verification failures raise DeliveryVerificationError. Use its code to
handle the failure.
Metadata
Release files for stormedo 0.1.0rc1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| stormedo-0.1.0rc1.tar.gz | 17.7 kB | With provenance | Details for stormedo-0.1.0rc1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| stormedo-0.1.0rc1-py3-none-any.whl | Python 3 | none | any | Details for stormedo-0.1.0rc1-py3-none-any.whl |
Total release size: 38.8 kB
Release files / stormedo-0.1.0rc1.tar.gz
| Download URL | stormedo-0.1.0rc1.tar.gz |
|---|---|
| Size | 17.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
02969faef3a293f2d61d7af3d87300756521476522f757367ea69f5d76d8589e
|
|
BLAKE2b-256 checksum How to use checksums |
31aa26b58b734cf86ca597a43051ae88a49d55bd63075fc32eabca31a8b765db
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Oct 22, 2026.
Transparency logRelease files / stormedo-0.1.0rc1-py3-none-any.whl
| Download URL | stormedo-0.1.0rc1-py3-none-any.whl |
|---|---|
| Size | 21.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
232744ba8a0ab6b7f74cc4117253ce76b0912cc89fd83cc025ebaa1396923804
|
|
BLAKE2b-256 checksum How to use checksums |
2c5857db08f06a93fa42471f29b01d54b55671eabffe621ec22b1f79335e2dce
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Oct 22, 2026.
Transparency logSecurity for stormedo 0.1.0rc1
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.
Full provenance
Both files in this release have been uploaded with provenance metadata.
Attestation for stormedo-0.1.0rc1.tar.gz
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 Oct 22, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.