Skip to main content
The official Zavu SDK for Python provides a clean, Pythonic interface to the Zavu API with full type hints.

Installation

pip install zavu
# or
poetry add zavu

Requirements

  • Python 3.8 or higher

Quick Start

from zavu import Zavu
import os

zavu = Zavu(os.environ['ZAVU_API_KEY'])

# Send a message
message = zavu.messages.send(
    to='+56912345678',
    text='Hello from Zavu!'
)

print(f'Message sent: {message.id}')

Configuration

Initialize the Client

from zavu import Zavu

# Basic initialization
zavu = Zavu('zv_live_xxx')

# With options
zavu = Zavu(
    api_key='zv_live_xxx',
    base_url='https://api.zavu.dev',  # Custom API URL
    timeout=30.0                       # Request timeout in seconds
)

Environment Variables

We recommend storing your API key in environment variables:
import os
from zavu import Zavu

zavu = Zavu(os.environ['ZAVU_API_KEY'])

Messages

Send a Message

message = zavu.messages.send(
    to='+56912345678',
    text='Your verification code is 123456',
    channel='sms',  # optional: sms, whatsapp, auto
    metadata={      # optional: custom data
        'userId': 'user_123'
    },
    idempotency_key='unique-key'  # optional: prevent duplicates
)

print(message.id)      # msg_xxx
print(message.status)  # queued

Send with Template

message = zavu.messages.send(
    to='+56912345678',
    template_id='tpl_abc123',
    data={
        'customerName': 'John',
        'orderId': '12345'
    }
)

Get Message Status

message = zavu.messages.get('msg_abc123')

print(message.status)  # queued, sending, delivered, failed

List Messages

# List all messages
result = zavu.messages.list()
for message in result.items:
    print(message.id)

# With filters
result = zavu.messages.list(
    status='delivered',
    channel='sms',
    limit=100
)

# Pagination
cursor = None
while True:
    result = zavu.messages.list(cursor=cursor, limit=50)
    for message in result.items:
        print(message.id)
    cursor = result.next_cursor
    if not cursor:
        break

Templates

Create Template

template = zavu.templates.create(
    name='order_confirmation',
    category='transactional',
    body='Hi {{name}}, your order #{{orderId}} is confirmed!'
)

List Templates

result = zavu.templates.list()
for template in result.items:
    print(template.name)

Get Template

template = zavu.templates.get('tpl_abc123')

Update Template

template = zavu.templates.update(
    'tpl_abc123',
    body='Hi {{name}}, order #{{orderId}} confirmed! Delivery: {{date}}'
)

Delete Template

zavu.templates.delete('tpl_abc123')

Senders

List Senders

result = zavu.senders.list()
for sender in result.items:
    print(sender.name)

Create Sender

sender = zavu.senders.create(
    name='Marketing',
    routing_policy='prefer_whatsapp',
    channels={
        'sms': {'phoneNumber': '+15551234567'},
        'whatsapp': {'phoneNumber': '+15551234567'}
    },
    set_as_default=True
)

Contacts

Get Contact

contact = zavu.contacts.get('con_abc123')
# or by phone
contact = zavu.contacts.get_by_phone('+56912345678')

Update Contact

contact = zavu.contacts.update(
    'con_abc123',
    default_channel='whatsapp',
    metadata={
        'name': 'John Doe',
        'tier': 'premium'
    }
)

Error Handling

from zavu import Zavu
from zavu.exceptions import ZavuError, BadRequestError, UnauthorizedError

try:
    zavu.messages.send(
        to='invalid-number',
        text='Hello'
    )
except BadRequestError as e:
    print(f'Bad request: {e.message}')
except UnauthorizedError as e:
    print(f'Auth error: {e.message}')
except ZavuError as e:
    print(f'API error: {e.code} - {e.message}')

Exception Types

ExceptionStatusDescription
BadRequestError400Invalid request parameters
UnauthorizedError401Invalid or missing API key
ForbiddenError403Insufficient permissions
NotFoundError404Resource not found
RateLimitError429Too many requests
ZavuErrorAnyBase exception class

Async Support

The SDK supports async/await with asyncio:
import asyncio
from zavu import AsyncZavu

async def main():
    zavu = AsyncZavu(os.environ['ZAVU_API_KEY'])

    message = await zavu.messages.send(
        to='+56912345678',
        text='Hello async!'
    )

    print(f'Message sent: {message.id}')

asyncio.run(main())

Async Context Manager

async with AsyncZavu(api_key) as zavu:
    message = await zavu.messages.send(
        to='+56912345678',
        text='Hello!'
    )

Type Hints

The SDK includes full type annotations:
from zavu import Zavu
from zavu.types import Message, Template, SendMessageRequest

zavu: Zavu = Zavu(api_key)

request: SendMessageRequest = {
    'to': '+56912345678',
    'text': 'Hello!'
}

message: Message = zavu.messages.send(**request)

Logging

Enable debug logging:
import logging

logging.basicConfig(level=logging.DEBUG)

# Or just for zavu
logging.getLogger('zavu').setLevel(logging.DEBUG)