Call2Me Python SDK
The official Python SDK for Call2Me — the AI voice agent platform.
Build, deploy, and manage AI voice agents that handle real phone calls, extract data, and take automated actions.
Features
- 15 API Resources — Full coverage of the Call2Me REST API
- Voice Agents — Create agents with 30+ AI models and custom voices
- Phone & Web Calls — Inbound/outbound via SIP, browser, or chat widget
- Campaigns — Bulk outbound calling with CSV upload
- Scheduled Calls — Book follow-ups at specific dates
- Post-Call Intelligence — Auto-extract data and trigger actions
- Knowledge Base — RAG-powered answers from your documents
- White-Label — Custom branding, domain, and tenant management
- Payments — Checkout, saved cards, auto-charge
Installation
pip install call2me
Requires Python 3.8+
Getting Your API Key
- Sign up at dash.call2me.app — you get $10 free credits
- Go to API Keys in the dashboard
- Click Create API Key and copy your
sk_call2me_...key
Quick Start
from call2me import Call2Me
client = Call2Me(api_key="sk_call2me_...")
# Create an agent
agent = client.agents.create(
agent_name="Sales Agent",
voice_id="elevenlabs-selin",
language="tr-TR",
system_prompt="You are a friendly sales agent."
)
print(f"Agent: {agent['agent_id']}")
# List calls
for call in client.calls.list():
print(f"{call['call_id']} — {call['call_status']}")
# Check balance
print(f"Balance: ${client.wallet.balance()['balance_usd']}")
Full API Reference
Agents
client.agents.list(limit=100, offset=0)
client.agents.get("agent_id")
client.agents.create(agent_name="My Agent", voice_id="elevenlabs-selin", system_prompt="...")
client.agents.update("agent_id", agent_name="New Name")
client.agents.delete("agent_id")
client.agents.duplicate("agent_id")
client.agents.stats("agent_id", days=30)
client.agents.global_stats()
Calls
client.calls.list(limit=50, agent_id="agent_id")
client.calls.get("call_id")
client.calls.end("call_id")
client.calls.recording("call_id")
Knowledge Base
client.knowledge_bases.list()
client.knowledge_bases.get("kb_id")
client.knowledge_bases.create(name="FAQ", description="Product FAQ")
client.knowledge_bases.delete("kb_id")
client.knowledge_bases.add_source("kb_id", source_type="text", content="...", name="intro")
client.knowledge_bases.query("kb_id", "What is the return policy?", top_k=5)
Campaigns
client.campaigns.list()
client.campaigns.get("campaign_id")
client.campaigns.create(name="Spring Sale", agent_id="agent_id", from_number="+908501234567")
client.campaigns.update("campaign_id", name="Updated")
client.campaigns.delete("campaign_id")
client.campaigns.upload_csv("campaign_id", "/path/to/contacts.csv")
client.campaigns.start("campaign_id")
client.campaigns.pause("campaign_id")
client.campaigns.resume("campaign_id")
client.campaigns.cancel("campaign_id")
client.campaigns.contacts("campaign_id")
Scheduled Calls
client.schedules.list()
client.schedules.get("schedule_id")
client.schedules.create(agent_id="agent_id", phone_number="+905551234567", scheduled_at="2026-04-15T10:00:00+03:00", timezone="Europe/Istanbul")
client.schedules.update("schedule_id", scheduled_at="2026-04-16T14:00:00+03:00")
client.schedules.delete("schedule_id")
client.schedules.cancel("schedule_id")
Phone Numbers
client.phone_numbers.list()
client.phone_numbers.get("+908501234567")
client.phone_numbers.create(phone_number="+908501234567", trunk_id="trunk_id")
client.phone_numbers.update("+908501234567", display_name="Main Line")
client.phone_numbers.delete("+908501234567")
client.phone_numbers.bind_agent("+908501234567", "agent_id")
client.phone_numbers.unbind_agent("+908501234567")
SIP Trunks
client.sip_trunks.list()
client.sip_trunks.get("trunk_id")
client.sip_trunks.create(name="My Trunk", sip_server="sip.provider.com", sip_username="user", sip_password="pass")
client.sip_trunks.update("trunk_id", name="Updated")
client.sip_trunks.delete("trunk_id")
client.sip_trunks.test("trunk_id")
Wallet & Billing
client.wallet.balance()
client.wallet.transactions(limit=50, offset=0)
client.wallet.analytics(days=30)
client.wallet.pricing()
Payments
client.payments.checkout(amount=50.0, currency="USD")
client.payments.history(limit=50)
client.payments.saved_cards()
client.payments.auto_charge()
client.payments.update_auto_charge(enabled=True, threshold=5.0, amount=50.0)
API Keys
client.api_keys.list()
client.api_keys.create(name="Production Key")
client.api_keys.revoke("key_id")
client.api_keys.delete("key_id")
client.api_keys.usage("key_id")
Users & Branding
client.users.me()
client.users.update(full_name="John Doe", company_name="Acme Inc")
client.users.stats()
client.users.usage(days=30)
client.users.daily_usage(days=30)
client.users.branding()
client.users.update_branding(app_name="My Platform", primary_color="#6366f1")
client.users.tenant_members(page=1, per_page=20)
Widgets
client.widgets.list()
client.widgets.get("widget_id")
client.widgets.create(agent_id="agent_id", name="Support Widget")
client.widgets.update("widget_id", welcome_message="Hi!")
client.widgets.delete("widget_id")
client.widgets.chat("widget_id", "Hello, I need help")
Voices
client.voices.list()
client.voices.providers()
Headless voice sessions
Open an AI voice session with an agent from your own app:
s = client.voice_sessions.create("agent_abc123")
# s = {"token": ..., "url": "wss://livekit.call2me.app", "room_name": ..., "session_limit_sec": 3600}
# Connect a LiveKit client with s["token"] + s["url"]; the agent auto-joins and talks.
Chats
client.chats.list(limit=50)
client.chats.get("session_id")
client.chats.send_message("session_id", "Hello!", model="openrouter/auto")
Events
Forward application errors and business events to the Call2Me observability pipeline. The POST endpoint is public; sending the API key lifts your per-minute ceiling from 10 (anon) to 100.
client.events.report(
type="payment_failed",
source="api",
message="Paddle rejected the webhook",
severity="error",
meta={"payment_id": "pay_abc", "provider": "paddle"},
)
# Admin-only query over archived (error+) events:
client.events.query(severity="error", hours=24)
Common type values: js_error, unhandled_rejection, http_5xx,
auth_login, auth_signup, payment_success, payment_failed,
call_started, call_ended, call_failed, agent_crash.
Error Handling
import httpx
try:
agent = client.agents.get("invalid_id")
except httpx.HTTPStatusError as e:
print(f"Error {e.response.status_code}: {e.response.json()}")
Links
- Website: call2me.app
- Dashboard: dash.call2me.app
- API Docs: call2me.app/docs
- Guides: call2me.app/guides
- GitHub: github.com/call2me-app/python-sdk
- Support: support@call2me.app
Changelog
1.4.0 (2026-07-02)
- Added
voice_sessions.create(agent_id, context=None)— open a headless AI voice session (LiveKit token) with an agent.
1.3.1 (2026-04-24)
- README — publish the 1.3.0 events-resource documentation to PyPI (the 1.3.0 upload shipped the pre-release README by accident).
1.3.0 (2026-04-24)
- Add
eventsresource —client.events.report()and.query()for forwarding errors and business events to the observability pipeline. - Published via PyPI Trusted Publishing (OIDC, no API token).
1.2.0
- All 14 resources, campaigns, schedules, widgets.
License
MIT
Metadata
Release files for call2me 1.4.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| call2me-1.4.1.tar.gz | 14.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| call2me-1.4.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 24.9 kB
Release files / call2me-1.4.1.tar.gz
| Download URL | call2me-1.4.1.tar.gz |
|---|---|
| Size | 14.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9e3ce0b989789b8648992a4b42a0f49851e725a9d3edc0c54aed869a12b7115b
|
|
BLAKE2b-256 checksum How to use checksums |
d47fa9152931d4ae736e8d429bf27479b675873eb65852ff924802d942b724af
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.
Transparency logRelease files / call2me-1.4.1-py3-none-any.whl
| Download URL | call2me-1.4.1-py3-none-any.whl |
|---|---|
| Size | 10.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
487fde0666d045a084864e5fb5555cac179ec5ac187f81eed04fd2145b146197
|
|
BLAKE2b-256 checksum How to use checksums |
12bc900e6516694bae2501e07bd9170a624e4a0e69f978fb58d6378d2053dd94
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.
Transparency log