Metadata-Version: 2.4
Name: coinwaka
Version: 1.0.0
Summary: Official Python SDK for the Coinwaka Pay API.
Project-URL: Homepage, https://developers.coinwaka.com
Author: Coinwaka
License: MIT
License-File: LICENSE
Keywords: coinwaka,crypto,mpesa,payment-gateway,payments,usdt
Requires-Python: >=3.8
Description-Content-Type: text/markdown

# coinwaka

Official Python SDK for the [Coinwaka Pay API](https://developers.coinwaka.com).
Standard library only (no dependencies), Python 3.8+.

```bash
pip install coinwaka
```

## Quickstart

Create an intent, redirect the customer to its hosted checkout, and fulfil the
order on the signed `payment_intent.paid` webhook.

```python
import os
from coinwaka import Coinwaka

coinwaka = Coinwaka(api_key=os.environ["COINWAKA_SECRET_KEY"])

intent = coinwaka.payment_intents.create(
    amount="2500",
    currency="KES",
    settlement_currency="USDT",
    payment_methods=["mpesa", "card", "coinwaka_balance"],
    merchant_reference="ORDER-1001",
)

# Redirect the customer to:
print(intent["checkout_url"])
```

A `cwk_test_…` key runs in sandbox (no real money); a `cwk_live_…` key is live.
Every create call sends an `Idempotency-Key` automatically, so an automatic
retry (on 429/5xx) never double-charges.

## Resources

```python
coinwaka.auth.verify()
coinwaka.rates.retrieve()
coinwaka.quotes.create(source_currency="KES", target_asset="USDT", amount="2500")

coinwaka.payment_intents.create(amount="2500", currency="KES", idempotency_key="order-1001")
coinwaka.payment_intents.retrieve("pi_...")
coinwaka.payment_intents.list(limit=20, status="paid")
coinwaka.payment_intents.cancel("pi_...")
coinwaka.payment_intents.refund_request("pi_...", reason="Customer returned item")

coinwaka.payment_links.create(title="Deposit", amount="15000", currency="KES")
coinwaka.payment_links.retrieve("pl_...")
```

## Verify webhooks

Pass the **raw** request body (str or bytes).

```python
event = coinwaka.webhooks.verify(
    payload=raw_body,
    signature=headers["Coinwaka-Signature"],
    timestamp=headers["Coinwaka-Timestamp"],
    secret=os.environ["COINWAKA_WEBHOOK_SECRET"],
)
if event["type"] == "payment_intent.paid":
    ...  # fulfil the order, dedupe on event["id"]
```

## Errors

```python
from coinwaka import CoinwakaError

try:
    coinwaka.payment_intents.create(amount="0", currency="KES")
except CoinwakaError as err:
    print(err.type, err.code, err, err.request_id)
```

The full contract is published as OpenAPI at <https://www.coinwaka.com/openapi.yaml>.

## License

MIT
