Skip to main content
Partner invitations allow you to generate links for clients to connect their WhatsApp Business accounts to your project.

Create Invitation

invitation = client.invitations.create(
    client_name="Acme Corp",
    client_email="contact@acme.com",
    expires_in_days=14
)

print(invitation.id)      # jh7am5bng9p3v2x1k4r8
print(invitation.url)     # https://dashboard.zavu.dev/invite/abc123xyz
print(invitation.status)  # pending

With Phone Number Restrictions

Restrict which countries the client can register phone numbers from:
invitation = client.invitations.create(
    client_name="Acme Corp",
    client_email="contact@acme.com",
    expires_in_days=7,
    allowed_phone_countries=["US", "MX"]
)

Get Invitation

result = client.invitations.get(invitation_id="jh7am5bng9p3v2x1k4r8")
invitation = result.invitation

print(invitation.status)       # pending | in_progress | completed | expired | cancelled
print(invitation.client_name)  # Acme Corp
print(invitation.sender_id)    # None (until completed)
print(invitation.expires_at)   # 2025-01-15T00:00:00.000Z

List Invitations

result = client.invitations.list()

for invitation in result.items:
    print(invitation.id, invitation.client_name, invitation.status)

Filter by Status

result = client.invitations.list(
    status="pending",
    limit=50
)

Pagination

cursor = None

while True:
    result = client.invitations.list(
        limit=50,
        cursor=cursor
    )

    for invitation in result.items:
        print(invitation.id)

    if not result.next_cursor:
        break
    cursor = result.next_cursor

Cancel Invitation

Cancel an active invitation to prevent the client from using it:
result = client.invitations.cancel(invitation_id="jh7am5bng9p3v2x1k4r8")
print(result.invitation.status)  # cancelled
You cannot cancel a completed invitation. Once a sender is created, manage it through the senders API.

After Completion

When a client completes the signup flow, a sender is created in your project:
result = client.invitations.get(invitation_id="jh7am5bng9p3v2x1k4r8")
invitation = result.invitation

if invitation.status == "completed" and invitation.sender_id:
    # Use the sender to send messages
    client.messages.send(
        to="+14155551234",
        channel="whatsapp",
        message_type="template",
        content={
            "template_id": "tmpl_xyz789",
            "template_variables": {
                "1": "John"
            }
        },
        extra_headers={
            "Zavu-Sender": invitation.sender_id
        }
    )

Full Example

import os
from zavu import Zavu

client = Zavu(api_key=os.environ["ZAVU_API_KEY"])

def onboard_client(client_name: str, client_email: str):
    """Create an invitation for a new client."""
    invitation = client.invitations.create(
        client_name=client_name,
        client_email=client_email,
        expires_in_days=7
    )

    print(f"Send this link to {client_name}: {invitation.url}")
    return invitation

def check_invitation_status(invitation_id: str):
    """Check the status of an invitation."""
    result = client.invitations.get(invitation_id=invitation_id)
    invitation = result.invitation

    match invitation.status:
        case "pending":
            print("Waiting for client to start signup")
        case "in_progress":
            print("Client is completing the signup flow")
        case "completed":
            print(f"Success! Sender ID: {invitation.sender_id}")
        case "expired":
            print("Invitation expired, create a new one")
        case "cancelled":
            print("Invitation was cancelled")

    return invitation

# Usage
invitation = onboard_client("Acme Corp", "contact@acme.com")
# Later...
check_invitation_status(invitation.id)

Async Usage

import asyncio
from zavudev import AsyncZavudev

async def main():
    client = AsyncZavudev()

    invitation = await client.invitations.create(
        client_name="Acme Corp",
        client_email="contact@acme.com",
        expires_in_days=7
    )
    print(invitation.url)

    # List pending invitations
    result = await client.invitations.list(status="pending")
    for inv in result.items:
        print(inv.client_name, inv.status)

asyncio.run(main())