SparkGlim Desarrolladores
La credencial adecuada para cada límite.
Las lecturas públicas, las firmas de Organización y las sesiones de Revendedor tienen modelos distintos.
Claves y capacidades
Copie el valor único keyId:secret de ajustes de Creador. Las claves públicas van en x-white-label-key; las privadas permanecen en su servidor.
Dominios y origen de solicitudes
Vincule la firma al dominio verificado, método, ruta completa, consulta canónica y bytes exactos del cuerpo. Use un nonce nuevo en cada intento.
Reintentos e idempotencia
La tolerancia temporal es de cinco minutos. Nonces y claves de idempotencia usan 16–128 letras, números, guiones o guiones bajos. Una clave estable no sustituye un nonce nuevo.
Acceso Distribuidor
El portal de distribución usa la sesión SparkGlim existente y la relación autorizada del miembro. Las rutas públicas siguen sus reglas, no encabezados de clave privada de Organización.
Solicitud ilustrativa con valores de ejemplo
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.