Skip to main content

Python SDK for the 3CX XAPI (OData v4)

Project description

3CX Python SDK

A typed Python SDK for the 3CX XAPI (/xapi/v1), built on httpx and Pydantic v2.

Features

  • OAuth2 client-credentials authentication with automatic token refresh
  • OData v4 query builder ($filter, $select, $expand, $orderby, $top, $skip, $count)
  • Automatic pagination — iterate over all pages with a single generator call
  • Full coverage — 37 typed services covering every resource group in the 3CX XAPI swagger spec
  • Auto-generated models — every Pydantic model is generated from swagger.yaml, giving you full IDE autocomplete on every field of every entity (User has 60+ typed fields, Queue has 50+, etc.)
  • Reporting helpers for call log, queue performance, extension statistics, activity log, and more
  • Context-manager support for clean resource management
  • Escape hatches (client.get() / client.post()) for raw access to any endpoint

Installation

pip install 3cx-xapi-python-sdk

Quick start

from threecx import ThreeCXClient, ODataQuery

client = ThreeCXClient(
    base_url="https://pbx.example.com",
    client_id="<service-principal-client-id>",
    client_secret="<service-principal-secret>",
)

# ── Active calls ─────────────────────────────────────────────────────────────
for call in client.active_calls.list():
    print(f"{call.caller}{call.callee}  (duration: {call.duration}s)")

# Drop a specific call
client.active_calls.drop(call_id=42)

# ── Users ─────────────────────────────────────────────────────────────────────
# List first 50 enabled users, sorted by extension number
q = ODataQuery().filter("Enabled eq true").order_by("Number").top(50)
for user in client.users.list(q):
    print(user.number, user.full_name, user.email)

# Get a single user and update their e-mail
user = client.users.get(101)
client.users.update(101, {"Email": "new@example.com"})

# Create a user
from threecx.models import User
new_user = client.users.create(User(
    Number="200",
    FirstName="Alice",
    LastName="Smith",
    Email="alice@example.com",
))

# ── Queues ────────────────────────────────────────────────────────────────────
for queue in client.queues.list():
    agents = client.queues.get_agents(queue.id)
    print(f"Queue {queue.name}: {len(agents)} agents")

# ── Call history ──────────────────────────────────────────────────────────────
q = ODataQuery().filter("CallDirection eq 'Inbound'").order_by("StartTime desc").top(100)
for entry in client.call_history.iterate(q):
    print(entry.start_time, entry.caller, "→", entry.callee, entry.status)

# ── Reports ───────────────────────────────────────────────────────────────────
from datetime import datetime, timedelta, timezone

end = datetime.now(timezone.utc)
start = end - timedelta(days=7)
rows = client.reports.get_call_log(start, end)
print(f"{len(rows)} call-log entries for the last 7 days")

# ── System status ─────────────────────────────────────────────────────────────
status = client.system.get_status()
print(f"PBX {status.pbx_version}  calls: {status.calls_active}  cpu: {status.cpu_usage}%")

# ── Context manager ───────────────────────────────────────────────────────────
with ThreeCXClient(base_url="https://pbx.example.com",
                   client_id="...", client_secret="...") as c:
    print(c.system.get_license())

OData query builder

from threecx import ODataQuery

q = (
    ODataQuery()
    .filter("LastName eq 'Smith'")
    .select("Id", "Number", "FirstName", "LastName", "Email")
    .expand("Groups")
    .order_by("Number")
    .top(25)
    .skip(0)
    .count()
)

All query parameters map directly to OData v4 syntax. Refer to the 3CX XAPI swagger for supported fields per endpoint.

Creating a service principal

  1. Log in to 3CX as admin.
  2. Navigate to Admin → Integrations → API.
  3. Create a new service principal and copy the Client ID and Client Secret.

Services reference

The SDK exposes 37 services as attributes of ThreeCXClient, covering every resource group in swagger.yaml.

Calls & telephony

client.<service> Resource
active_calls /ActiveCalls — list & drop live calls
call_history /CallHistoryView — paginated call log
recordings /Recordings, /RemoteArchivingSettings
voicemail /VoicemailSettings, /MusicOnHoldSettings
fax /Fax, /FaxServerSettings

