Ir a la documentación
SparkGlimSparkGlim Desarrolladores
Buscar en toda la documentación

Prueba un tema en tu idioma o una ruta API exacta.

    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

    API Organización Versión 1
    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.