JS SDK Reference

Referencia completa de @allsign/embedded — inspirado en Plaid Link moderno y Typeform Embed. Modelo client_secret-only: una sola credencial pública, efímera, scoped a una session.

Instalación

npm install @allsign/embedded

O vía CDN para proyectos sin bundler (disponible al publicar la v1):

<script src="https://js.allsign.io/v1.js" async></script>

Inicialización

import { AllSign } from '@allsign/embedded';

const session = AllSign.init({
  clientSecret: 'as_sess_xxx_secret_yyy',
  // callbacks y opciones (ver tabla más abajo)
});

El clientSecret es la única credencial que el frontend maneja. Es efímero (15 min), single-use y scoped a una sola firma — lo genera tu backend con POST /v2/signing-sessions usando tu secret key, y lo pasas al frontend. Tu secret key nunca sale del backend.


Modos de embedding

Todas las funciones de montaje son métodos del objeto session devuelto por AllSign.init(). Las opciones visuales (locale, theme, values) se pasan en init; los métodos de montaje solo reciben el contenedor o config de posicionamiento.

session.modal()

Abre un overlay fullscreen sobre tu aplicación. El más fácil de integrar — no necesitas un contenedor.

const session = AllSign.init({
  clientSecret: 'as_sess_xxx_secret_yyy',
  locale: 'es-MX',
  theme: { primaryColor: '#1a73e8' },
  onSuccess: (result) => { /* firmado */ },
  onExit: (metadata) => { /* cerró */ },
  onEvent: (event) => { /* progreso */ },
});

session.modal();

session.inline(container)

Monta el widget dentro de un elemento DOM que tú controlas. Ideal cuando la firma es parte de tu layout.

const session = AllSign.init({
  clientSecret: 'as_sess_xxx_secret_yyy',
  locale: 'es-MX',
  values: { nombre: 'Juan', rfc: 'ABC123' },
  onSuccess: (result) => { /* firmado */ },
});

session.inline('#firma-container');
<div id="firma-container" style="width: 100%; height: 600px;"></div>

El widget comunica su altura al parent y se auto-redimensiona para evitar doble scroll.

session.slider(options)

const session = AllSign.init({
  clientSecret: 'as_sess_xxx_secret_yyy',
  onSuccess: (result) => { /* firmado */ },
});

session.slider();

Opciones de AllSign.init()

Estas son todas las opciones que puedes pasar al crear la session:

ParámetroTipoRequeridoDefaultDescripción
clientSecretstringEl client_secret de tu Signing Session (creado en tu backend con POST /v2/signing-sessions)
locale'es-MX' | 'en-US''es-MX'Idioma de la interfaz
themeThemeOptionsPersonalización visual
valuesRecord<string, string>Pre-fill de variables del template desde el frontend
allowCancelbooleantrueReservado — sin efecto en la versión actual (0.3.x). El modal siempre permite cerrar (botón + click en el backdrop).
onSuccess(result: SigningResult) => voidSe dispara al instante en que el firmante completa su firma. El iframe NO se cierra aquí — muestra la vista post-firma; no lo destruyas si quieres que la vean
onExit(metadata: ExitMetadata) => voidSe dispara cuando la sesión termina (cualquier razón). Para 'completed' es diferido: ocurre cuando el firmante cierra la vista post-firma ("Cerrar")
onEvent(event: SigningEvent) => voidSe dispara en cada paso del flujo (OTP, IDV, firma)
onEvidence(evidence: SigningEvidence) => voidSe dispara cuando el PDF de evidencia está listo (todos firmaron). Trae downloadUrl presignado
onReady() => voidSe dispara cuando el widget terminó de cargar

ThemeOptions

PropiedadTipoDescripción
primaryColorstringColor principal — botones, links, acentos (hex)
backgroundColorstringColor de fondo del widget
buttonTextstringTexto del botón principal (default: "Firmar documento")
logostringURL de tu logo (se muestra en el header)

El hook para React elimina todo el boilerplate. Inspirado en usePlaidLink.

npm install @allsign/embedded
import { useAllSignLink } from '@allsign/embedded/react';

function SignButton({ clientSecret }) {
  const { open, ready, error } = useAllSignLink({
    clientSecret,
    mode: 'modal',  // 'modal' | 'slider'

    onSuccess: (result) => {
      // result.signatureId — UUID de la firma
      // result.documentId  — UUID del documento
      // result.signedAt    — timestamp ISO-8601
      console.log('Firmado:', result.signatureId);
    },

    onExit: (metadata) => {
      // metadata.reason — 'completed' | 'cancelled' | 'expired' | 'error'
      // metadata.lastStep — último paso completado ('otp', 'id_scan', 'signature')
      console.log('Salió en:', metadata.lastStep);
    },

    onEvent: (event) => {
      // Eventos granulares para analytics y UI
      // event.name — 'OTP_SENT', 'OTP_VERIFIED', 'ID_SCAN_STARTED',
      //              'ID_SCAN_COMPLETED', 'DOCUMENT_VIEWED',
      //              'SIGNATURE_DRAWN', 'SIGNATURE_SUBMITTED'
      // event.timestamp — ISO-8601
      // event.metadata — datos adicionales del paso
      console.log('Evento:', event.name);
    },
  });

  if (error) return <p>Error: {error.message}</p>;

  return (
    <button onClick={open} disabled={!ready}>
      Firmar documento
    </button>
  );
}

Hook API

PropiedadTipoDescripción
open() => voidAbre la sesión de firma
readybooleantrue cuando el SDK cargó y el clientSecret es válido
errorError | nullError de inicialización (secret inválido, expirado, etc.)

