Authentification & signature
Headers, calcul du HMAC-SHA256 et exemples Node.js / PHP / cURL pour signer une requête vers l'API Merchant.
Chaque requête vers l'API Merchant porte trois headers obligatoires : ta clé publique, un timestamp, et une signature HMAC du contenu calculée avec ta clé secrète.
Récupérer tes clés
Connecte-toi sur https://app.intram.org/login
Menu Développeurs → API
Choisis le mode
SANDBOX(cléspk_sandbox_…) ouLIVE(cléspk_live_…)Tu obtiens 3 clés par environnement :
Clé publique
Envoyée dans le header X-Api-Key — identifie ton compte
Clé secrète
Ne sort jamais — sert à calculer la signature HMAC
Clé privée
Réservée à l'ancienne API (/api/v1/payments/request) ; pas utilisée par le Merchant API v1
Headers obligatoires
X-Api-Key: pk_live_a1b2c3d4…
X-Timestamp: 2026-05-20T10:30:00.000Z
X-Signature: sha256=<hex>Pour les mutations (POST / PUT / PATCH), ajoute :
Idempotency-Key: <UUID v4, 8 à 128 caractères [A-Za-z0-9_-]>
Content-Type: application/jsonX-Timestampdoit être en ISO 8601 UTC. Toute requête de plus de 5 minutes par rapport à l'heure serveur est rejetée (anti-replay).Idempotency-Keydoit être unique par requête métier. Voir Idempotency.
Construire la chaîne à signer
La signature couvre 5 champs séparés par \n :
timestamp
La valeur exacte du header X-Timestamp
METHOD
En MAJUSCULES : GET, POST, DELETE…
path
Le chemin après le rewrite Nginx, donc /api/v1/merchant/... (voir note ci-dessous)
sorted_query
Paires clé=valeur triées alphabétiquement, jointes par &. Chaîne vide si pas de query
raw_body
Le body JSON tel qu'envoyé (pas de re-sérialisation). Chaîne vide si GET / HEAD / DELETE
Puis HMAC-SHA256 de cette chaîne avec ta secret_key, encodé en hex, préfixé par sha256=.
Exemple Node.js complet
Exemple PHP
Exemple cURL
Codes d'erreur d'authentification
Code HTTP
code JSON
Cause
401
missing_api_key
Header X-Api-Key absent
401
invalid_api_key
Clé inconnue ou révoquée
401
signature_invalid
HMAC mauvais, timestamp hors fenêtre, ou header manquant
403
merchant_inactive
Compte marchand non validé
403
ip_not_allowed
L'IP appelante n'est pas dans la whitelist live
Mis à jour
Ce contenu vous a-t-il été utile ?