Python SDK
morevoice is the Python client for the MoreVoice API. It runs on Python 3.9 and later and has a sync client, MoreVoice, and an async one, AsyncMoreVoice, with the same methods. Its core is generated from the OpenAPI document, so every operation of the API has a typed method, named like the Node.js SDK’s in snake_case: mv.calls.sendDtmf() there is client.calls.send_dtmf() here. Hand-written helpers cover the rest: verifying webhooks, serving custom tools from FastAPI or Flask, event streams and pagination.
Install
Section titled “Install”pip install morevoiceThe package is morevoice on PyPI. It depends only on httpx, attrs and python-dateutil.
Connect
Section titled “Connect”Create an API key in DevelopersAPI keys and keep it in an environment variable, MOREVOICE_API_KEY. Use a test-mode key (mv_test_…) while you build: test mode never reaches a real phone. Keys are for your server only.
import asyncio
from morevoice import AsyncMoreVoice, MoreVoice
client = MoreVoice() # reads MOREVOICE_API_KEY (and MOREVOICE_BASE_URL, if set)
# Check the key: which organisation, which mode, which scopes.me = client.whoami.retrieve()print(f"Connected to {me.org_id} in {'live' if me.livemode else 'test'} mode")
# The same methods, awaited, on AsyncMoreVoice.async def main() -> None: async_client = AsyncMoreVoice() me = await async_client.whoami.retrieve() print(me.api_version)
asyncio.run(main())Every method raises an exception when the API answers with an error: the exception carries the error’s type, code, message and the request_id. See errors, rate limits and concurrency.
Resources
Section titled “Resources”Each method takes its path parameters first, then the request body or the query. Each page lists the parameters, the body fields, the response and an example.
| Resource | Methods |
|---|---|
client.agents |
retrieve_status() |
client.assistants |
create(), delete(), duplicate(), list(), retrieve(), update() |
client.audio_assets |
create(), delete(), list(), retrieve(), retrieve_content(), update() |
client.callbacks |
add_note(), cancel(), complete(), create(), list(), retrieve(), stats(), update() |
client.calls |
add_participant(), consult(), create(), create_stream(), create_summary(), delete(), delete_stream(), download_recording(), hangup(), hold(), list(), list_copilot_events(), pci(), remove_participant(), retrieve(), retrieve_control(), retrieve_flow_path(), retrieve_pci(), retrieve_recording(), retrieve_summary(), retrieve_transcript(), send_dtmf(), stream(), transcript_stream(), transfer(), update_participant() |
client.campaigns |
cancel(), contacts.create(), contacts.import_(), contacts.list(), contacts.list_attempts(), contacts.retrieve(), contacts.update(), create(), delete(), export(), list(), pause(), preflight(), resume(), retrieve(), start(), stats(), update() |
client.cli |
submit_tool_result() |
client.cli_listen |
stream() |
client.client_tokens |
create() |
client.conference_rooms |
create(), create_link(), delete(), invite(), list(), list_sessions(), moderate(), retrieve(), retrieve_ics(), retrieve_live(), update() |
client.connections |
create(), delete(), list(), register(), retrieve(), update() |
client.consents |
create(), delete(), list() |
client.copilot_profiles |
create(), delete(), duplicate(), list(), list_templates(), retrieve(), update() |
client.dnc |
check(), create(), delete(), list(), retrieve() |
client.events |
list(), retrieve(), stream() |
client.flow_templates |
list(), retrieve() |
client.flows |
create(), delete(), duplicate(), list(), list_versions(), publish(), restore.version(), retrieve(), retrieve_analytics(), retrieve_draft(), retrieve_usage(), retrieve_version(), simulate(), update(), update_draft(), validate() |
client.imports |
retrieve() |
client.inbound_routes |
create(), delete(), list(), retrieve(), update() |
client.insights |
retrieve() |
client.invitations |
create(), delete(), list(), resend(), retrieve() |
client.kb |
documents_search() |
client.kb_documents |
create(), delete(), list(), reingest(), retrieve(), retrieve_content() |
client.openapi |
postman() |
client.organizations |
create(), list(), retrieve(), usage.retrieve() |
client.phone_numbers |
create(), delete(), list(), retrieve() |
client.qa |
override_scorecard_item(), retrieve_rubric(), retrieve_scorecard(), run.scorecard(), update_rubric() |
client.queues |
create(), delete(), list(), retrieve(), retrieve_live(), update() |
client.reports |
catalog(), create(), delete(), download_run_csv(), download_run_pdf(), list(), list_runs(), preview(), retrieve(), send(), update() |
client.request_logs |
list(), retrieve(), stream() |
client.secrets |
delete(), list(), set() |
client.teams |
create(), delete(), list(), retrieve(), update() |
client.test_helpers_events |
create() |
client.test_helpers_inbound_calls |
create() |
client.tools |
test() |
client.usage |
retrieve() |
client.users |
delete(), list(), reactivate(), retrieve(), update() |
client.voices |
list(), preview() |
client.web_calls |
create() |
client.webhook_deliveries |
list(), retrieve(), retry() |
client.webhook_endpoints |
create(), delete(), list(), replay(), retrieve(), retrieve_public_key(), rotate_secret(), test(), update() |
client.whoami |
retrieve() |
Helpers
Section titled “Helpers”The helpers (webhook verification, tool handlers for FastAPI and Flask, event streams, pagination, wait_until_ended, import_csv) ship with the package.
Webhooks and custom tools without the SDK
Section titled “Webhooks and custom tools without the SDK”Verifying a webhook or a tool call takes a few lines of the standard library: see verifying signatures and custom tools, which show the same checks in Python.