Python Integration
Zyphr doesn't have an official Python SDK yet, but the REST API is easy to use with the requests library.
Setup
pip install requests
import os
import requests
ZYPHR_API_KEY = os.environ["ZYPHR_API_KEY"]
BASE_URL = "https://api.zyphr.dev/v1"
headers = {
"X-API-Key": ZYPHR_API_KEY,
"Content-Type": "application/json",
}
def zyphr_request(method, path, json=None, params=None):
"""Make a request to the Zyphr API."""
response = requests.request(
method,
f"{BASE_URL}{path}",
headers=headers,
json=json,
params=params,
)
response.raise_for_status()
return response.json()
Send an Email
result = zyphr_request("POST", "/emails", json={
"to": "user@example.com",
"from": "hello@yourapp.com",
"subject": "Welcome!",
"html": "<h1>Hello from Python!</h1>",
"text": "Hello from Python!",
"tags": ["welcome", "onboarding"],
})
print(f"Email sent: {result['data']['id']}")
Send with a Template
result = zyphr_request("POST", "/emails", json={
"to": "user@example.com",
"template_id": "welcome-email",
"template_data": {
"name": "John",
"action_url": "https://yourapp.com/activate",
},
})
Send Batch Emails
result = zyphr_request("POST", "/emails/batch", json={
"messages": [
{"to": "user1@example.com", "subject": "Hello", "html": "<p>Hi!</p>"},
{"to": "user2@example.com", "subject": "Hello", "html": "<p>Hi!</p>"},
]
})
print(f"Succeeded: {result['data']['succeeded']}, Failed: {result['data']['failed']}")
Get Email Status
result = zyphr_request("GET", "/emails/msg_abc123")
print(f"Status: {result['data']['status']}")
List Emails
result = zyphr_request("GET", "/emails", params={
"page": 1,
"per_page": 25,
"status": "delivered",
})
for email in result["data"]:
print(f"{email['id']}: {email['status']}")
print(f"Page {result['meta']['page']} of {result['meta']['total_pages']}")
Send a Push Notification
result = zyphr_request("POST", "/push", json={
"user_id": "user_123",
"title": "New Message",
"body": "You have a new message",
"data": {"message_id": "msg_456"},
})
Register a Device
result = zyphr_request("POST", "/devices", json={
"user_id": "user_123",
"token": "fcm_token_here",
"platform": "android",
})
Send an SMS
result = zyphr_request("POST", "/sms", json={
"to": "+14155551234",
"body": "Your verification code is 123456",
})
print(f"SMS sent: {result['data']['id']}, segments: {result['data']['segments']}")
Send an In-App Notification
result = zyphr_request("POST", "/inbox/send", json={
"subscriber_id": "user_123",
"title": "New Comment",
"body": "John commented on your post",
"action_url": "/posts/123#comments",
"category": "comments",
})
Create a Subscriber
result = zyphr_request("POST", "/subscribers", json={
"external_id": "user_123",
"email": "user@example.com",
"phone": "+14155551234",
"name": "John Doe",
"metadata": {"plan": "pro"},
})
Update Subscriber Preferences
result = zyphr_request("PUT", "/subscribers/sub_abc/preferences", json={
"email": {"enabled": True, "categories": {"marketing": False}},
"push": {"enabled": True},
"sms": {"enabled": False},
"in_app": {"enabled": True},
})
Error Handling
import requests
try:
result = zyphr_request("POST", "/emails", json={
"to": "user@example.com",
"subject": "Hello",
"html": "<p>Hi!</p>",
})
except requests.exceptions.HTTPError as e:
error_data = e.response.json()
error_code = error_data.get("error", {}).get("code", "unknown")
error_message = error_data.get("error", {}).get("message", str(e))
if e.response.status_code == 429:
retry_after = error_data["error"]["details"]["retry_after"]
print(f"Rate limited. Retry after {retry_after}s")
elif e.response.status_code == 422:
print(f"Validation error: {error_message}")
elif e.response.status_code == 401:
print("Invalid API key")
else:
print(f"API error ({error_code}): {error_message}")
Async with httpx
For async applications, use httpx:
pip install httpx
import httpx
import asyncio
async def send_email():
async with httpx.AsyncClient(
base_url=BASE_URL,
headers=headers,
) as client:
response = await client.post("/emails", json={
"to": "user@example.com",
"subject": "Hello",
"html": "<p>Hi from async Python!</p>",
})
response.raise_for_status()
result = response.json()
print(f"Email sent: {result['data']['id']}")
asyncio.run(send_email())
Django Integration
# settings.py
ZYPHR_API_KEY = os.environ["ZYPHR_API_KEY"]
# notifications.py
from django.conf import settings
import requests
def send_notification(user, subject, html):
response = requests.post(
"https://api.zyphr.dev/v1/emails",
headers={
"X-API-Key": settings.ZYPHR_API_KEY,
"Content-Type": "application/json",
},
json={
"to": user.email,
"subject": subject,
"html": html,
},
)
response.raise_for_status()
return response.json()
Flask Integration
from flask import Flask, current_app
import requests
app = Flask(__name__)
app.config["ZYPHR_API_KEY"] = os.environ["ZYPHR_API_KEY"]
def send_email(to, subject, html):
response = requests.post(
"https://api.zyphr.dev/v1/emails",
headers={
"X-API-Key": current_app.config["ZYPHR_API_KEY"],
"Content-Type": "application/json",
},
json={"to": to, "subject": subject, "html": html},
)
response.raise_for_status()
return response.json()
Requirements
- Python 3.8 or later
requestslibrary (orhttpxfor async)