Callbacks detallados

onSuccess(result)

Se dispara cuando el firmante completó su firma. Úsalo para feedback instantáneo en tu UI.

interface SigningResult {
  signatureId: string;    // UUID de la firma
  documentId: string;     // UUID del documento
  signerEmail: string;    // Email del firmante
  signedAt: string;       // Timestamp ISO-8601
}

onExit(metadata)

Se dispara siempre que la sesión termina, sin importar la razón. Es tu "catch-all" para cleanup.

interface ExitMetadata {
  reason: 'completed' | 'cancelled' | 'expired' | 'error';
  lastStep: 'otp' | 'id_scan' | 'variables' | 'document_view' | 'signature' | null;
  sessionId: string;
  documentId: string;
  error?: {
    code: string;
    message: string;
  };
}

lastStep te dice exactamente dónde abandonó el firmante — útil para analytics y para mostrar el paso correcto si vuelve a intentar.

onEvent(event)

Se dispara en cada paso del flujo. Granular, ideal para analytics y para mostrar progreso en tu UI.

interface SigningEvent {
  name: string;        // Nombre del evento
  timestamp: string;   // ISO-8601
  metadata: Record<string, any>;
}

Eventos disponibles:

EventoCuándo se dispara
SESSION_STARTEDEl widget se montó y cargó
OTP_SENTSe envió el código OTP (si está configurado)
OTP_VERIFIEDEl firmante verificó su OTP
ID_SCAN_STARTEDInició escaneo de identificación
ID_SCAN_COMPLETEDEscaneo de INE completado
SELFIE_CAPTUREDSelfie capturada para face match
BIOMETRIC_VERIFIEDFace match exitoso (INE vs selfie)
VARIABLES_FILLEDEl firmante completó las variables del formulario
DOCUMENT_VIEWEDEl firmante vio el documento
SIGNATURE_DRAWNEl firmante dibujó su firma
SIGNATURE_SUBMITTEDLa firma se envió al servidor
SESSION_COMPLETEDTodo el flujo terminó exitosamente

Métodos de instancia

session.close()

Cierra la sesión de firma y destruye el iFrame.

const session = AllSign.init({ clientSecret: '...' });
session.inline('#container');

// Después...
session.close();

session.unmount()

Desmonta el widget del DOM sin cerrar la sesión. Útil para cleanup en React.

useEffect(() => {
  const session = AllSign.init({ clientSecret });
  session.inline('#container');
  return () => session.unmount();
}, [clientSecret]);

HTML Data Attributes (no-code) — no disponible aún


TypeScript

El SDK incluye tipos completos:

import type {
  AllSignSession,
  AllSignInitOptions,
  SigningResult,
  ExitMetadata,
  SigningEvent,
  ThemeOptions,
} from '@allsign/embedded';

import type {
  UseAllSignLinkOptions,
  UseAllSignLinkReturn,
} from '@allsign/embedded/react';

Manejo de errores

Los errores te llegan por dos canales: excepción síncrona de AllSign.init() (AllSignError, validación local) y metadata.error.code en onExit (errores en tiempo de ejecución dentro del iframe). Desde 0.3.0 el SDK exporta isRetryableError(code) / isTerminalError(code) para decidir la recuperación sin memorizar códigos:

import { AllSign, isRetryableError } from '@allsign/embedded';

const session = AllSign.init({
  clientSecret: '...',
  onExit: async (metadata) => {
    const code = metadata.error?.code;
    if (!code) return; // salida limpia (completada / cancelada por el firmante)

    if (isRetryableError(code)) {
      // Transitorio (NETWORK_ERROR, BACKEND_UNREACHABLE, INTERNAL_ERROR,
      // INIT_TIMEOUT, HTTP_5xx…): el MISMO client_secret sigue siendo
      // válido dentro de su ventana de 15 min — re-invoca init con backoff.
      setTimeout(() => reintentar(clientSecret), 2000);
    } else {
      // Terminal (SESSION_EXPIRED, SESSION_CANCELLED, ORIGIN_NOT_ALLOWED…):
      // pide a TU backend una sesión NUEVA y re-invoca init con el
      // client_secret fresco.
      refreshSession();
    }
  },
});

Códigos de error

La taxonomía completa — cada código con su HTTP, quién lo emite (SDK, proxy, backend o iframe), si es terminal o reintentable, y la acción recomendada — vive en Errores del flujo embebido. Los que verás con más frecuencia:

CódigoTipoDescripción
MISSING_CLIENT_SECRETTerminalNo pasaste clientSecret a AllSign.init().
SECRET_KEY_PASSED_AS_CLIENT_SECRETTerminalPasaste una secret key (allsign_live_sk_*) donde iba el client_secret — bug de seguridad, corrígelo.
SESSION_EXPIREDTerminalEl client_secret expiró (>15 min). Crea una sesión nueva en tu backend.
SESSION_INVALIDTerminalToken inválido o no reconocido por el servidor.
SESSION_COMPLETEDTerminalLa sesión ya se completó — trátalo como éxito.
ORIGIN_NOT_ALLOWEDTerminalTu origen no está en allowed_origins de la sesión.
NETWORK_ERRORReintentableFalla de red — reintenta con el mismo client_secret.
INTERNAL_ERRORReintentableError inesperado del lado de AllSign — reintenta; si persiste, sesión nueva + reporte.

Compatibilidad

BrowserVersión mínima
Chrome80+
Firefox78+
Safari14+
Edge80+
Mobile Safari (iOS)14+
Chrome Android80+

Siguiente paso

Was this page helpful?