Documentation API

Vérification d'identité par missed call — 0 FCFA, 5 secondes, 100% fiable

Quick Start Widget JS Authentification Créer une session Vérifier le statut File d'attente Mode Flash Call Codes d'erreur Proxy PHP Exemples complets

🚀 Quick Start — 3 étapes

Intégrez FlashCall en moins de 10 minutes.

  1. Créez un compte sur /signup.php et récupérez vos clés API dans le dashboard.
  2. Copiez le proxy PHP sur votre serveur (voir section Proxy) — il détient votre clé secrète.
  3. Ajoutez le widget JS dans votre page de connexion (voir ci-dessous).

Résultat attendu

L'utilisateur entre son numéro → voit le numéro à appeler → appelle → est connecté. 0 FCFA, 5 secondes.

📱 Widget "Sign in with FlashCall"

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.

1. Le widget (côté navigateur)

<!-- 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>

2. Le proxy (côté serveur, 1 fichier PHP)

Ce fichier détient votre clé secrète et fait le pont entre le widget et l'API. Voir le template complet.

Attributs de configuration

AttributObligatoireDescription
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)

API JavaScript du widget

// Réinitialiser le widget
FlashCallWidget.reset();

// Lancer une vérification programmatique
FlashCallWidget.verify('699999999');

🔐 Authentification

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 :

⚠️ La clé secrète ne doit jamais être exposée côté navigateur. Utilisez toujours un proxy côté serveur.

📡 POST — Créer une session

POST /api/v1/?action=create_session

Paramètres

ParamètreTypeDescription
phonestringNuméro de téléphone (9 chiffres, sans indicatif)
modestringinverted (recommandé) ou flash

Exemple

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"}'

Réponse — session active immédiatement

{
  "status": "initialized",
  "session_id": "a1b2c3d4e5f6...",
  "phone": "699999999",
  "mode": "inverted",
  "gateway_number": "+237 694 69 96 44",
  "expires_in": 300,
  "queue_position": 0
}

Réponse — session en file d'attente

{
  "status": "queued",
  "session_id": "b2c3d4e5f6a1...",
  "phone": "688888888",
  "mode": "inverted",
  "gateway_number": "+237 694 69 96 44",
  "expires_in": 900,
  "queue_position": 2
}

🔄 GET — Vérifier le statut

GET /api/v1/?action=status&session=SESSION_ID

Interrogez ce endpoint toutes les 3-4 secondes jusqu'à obtenir un statut final.

Exemple

curl "https://flashcall.lagloiredeladernieremaison.org/api/v1/?action=status&session=a1b2c3d4..." \
  -H "Authorization: Bearer sk_test_xxxxxxxx"

Réponse

{
  "session_id": "a1b2c3d4...",
  "phone": "699999999",
  "mode": "inverted",
  "status": "verified",
  "verified_at": "2026-08-21 15:30:00",
  "queue_position": 0
}

Statuts possibles

StatutDescription
queuedEn file d'attente — pas encore actif
pendingActif — 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é

⏳ File d'attente

FlashCall gère automatiquement la concurrence. Si plusieurs utilisateurs se vérifient en même temps, ils sont placés en file d'attente.

Logique côté client

// 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
}

📞 Mode Flash Call

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.

⚠️ Codes d'erreur

Code HTTPSignificationAction
400Paramètres invalidesVérifiez les champs envoyés
401Clé API manquante ou invalideVérifiez votre clé secrète
403Compte suspenduContactez le support
404Session introuvableVérifiez le session_id
405Méthode HTTP non autoriséeUtilisez POST ou GET selon l'endpoint
429Rate limit dépasséAttendez 5 minutes ou augmentez votre plan
500Erreur serveurRéessayez ou contactez le support

Rate limits

EndpointLimiteFenêtre
create_session30 requêtes5 min / client
status120 requêtes5 min / client

🖥️ Proxy PHP (côté serveur)

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;
}

📚 Exemples complets

JavaScript (fetch)

// 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);

Python (requests)

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 (cURL)

<?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);
}

Prêt à intégrer FlashCall ?

Créez votre compte gratuit et obtenez vos clés API en 30 secondes.

Créer un compte →

FlashCall — Vérification par missed call pour le Cameroun 🇨🇲

Accueil · Démo · Dashboard