Skip to main content

rmyndharis-openwa

Official Python SDK for the OpenWA WhatsApp API Gateway.

A synchronous client built on httpx, with bundled type hints (PEP 561).

Install

pip install rmyndharis-openwa

Requires Python 3.9+. The importable module is openwa.

Usage

from openwa import OpenWAClient

client = OpenWAClient(
    base_url="https://your-gateway.example.com",
    api_key="owa_k1_…",
)

client.sessions.start("my-session")

result = client.messages.send_text("my-session", {
    "chatId": "628123456789@c.us",
    "text": "Hello from the OpenWA Python SDK!",
})
print(result["messageId"])

The client is also a context manager (it closes the underlying connection pool on exit):

with OpenWAClient(base_url="…", api_key="…") as client:
    client.messages.send_text("my-session", {"chatId": "…@c.us", "text": "hi"})

For tests, pass an httpx transport — no global monkey-patching required:

import httpx
client = OpenWAClient(base_url="…", api_key="…", transport=httpx.MockTransport(handler))

Search

GET /search is wrapped as client.search.search(params). Only q is required; the rest (sessionId, chatId, direction, type, from, dateFrom, dateTo, limit, offset) are optional. dateFrom / dateTo are epoch-ms. The active search provider (built-in DB full-text, or a plugin) answers; if none is configured the server returns 501.

res = client.search.search({"q": "invoice", "sessionId": "my-session", "limit": 20})
for hit in res["hits"]:
    print(hit["snippet"], hit["score"])

Messaging

Voice notes: pass ptt=True inside the body dict to send_audio to send a real WhatsApp voice note (PTT). Supply audio/ogg; codecs=opus audio for reliable playback; the server defaults the mimetype to that when ptt is set without one.

Errors

A non-2xx response raises a typed OpenWAApiError subclass — OpenWAAuthError (401), OpenWAForbiddenError (403), OpenWANotFoundError (404), OpenWAConflictError (409), OpenWARateLimitError (429), OpenWANotImplementedError (501), OpenWAServiceUnavailableError (503 — the only retryable one) — each carrying .status and the parsed .body. A timeout raises OpenWATimeoutError.

from openwa import OpenWANotFoundError

try:
    client.sessions.get("missing")
except OpenWANotFoundError as e:
    print(e.status)  # 404

Notes

  • Use HTTPS in production — the API key is sent as X-API-Key and is bearer-equivalent.
  • The SDK does not retry, and never follows redirects (so the key is never re-sent to a redirect target). Path segments are percent-encoded; a base-URL path prefix (e.g. behind a reverse proxy) is preserved.
  • Escape hatch for endpoints the SDK does not wrap: client.request(method, path, query=…, body=…).

Releasing

Publishing to PyPI is done by the python-sdk-release.yml workflow, which authenticates with PyPI Trusted Publishing (OIDC). There is no PyPI token in the workflow or in the repository secrets: PyPI mints a short-lived credential from the GitHub OIDC token, so nothing long-lived exists to leak or rotate.

One-time setup, required before the first tag — on pypi.org, open the project's publishing settings and add a GitHub trusted publisher:

  • Owner: rmyndharis
  • Repository: OpenWA
  • Workflow name: python-sdk-release.yml

There are no repository secrets to add. Until the trusted publisher exists PyPI rejects the upload, so configure it first.

Cutting a release:

  1. Bump version in pyproject.toml and land it on main.
  2. Tag that commit py-sdk-v<version> (e.g. py-sdk-v0.5.0) and push the tag. The SDK has its own version line — the monorepo's v* tags are the app version and never trigger an SDK publish.
  3. The workflow re-runs the test suite, builds the sdist and wheel, and uploads. The artifacts published are the ones those tests passed against.

License

MIT

Download files

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

Source Distribution

rmyndharis_openwa-0.5.0.tar.gz (42.2 kB view details)

Uploaded Source

Built Distribution

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

rmyndharis_openwa-0.5.0-py3-none-any.whl (39.9 kB view details)

Uploaded Python 3

File details

Details for the file rmyndharis_openwa-0.5.0.tar.gz.

File metadata

  • Download URL: rmyndharis_openwa-0.5.0.tar.gz
  • Upload date:
  • Size: 42.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for rmyndharis_openwa-0.5.0.tar.gz
Algorithm Hash digest
SHA256 7d6579ef90ec9920792868156a445b0d79e358b39aa8e380d2e8894855f70daa
MD5 5135014793cb5a1cba8f95d14ee62cc9
BLAKE2b-256 0121a7a4d272053b5b22943a95b792d2e18f768de3772873b47df418f60ce0af

See more details on using hashes here.

Provenance

The following attestation bundles were made for rmyndharis_openwa-0.5.0.tar.gz:

Publisher: python-sdk-release.yml on rmyndharis/OpenWA

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rmyndharis_openwa-0.5.0-py3-none-any.whl.

File metadata

File hashes

Hashes for rmyndharis_openwa-0.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 b028e034fbe53da86cff3e41489b13d9496cb3f6cbd4015f32ab0ad10aa9cdfa
MD5 df41217d4ad7c31eb04d4b4cc009113b
BLAKE2b-256 940f9761236d9f9831eb1d02e8a8f9196bd97d56bad21b0ca53bf02b482e3844

See more details on using hashes here.

Provenance

The following attestation bundles were made for rmyndharis_openwa-0.5.0-py3-none-any.whl:

Publisher: python-sdk-release.yml on rmyndharis/OpenWA

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.5.0 This release

2 files

0.4.0

2 files

0.3.0

2 files

0.2.0

2 files

0.1.0

2 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