Skip to main content

Official Python SDK for WorkOnward Reach (https://send.gitdate.ink) — send emails, manage contacts, campaigns, and domains, and verify webhooks. Defaults to the send.gitdate.ink instance.

Project description

WorkonwardSend Python SDK

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

Installation

Install via pip or Poetry:

pip install workonward-reach
# or
poetry add workonward-reach

Usage

from workonward_reach import WorkonwardSend, types

# By default: raises WorkonwardSendHTTPError on non-2xx.
client = WorkonwardSend("us_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 = WorkonwardSend("us_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 workonward_reach/types.py (readable names). Update this file as the API evolves.

It is published as workonward-reach 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 workonward_reach.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

workonward_reach-2.0.0.tar.gz (13.7 kB view details)

Uploaded Source

Built Distribution

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

workonward_reach-2.0.0-py3-none-any.whl (17.1 kB view details)

Uploaded Python 3

File details

Details for the file workonward_reach-2.0.0.tar.gz.

File metadata

  • Download URL: workonward_reach-2.0.0.tar.gz
  • Upload date:
  • Size: 13.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.10.10 {"installer":{"name":"uv","version":"0.10.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for workonward_reach-2.0.0.tar.gz
Algorithm Hash digest
SHA256 017e80f1d21b9587f7d21fc8f6761f314c384d27d7e6333fdf1e78b34e0fb62e
MD5 ae0506a4f0d4e52d380fc8f9c64dd1e8
BLAKE2b-256 59e28018ed343071a1436a02916efa6682f44bae7224c28303a6d7809852f88c

See more details on using hashes here.

File details

Details for the file workonward_reach-2.0.0-py3-none-any.whl.

File metadata

  • Download URL: workonward_reach-2.0.0-py3-none-any.whl
  • Upload date:
  • Size: 17.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.10.10 {"installer":{"name":"uv","version":"0.10.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for workonward_reach-2.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 2700c00c886a12b9e4d389548b636cb8f518e7d7bfb521ead300cf65c21f29b5
MD5 1bac184c874547487eeea8fe91ddc263
BLAKE2b-256 ec5ab874e45f0cf72204152fee35632dd083531a3f433c35a723fd0d4c54cc20

See more details on using hashes here.

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