Skip to main content

Courier: Your Complete Communication Stack

pypi fern shield

This is the official Python package for sending notifications with the Courier REST API.

Installation

Install from PyPI

pip install trycourier
# or 
poetry add trycourier

Python 3.7 or later is required.

Usage

Use the Courier class to access all of our endpoints.

import os
import courier

from courier.client import Courier

client = Courier(
  authorization_token="YOUR_TOKENY" # Defaults to COURIER_AUTH_TOKEN
)

response = client.send(
  message=courier.ContentMessage(
    to=courier.UserRecipient(
      email="marty_mcfly@email.com",
      data={
        name: "Marty",
      }
    ),
    content=courier.ElementalContentSugar(
      title="Back to the Future",
      body="Oh my {{name}}, we need 1.21 Gigawatts!",
    ),
    routing=courier.Routing(
      method=courier.RoutingMethod.ALL,
      channels=["email"]
    )
  )
)

print(response)

Async Client

The SDK also exports an asynchronous client, AsyncCourier.

import os
import courier
import asyncio

from courier.client import AsyncCourier

client = AsyncCourier(
  authorization_token="YOUR_TOKEN" # Defaults to COURIER_AUTH_TOKEN
)

async def main() -> None: 
  response = await client.send(
    message=courier.ContentMessage(
      to=courier.UserRecipient(
        email="marty_mcfly@email.com",
        data={
          name: "Marty",
        }
      ),
      content=courier.ElementalContentSugar(
        title="Back to the Future",
        body="Oh my {{name}}, we need 1.21 Gigawatts!",
      ),
      routing=courier.Routing(
        method=courier.RoutingMethod.ALL,
        channels=["email"]
      )
    )
  )

asyncio.run(main())

Timeouts

By default, the client is configured to have a timeout of 60 seconds. You can customize this value at client instantiation.

from courier.client import Courier

client = Courier(
  authorization_token="YOUR_TOKEN",
  timeout=30
)

Handling Exceptions

All exceptions thrown by the SDK will sublcass courier.ApiError.

import courier

from courier.core import ApiError

try:
  courier.send(...)
except APIError as e:  
  # handle any api related error

Idempotency Keys

For POST methods, you can supply an idempotencyKey in the config parameter to ensure the idempotency of the API Call. We recommend that you use a V4 UUID for the key. Keys are eligible to be removed from the system after they're at least 24 hours old, and a new request is generated if a key is reused after the original has been removed. For more info, see Idempotent Requests in the Courier documentation.

import courier

courier.send(
  message={...}, 
  idempotency_key"YOUR_KEY", 
  idempotency_expiration="YOUR_EXPIRATION")

Additional Usage Examples

Send Template Message

import courier

from courier import Courier

client = Courier(
  authorization_token="YOUR_TOKEN")

response = client.send(
    message=courier.TemplateMessage(
      template="my-template",
      to=courier.UserRecipient(email="foo@bar.com")
    )
)
print(response.message_id)

UTM Metadata with Message

import courier

from courier import Courier

client = Courier(
  authorization_token="YOUR_TOKEN")

response = client.send(
    message=courier.ContentMessage(
      content=courier.ElementalContent(
        version='2020-01-01',
        elements=[
          courier.ElementalNode_Action(
            content="ELEMENTAL",
            href="courier.com",
            style="button",
            align="center"
          )
        ]
      ),
      to=courier.UserRecipient(email="foo@bar.com"),
      routing=courier.Routing(
        method=courier.RoutingMethod.SINGLE,
        channels=["email"]
      ),
      metadata=courier.MessageMetadata(
        utm=courier.Utm(source="python")
      )
    )
)
print(response.request_id)

Advanced

Overriding HTTP Client

You can override the httpx client to customize it for your use case. Some common usecases include support for proxies and transports.

import httpx
from courier.client import Courier

client = Courier(
    http_client=httpx.Client(
        proxies="http://my.test.proxy.example.com",
        transport=httpx.HTTPTransport(local_address="0.0.0.0"),
    ),
)

Contributing

While we value open-source contributions to this SDK, this library is generated programmatically. Additions made directly to this library would have to be moved over to our generation code, otherwise they would be overwritten upon the next generated release. Feel free to open a PR as a proof of concept, but know that we will not be able to merge it as-is. We suggest opening an issue first to discuss with us!

On the other hand, contributions to the README are always very welcome!

License

MIT License

Author

Courier (support@courier.com)

Metadata

Release files for trycourier 6.0.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for trycourier 6.0.3
File Size Uploaded Provenance
trycourier-6.0.3.tar.gz 84.0 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for trycourier 6.0.3
File Interpreter ABI Platform
trycourier-6.0.3-py3-none-any.whl Python 3 none any Details

Total release size: 333.7 kB

Release files / trycourier-6.0.3.tar.gz

Download URL trycourier-6.0.3.tar.gz
Size 84.0 kB
Tags Source
SHA-256 checksum
How to use checksums
4602a24a746383e09a99ea9462f3e5a35479ff6b83253a9a6a647a48fe41de1f
BLAKE2b-256 checksum
How to use checksums
576c42d5d7f1e379acdee29cd1d0d3e6914e954a629a8a595c542adc1c8aed3b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.5.1 CPython/3.8.18 Linux/5.15.0-1061-azure

Release files / trycourier-6.0.3-py3-none-any.whl

Download URL trycourier-6.0.3-py3-none-any.whl
Size 249.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
d5005abb68ff339e8f7c58078e40b43175268ca8249dd9662d52865c9291c690
BLAKE2b-256 checksum
How to use checksums
2c961956bd77373a8ca77418ef32b3305f9e7fb2c3c32350620946625bdb0d22
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.5.1 CPython/3.8.18 Linux/5.15.0-1061-azure

Security for trycourier 6.0.3

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.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A 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.

Release history Release notifications | RSS feed

This release

6.0.3 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page