Users, groups & directories

client.<service> Resource
users /Users — CRUD extensions/users + greetings, phones, provisioning
my_user /MyUser — current authenticated user
groups /Groups — full admin groups (members, rights, restrictions)
my_group /MyGroup — current user's primary group
contacts /Contacts — company phone book
parameters /TenantProperties, /DNProperties, directory info

Call routing & flow

client.<service> Resource
queues /Queues — CRUD call queues & agents
ring_groups /RingGroups — CRUD ring groups
inbound_rules /InboundRules — DID/inbound rules
outbound_rules /OutboundRules — outbound dial rules
receptionists /Receptionists — digital receptionists
holidays /Holidays, /OfficeHours
parkings /Parkings, /CallParkingSettings
call_flow /CallFlowApps, /CallFlowScripts

Trunks & PBX hardware

client.<service> Resource
trunks /Trunks, /TrunkTemplates, /Peers, /Sbcs
phones /Phones, /PhoneTemplates, /SipDevices, /Fxs, /FxsTemplates, /DeviceInfos, /Firmwares

Communication

client.<service> Resource
chat /ChatHistoryView, /ChatMessagesHistoryView
prompts /PromptSets, /CustomPrompts, /Playlists
email /EmailTemplate

System administration

client.<service> Resource
system /SystemStatus, /LicenseStatus, /Parameters
settings /GeneralSettingsForPbx, /MailSettings, /CDRSettings, ~20 settings domains
pbx_services /Services — start/stop/enable/disable PBX services
backups /Backups, failover & restore settings
updates /Updates, prompt set / CRM updates, Debian upgrade
event_logs /EventLogs
security /SecurityTokens, /ServicePrincipals, /BlackListNumbers, /Blocklist, /AntiHackingSettings, /Firewall
emergency /EmergencyGeoLocations, /EmergencyNotificationsSettings
defs /Defs — codecs, timezones, gateway parameters, countries, DID numbers

Integrations

client.<service> Resource
integrations /Microsoft365Integration, /Microsoft365TeamsIntegration, /GoogleSettings, /AmazonIntegrationSettings, /DataConnectorSettings, /AISettings
crm /CrmIntegration, /CrmTemplates
website_links /WebsiteLinks

Reporting

client.<service> Resource
reports 30+ report endpoints: call log, queue & extension statistics, agent login, activity log, SLA breaches, audit, scheduled reports

Escape hatch

Any endpoint not covered by a typed service can be called directly:

data = client.get("/InboundRules", params={"$top": "10"})
result = client.post("/Backups/Pbx.CreateBackup")

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

3cx_xapi_python_sdk-1.1.0.tar.gz (82.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

3cx_xapi_python_sdk-1.1.0-py3-none-any.whl (92.0 kB view details)

Uploaded Python 3

File details

Details for the file 3cx_xapi_python_sdk-1.1.0.tar.gz.

File metadata

  • Download URL: 3cx_xapi_python_sdk-1.1.0.tar.gz
  • Upload date:
  • Size: 82.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for 3cx_xapi_python_sdk-1.1.0.tar.gz
Algorithm Hash digest
SHA256 6adcc80c2b4dc352173473334efb6612122aef6640123867e5bb1ae38bb500b6
MD5 c266dd5a3bea4008952410b5a74d95c3
BLAKE2b-256 7ae3824fc03b86e822d73aa281d958ec37eb781c4256d130c616e1cc88eb60b5

See more details on using hashes here.

File details

Details for the file 3cx_xapi_python_sdk-1.1.0-py3-none-any.whl.

File metadata

  • Download URL: 3cx_xapi_python_sdk-1.1.0-py3-none-any.whl
  • Upload date:
  • Size: 92.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for 3cx_xapi_python_sdk-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 524226163337338eac51202a600e1d62de400ec54c415c312267f64bde5f3b24
MD5 1fc1cc01ffb62f81dbcdd8f0d5a8e398
BLAKE2b-256 bba728620128a09e5be99e032c43e7a7809b0a6aecb9205b3b02e5b127d51337

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page