API Reference
Billing Session API

API Billing Session

Émet un token de session signé pour le rail ADULT_BLIND. Réservé aux partenaires sur ce rail de conformité.

Cet endpoint est uniquement disponible pour les organisations configurées sur le rail ADULT_BLIND. Contactez tech@zykay.com pour activer ce mode.

Endpoint

POST https://app.zykay.com/api/billing/session

Authentification

Même signature HMAC que POST /v1/exchange — headers identiques :

HeaderRequisDescription
Content-TypeOuiapplication/json
x-partner-idOuiVotre Partner ID
x-partner-timestampOuiTimestamp Unix en secondes
x-partner-nonceOuiIdentifiant unique par requête (hex 32 chars recommandé)
x-partner-signatureOuiSignature HMAC-SHA256 (base64url)

La chaîne canonique et le calcul de signature sont identiques à ceux décrits dans API d'échange de Grant.

Corps de la requête

{
  "scopes": ["isAdult"],
  "origin": "https://votresite.com"
}
ChampTypeRequisDescription
originstringOuiURL d'origine de votre site (doit correspondre à votre domaine enregistré)
scopesstring[]NonScopes demandés. Défaut : ["isAdult"]. Disponible : isAdult, isFrench, isEU, isUnique

Réponse (201 Created)

{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "expires_in": 300
}
ChampTypeDescription
tokenstringToken signé (JWS). À transmettre au widget via data-session-token
expires_inintegerDurée de validité en secondes (toujours 300 = 5 minutes)
⚠️

Le token expire après 5 minutes. Appelez cet endpoint à chaque chargement de page — ne mettez pas le token en cache entre les requêtes.

Codes d'erreur

CodeHTTPDescriptionSolution
UNAUTHORIZED / INVALID_PARTNER401/403Signature HMAC invalide ou Partner ID inconnuVérifiez vos identifiants et le calcul de signature
FORBIDDEN_RAIL403L'organisation n'est pas sur le rail ADULT_BLINDContactez tech@zykay.com pour activer le rail
MISSING_BLIND_APP_ID400blindAppId non configuré pour l'organisationContactez le support ZYKAY
MISSING_ORIGIN400Le champ origin est absent du corpsIncluez "origin": "https://votresite.com"
INVALID_SCOPES400Scopes non supportés pour votre tierVérifiez les scopes disponibles pour votre niveau
INTERNAL_ERROR500Erreur serveurRéessayez avec backoff exponentiel

Limites de débit

PhaseLimiteFenêtreClé
Pré-auth (IP)30 req60sIP client
Post-auth (par partenaire)100 req60sPartner ID

La limite pré-auth protège contre les abus avant la vérification HMAC. La limite post-auth (100/min) est conçue pour le trafic serveur-à-serveur normal.

Clés publiques d'attestation (JWKS)

Pour vérifier les signatures d'attestation côté serveur sans appel API :

GET https://app.zykay.com/api/billing/attestation-keys

Réponse :

{
  "keys": [
    {
      "kty": "OKP",
      "crv": "Ed25519",
      "kid": "ak-2026-02",
      "x": "...",
      "use": "sig"
    }
  ]
}

Mettez en cache la réponse JWKS jusqu'à 1 heure. Les clés tournent rarement (tous les quelques mois). En cas de changement de clé, ZYKAY vous en informe à l'avance.

Structure du payload d'attestation

Une fois le JWS décodé et la signature vérifiée :

{
  "jti": "abc123...",
  "exp": 1708560000,
  "scope_mask": 1,
  "app_id": "blind_app_xxx",
  "origin_hash": "sha256_of_origin",
  "nullifier": "0x7a3b9c...",
  "aud": "zykay-verifier",
  "ver": "1.0"
}
ChampDescription
scope_maskBitmask des scopes vérifiés. Bit 0 = isAdult, bit 1 = isFrench, bit 2 = isEU, bit 3 = isUnique
nullifierIdentifiant unique respectant la vie privée (spécifique à votre app_id)
expExpiration Unix — vérifiez que exp > now()

Exemple complet

Voir le guide d'intégration complet : Sites Adultes (ADULT_BLIND)