Official Python SDK for the AugStash WhatsApp BSP Platform
Project description
augstash-sdk — Python
Official Python SDK for the AugStash WhatsApp BSP Platform by AugmenTrait Pvt. Ltd.
Installation
pip install augstash-sdk
Requirements: Python ≥ 3.10. No third-party dependencies — uses only the standard library.
Quick Start
from augstash_client import AugStashClient, AugStashError
client = AugStashClient(
base_url="https://api.augstash.com", # your AugStash deployment URL
api_key="as_live_xxxxxxxxxxxx" # API key from Settings → Developer
)
# List connected WABA accounts
connections = client.list_waba_connections()
print(connections)
# Send a WhatsApp message
import json
result = client.send_message(
waba_id="1234567890",
phone_number_id="9876543210",
contact_phone="+919876543210",
meta_payload_json=json.dumps({
"messaging_product": "whatsapp",
"to": "+919876543210",
"type": "text",
"text": {"body": "Hello from AugStash!"}
})
)
print(result["metaMessageId"])
Authentication
Every API call requires a Bearer API key issued per tenant.
Generate your key: AugStash Dashboard → Settings → Developer → API Keys
client = AugStashClient(base_url, api_key)
Keep your API key secret. Never commit it to source control.
Use environment variables:
import os
client = AugStashClient(
base_url=os.environ["AUGSTASH_BASE_URL"],
api_key=os.environ["AUGSTASH_API_KEY"]
)
API Reference
WABA Management
# List all connected WABA accounts
connections = client.list_waba_connections()
# List phone numbers (optionally filter by WABA UUID)
phones = client.list_phone_numbers()
waba_phones = client.list_phone_numbers(waba_id="waba-uuid")
# Get WABA health — quality rating, tier, daily limit per phone
health = client.get_waba_health("meta-waba-id")
# → { "wabaId": ..., "connectionStatus": ..., "phones": [...] }
# Submit display name with SLM pre-check before Meta submission
result = client.submit_display_name(
waba_id="waba-id",
proposed_name="Acme Pharma",
legal_name="Acme Pharmaceuticals Ltd.",
phone_number_id="phone-number-id"
)
# → { "displayNameStatus": "PENDING" | "BLOCKED_BY_SLM", "slmScore": 85, ... }
# Disconnect a WABA cleanly (pauses campaigns, revokes Meta webhook)
client.disconnect_waba("waba-id")
# Complete credential rotation after token expiry
client.complete_credential_rotation("waba-id", "new-meta-auth-code")
Contacts
# List with pagination and search
page = client.list_contacts(page=0, size=50, search="Ravi")
# → { "content": [...], "totalElements": 320, "totalPages": 7 }
# Create contact
contact = client.create_contact({
"phone": "+919876543210",
"name": "Ravi Kumar",
"email": "ravi@example.com",
"tags": ["vip", "mumbai"]
})
# Update contact
client.update_contact("contact-uuid", {"name": "Ravi K."})
# Bulk import (up to 1,000 contacts per request)
summary = client.bulk_import_contacts([
{"phone": "+919876543210", "name": "Ravi Kumar"},
{"phone": "+919123456789", "name": "Priya Sharma"}
])
# → { "imported": 2, "failed": 0 }
# Record manual opt-out
client.opt_out_contact("contact-uuid")
Campaigns
# Create a campaign in DRAFT status
campaign = client.create_campaign({
"name": "Diwali Offer 2025",
"templateId": "template-uuid",
"segmentId": "segment-uuid",
"attributionGoal": "augvanta.finance.invoice.paid",
"attributionWindowHours": 48
})
# Launch immediately (must be DRAFT or SCHEDULED)
client.launch_campaign(campaign["id"])
# Pause / Resume
client.pause_campaign(campaign["id"])
client.resume_campaign(campaign["id"])
# Full funnel analytics
analytics = client.get_campaign_analytics(campaign["id"])
# → { "sentCount": 1500, "deliveredCount": 1450, "readCount": 980,
# "deliveryRate": 0.966, "readRate": 0.676, "optOutRate": 0.004 }
# Per-contact drill-down (paginated)
recipients = client.get_campaign_recipients(campaign["id"], page=0, size=100)
# Export recipients as CSV
csv_bytes = client.export_campaign_csv(campaign["id"])
with open("campaign_report.csv", "wb") as f:
f.write(csv_bytes)
Templates
import json
# Create a template
client.create_template({
"name": "invoice_payment_reminder",
"category": "UTILITY",
"language": "en",
"wabaId": "meta-waba-id",
"components": json.dumps({
"body": {
"type": "BODY",
"text": "Hi {{1}}, your invoice of ₹{{2}} is due on {{3}}."
}
})
})
# Browse available template packs
packs = client.list_template_packs()
# → [{"id": "bfsi", "name": "BFSI Template Pack", "templateCount": "6"}, ...]
# Import a pack — creates PENDING drafts ready for Meta submission
result = client.import_template_pack("bfsi", "meta-waba-id")
# → { "imported": 6, "skipped": 0, "total": 6 }
# Import Healthcare pack
client.import_template_pack("healthcare", "meta-waba-id")
Inbox
# List agent conversations
inbox = client.list_conversations(page=0, size=20)
# Assign conversation to agent or team
client.assign_conversation("conv-id", agent_id="agent-user-id")
client.assign_conversation("conv-id", team_id="team-uuid")
# Reply (auto-translates to contact's detected language)
client.reply_to_conversation("conv-id", {
"wabaId": "waba-id",
"phoneNumberId": "phone-id",
"contactPhone": "+919876543210",
"metaPayloadJson": json.dumps({
"messaging_product": "whatsapp",
"to": "+919876543210",
"type": "text",
"text": {"body": "Your order is confirmed!"}
})
})
# Resolve conversation (triggers CSAT + SLM summary generation)
client.resolve_conversation("conv-id")
# SLM-generated reply suggestions
suggestions = client.get_reply_suggestions("conv-id", "when will my order arrive?")
# → { "suggestions": ["Your order will arrive by...", "Let me check...", "..."] }
# Conversation SLM summary
summary = client.get_conversation_summary("conv-id")
# → { "summary": "Customer asked about order status. Agent confirmed delivery by 5th." }
# Canned responses
responses = client.list_canned_responses()
matches = client.search_canned_responses(shortcode="/refund")
matches = client.search_canned_responses(keyword="payment")
# CSAT report
csat = client.get_csat_report()
# → { "avgScore": 4.3, "responseCount": 120,
# "distribution": {1: 2, 2: 5, 3: 10, 4: 45, 5: 58} }
FAQ Bot (A9.5)
# Option 1: upload plain text directly
faq_text = open("product-faq.txt").read()
client.upload_faq("Product FAQ v2.1", faq_text)
# → { "status": "UPLOADED", "chunkCount": 23 }
# Option 2: extract text from PDF first (using pdfplumber)
# pip install pdfplumber
import pdfplumber
with pdfplumber.open("faq.pdf") as pdf:
faq_text = "\n\n".join(page.extract_text() for page in pdf.pages)
client.upload_faq("Product FAQ v2.1", faq_text)
# Check what's uploaded
info = client.get_faq_info()
# → { "title": "...", "chunkCount": 23, "uploadedAt": "...", "updatedAt": "..." }
# Test the bot
answer = client.ask_faq("What is the return policy?")
# → { "answer": "Our return policy allows returns within 30 days...", "confidence": 0.87 }
# Confidence interpretation:
# ≥ 0.70 → answered automatically, not escalated to agent
# < 0.70 → escalated to human agent
# Delete FAQ knowledge base
client.delete_faq()
Analytics
# Agent performance report (A12.3)
stats = client.get_agent_performance()
# → [{ "agentId": "...", "displayName": "Ananya", "totalConversations": 145,
# "avgCsatScore": 4.5, "csatResponses": 89, "available": True }]
# Contact list health (A12.5)
health = client.get_contact_health()
# → { "reachabilityPct": 87.3, "optOutsLast7Days": 12,
# "weeklyGrowth": [{"weekStart": "2025-01-01", "newContacts": 45}, ...],
# "activeAnomalies": 0 }
# Click-to-WhatsApp ROAS report (B2.2)
roas = client.get_ctwa_roas()
# → { "totalCtwaConversations": 320, "byAdSource": [...] }
# Flow funnel analytics (A8.4)
funnel = client.get_flow_analytics("flow-definition-uuid")
# → { "totalSessions": 450, "completionRate": 62.5,
# "nodeStats": [{"nodeId": "welcome", "entries": 450, "dropOffRate": 5.0}] }
# Active anomaly events (A9.6)
anomalies = client.get_active_anomalies()
# → [{ "anomalyType": "OPT_OUT_RATE_SPIKE", "severity": "HIGH",
# "description": "...", "campaignsPaused": True }]
# Resolve an anomaly
client.resolve_anomaly(anomalies[0]["id"])
Developer / Sandbox (A15.1–2)
# Enable sandbox — no real WhatsApp messages sent
client.toggle_sandbox(True)
status = client.get_sandbox_status()
# → { "sandboxEnabled": True, "tenantId": "...", "plan": "STARTER" }
# Webhook delivery log
log = client.get_webhook_log(limit=100)
# → { "total": 850, "sent": 830, "suppressed": 12, "queued": 8,
# "deliveryRate": 97.6, "entries": [...] }
# Replay a failed message by its Augstash message ID
client.replay_webhook("augstash-message-id")
# Disable sandbox when ready for production
client.toggle_sandbox(False)
Error Handling
from augstash_client import AugStashClient, AugStashError
try:
client.launch_campaign("invalid-id")
except AugStashError as e:
print(f"API error {e.status_code}: {e}")
# status_code: 400 | 401 | 403 | 404 | 422 | 429 | 500
Complete Example — Onboarding Automation
import os
import json
from augstash_client import AugStashClient
client = AugStashClient(
base_url=os.environ["AUGSTASH_BASE_URL"],
api_key=os.environ["AUGSTASH_API_KEY"]
)
# 1. Check WABA health
health = client.get_waba_health("meta-waba-id")
for phone in health["phones"]:
if phone["qualityRating"] == "RED":
print(f"WARNING: {phone['phoneNumber']} is RED quality!")
# 2. Import BFSI templates
result = client.import_template_pack("bfsi", "meta-waba-id")
print(f"Imported {result['imported']} BFSI templates")
# 3. Upload FAQ knowledge base
with open("product-faq.txt") as f:
client.upload_faq("Product FAQ", f.read())
print("FAQ uploaded")
# 4. Create and launch a campaign
campaign = client.create_campaign({
"name": "EMI Reminder — November",
"templateId": "emi-template-uuid",
"segmentId": "active-borrowers-segment-uuid"
})
client.launch_campaign(campaign["id"])
print(f"Campaign launched: {campaign['id']}")
# 5. Monitor analytics
import time
time.sleep(300) # wait 5 minutes
analytics = client.get_campaign_analytics(campaign["id"])
print(f"Sent: {analytics['sentCount']}, "
f"Delivered: {analytics['deliveredCount']}, "
f"Read: {analytics['readCount']}")
License
MIT © AugmenTrait Pvt. Ltd.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file augstash_sdk-1.0.0.tar.gz.
File metadata
- Download URL: augstash_sdk-1.0.0.tar.gz
- Upload date:
- Size: 13.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cd2fc5f870403fbe742e75abcb00e1559f3bd1e2f46280936205f76234d15b38
|
|
| MD5 |
b88e88e3c48dba861bf4d62be7615c65
|
|
| BLAKE2b-256 |
08959ad70bc4cacd9217747b641b058e82e8a94f57089eb632fb69c5c1ffbe2e
|
File details
Details for the file augstash_sdk-1.0.0-py3-none-any.whl.
File metadata
- Download URL: augstash_sdk-1.0.0-py3-none-any.whl
- Upload date:
- Size: 10.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
28bd8d6f78e9e8e6fe1a2bc84265443757a19435b71874b915d45bcdceedc17d
|
|
| MD5 |
7b018cfff5ca30cad7278571a7540346
|
|
| BLAKE2b-256 |
956b622627cec3374770332a1ee7de603aaa1e970104af5f24942a9e60641d9e
|