Documentation API DES CONDAMNES
Introduction
L'API DES CONDAMNES permet d'accéder aux données des condamnés de manière sécurisée et performante. Cette API REST utilise JSON pour les réponses et requiert une authentification HMAC-SHA256 pour chaque requête.
URL de base
https://condamne.gouv.ml/api/v1
Format des réponses
Toutes les réponses sont au format JSON avec la structure suivante:
{
"success": true,
"data": { ... }
}
Authentification
L'API utilise une authentification basée sur HMAC-SHA256. Chaque requête doit inclure les headers suivants:
| Header | Description | Exemple |
|---|---|---|
X-API-Key |
Votre clé API publique | pk_xxxxxxxxxxxx |
X-Timestamp |
Timestamp Unix actuel | 1635789012 |
X-Nonce |
Valeur unique (32 caractères hex) | a1b2c3d4... |
X-Signature |
Signature HMAC-SHA256 | f7bc83f4... |
Génération de la signature
La signature est générée en suivant ces étapes:
- Concaténer:
api_key + timestamp + nonce + request_body - Calculer le HMAC-SHA256 avec votre API Secret
- Convertir en hexadécimal
$payload = $apiKey . $timestamp . $nonce . $requestBody;
$signature = hash_hmac('sha256', $payload, $apiSecret);
Endpoints
POST /condamne/search
Recherche un condamné dans la base.
Paramètres de requête
| Paramètre | Type | Requis | Description |
|---|---|---|---|
prenom |
string | Oui | |
nom |
string | Oui | |
date |
string | Oui | |
lieu |
string | non | |
sexe |
string | non | |
profession |
string | non | |
pere |
string | Oui | |
mere |
string | Oui | |
domicile |
string | non |
Exemple de requête
{
"numero": "12345678901234A"
}
Réponse succès (200)
{
"success": true,
"data": {
"numero": "12345678901234A",
"prenom": "Famoro",
"nom": "Karakoro",
"date_naissance": "15/01/1990",
"lieu_naissance": "Bamako",
"sexe": "M",
"profession": "Ingénieur",
"pere": "N'Tji Karakoro",
"mere": "Tifon Korokara"
}
}
Réponse non trouvé (404)
{
"success": false,
"message": "non trouvé"
}
Exemples de code
PHP
<?php
$apiKey = 'pk_xxxxxxxxxxxx';
$apiSecret = 'sk_xxxxxxxxxxxx';
$numero = '12345678901234A';
$timestamp = time();
$nonce = bin2hex(random_bytes(16));
$body = json_encode(['numero' => $numero]);
$payload = $apiKey . $timestamp . $nonce . $body;
$signature = hash_hmac('sha256', $payload, $apiSecret);
$ch = curl_init('https://condamne.gouv.ml/api/v1/NINA/search');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'X-API-Key: ' . $apiKey,
'X-Timestamp: ' . $timestamp,
'X-Nonce: ' . $nonce,
'X-Signature: ' . $signature
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
Python
import requests
import hashlib
import hmac
import time
import secrets
import json
api_key = 'pk_xxxxxxxxxxxx'
api_secret = 'sk_xxxxxxxxxxxx'
numero = '12345678901234A'
timestamp = str(int(time.time()))
nonce = secrets.token_hex(16)
body = json.dumps({'numero': numero})
payload = api_key + timestamp + nonce + body
signature = hmac.new(
api_secret.encode(),
payload.encode(),
hashlib.sha256
).hexdigest()
headers = {
'Content-Type': 'application/json',
'X-API-Key': api_key,
'X-Timestamp': timestamp,
'X-Nonce': nonce,
'X-Signature': signature
}
response = requests.post(
'https://condamne.gouv.ml/api/v1/NINA/search',
headers=headers,
data=body
)
result = response.json()
JavaScript (Node.js)
const crypto = require('crypto');
const axios = require('axios');
const apiKey = 'pk_xxxxxxxxxxxx';
const apiSecret = 'sk_xxxxxxxxxxxx';
const numero = '12345678901234A';
const timestamp = Math.floor(Date.now() / 1000);
const nonce = crypto.randomBytes(16).toString('hex');
const body = JSON.stringify({ numero });
const payload = apiKey + timestamp + nonce + body;
const signature = crypto
.createHmac('sha256', apiSecret)
.update(payload)
.digest('hex');
axios.post('https://condamne.gouv.ml/api/v1/NINA/search',
{ numero },
{
headers: {
'Content-Type': 'application/json',
'X-API-Key': apiKey,
'X-Timestamp': timestamp,
'X-Nonce': nonce,
'X-Signature': signature
}
}
).then(response => {
console.log(response.data);
}).catch(error => {
console.error(error.response.data);
});
Codes d'erreur
| Code | Message | Description |
|---|---|---|
| 400 | Bad Request | Requête invalide (paramètres manquants ou mal formatés) |
| 401 | Unauthorized | Authentification échouée (clé invalide ou signature incorrecte) |
| 403 | Forbidden | Accès refusé (IP non autorisée ou clé désactivée) |
| 404 | Not Found | Ressource non trouvée |
| 429 | Too Many Requests | Limite de requêtes dépassée |
| 500 | Internal Server Error | Erreur serveur interne |
Limites et quotas
Rate Limiting
Les limites de requêtes sont configurées par compte:
- 60 requêtes/minute
Headers de réponse
Chaque réponse inclut des headers indiquant votre utilisation:
X-RateLimit-Limit: Limite totaleX-RateLimit-Remaining: Requêtes restantesRetry-After: Secondes avant réinitialisation (si limite atteinte)