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
)
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())