SparkGlim Programadores
A credencial certa para cada limite.
Leituras públicas, assinaturas de Organização e sessões de Revenda têm modelos distintos.
Chaves e capacidades
Copie o valor único keyId:secret nas definições de Criador. Chaves públicas usam x-white-label-key; privadas ficam no servidor.
Domínios e origem dos pedidos
Vincule a assinatura ao domínio verificado, método, caminho completo, consulta canónica e bytes exatos do corpo. Use um nonce novo em cada tentativa.
Repetições e idempotência
A tolerância temporal é de cinco minutos. Nonces e chaves usam 16–128 letras, números, hífenes ou sublinhados. Uma chave estável não substitui um nonce novo.
Acesso Revenda
O portal de revenda usa a sessão SparkGlim existente e a relação autorizada do membro. As rotas públicas seguem as suas regras, não cabeçalhos de chave privada Organização.
Pedido ilustrativo com valores de exemplo
typescript
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.