Intégration partenaire

Trois appels HTTP, ~30 minutes d'intégration. Tous les appels sont serveur-vers-serveur, authentifiés par une clé API.

1. Obtenir une clé API

L'accès est ouvert manuellement (déploiement contrôlé). Le parcours :

  1. Demander un accès à admin@altcheck.eu en précisant secteur, niveau de vérification et volume estimé.
  2. Signer la convention de traitement (DPA) reçue par email, par accusé de réception à dpo@altcheck.eu.
  3. AltCheck active votre compte et vous transmet une clé altcheck_<hex> à stocker côté serveur uniquement. La clé n'est jamais récupérable : conservez-la dès réception.

Le flow_id associé (niveau de vérification) est fixé avec vous à l'activation ; vous pouvez aussi le préciser par ticket (cf. §2).

2. Créer un ticket de vérification

Quand un visiteur souhaite accéder à une zone protégée, votre 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 votre identifiant interne pour ce visiteur. flow_id détermine la politique de décision : age_strict_fr_18 (France/UE, 18 ans), age_strict_kr_19 (19), age_strict_jp_20 (20), age_strict_us_21 (US, 21), identity_basic (selfie + photo pièce), identity_strict (selfie + pièce recto/verso + selfie tenant la pièce), kyc_full (vérification complète). Le niveau accessible dépend de votre contrat.

3. Présenter au visiteur

Trois modes au choix, par ordre de robustesse :

4. 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).

5. 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é

Support

Questions techniques et recours RGPD : dpo@altcheck.eu.

Pour une demande de suppression d'un visiteur, joindre le decision_id issu du JWT.