URL de base pour toutes les requêtes API
https://api.huntertechpay.com/api/v1/paymentshttps://sandbox-api.huntertechpay.com/api/v1/paymentsToutes les requêtes doivent être signées avec votre Secret Key
Important: Si vous utilisez nos SDKs officiels (Python, Node.js, PHP), l'authentification HMAC-SHA512 est gérée automatiquement. Cette section est pour les implémentations manuelles.
X-API-Key - Votre clé API publiqueX-Hunter-Signature - Signature HMAC-SHA512 du payloadX-Hunter-Timestamp - Timestamp UNIX de la requêteContent-Type - application/jsonimport hmac
import hashlib
import time
import json
# 1. Préparer les données
secret_key = "sk_live_your_secret_key"
payload = {
"amount": 10000,
"currency": "XAF",
"country": "CM",
"phone_number": "+237670000000",
"service_code": "HT_PAIEMENTMARCHAND_MTN_CM",
"partner_id": "ORDER-12345"
}
# 2. Générer timestamp
timestamp = str(int(time.time()))
# 3. Créer le message à signer
message = f"{timestamp}.{json.dumps(payload, separators=(',', ':'), sort_keys=True)}"
# 4. Calculer signature HMAC-SHA512
signature = hmac.new(
secret_key.encode(),
message.encode(),
hashlib.sha512
).hexdigest()
# 5. Envoyer la requête
headers = {
"X-API-Key": "htp_live_your_api_key",
"X-Hunter-Signature": signature,
"X-Hunter-Timestamp": timestamp,
"Content-Type": "application/json"
}Recevoir un paiement depuis un compte Mobile Money vers votre wallet marchand
Use Case: Le client paie depuis son compte Mobile Money (MTN, Orange, etc.) et l'argent est crédité sur votre wallet marchand après déduction des frais.
{
"amount": 10000, // Montant en centimes (100 = 1 XAF)
"currency": "XAF",
"country": "CM",
"phone_number": "+237670000000",
"service_code": "HT_PAIEMENTMARCHAND_MTN_CM",
"partner_id": "ORDER-12345",
"description": "Paiement commande #12345",
"callback_url": "https://votresite.com/webhook",
"metadata": {
"order_id": "12345",
"customer_email": "client@example.com"
}
}amount (required) - Montant en centimescurrency (required) - Code devise (XAF, XOF)country (required) - Code pays ISO (CM, CI, SN...)phone_number (required) - Numéro avec indicatif (+237...)service_code (required) - Code du service (voir /providers)partner_id (required) - Votre référence uniquecallback_url (optional) - URL pour recevoir les notificationsmetadata (optional) - Données additionnelles (JSON){
"success": true,
"transaction_id": "txn_abc123xyz",
"status": "pending",
"amount": 10000,
"currency": "XAF",
"partner_id": "ORDER-12345",
"created_at": "2026-03-24T10:30:00Z",
"message": "Transaction créée. Le client va recevoir une demande USSD."
}Envoyer de l'argent depuis votre wallet marchand vers un compte Mobile Money
Use Case: Envoyer de l'argent à un bénéficiaire (remboursement, paiement fournisseur, salaires, etc.). L'argent est débité de votre wallet et envoyé vers le Mobile Money.
{
"amount": 5000,
"currency": "XAF",
"country": "CM",
"phone_number": "+237690000000",
"service_code": "HT_PAIEMENTMARCHAND_ORANGE_CM",
"partner_id": "REFUND-789",
"description": "Remboursement client",
"callback_url": "https://votresite.com/webhook"
}{
"success": true,
"transaction_id": "txn_xyz789abc",
"status": "pending",
"amount": 5000,
"currency": "XAF",
"partner_id": "REFUND-789",
"created_at": "2026-03-24T11:00:00Z",
"message": "Retrait initié avec succès"
}Vérifier le statut d'une transaction par transaction_id ou partner_id
{
"reference": "ORDER-12345",
"reference_type": "partner_id" // ou "transaction_id"
}{
"success": true,
"transaction": {
"transaction_id": "txn_abc123xyz",
"partner_id": "ORDER-12345",
"status": "completed", // pending, completed, failed
"amount": 10000,
"currency": "XAF",
"operation_type": "cashin",
"phone_number": "+237670000000",
"provider": "MTN",
"created_at": "2026-03-24T10:30:00Z",
"completed_at": "2026-03-24T10:31:45Z",
"metadata": {
"order_id": "12345",
"customer_email": "client@example.com"
}
}
}pending - Transaction en courscompleted - Transaction réussiefailed - Transaction échouéeObtenir la liste des providers Mobile Money disponibles par pays
{
"success": true,
"country": "CM",
"providers": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "MTN Cameroun",
"code": "mtn",
"cashin_service_code": "HT_PAIEMENTMARCHAND_MTN_CM",
"cashout_service_code": "HT_PAIEMENTMARCHAND_MTN_CM",
"supports_cashin": true,
"supports_cashout": true,
"logo_url": "https://cdn.huntertechpay.com/logos/mtn.png",
"limits": {
"min_amount": 10000, // 100 XAF
"max_amount": 500000000 // 5,000,000 XAF
}
},
{
"id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"name": "Orange Money Cameroun",
"code": "orange",
"cashin_service_code": "HT_PAIEMENTMARCHAND_ORANGE_CM",
"cashout_service_code": "HT_PAIEMENTMARCHAND_ORANGE_CM",
"supports_cashin": true,
"supports_cashout": true,
"logo_url": "https://cdn.huntertechpay.com/logos/orange.png",
"limits": {
"min_amount": 10000,
"max_amount": 200000000
}
}
],
"total": 2
}Utilisez le champ cashin_service_code ou cashout_service_code dans vos requêtes de paiement selon l'opération.
Liste paginée de toutes vos transactions avec filtres
limit (optional, default: 20) - Nombre de résultatsoffset (optional, default: 0) - Paginationstatus (optional) - pending, completed, failedoperation_type (optional) - cashin, cashoutstart_date (optional) - Date début ISO 8601end_date (optional) - Date fin ISO 8601{
"success": true,
"transactions": [
{
"transaction_id": "txn_abc123",
"partner_id": "ORDER-12345",
"status": "completed",
"operation_type": "cashin",
"amount": 10000,
"currency": "XAF",
"phone_number": "+237670000000",
"provider": "MTN",
"created_at": "2026-03-24T10:30:00Z",
"completed_at": "2026-03-24T10:31:45Z"
}
],
"total": 150,
"limit": 20,
"offset": 0
}Consulter le solde disponible de votre wallet marchand
{
"success": true,
"balance": {
"available": 2500000, // 25,000 XAF disponible
"pending": 150000, // 1,500 XAF en attente
"currency": "XAF",
"last_updated": "2026-03-24T12:00:00Z"
}
}Recevez des notifications en temps réel sur le statut de vos transactions
Les webhooks vous permettent d'être notifié automatiquement lorsqu'une transaction change de statut (pending → completed/failed), sans avoir à faire du polling sur /check-status.
Configurez votre URL webhook dans le dashboard HunterTech Pay ou lors de la création de votre API Key. Exemple:
https://votresite.com/webhook/huntertechpay{
"event": "transaction.completed", // ou transaction.failed
"transaction": {
"transaction_id": "txn_abc123",
"partner_id": "ORDER-12345",
"status": "completed",
"operation_type": "cashin",
"amount": 10000,
"currency": "XAF",
"phone_number": "+237670000000",
"provider": "MTN",
"created_at": "2026-03-24T10:30:00Z",
"completed_at": "2026-03-24T10:31:45Z",
"metadata": {
"order_id": "12345"
}
},
"timestamp": "2026-03-24T10:31:46Z"
}Chaque webhook contient une signature HMAC-SHA512 dans les headers pour garantir son authenticité:
import hmac
import hashlib
from flask import request, jsonify
@app.route('/webhook/huntertechpay', methods=['POST'])
def handle_webhook():
# 1. Récupérer signature et timestamp
signature = request.headers.get('X-Hunter-Signature')
timestamp = request.headers.get('X-Hunter-Timestamp')
# 2. Récupérer le body
payload = request.get_data(as_text=True)
# 3. Recalculer la signature
message = f"{timestamp}.{payload}"
expected_signature = hmac.new(
SECRET_KEY.encode(),
message.encode(),
hashlib.sha512
).hexdigest()
# 4. Vérifier la signature
if signature != expected_signature:
return jsonify({"error": "Invalid signature"}), 401
# 5. Traiter le webhook
data = request.json
if data['event'] == 'transaction.completed':
# Mettre à jour votre base de données
update_order_status(data['transaction']['partner_id'], 'paid')
return jsonify({"success": True}), 200Liste complète des codes d'erreur et leur signification
Limites de taux pour protéger l'API
X-RateLimit-*Chaque réponse API inclut ces headers :
X-RateLimit-Limit - Limite totaleX-RateLimit-Remaining - Requêtes restantesX-RateLimit-Reset - Timestamp de réinitialisation