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.

1

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

Ouvrir le portail →

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

Demander un accès → Demander le DPA →
2

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_fr_18 age_strict_kr_19 age_strict_jp_20 age_strict_us_21 identity_basic identity_strict kyc_full

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.

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 : admin@altcheck.eu. Recours RGPD : dpo@altcheck.eu.

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