About zavu-rules
zavu-rules is a reference skill for using Zavu’s multi-channel messaging API, covering SDKs, CLI workflows, message rules, and API access from AI assistants.
Key features
- 01SMS, WhatsApp, Telegram, email, and voice channels
- 02TypeScript, Python, Go, PHP, and Ruby SDK guidance
- 03CLI access to API operations
- 04Channel selection and fallback rules
- 05Authentication and error-handling guidance
Use cases
- 01Implementing messaging through Zavu SDKs
- 02Choosing channels and handling delivery fallback
- 03Running API operations from a terminal
- 04Executing API calls from an AI assistant
MCP support
Documents Zavu’s MCP server setup for direct API execution by AI assistants. The server provides `search_docs` and `execute` tools.
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ zavudev/ zavu-skills --skill zavu-rulesAfter installing, type/zavu-rulesin Claude Code to confirm it loaded.
Details
From the project READMEZavu API Context
Zavu is a unified multi-channel messaging API. One API to send messages via SMS, WhatsApp, Telegram, Email, Instagram, and Voice, with automatic channel selection and fallback.
SDK Ecosystem
| Language | Package | Install |
|---|---|---|
| TypeScript | @zavudev/sdk | npm add @zavudev/sdk |
| Python | zavudev | pip install zavudev |
| Go | github.com/zavudev/sdk-go | go get github.com/zavudev/sdk-go |
| PHP | zavudev/sdk-php | Composer |
| Ruby | zavudev/sdk-ruby | RubyGems |
Tooling
| Tool | Purpose | Install |
|---|---|---|
zavu CLI | Interact with the API from the terminal; manage Zavu Functions (serverless TypeScript on Zavu Cloud) | npx zavudev@latest (no install), or npm install -g zavudev |
@zavudev/functions | Runtime package for Zavu Functions. Provides defineAgent, defineTool, defineFunction declarative APIs. | Pre-installed in the function runtime — import { defineAgent } from "@zavudev/functions" (no install needed). |
The CLI is the primary interface for Zavu Functions: serverless TypeScript that runs on Zavu Cloud and lets you declare AI agents + tool handlers in code. See the functions skill for full coverage.
TypeScript Init
import Zavudev from '@zavudev/sdk';
const zavu = new Zavudev({
apiKey: process.env['ZAVUDEV_API_KEY'],
});
Python Init
import os
from zavudev import Zavudev
zavu = Zavudev(api_key=os.environ.get("ZAVUDEV_API_KEY"))
Python Async
from zavudev import AsyncZavudev
zavu = AsyncZavudev(api_key=os.environ.get("ZAVUDEV_API_KEY"))
Go Init
import "github.com/zavudev/sdk-go"
client := zavudev.NewClient(os.Getenv("ZAVUDEV_API_KEY"))
Ruby Init
require "zavudev"
client = Zavudev::Client.new(api_key: ENV["ZAVUDEV_API_KEY"])
PHP Init
use Zavudev\Client;
$client = new Client(apiKey: getenv('ZAVUDEV_API_KEY'));
Authentication
- Environment variable:
ZAVUDEV_API_KEY - Key prefixes:
zv_live_(production),zv_test_(sandbox) - Header:
Authorization: Bearer <api_key> - Sender override header:
Zavu-Sender: <sender_id>
Core Conventions
- Phone numbers: Always E.164 format (
+14155551234) - Channels:
auto,sms,sms_oneway,whatsapp,telegram,email,instagram,messenger,voice - Message types:
text,image,video,audio,document,sticker,location,contact,buttons,list,cta_url,request_contact_info,location_request,reaction,template - Pagination: Cursor-based. All list endpoints return
{ items: [...], nextCursor: string | null } - Idempotency: Use
idempotencyKeyon send to prevent duplicate messages
Error Handling
TypeScript
import Zavudev, { APIError } from '@zavudev/sdk';
try {
await zavu.messages.send({ to: "+14155551234", text: "Hello" });
} catch (error) {
if (error instanceof APIError) {
console.error(error.status, error.message);
}
}
Python
from zavudev import Zavudev, APIError
try:
zavu.messages.send(to="+14155551234", text="Hello")
except APIError as e:
print(e.status_code, e.message)
Key Business Rules
- WhatsApp 24h window: Free-form messages require an open conversation window (user messaged you in last 24h). Use template messages to initiate conversations outside the window.
- Verification raises limits; it is not permission to send: an account sends on every channel, to any destination, from its first minute. Identity verification, a saved payment method, a settled deposit or a paid plan raise the daily ceilings, which return
429 daily_limit_exceededwhen spent. Business verification (KYB) gates 10DLC registration, which every US and Canadian (+1) SMS destination needs (403 ten_dlc_required); no channel needs it to send,sms_onewayincluded. Everysms,sms_oneway,emailandvoicemessage is read before it is sent and can be held briefly for review (it staysqueued) or refused (RISK_BLOCKED,RISK_REJECTED,RISK_REVIEW_EXPIREDon the failed message); repeated refusals suspend an account's sending (403 sending_suspended). See thesend-messageskill. - URL verification: SMS, one-way SMS and voice messages containing URLs require those URLs to be verified (pre-verify with
/v1/urls; an unknown URL holds the message inpending_url_verificationwhile it is checked). Email, WhatsApp, Telegram, Instagram and Messenger messages are not checked. - URL shorteners blocked: bit.ly, t.co, etc. are always blocked. Use full destination URLs.
- Channel
auto: picks the first channel the sender has configured that the recipient's address can receive on, in a fixed preference order. It does not consider cost. Cost-based, per-contact selection exists only on broadcasts sent with channelsmart. - Fallback: If WhatsApp fails, text and template messages can fall back to SMS. On by default when Zavu picks the channel (
channelomitted orauto); off whenchannelis set explicitly, unlessfallbackEnabled: true. - Voice agents: An agent can answer and place phone calls when its
voiceconfig hasenabled: true. Place outbound calls via/v1/callsand fetch transcripts from/v1/calls/{callId}. Requires a live key. See theai-agentskill.
MCP Server
For direct API execution from AI assistants:
claude mcp add zavudev --scope user \
-e ZAVUDEV_API_KEY=$ZAVUDEV_API_KEY -- npx -y @zavudev/sdk-mcp
Tools available: search_docs (search API docs), execute (run TypeScript against authenticated client).
CLI
The zavudev/cli package provides terminal access to all API operations.
Rate Limits
Check X-RateLimit-Remaining header. Use .withResponse() (TS) or .with_raw_response() (Python) to access response headers.
Message Statuses
queued -> sending -> sent -> delivered -> read (success path)
queued -> sending -> failed (failure path)
received (inbound messages)
pending_url_verification (message with URLs awaiting verification)