Aller au contenu principal

SDK Python

SDK officiel Python pour l'API MonCréneau, publié sur PyPI.

Installation​

pip install moncreneau

Configuration​

from moncreneau import Moncreneau

client = Moncreneau('YOUR_API_KEY')

Avec options :

from moncreneau import Moncreneau

client = Moncreneau(
'YOUR_API_KEY',
base_url='https://mc-prd.duckdns.org/api/v1',
timeout=30
)

Avec variables d'environnement :

import os
from moncreneau import Moncreneau

client = Moncreneau(os.getenv('MONCRENEAU_API_KEY'))

Lister les départements​

from moncreneau import Moncreneau

client = Moncreneau('YOUR_API_KEY')

try:
departments = client.departments.list()

for dept in departments:
print(f"ID: {dept['id']} - {dept['name']}")

except Exception as e:
print(f"Erreur: {e}")

Créer un rendez-vous​

from moncreneau import Moncreneau, MoncreneauError

client = Moncreneau('YOUR_API_KEY')

try:
appointment = client.appointments.create(
department_id=5,
date_time='2026-02-15T10:00:00',
name='Amadou Diallo'
)

print('✅ Rendez-vous créé !')
print(f"ID: {appointment['id']}")
print(f"QR Code: {appointment['qrCode']}")
print(f"Statut: {appointment['status']}")

except MoncreneauError as e:
if e.code == 'INSUFFICIENT_CREDITS':
print(f'❌ Crédits insuffisants: {e.message}')
else:
print(f'❌ Erreur: {e.message}')

Vérifier la disponibilité d'un créneau​

Le backend vérifie un créneau précis (date_time), pas une plage de dates.

from moncreneau import Moncreneau

client = Moncreneau('YOUR_API_KEY')

try:
availability = client.departments.get_availability('5', '2026-02-15T10:00:00')

if availability['available']:
print('✅ Créneau disponible !')
print(f"Places restantes: {availability['remainingSlots']}")
else:
print('❌ Créneau indisponible')
print(f"Raison: {availability.get('unavailabilityReason')}")

except Exception as e:
print(f'Erreur: {e}')

Annuler un rendez-vous​

from moncreneau import Moncreneau

client = Moncreneau('YOUR_API_KEY')

try:
client.appointments.cancel('123')
print('✅ Rendez-vous annulé, 1 crédit remboursé')
except Exception as e:
print(f'❌ Erreur: {e}')

Intégration Django​

# settings.py
MONCRENEAU_API_KEY = os.getenv('MONCRENEAU_API_KEY')

# services.py
from django.conf import settings
from moncreneau import Moncreneau

class MoncreneauService:
def __init__(self):
self.client = Moncreneau(settings.MONCRENEAU_API_KEY)

def create_appointment(self, department_id: int, date_time: str, name: str):
return self.client.appointments.create(
department_id=department_id,
date_time=date_time,
name=name
)

def list_departments(self):
return self.client.departments.list()

# Singleton
moncreneau_service = MoncreneauService()
# views.py
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_http_methods
import json
from moncreneau import MoncreneauError
from .services import moncreneau_service

@csrf_exempt
@require_http_methods(["POST"])
def create_appointment(request):
data = json.loads(request.body)
try:
appointment = moncreneau_service.create_appointment(
department_id=data['departmentId'],
date_time=data['dateTime'],
name=data['name']
)
return JsonResponse(appointment, status=201)
except MoncreneauError as e:
status = 402 if e.code == 'INSUFFICIENT_CREDITS' else e.status_code
return JsonResponse({'error': e.message}, status=status)

Gestion des erreurs​

Il n'existe qu'une seule classe d'erreur, MoncreneauError — le code métier se distingue via .code :

from moncreneau import Moncreneau, MoncreneauError

client = Moncreneau('YOUR_API_KEY')

try:
appointment = client.appointments.create(
department_id=5,
date_time='2026-02-15T10:00:00',
name='Amadou Diallo'
)
except MoncreneauError as e:
if e.code == 'INSUFFICIENT_CREDITS':
print(f'Crédits insuffisants: {e.message}')
elif e.code == 'VALIDATION_ERROR':
print(f'Validation: {e.details}')
elif e.code == 'INVALID_API_KEY':
print('Clé API invalide')
else:
print(f'Erreur {e.code} (HTTP {e.status_code}): {e.message}')

Vérification des webhooks​

verify_webhook_signature est une méthode statique sur la classe Moncreneau, pas une méthode d'instance :

# Flask
from flask import Flask, request, jsonify
from moncreneau import Moncreneau
import os
import json

app = Flask(__name__)

@app.route('/webhooks/moncreneau', methods=['POST'])
def handle_webhook():
signature = request.headers.get('X-Moncreneau-Signature')
payload = request.get_data(as_text=True)

is_valid = Moncreneau.verify_webhook_signature(
payload,
signature,
os.getenv('WEBHOOK_SECRET')
)

if not is_valid:
return 'Invalid signature', 401

event = json.loads(payload)
print('Event:', request.headers.get('X-Moncreneau-Event'), event)

return jsonify({'received': True})

Voir Sécurité des webhooks pour le détail du format de signature.

Type hints​

Le SDK renvoie des Dict[str, Any] (pas d'objets typés dédiés) — les valeurs de retour se manipulent comme des dictionnaires standards (appointment['id'], pas appointment.id).