Skip to main content

Python SDK for the ByteSend API

Project description

ByteSend Python SDK

A minimal Python SDK for the ByteSend API, mirroring the structure of the JavaScript SDK.

Installation

Install via pip or Poetry:

pip install bytesend
# or
poetry add bytesend

Usage

from bytesend import ByteSend, types

# By default: raises ByteSendHTTPError on non-2xx.
client = ByteSend("bs_123")

# 1) TypedDict payload (autocomplete in IDEs). Use dict to pass 'from'.
payload: types.EmailCreate = {
    "to": "test@example.com",
    "from": "no-reply@example.com",
    "subject": "Hello",
    "html": "<strong>Hi!</strong>",
}
resp, _ = client.emails.send(payload=payload)

# 2) Or pass a plain dict (supports 'from')
resp, _ = client.emails.send(payload={
    "to": "test@example.com",
    "from": "no-reply@example.com",
    "subject": "Hello",
    "html": "<strong>Hi!</strong>",
})

# Idempotent retries: same payload + same key returns the original response
resp, _ = client.emails.send(
    payload=payload,
    options={"idempotency_key": "signup-123"},
)

# Works for batch requests as well
resp, _ = client.emails.batch(
    payload=[payload],
    options={"idempotency_key": "bulk-welcome-1"},
)
# If the same key is reused with a different payload, the API responds with HTTP 409.

# 3) Campaigns
campaign_payload: types.CampaignCreate = {
    "name": "Welcome Series",
    "subject": "Welcome to our service!",
    "html": "<p>Thanks for joining us!</p>",
    "from": "welcome@example.com",
    "contactBookId": "cb_1234567890",
}
campaign_resp, _ = client.campaigns.create(payload=campaign_payload)

# Schedule a campaign
schedule_payload: types.CampaignSchedule = {
    "scheduledAt": "2024-12-01T10:00:00Z",
}
schedule_resp, _ = client.campaigns.schedule(
    campaign_id=campaign_resp["id"],
    payload=schedule_payload
)

# Pause/resume campaigns
client.campaigns.pause(campaign_id="campaign_123")
client.campaigns.resume(campaign_id="campaign_123")

# Toggle behavior if desired:
# - raise_on_error=False: return (None, error_dict) instead of raising
# No model parsing occurs; methods return plain dicts following the typed shapes.
client = ByteSend("bs_123", raise_on_error=False)
raw, err = client.emails.get(email_id="email_123")
if err:
    print("error:", err)
else:
    print("ok:", raw)

Webhook Local Example

For a runnable webhook verification demo project, see:

  • example/webhook-test-project/README.md

Development

This package is managed with Poetry. Models are maintained in-repo under bytesend/types.py (readable names). Update this file as the API evolves.

It is published as bytesend on PyPI.

Available Resources

  • Emails: client.emails.send(), client.emails.get()
  • ContactBooks: client.contact_books.list(), client.contact_books.create(), client.contact_books.get(), client.contact_books.update()
  • Contacts: client.contacts.create(), client.contacts.list(), client.contacts.get(), client.contacts.bulk_create(), client.contacts.bulk_delete()
  • Domains: client.domains.create(), client.domains.get(), client.domains.verify()
  • Campaigns: client.campaigns.create(), client.campaigns.get(), client.campaigns.schedule(), client.campaigns.pause(), client.campaigns.resume()

Notes

  • Human-friendly models are available under bytesend.types (e.g., EmailCreate, CampaignCreate, Contact, APIError).
  • Endpoint methods accept TypedDict payloads or plain dicts via the payload= keyword.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

bytesend-0.1.1.tar.gz (24.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

bytesend-0.1.1-py3-none-any.whl (27.0 kB view details)

Uploaded Python 3

File details

Details for the file bytesend-0.1.1.tar.gz.

File metadata

  • Download URL: bytesend-0.1.1.tar.gz
  • Upload date:
  • Size: 24.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for bytesend-0.1.1.tar.gz
Algorithm Hash digest
SHA256 6eee1dd9693856c474e271e71f33179096074e602de60f59054fe3a1748f071f
MD5 87f9e5670255d868a0a4e569e3dbfb9e
BLAKE2b-256 5b4597b4b3e9f55e72447f342d90df67408e9ae6776da00ff0c57e952433c28e

See more details on using hashes here.

Provenance

The following attestation bundles were made for bytesend-0.1.1.tar.gz:

Publisher: pypi-release.yml on NodeByteLTD/ByteSend

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file bytesend-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: bytesend-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 27.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for bytesend-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 a6c8c30ecaa9bac6dc434753976a74cf85324b65d4bb2acf5fbc93fefc9038bd
MD5 8e48d929e0a0a021461b6e81a73587ac
BLAKE2b-256 fa8cc7e60abda974f88089877e3c7c00a1ff8c5d61293dfcae9c7c28e4c5460d

See more details on using hashes here.

Provenance

The following attestation bundles were made for bytesend-0.1.1-py3-none-any.whl:

Publisher: pypi-release.yml on NodeByteLTD/ByteSend

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page