Vérification d'identité par missed call — 0 FCFA, 5 secondes, 100% fiable
Intégrez FlashCall en moins de 10 minutes.
L'utilisateur entre son numéro → voit le numéro à appeler → appelle → est connecté. 0 FCFA, 5 secondes.
Copiez-collez ce code dans n'importe quelle page HTML. Le widget gère tout : saisie du numéro, création de session, affichage du numéro à appeler, polling, file d'attente, et callback final.
<!-- Conteneur du widget -->
<div id="flashcall-login"></div>
<!-- Widget FlashCall -->
<script src="https://flashcall.lagloiredeladernieremaison.org/assets/js/flashcall-widget.js"
data-public-key="pk_test_VOTRE_CLE_PUBLIQUE"
data-callback="onFlashCallVerified"
data-lang="fr"
data-theme="light"></script>
<!-- Callback appelé après vérification -->
<script>
function onFlashCallVerified(result) {
console.log('Numéro vérifié !', result);
// result = { session_id: "xxx", status: "verified" }
// → Redirigez l'utilisateur, créez sa session, etc.
window.location.href = '/dashboard';
}
</script>
Ce fichier détient votre clé secrète et fait le pont entre le widget et l'API. Voir le template complet.
| Attribut | Obligatoire | Description |
|---|---|---|
data-public-key | ✅ | Votre clé publique (pk_test_ ou pk_live_) |
data-callback | ✅ | Nom de la fonction JS appelée après vérification |
data-container | ❌ | ID du div conteneur (défaut: flashcall-login) |
data-lang | ❌ | fr ou en (défaut: fr) |
data-theme | ❌ | light ou dark (défaut: light) |
// Réinitialiser le widget
FlashCallWidget.reset();
// Lancer une vérification programmatique
FlashCallWidget.verify('699999999');
Toutes les requêtes vers /api/v1/ nécessitent votre clé secrète dans l'en-tête Authorization.
Authorization: Bearer sk_test_votre_cle_secrete
Deux environnements :
sk_test_... — Mode test (gratuit, illimité pour le développement)sk_live_... — Mode production (facturé selon votre plan)⚠️ La clé secrète ne doit jamais être exposée côté navigateur. Utilisez toujours un proxy côté serveur.
POST /api/v1/?action=create_session
| Paramètre | Type | Description |
|---|---|---|
phone | string | Numéro de téléphone (9 chiffres, sans indicatif) |
mode | string | inverted (recommandé) ou flash |
curl -X POST https://flashcall.lagloiredeladernieremaison.org/api/v1/ \
-H "Authorization: Bearer sk_test_xxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"phone": "699999999", "mode": "inverted"}'
{
"status": "initialized",
"session_id": "a1b2c3d4e5f6...",
"phone": "699999999",
"mode": "inverted",
"gateway_number": "+237 694 69 96 44",
"expires_in": 300,
"queue_position": 0
}
{
"status": "queued",
"session_id": "b2c3d4e5f6a1...",
"phone": "688888888",
"mode": "inverted",
"gateway_number": "+237 694 69 96 44",
"expires_in": 900,
"queue_position": 2
}
GET /api/v1/?action=status&session=SESSION_ID
Interrogez ce endpoint toutes les 3-4 secondes jusqu'à obtenir un statut final.
curl "https://flashcall.lagloiredeladernieremaison.org/api/v1/?action=status&session=a1b2c3d4..." \
-H "Authorization: Bearer sk_test_xxxxxxxx"
{
"session_id": "a1b2c3d4...",
"phone": "699999999",
"mode": "inverted",
"status": "verified",
"verified_at": "2026-08-21 15:30:00",
"queue_position": 0
}
| Statut | Description |
|---|---|
| queued | En file d'attente — pas encore actif |
| pending | Actif — en attente de l'appel de l'utilisateur |
| verified | ✅ Vérification réussie |
| failed | ❌ Échec (numéro non correspondant, timeout...) |
| expired | ⏰ Délai dépassé |
FlashCall gère automatiquement la concurrence. Si plusieurs utilisateurs se vérifient en même temps, ils sont placés en file d'attente.
queued avec leur position// Le widget gère tout automatiquement, mais si vous codez manuellement :
if (data.status === 'queued') {
// Afficher "Position X dans la file"
// Continuer à poller — le statut passera à 'pending' automatiquement
}
if (data.status === 'pending' && data.queue_position === 0) {
// C'est le tour de l'utilisateur — afficher le numéro à appeler
}
Dans le mode flash, c'est le gateway qui appelle l'utilisateur. L'utilisateur doit alors entrer les 4 derniers chiffres du numéro qui l'a appelé pour valider.
POST /api/v1/?action=validate_code
curl -X POST "https://flashcall.lagloiredeladernieremaison.org/api/v1/?action=validate_code" \
-H "Authorization: Bearer sk_test_xxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"session": "a1b2c3d4...", "code": "9644"}'
⚠️ Le mode flash nécessite du crédit sur la SIM gateway. Le mode inverted (recommandé) est 100% gratuit.
| Code HTTP | Signification | Action |
|---|---|---|
| 400 | Paramètres invalides | Vérifiez les champs envoyés |
| 401 | Clé API manquante ou invalide | Vérifiez votre clé secrète |
| 403 | Compte suspendu | Contactez le support |
| 404 | Session introuvable | Vérifiez le session_id |
| 405 | Méthode HTTP non autorisée | Utilisez POST ou GET selon l'endpoint |
| 429 | Rate limit dépassé | Attendez 5 minutes ou augmentez votre plan |
| 500 | Erreur serveur | Réessayez ou contactez le support |
| Endpoint | Limite | Fenêtre |
|---|---|---|
create_session | 30 requêtes | 5 min / client |
status | 120 requêtes | 5 min / client |
Ce fichier fait le pont entre le widget JS et l'API FlashCall. Il détient votre clé secrète. Copiez-le à la racine de votre site.
<?php
// flashcall-proxy.php — copiez ce fichier sur votre serveur
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type');
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(200); exit; }
// ⚠️ Remplacez par VOTRE clé secrète (sk_test_ ou sk_live_)
$SECRET = 'sk_test_VOTRE_CLE_SECRETE';
$API = 'https://flashcall.lagloiredeladernieremaison.org/api/v1/';
$method = $_SERVER['REQUEST_METHOD'];
$body = json_decode(file_get_contents('php://input'), true) ?: [];
if ($method === 'POST') {
// Crée une session
$ch = curl_init($API . '?action=create_session');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $SECRET,
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'phone' => $body['phone'],
'mode' => 'inverted',
]),
CURLOPT_TIMEOUT => 15,
]);
echo curl_exec($ch);
curl_close($ch);
exit;
}
if ($method === 'GET') {
// Vérifie le statut
$session = $_GET['session'] ?? '';
$ch = curl_init($API . '?action=status&session=' . urlencode($session));
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $SECRET],
CURLOPT_TIMEOUT => 15,
]);
echo curl_exec($ch);
curl_close($ch);
exit;
}
// 1. Créer une session
const res = await fetch('https://flashcall.lagloiredeladernieremaison.org/api/v1/', {
method: 'POST',
headers: {
'Authorization': 'Bearer sk_test_xxxxxxxx',
'Content-Type': 'application/json',
},
body: JSON.stringify({ phone: '699999999', mode: 'inverted' })
});
const session = await res.json();
console.log('Appelez:', session.gateway_number);
// 2. Polling du statut
const poll = setInterval(async () => {
const r = await fetch(
'https://flashcall.lagloiredeladernieremaison.org/api/v1/?action=status&session=' + session.session_id,
{ headers: { 'Authorization': 'Bearer sk_test_xxxxxxxx' } }
);
const status = await r.json();
if (status.status === 'verified') {
clearInterval(poll);
console.log('✅ Vérifié !');
}
}, 3000);
import requests, time
API = "https://flashcall.lagloiredeladernieremaison.org/api/v1/"
HEADERS = {"Authorization": "Bearer sk_test_xxxxxxxx", "Content-Type": "application/json"}
# 1. Créer une session
r = requests.post(f"{API}?action=create_session", json={"phone": "699999999", "mode": "inverted"}, headers=HEADERS)
session = r.json()
print(f"Appelez: {session['gateway_number']}")
# 2. Polling
while True:
r = requests.get(f"{API}?action=status&session={session['session_id']}", headers=HEADERS)
data = r.json()
if data["status"] == "verified":
print("✅ Vérifié !")
break
elif data["status"] in ("failed", "expired"):
print("❌ Échec")
break
time.sleep(3)
<?php
$API = 'https://flashcall.lagloiredeladernieremaison.org/api/v1/';
$KEY = 'sk_test_xxxxxxxx';
// 1. Créer une session
$ch = curl_init($API . '?action=create_session');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ["Authorization: Bearer $KEY", 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode(['phone' => '699999999', 'mode' => 'inverted']),
]);
$session = json_decode(curl_exec($ch), true);
curl_close($ch);
echo "Appelez: {$session['gateway_number']}\n";
// 2. Polling
while (true) {
$ch = curl_init($API . '?action=status&session=' . $session['session_id']);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ["Authorization: Bearer $KEY"],
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
if ($data['status'] === 'verified') { echo "✅ Vérifié !\n"; break; }
if (in_array($data['status'], ['failed', 'expired'])) { echo "❌ Échec\n"; break; }
sleep(3);
}
Créez votre compte gratuit et obtenez vos clés API en 30 secondes.
Créer un compte →