Intégration partenaire
Clé instantanée en self-service, ou accès entreprise négocié — dans les deux cas, l'intégration technique ci-dessous est identique. Trois appels HTTP, ~30 minutes, tout en serveur-vers-serveur.
Deux façons de commencer
Indépendant·e — clé instantanée
Auto-inscription, sans email ni carte bancaire. La clé est une clé sandbox : quelques vérifications réelles par jour, simulations illimitées.
curl -X POST https://api.altcheck.eu/portal/signup \
-H "Content-Type: application/json" \
-d '{"partner_name":"Ma marque","partner_domain":"mondomaine.com"}'
Réponse : api_key (montrée une seule fois — la stocker immédiatement) + un token de preuve de domaine.
Pour lever la limite quotidienne (tier prod), prouver le contrôle du domaine — une ligne DNS, ou un fichier, au choix :
# Option A — enregistrement TXT DNS
_altcheck.mondomaine.com TXT "altcheck-verify=<token>"
# Option B — fichier statique
https://mondomaine.com/.well-known/altcheck.txt
# contenu : <token>
curl -X POST https://api.altcheck.eu/portal/verify-domain \
-H "X-API-Key: altcheck_VOTRE_CLE"
Puis GET /portal/me confirme "tier": "prod" — quota levé, franchise mensuelle incluse (grille visible sur /portal/pricing).
Entreprise — accès négocié
Volumes élevés, conditions contractuelles, ou flow_id réglementaire (kyc_full, rétention 90 j) qui engage une convention de traitement (DPA) signée.
AltCheck active le compte en tier prod directement, sans limite d'essai, et transmet une clé altcheck_<hex> par un canal sécurisé.
Créer un ticket de vérification
Quand un visiteur souhaite accéder à une zone protégée, ton serveur crée un ticket et reçoit une URL à présenter au visiteur.
curl
curl -X POST https://api.altcheck.eu/partner/verifications \
-H "X-API-Key: altcheck_VOTRE_CLE" \
-H "Content-Type: application/json" \
-d '{"external_user_id":"user_42","flow_id":"age_strict_fr_18"}'
Python (requests)
import requests
r = requests.post(
"https://api.altcheck.eu/partner/verifications",
headers={"X-API-Key": "altcheck_VOTRE_CLE"},
json={"external_user_id": "user_42", "flow_id": "age_strict_fr_18"},
timeout=10,
)
r.raise_for_status()
ticket = r.json()
# {ticket_id, verification_url, expires_at, status, flow_id}
Node.js (fetch)
const r = await fetch("https://api.altcheck.eu/partner/verifications", {
method: "POST",
headers: {
"X-API-Key": "altcheck_VOTRE_CLE",
"Content-Type": "application/json",
},
body: JSON.stringify({
external_user_id: "user_42",
flow_id: "age_strict_fr_18",
}),
});
const ticket = await r.json();
Réponse 201 Created :
{
"ticket_id": "5a8e9...",
"verification_url": "https://api.altcheck.eu/static/visitor/?vt=5a8e9...",
"expires_at": "2026-06-18T12:00:00+00:00",
"status": "pending",
"flow_id": "age_strict_fr_18"
}
external_user_id est ton identifiant interne pour ce visiteur. flow_id détermine la politique de décision — celui-ci accompagne chaque ticket, aucune négociation requise pour les niveaux standards :
age_strict_* : majorité par juridiction (18/19/20/21 ans). identity_basic : selfie + photo de pièce. identity_strict : selfie + pièce recto/verso + selfie tenant la pièce. kyc_full : identité complète avec rétention 90 j — réservé à l'accès entreprise (§1), une conformité contractuelle l'accompagne.
Présenter au visiteur
Trois modes au choix, par ordre de robustesse :
- Popup (recommandé) :
window.open(verification_url, "AltCheck", "width=420,height=720"). Le visiteur garde ta page ouverte. Tu écoutespostMessagepour détecter la fin. - Redirect :
location.href = verification_urlavec une page de retour côté partenaire. Préférer si tu gères déjà des flows de redirection (OAuth, paiement). - iframe : possible mais déconseillé — les permissions caméra varient selon les navigateurs et les politiques cross-origin.
Récupérer l'outcome
Polling côté serveur, intervalle 2 secondes recommandé jusqu'à statut terminal (TTL ticket par défaut : 10 min).
curl https://api.altcheck.eu/partner/verifications/5a8e9... \
-H "X-API-Key: altcheck_VOTRE_CLE"
Statut pending tant que le visiteur n'a pas fini. Statut completed quand une décision est prise :
{
"ticket_id": "5a8e9...",
"status": "completed",
"outcome": {
"decision": "ADULT",
"is_adult": true,
"confidence": 0.92,
"jwt": "eyJhbGciOiJFZERTQSI..."
}
}
Autres statuts terminaux : expired (TTL atteint sans décision), cancelled (annulé via POST /partner/verifications/<id>/cancel).
Vérifier le JWT côté serveur
Le champ outcome.jwt est signé Ed25519. Récupérer la clé publique une fois, mettre en cache :
curl https://api.altcheck.eu/partner/pubkey
# {"public_key_pem": "-----BEGIN PUBLIC KEY-----\nMCowBQ..."}
Vérification avec une librairie EdDSA (PyJWT, jose, jsonwebtoken). Claims attendus :
{
"decision_id": "uuid-v4",
"decision": "ADULT",
"stage_decided": "prefilter_adult25",
"confidence": 0.92,
"partner_domain": "votredomaine.com",
"iat": 1718600000,
"exp": 1718600300,
"iss": "altcheck.eu",
"claims": {"age_gte_18": true}
}
TTL par défaut : 300 secondes. Vérifier exp et iss strictement côté serveur.
Sécurité
- La clé API ne doit jamais transiter par le navigateur. Tous les appels ci-dessus sont serveur-vers-serveur.
- Le JWT est destiné à ton serveur. Ne le relaie pas au client autrement que sous forme d'une session signée par toi.
- HTTPS obligatoire sur tous les endpoints.
- Conserve le
decision_id(présent dans le JWT) : il est requis pour toute demande RGPD ultérieure du visiteur. - Clé perdue ou compromise ? Remplace-la toi-même, sans attendre :
POST /portal/rotate-key(authentifié par ta clé actuelle) — l'ancienne meurt aussitôt.
Support
Questions techniques : admin@altcheck.eu. Recours RGPD : dpo@altcheck.eu.
Pour une demande de suppression d'un visiteur, joindre le decision_id issu du JWT.