daraja-sdk
A typed, async-first Python SDK for the M-Pesa Safaricom Daraja API.
Installation
pip install daraja-sdk
With Django support:
pip install daraja-sdk[django]
With FastAPI support:
pip install daraja-sdk[fastapi]
Quick start
from daraja_sdk import MpesaClient
async with MpesaClient(
consumer_key="...",
consumer_secret="...",
shortcode="174379",
passkey="...",
callback_url="https://yourdomain.com/mpesa/stk/callback/",
environment="sandbox",
) as client:
result = await client.stk_push(phone="0712345678", amount=100)
print(result)
Django
Add to INSTALLED_APPS and configure in settings.py:
INSTALLED_APPS = [
...
"daraja_sdk",
]
MPESA_CONSUMER_KEY = "..."
MPESA_CONSUMER_SECRET = "..."
MPESA_SHORTCODE = "174379"
MPESA_PASSKEY = "..."
MPESA_CALLBACK_URL = "https://yourdomain.com/mpesa/stk/callback/"
MPESA_ENV = "sandbox"
Include the SDK URLs:
from django.urls import include, path
urlpatterns = [
path("mpesa/", include("daraja_sdk.urls", namespace="daraja_sdk")),
]
Listen for successful payments via the signal:
from django.dispatch import receiver
from daraja_sdk.signals import payment_received
@receiver(payment_received)
def on_payment(sender, callback, **kwargs):
print(callback.phone, callback.amount, callback.mpesa_receipt_number)
FastAPI
from contextlib import asynccontextmanager
from fastapi import FastAPI
import daraja_sdk.fastapi as daraja_fastapi
from daraja_sdk import MpesaClient
from daraja_sdk.fastapi import router
@asynccontextmanager
async def lifespan(app):
daraja_fastapi.set_client(MpesaClient(...))
yield
app = FastAPI(lifespan=lifespan, redirect_slashes=False)
app.include_router(router)
@daraja_fastapi.on_payment_received
async def handle_payment(data: dict) -> None:
print(data["phone"], data["amount"], data["receipt"])
License
MIT
Metadata
Release files for daraja-sdk 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| daraja_sdk-0.1.0.tar.gz | 10.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| daraja_sdk-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 26.8 kB
Release files / daraja_sdk-0.1.0.tar.gz
| Download URL | daraja_sdk-0.1.0.tar.gz |
|---|---|
| Size | 10.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
914fe0e67bcf1a5645a4548e20eaf92c810ac019f12adb2dcf1f02746b0915b0
|
|
BLAKE2b-256 checksum How to use checksums |
624e5e7fe5a36106afa842915a323f44642f1f8dda99198be21d950abda38841
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/2.3.2 CPython/3.13.5 Darwin/25.2.0
|
Release files / daraja_sdk-0.1.0-py3-none-any.whl
| Download URL | daraja_sdk-0.1.0-py3-none-any.whl |
|---|---|
| Size | 16.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d4ad4b99ca034c6bf373da477d6939468f96d767f1258e21ba35a77c5d5b5abb
|
|
BLAKE2b-256 checksum How to use checksums |
ff50cb872e482e9d20ea955e9482035653d69426ce5e50118e298ef4ea0efa3c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/2.3.2 CPython/3.13.5 Darwin/25.2.0
|