SparkGlim Développeurs
Le bon identifiant pour chaque périmètre.
Lectures publiques, signatures Organisation et sessions Revendeur répondent à des modèles différents.
Clés et capacités
Copiez la valeur unique keyId:secret des paramètres Créateur. Les clés publiques utilisent x-white-label-key ; les clés privées restent sur votre serveur.
Domaines et origine des requêtes
Liez la signature au domaine vérifié, à la méthode, au chemin complet, à la requête canonique et aux octets exacts du corps. Utilisez un nonce frais à chaque tentative.
Nouvelles tentatives et idempotence
La tolérance temporelle est de cinq minutes. Nonces et clés d’idempotence comportent 16–128 lettres, chiffres, tirets ou soulignements. Une clé stable ne remplace pas un nonce frais.
Accès Revendeur
Le portail Revendeur utilise la session SparkGlim existante et la relation membre autorisée. Les routes publiques suivent leurs règles documentées, sans en-têtes de clé privée Organisation.
Requête illustrative avec valeurs fictives
import { createHash, createHmac, randomBytes } from 'node:crypto'
// Server-side only; this example signs but does not send a request.
const [keyId, secret] = process.env.SPARKGLIM_PRIVATE_KEY.split(':')
const domain = process.env.SPARKGLIM_VERIFIED_DOMAIN
const url = new URL('https://api.sparkglim.net/api/white-label/v1/context')
const timestamp = String(Date.now())
const nonce = randomBytes(16).toString('hex')
const method = 'GET'
const body = ''
const idempotencyKey = '' // Stable operation key for routes that require it.
const campaignKey = '' // Complete optional scoped campaign credential.
const pairs = [...url.searchParams.entries()].sort((a, b) =>
a[0] === b[0] ? a[1].localeCompare(b[1]) : a[0].localeCompare(b[0]))
const query = pairs.map(([key, value]) =>
encodeURIComponent(key) + '=' + encodeURIComponent(value)).join('&')
const pathname = url.pathname.replace(/\/$/, '') || '/'
const bodyHash = createHash('sha256').update(body).digest('hex')
const canonical = ['v2', domain, idempotencyKey, campaignKey,
timestamp, nonce, method, pathname, query, bodyHash].join('.')
const signature = createHmac('sha256', secret).update(canonical).digest('hex')
const headers = {
'x-white-label-domain': domain,
'x-white-label-key-id': keyId,
'x-white-label-signature-version': '2',
'x-white-label-timestamp': timestamp,
'x-white-label-nonce': nonce,
'x-white-label-signature': signature,
}
// For signed POST requests, hash the exact JSON string sent as the body.
// Add X-Idempotency-Key when required and include it in canonical.
// Never expose this private key or generated headers to a public client.