Skip to main content

vapi_agent

A small, friendly Python wrapper around the Vapi voice-AI API. It ships both a synchronous and an asynchronous client, covers the full REST API through a uniform CRUD interface, and returns plain parsed JSON so you're never fighting the library.

from vapi_agent import VapiAgent

client = VapiAgent(api_key="your-private-key")
for assistant in client.assistants.list(limit=20):
    print(assistant["id"], assistant["name"])

Installation

pip install vapi-agent

Or, from a local checkout:

pip install -e .

Requires Python 3.8+ and depends only on httpx.

Authentication

Get your private API key from the Vapi dashboard. Pass it directly or set the VAPI_API_KEY environment variable:

client = VapiAgent(api_key="your-private-key")
# ...or, with VAPI_API_KEY set in the environment:
client = VapiAgent()

Use the private key server-side only. Never ship it in client-side code.

Resources

Every resource exposes the same five methods — list(), get(id), create(**fields), update(id, **fields), delete(id):

Attribute Vapi endpoint
client.assistants /assistant
client.calls /call
client.phone_numbers /phone-number
client.tools /tool
client.squads /squad
client.workflows /workflow
client.files /file
client.knowledge_bases /knowledge-base
client.test_suites /test-suite
client.analytics /analytics (.query(...))
client.logs /logs (read-only, .list(...))

Request bodies are passed as keyword arguments and forwarded as JSON, so you can use anything the Vapi API accepts without waiting for the library to add a field.

Examples

Create an assistant

assistant = client.assistants.create(
    name="Support Bot",
    model={
        "provider": "openai",
        "model": "gpt-4o",
        "messages": [{"role": "system", "content": "You are a helpful agent."}],
    },
    voice={"provider": "11labs", "voiceId": "burt"},
    firstMessage="Hi! How can I help you today?",
)
print(assistant["id"])

Make an outbound call

call = client.calls.create(
    assistantId=assistant["id"],
    phoneNumberId="your-phone-number-id",
    customer={"number": "+15551234567"},
)

Paginate with the timestamp filters

Vapi's list endpoints cap results with limit and page by createdAt rather than an offset:

def all_assistants(client, page_size=100):
    cursor = None
    while True:
        page = client.assistants.list(limit=page_size, createdAtLt=cursor)
        if not page:
            break
        yield from page
        cursor = page[-1]["createdAt"]
        if len(page) < page_size:
            break

Upload a file

file = client.files.create(path="./knowledge.pdf")

Async client

import asyncio
from vapi_agent import AsyncVapiAgent

async def main():
    async with AsyncVapiAgent(api_key="your-key") as client:
        assistants = await client.assistants.list(limit=20)
        print(len(assistants))

asyncio.run(main())

Analytics

result = client.analytics.query([
    {
        "name": "calls_by_day",
        "table": "call",
        "timeRange": {"step": "day"},
        "operations": [{"operation": "count", "column": "id"}],
    }
])

Error handling

Non-2xx responses raise a typed exception (all subclasses of VapiAPIError):

from vapi_agent import NotFoundError, AuthenticationError, VapiAPIError

try:
    client.assistants.get("does-not-exist")
except NotFoundError:
    print("no such assistant")
except AuthenticationError:
    print("check your API key")
except VapiAPIError as e:
    print(e.status_code, e.body)

Configuration

client = VapiAgent(
    api_key="your-key",
    base_url="https://api.vapi.ai",   # override for self-hosted/proxy
    timeout=60.0,
    default_headers={"X-My-Header": "value"},
)

Both clients support context managers (with / async with) and expose close() / aclose() for manual cleanup.

License

MIT

Metadata

Release files for vapi-agent 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for vapi-agent 0.1.1
File Size Uploaded
vapi_agent-0.1.1.tar.gz 8.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for vapi-agent 0.1.1
File Interpreter ABI Platform
vapi_agent-0.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 18.7 kB

Release files / vapi_agent-0.1.1.tar.gz

Download URL vapi_agent-0.1.1.tar.gz
Size 8.6 kB
Tags Source
SHA-256 checksum
How to use checksums
36b8f9d4cd50be4899db7dbfb80ca2095aa0959b53276ae66ba4b90530d0c778
BLAKE2b-256 checksum
How to use checksums
fc5a5d407a29c7183edcda950d382774101e4a60adf83a245b25eaa74c7cd19a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.9

Release files / vapi_agent-0.1.1-py3-none-any.whl

Download URL vapi_agent-0.1.1-py3-none-any.whl
Size 10.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
7f35276693589971be55783f66280fdd33cd0bfaa9b0be8ef8f2d3860a1ab536
BLAKE2b-256 checksum
How to use checksums
43508a80219f07b12396159375bed75331a4cd434c198bd406da6a8317448b30
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.9

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page