Skip to main content

Official Python SDK for Wotp — WhatsApp OTP, self-hosted, one command.

Project description

wotp

Official Python SDK for Wotp — WhatsApp OTP, self-hosted, one command.

PyPI License: MIT

Installation

pip install wotp

Quick Start

from wotp import create_client

client = create_client("http://localhost:54321", "wotp_anon_xxx")

# Send an OTP
resp = client.send_otp("+212600000000")
print(f"Token: {resp.token}, expires at: {resp.expires_at}")

# Verify the code entered by the user
result = client.verify_otp(resp.token, "483920")

# Send a text message
text_res = client.send_text("+212600000000", "Hello world")

# Send a media message
media_res = client.send_media("+212600000000", url="https://example.com/image.png")

# List chats
chats = client.get_chats()

print(f"Verified: {result.verified}")

API Reference

create_client(url, api_key, **options)

Creates a new Wotp client instance.

Parameter Type Description
url str Base URL of your Wotp instance
api_key str Your anon or service API key
max_retries int Max retries on transient errors (default: 3)
retry_delay float Base delay in seconds between retries (default: 0.5)
timeout float Request timeout in seconds (default: 10.0)

client.send_otp(phone)

Send an OTP to the given phone number.

  • Parameters: phone — E.164 formatted phone number
  • Returns: SendOTPResponse with .token and .expires_at
  • Raises: RateLimitError

client.verify_otp(token, code)

Verify an OTP code against a previously issued token.

  • Parameters: token — from send_otp, code — the user-entered code
  • Returns: VerifyOTPResponse with .verified, .phone, .attempts_remaining
  • Raises: ExpiredTokenError, InvalidCodeError

client.health()

Check the health of the Wotp instance.

  • Returns: HealthResponse with .status, .phone, .uptime_seconds

Error Handling

The SDK raises typed exceptions for business failures:

from wotp import create_client, RateLimitError, ExpiredTokenError, InvalidCodeError

client = create_client("http://localhost:54321", "wotp_anon_xxx")

try:
    result = client.verify_otp(token, code)
except RateLimitError as e:
    print(f"Rate limited. Retry after {e.retry_after}s")
except ExpiredTokenError:
    print("Token expired — request a new OTP")
except InvalidCodeError as e:
    print(f"Wrong code. {e.attempts_remaining} attempts left")
Exception When
RateLimitError Phone/IP exceeded rate limit (HTTP 429)
ExpiredTokenError Token has expired (HTTP 410 or expired_token)
InvalidCodeError Wrong OTP code (HTTP 400 + invalid_code)
WotpError Base class for all SDK errors

Context Manager

The client can be used as a context manager to ensure proper cleanup:

with create_client("http://localhost:54321", "wotp_anon_xxx") as client:
    resp = client.send_otp("+212600000000")

Auto-Retry

Transient errors (502, 503, 504, network timeouts) are automatically retried with exponential backoff. Business errors are never retried.

Requirements

  • Python ≥ 3.10
  • A running Wotp instance

License

MIT — see LICENSE for details.

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

wotp-1.0.8.tar.gz (2.9 kB view details)

Uploaded Source

Built Distribution

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

wotp-1.0.8-py3-none-any.whl (2.5 kB view details)

Uploaded Python 3

File details

Details for the file wotp-1.0.8.tar.gz.

File metadata

  • Download URL: wotp-1.0.8.tar.gz
  • Upload date:
  • Size: 2.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for wotp-1.0.8.tar.gz
Algorithm Hash digest
SHA256 f774f5ba2e517de1ea9a25e6f5f2e15474b71bb56c340969f5d4d3062046f551
MD5 49c15a09cb4c9c903b8f30af83e2046c
BLAKE2b-256 a9f4fb4db75535aa0a7d135bc5b909469c8c36641e1161ad30046babf4fcfc40

See more details on using hashes here.

Provenance

The following attestation bundles were made for wotp-1.0.8.tar.gz:

Publisher: release.yml on raucheacho/wotp

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

File details

Details for the file wotp-1.0.8-py3-none-any.whl.

File metadata

  • Download URL: wotp-1.0.8-py3-none-any.whl
  • Upload date:
  • Size: 2.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for wotp-1.0.8-py3-none-any.whl
Algorithm Hash digest
SHA256 3612025e77b0eff69e8628a9dfa8fab552c596370d455c52523102a41070bc97
MD5 64eeba8f885232a7081acb7af48653d7
BLAKE2b-256 9417184ff0614acb8d1424bf02b0e1f53cf77fccc4868183f395d13c2e473b81

See more details on using hashes here.

Provenance

The following attestation bundles were made for wotp-1.0.8-py3-none-any.whl:

Publisher: release.yml on raucheacho/wotp

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

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