Authenticated endpoints require three HTTP headers:
x-user-api-key
La clé publique de votre jeton API
x-user-api-timestamp
Horodatage Unix sur 13 chiffres en millisecondes
x-user-api-signature
Signature HMAC-SHA256 hexadécimale en minuscules
Payload de signature
La signature est calculée en concaténant les valeurs suivantes avec des sauts de ligne :
<METHODE_HTTP>
<chemin de la requête>
<chaîne de requête brute (sans ?)>
<x-user-api-timestamp>
<sha256 hex du corps brut de la requête>
Règles de portée
read
Requêtes GET et HEAD uniquement
read_write
Requêtes GET, POST, PATCH et DELETE
Codes d'erreur
401 UNAUTHORIZED
Identifiants invalides ou manquants
401 INVALID_SIGNATURE
La vérification de la signature HMAC a échoué
401 INVALID_TIMESTAMP
L'horodatage de la requête est hors de la fenêtre de 5 minutes
403 INSUFFICIENT_SCOPE
Le jeton n'a pas la portée requise pour cette opération
403 IP_NOT_ALLOWED
L'IP de la requête ne figure pas dans la liste des IP autorisées du jeton
409 USER_ALIAS_REQUIRED
L'utilisateur doit d'abord créer un alias par défaut
Exemple de code (JavaScript)
const crypto = require('crypto');
function signRequest(method, path, queryString, body, timestamp, secret) {
const payload = [
method.toUpperCase(),
path,
queryString || '',
timestamp,
crypto.createHash('sha256').update(body || '').digest('hex')
].join('\n');
return crypto.createHmac('sha256', secret)
.update(payload)
.digest('hex');
}
const timestamp = Date.now().toString();
const signature = signRequest('GET', '/v1/me', '', '', timestamp, 'your-secret');