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

Uploaded Python 3

File details

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

File metadata

  • Download URL: wotp-1.0.7.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.7.tar.gz
Algorithm Hash digest
SHA256 e46eb7dcb71ea0ae31c6c9cccfc4e0263e918cfc6c18984fde9be41b2fb1e94e
MD5 0fdeac74f7660af8985170fb27f32e3c
BLAKE2b-256 bd4367bb7ac6145f32095ea6fd70b66ca384d7bcddf78d5a4e1cbeea710b2b87

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: wotp-1.0.7-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.7-py3-none-any.whl
Algorithm Hash digest
SHA256 327e33a4a48a53727e81d77427d4342eaf6c3745c967791d7f997be1b25c0b52
MD5 2d27df040dbbcb25367b36cc97810c7a
BLAKE2b-256 5854e3b5d2b0302a40755471813c2077ff6e681140c92eef2983d861dd21e94a

See more details on using hashes here.

Provenance

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