> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://mmg-sdk.wetechnologygroup.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://mmg-sdk.wetechnologygroup.com/_mcp/server.

# Mmg Python Library

The Mmg Python library provides convenient access to the Mmg APIs from Python.

## Table of Contents

* [Installation](#installation)
* [Usage](#usage)
* [Async Client](#async-client)
* [Exception Handling](#exception-handling)
* [Advanced](#advanced)
  * [Access Raw Response Data](#access-raw-response-data)
  * [Retries](#retries)
  * [Timeouts](#timeouts)
  * [Custom Client](#custom-client)

## Installation

```sh
pip install mobile-money-sdk
```

## Usage

Instantiate and use the client with the following:

```python
from mmg import MMG

client = MMG(
    wss_mid="YOUR_WSS_MID",
    wss_mkey="YOUR_WSS_MKEY",
    wss_msecret="YOUR_WSS_MSECRET",
    api_key="YOUR_API_KEY",
    wss_correlationid="YOUR_WSS_CORRELATIONID",
    wss_token="YOUR_WSS_TOKEN",
)
client.authentication.login_resource_token_api(
    grant_type="password",
    api_key="{{x-api-key}}",
    username="{{x-wss-mid}}",
    password="{{PASSWORD}}",
)
```

## Async Client

The SDK also exports an `async` client so that you can make non-blocking calls to our API. Note that if you are constructing an Async httpx client class to pass into this client, use `httpx.AsyncClient()` instead of `httpx.Client()` (e.g. for the `httpx_client` parameter of this client).

```python
import asyncio

from mmg import AsyncMMG

client = AsyncMMG(
    wss_mid="YOUR_WSS_MID",
    wss_mkey="YOUR_WSS_MKEY",
    wss_msecret="YOUR_WSS_MSECRET",
    api_key="YOUR_API_KEY",
    wss_correlationid="YOUR_WSS_CORRELATIONID",
    wss_token="YOUR_WSS_TOKEN",
)


async def main() -> None:
    await client.authentication.login_resource_token_api(
        grant_type="password",
        api_key="{{x-api-key}}",
        username="{{x-wss-mid}}",
        password="{{PASSWORD}}",
    )


asyncio.run(main())
```

## Exception Handling

When the API returns a non-success status code (4xx or 5xx response), a subclass of the following error
will be thrown.

```python
from mmg.core.api_error import ApiError

try:
    client.authentication.login_resource_token_api(...)
except ApiError as e:
    print(e.status_code)
    print(e.body)
```

## Advanced

### Access Raw Response Data

The SDK provides access to raw response data, including headers, through the `.with_raw_response` property.
The `.with_raw_response` property returns a "raw" client that can be used to access the `.headers` and `.data` attributes.

```python
from mmg import MMG

client = MMG(
    ...,
)
response = client.authentication.with_raw_response.login_resource_token_api(...)
print(response.headers)  # access the response headers
print(response.data)  # access the underlying object
```

### Retries

The SDK is instrumented with automatic retries with exponential backoff. A request will be retried as long
as the request is deemed retryable and the number of retry attempts has not grown larger than the configured
retry limit (default: 2).

A request is deemed retryable when any of the following HTTP status codes is returned:

* [408](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/408) (Timeout)
* [429](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429) (Too Many Requests)
* [5XX](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500) (Internal Server Errors)

Use the `max_retries` request option to configure this behavior.

```python
client.authentication.login_resource_token_api(..., request_options={
    "max_retries": 1
})
```

### Timeouts

The SDK defaults to a 60 second timeout. You can configure this with a timeout option at the client or request level.

```python

from mmg import MMG

client = MMG(
    ...,
    timeout=20.0,
)


# Override timeout for a specific method
client.authentication.login_resource_token_api(..., request_options={
    "timeout_in_seconds": 1
})
```

### Custom Client

You can override the `httpx` client to customize it for your use-case. Some common use-cases include support for proxies
and transports.

```python
import httpx
from mmg import MMG

client = MMG(
    ...,
    httpx_client=httpx.Client(
        proxy="http://my.test.proxy.example.com",
        transport=httpx.HTTPTransport(local_address="0.0.0.0"),
    ),
)
```