Skip to main content

Official Python SDK for the Resletter API

Project description

Resletter Python SDK

Official Python SDK for the Resletter newsletter platform API.

Installation

pip install resletter
# or
poetry add resletter
# or
uv add resletter

Quick Start

from resletter import Resletter

client = Resletter("rsl_your_api_key")

# Create a subscriber
subscriber = client.subscribers.create(
    email="user@example.com",
    name="John Doe",
    metadata={"source": "website"},
)

print(f"Created subscriber: {subscriber['id']}")

Requirements

  • Python >= 3.9
  • A Resletter account with Starter plan or above (API access required)

Authentication

Get your API key from your Resletter project settings:

  1. Navigate to your project settings
  2. Go to the "API Access" section
  3. Click "Create API Key"
  4. Select the required scopes for your use case
  5. Copy your API key (starts with rsl_)

API Reference

Subscribers

# List subscribers
result = client.subscribers.list(
    page=1,
    limit=50,
    status="subscribed",
    group_id="uuid",
    email="search@example.com",
)
subscribers = result["subscribers"]
pagination = result["pagination"]

# Get a subscriber
subscriber = client.subscribers.get("subscriber-id")

# Create a subscriber
new_subscriber = client.subscribers.create(
    email="user@example.com",
    name="John Doe",
    metadata={"plan": "pro"},
    group_ids=["group-id"],
    bypass_double_opt_in=True,
)

# Create multiple subscribers
result = client.subscribers.create_bulk(
    subscribers=[
        {"email": "user1@example.com", "name": "User 1"},
        {"email": "user2@example.com", "name": "User 2"},
    ],
    group_ids=["group-id"],
    skip_duplicates=True,
    bypass_double_opt_in=True,
)

# Update a subscriber
updated = client.subscribers.update(
    "subscriber-id",
    name="Jane Doe",
    metadata={"plan": "enterprise"},
    group_ids=["new-group-id"],
)

# Unsubscribe (soft delete)
client.subscribers.delete("subscriber-id")

# Hard delete
client.subscribers.delete("subscriber-id", hard=True)

Groups

# List groups
groups = client.groups.list()

# Get a group
group = client.groups.get("group-id")

# Create a group
new_group = client.groups.create(
    name="Product Updates",
    description="Subscribers interested in product news",
    color="#3B82F6",
)

# Update a group
updated = client.groups.update(
    "group-id",
    name="New Name",
)

# Delete a group
client.groups.delete("group-id")

# Add subscribers to a group
client.groups.add_subscribers(
    "group-id",
    subscriber_ids=["sub-1", "sub-2"],
)

# Remove subscribers from a group
client.groups.remove_subscribers(
    "group-id",
    subscriber_ids=["sub-1"],
)

Campaigns

# List campaigns
campaigns = client.campaigns.list(status="active")

# Get a campaign
campaign = client.campaigns.get("campaign-id")

# Create a campaign
new_campaign = client.campaigns.create(
    name="Product Launch Campaign",
    description="Campaign for new product announcement",
    subscriber_group_ids=["group-1", "group-2"],
)

# Update a campaign
updated = client.campaigns.update(
    "campaign-id",
    name="Updated Campaign Name",
    status="paused",
)

# Delete a campaign
client.campaigns.delete("campaign-id")

Events

# Track a custom event to trigger automations
result = client.events.track(
    name="purchase_completed",
    email="user@example.com",
    data={
        "product": "Premium Plan",
        "amount": 99.0,
    },
)

print(f"Triggered {result['automationsTriggered']} automations")

Configuration Options

client = Resletter(
    "rsl_your_api_key",
    base_url="https://app.resletter.com",  # Custom base URL
    timeout=30.0,  # Request timeout in seconds
)

Context Manager

The client supports context manager protocol for automatic cleanup:

with Resletter("rsl_your_api_key") as client:
    subscriber = client.subscribers.create(email="user@example.com")
    # Connection is automatically closed when exiting the block

Error Handling

from resletter import Resletter, ResletterError

try:
    client.subscribers.create(email="invalid")
except ResletterError as e:
    print(f"Status: {e.status}")
    print(f"Message: {e.message}")
    print(f"Code: {e.code}")

Type Hints

This SDK includes full type hints for all methods and responses:

from resletter import (
    Subscriber,
    SubscriberGroup,
    Campaign,
    SubscriberStatus,
    CampaignStatus,
)

License

MIT

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

resletter-1.0.1.tar.gz (9.0 kB view details)

Uploaded Source

Built Distribution

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

resletter-1.0.1-py3-none-any.whl (12.9 kB view details)

Uploaded Python 3

File details

Details for the file resletter-1.0.1.tar.gz.

File metadata

  • Download URL: resletter-1.0.1.tar.gz
  • Upload date:
  • Size: 9.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for resletter-1.0.1.tar.gz
Algorithm Hash digest
SHA256 ab431c3fe6331f912f14acc609ee574d8e918d4797cce9ffe3ce162152da88eb
MD5 35227054a77fb5550cac83c817d0af8e
BLAKE2b-256 e04c3afc2cbac1b9432fc97ffe12b377e5e28c775575e53e3c2188c1775284af

See more details on using hashes here.

File details

Details for the file resletter-1.0.1-py3-none-any.whl.

File metadata

  • Download URL: resletter-1.0.1-py3-none-any.whl
  • Upload date:
  • Size: 12.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for resletter-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 91ab089c74d089199a1e3935813609a572bdce68bc580b4718608956f2275276
MD5 23d245dc9334b0f7cf57db05e89f79d1
BLAKE2b-256 53bfb96de3119eab538795a24018b997b6bbd24762cd86e4b598507773ff9ff6

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