Skip to main content

Python SDK for the HostPay payments API

Project description

HostPay Python SDK

A small, typed client for the HostPay payments API — wallets, deposits, transfers, payouts, escrow, and webhook verification.

Install

pip install hostpay          # once published
# or, from this repo:
pip install ./sdk/python

Requires Python 3.8+ and httpx.

Quickstart

from hostpay import HostPay

client = HostPay(api_key="ak-...", secret_key="sk-...")
# Test Mode? use your test keys — same code, no real money moves.

# 1. Create a user and their wallet
user = client.users.create(
    app_user_id="user_123",
    name="Alice",
    phone_number="+23279000000",
    email="alice@example.com",
)
wallet = client.wallets.create(user.id)

# 2. Deposit via mobile money
deposit = client.deposits.mobile_money(wallet_id=wallet.id, amount=100)

# 3. Check the balance (attribute or dict access)
bal = client.wallets.balance(wallet.id)
print(bal.balance, bal["currency"])

# 4. Transfer, pay out, escrow
client.transfers.create(sender_wallet_id=wallet.id, recipient_identifier="bob", amount=20)
client.payouts.mobile_money(wallet_id=wallet.id, amount=5, phone_number="+23279000000")
hold = client.escrow.hold(wallet_id=wallet.id, amount=10)
client.escrow.release(hold.id, recipient_wallet_id="...")

Authentication

Pass your api-key and secret-key once at construction; they're sent on every request. base_url defaults to production — point it at your staging host for testing.

Idempotency

Money-moving calls accept idempotency_key — reuse the same key to safely retry without double-charging:

client.payouts.mobile_money(
    wallet_id=w, amount=5, phone_number="+232...", idempotency_key="order-42-payout"
)

Verifying webhooks

Pass the raw request body and headers straight from your web framework:

from hostpay import HostPay, SignatureVerificationError

client = HostPay(api_key="ak-...", secret_key="sk-...")

# e.g. in Flask
@app.post("/webhooks/hostpay")
def hook():
    try:
        event = client.webhooks.construct_event(
            payload=request.get_data(),          # raw bytes, not request.json
            headers=request.headers,
            secret=WEBHOOK_SIGNING_SECRET,
        )
    except SignatureVerificationError:
        return "", 400
    if event.event == "deposit.completed":
        ...
    return "", 200

Signatures are HMAC-SHA256 over "<timestamp>.<body>"; deliveries older than tolerance seconds (default 300) are rejected.

Errors

All errors derive from HostPayError and carry .status_code and .detail: AuthenticationError (401/403), InvalidRequestError (400/404/422), RateLimitError (429), APIError (5xx), APIConnectionError, SignatureVerificationError.

Sandbox testing

In Test Mode, a user's phone number drives deterministic outcomes (see the Testing guide): +23299000001 completes, +23299000002 fails, +23299000009 stays pending. The same fail number works for payout recipients.

Typed responses

Core methods are annotated with TypedDict models (hostpay.models): users.* return UserRead, wallets.create/get return WalletRead, transfers/ payouts return TransactionResponse, and escrow.* returns EscrowResponse. A type checker (mypy/Pyright) will autocomplete and check keyed access — user["id"], wallet["balance"]. Ad-hoc responses (wallet balance, the deposit envelope) stay loosely typed.

At runtime every response is a HostPayObject (a dict), so both resp["field"] and resp.field work regardless of typing. The model fields mirror the committed ../openapi.json, the source of truth for both SDKs — regenerate the spec with python wallet-system/scripts/dump_openapi.py.

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

hostpay-0.1.0.tar.gz (8.9 kB view details)

Uploaded Source

Built Distribution

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

hostpay-0.1.0-py3-none-any.whl (10.6 kB view details)

Uploaded Python 3

File details

Details for the file hostpay-0.1.0.tar.gz.

File metadata

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

File hashes

Hashes for hostpay-0.1.0.tar.gz
Algorithm Hash digest
SHA256 c2503d92c3938f55455dff86eb79a48f9d3a027585977b27d3b413092137c338
MD5 dce0d95e73f80a0e3e137c9cd975e129
BLAKE2b-256 baee9bce5ccc1914e15e95e0508e8d7b3a01214bddb7cb4b9bd983a3af10409c

See more details on using hashes here.

Provenance

The following attestation bundles were made for hostpay-0.1.0.tar.gz:

Publisher: publish-python.yml on HOST-SL/hostpay-sdk

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

File details

Details for the file hostpay-0.1.0-py3-none-any.whl.

File metadata

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

File hashes

Hashes for hostpay-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 9e7bc254c67dbe402a8685e120a04896e8b522748a8aba6d0bde3eff231bb9b9
MD5 27be1aa01b5c244d890f0ff20239a486
BLAKE2b-256 43ac566397cc4ec7ab147b1afd5c866298b9ece554be792e87b162e3531b1322

See more details on using hashes here.

Provenance

The following attestation bundles were made for hostpay-0.1.0-py3-none-any.whl:

Publisher: publish-python.yml on HOST-SL/hostpay-sdk

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