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.9.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.9-py3-none-any.whl (2.5 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: wotp-1.0.9.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.9.tar.gz
Algorithm Hash digest
SHA256 02c8317399e6d7d0060d396036539d9507239214f901b0ab39005d56e9d8d5f1
MD5 40ad9fe6cf6c8634107754c7f87b0aca
BLAKE2b-256 5cf6a2aee1b40d33136bf66e917a9195ea001943448a2d644b7fa0ea8dec5a0d

See more details on using hashes here.

Provenance

The following attestation bundles were made for wotp-1.0.9.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.9-py3-none-any.whl.

File metadata

  • Download URL: wotp-1.0.9-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.9-py3-none-any.whl
Algorithm Hash digest
SHA256 fac0b5cd1cb36e10d8451e128ec1e9bb9111e26bd075b60c1507ce83ddefd0d9
MD5 02842bf1577928131568e46adaf60203
BLAKE2b-256 11f9a02c8767f40d5199590d9dd7765a70f418ba5675bd89d6449ea0f5229698

See more details on using hashes here.

Provenance

The following attestation bundles were made for wotp-1.0.9-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