Saltar al contenido principal

Configuración JSON

Referencia completa para el archivo de configuración JSON — estructura raíz, tipos de pregunta, validaciones, condicionales y perfiles de firma.


Localización y defaults

La plataforma asume Colombia por defecto en varios tipos. Algunos aceptan override vía el atributo country; otros están fijos.

TipoDefaultOverride
currencyCOPNo soportado — siempre formatea en pesos colombianos
nitColombiaNo soportado — formato NIT colombiano fijo (XXXXXX-X)
identificationCOcountry: "MX" | "CL" | "SV" | ... (ver la sección Identificación más abajo)
phoneDetecta automáticamentecountry: "co" | "mx" | ... (ISO2 en minúscula)
departmentCOcountry: "CO" | "MX" | ...
dateEspañol, calendario gregorianoNo localizable — se renderiza como "15 de enero de 2024"
Mercados fuera de Colombia

Si tu caso de uso requiere USD u otro formato monetario, currency no es el tipo indicado — usa number y formatea el prefijo manualmente en el HTML. De forma similar, nit solo aplica a Colombia; para tax IDs de otros países usa text con una regex apropiada.


Propiedades Principales del Objeto Raíz

{
"name": "Mi Primera Automatización",
"preBuild": false,
"username": "usuario_ejemplo",
"config": [],
"signatureProfile": [],
"sign": []
}
PropiedadTipoRequeridoDescripción
namestringRequeridoNombre de la automatización
configarrayRequeridoArray de preguntas para el usuario
signatureProfilearrayRequeridoDefinición de firmantes y aprobadores
signarrayRequeridoNombres de preguntas obligatorias
preBuildbooleanOpcionalSi es true, incluye prellenado automático
usernamestringOpcionalNombre de usuario dueño de la plantilla
buildnumberGestionado por el servidorVersión de caché del SDK. No lo definas manualmente — el servidor lo incrementa automáticamente cuando actualizas la plantilla para invalidar la caché del SDK en clientes.

Propiedad preBuild — Prellenado Automático

Cuando preBuild es true, debes incluir preBuildData. Este campo habilita un prellenado automático de la plantilla: algunos campos se completan previamente para que el usuario solo termine de diligenciar el documento.

En preBuildData se declaran las preguntas que se prellenarán en esta primera instancia. El último elemento del arreglo debe ser el correo del usuario final, quien recibirá la solicitud de diligenciamiento por correo electrónico.

{
"preBuild": true,
"preBuildData": ["nombre_comprador", "email_comprador", "correo_usuario_final"]
}

config y sus tipos de preguntas

En esta sección se agregan todas las preguntas que debe diligenciar el usuario para generar el documento para firma.

info
  • Cada pregunta en config es un objeto con propiedades específicas. Siempre requiere name, description y type.
  • Las preguntas también pueden tener un valor por defecto añadiendo el atributo value (solo tiene sentido en clausula, select y searchlist).
{
"name": "identificador_unico",
"description": "Texto que ve el usuario",
"type": "tipo_pregunta"
}

Resumen de Tipos de Pregunta

TipoUI de entradaValor almacenadoRenderizado en el span
texttexto libre"str"tal cual
nametexto"str"EN MAYÚSCULAS
emailemail"lower@x.com"tal cual
phoneteléfono internacional"+573001234567"tal cual
numberentrada numérica"50000""50.000" (o con texto escrito si addText)
currencyentrada numérica"50000""$50.000 (CINCUENTA MIL PESOS)"
dateselector de fecha"2024-01-15""15 de enero de 2024"
nitentrada numérica"9001234567""900123456-7" (auto-formateado)
identificationpaís + tipo de doc + número"CC 1084340519" (dos partes)cadena completa
departmentdropdown territorial"Antioquia"tal cual
selectdropdown simple"valor_opcion"options[i].label coincidente
searchlistdropdown con búsqueda"valor_opcion"options[i].label coincidente
clausuladropdown con spans condicionales"valor_opcion"muestra <span name="pregunta_valor">
checkcheckboxes múltiplesselect: ["a","b"] arreglo"a, b" (unidos por coma)
imagesubida de archivodata URI base64<img src="..." class="object-contain"/>
signaturefirma dibujada / tipeadabase64 o cadena<img> o <span class="text-sign">
requesttexto + validación externa"str"tal cual (más los campos prellenados por el servicio)

request requiere integración adicional con un backend y se cubre en su propia página: consulta Tipo Request.


Texto Libre (text)

Acepta cualquier texto sin restricciones.

{
"name": "descripcion_producto",
"description": "Describa brevemente el producto",
"type": "text"
}

Soporta las validaciones maxlength y regex (ver Propiedades de Validación).


Nombre (name)

Igual a texto, pero convierte a mayúsculas automáticamente en el HTML.

{
"name": "nombre_comprador",
"description": "Ingrese su nombre completo",
"type": "name"
}
info

Ejemplo de salida:

  • Usuario ingresa: juan pérez
  • Se muestra en HTML: JUAN PÉREZ

Número (number)

Solo acepta valores numéricos. Se renderiza con separadores de miles.

{
"name": "cantidad_articulos",
"description": "¿Cuántos artículos desea?",
"type": "number"
}

Con texto escrito (addText):

{
"name": "cantidad_articulos",
"description": "¿Cuántos artículos desea?",
"type": "number",
"addText": true
}

Soporta límites numéricos min y max.

addTextUsuario ingresa 5000Se renderiza como
(omitir)50005.000
true50005.000 (CINCO MIL)

Moneda (currency)

Formatea automáticamente como moneda (pesos colombianos por defecto) con el monto escrito en letras.

{
"name": "monto_total",
"description": "Ingrese el valor en pesos",
"type": "currency"
}

Sin texto escrito (removeText):

{
"name": "monto_total",
"description": "Ingrese el valor en pesos",
"type": "currency",
"removeText": true
}
removeTextUsuario ingresa 50000Se renderiza como
(omitir)50000$50.000 (CINCUENTA MIL PESOS)
true50000$50.000

Correo Electrónico (email)

Valida que sea un email correcto.

{
"name": "email_comprador",
"description": "Ingrese su correo electrónico",
"type": "email"
}

Teléfono (phone)

Valida el número telefónico según el indicativo seleccionado.

{
"name": "telefono_comprador",
"description": "Ingrese su número telefónico",
"type": "phone"
}

Limitado a un país específico:

{
"name": "telefono_comprador",
"description": "Ingrese su teléfono colombiano",
"type": "phone",
"country": "co"
}

Cuando se define country, el input queda fijado al código de ese país.


Fecha (date)

Muestra un calendario para seleccionar una fecha.

{
"name": "fecha_entrega",
"description": "Seleccione la fecha de entrega",
"type": "date"
}

Soporta min, max, subYears, subDays y afterSubYears para restricciones de rango. Consulta Propiedades de Validación.


NIT (nit)

Entrada de NIT colombiano. Se formatea automáticamente como XXXXXX-X en el documento renderizado.

{
"name": "nit_empresa",
"description": "Ingrese el NIT de la empresa",
"type": "nit"
}
Usuario ingresaSe renderiza como
9001234567900123456-7
8301234830123-4

Identificación (identification)

Entrada estructurada de identificación del firmante. El usuario elige un país, un tipo de documento e ingresa el número. El valor almacenado tiene dos partes separadas por un espacio: "{TIPO_DOC} {NÚMERO}".

{
"name": "cedula_comprador",
"description": "Ingrese la identificación del comprador",
"type": "identification",
"country": "CO"
}
Acción del usuarioValor almacenadoRenderizado en el span
Elige CC, ingresa 1084340519"CC 1084340519"CC 1084340519
Elige CE, ingresa A0123456"CE A0123456"CE A0123456
Cuándo usarlo

Usa identification para documentos de firmantes en lugar de text o number. El runtime divide el valor en identificationType e identification al componer el perfil del firmante, lo cual es requerido para los flujos de verificación de identidad.

Países soportados: Colombia (CC, CE, PPT, DL, PASSPORT), México (CURP, PASSPORT), Chile (RUT, RUN, PASSPORT), El Salvador (DUI, PASSPORT), Costa Rica (CCCR, PASSPORT), Perú (DNI, PASSPORT), Uruguay (CI, PASSPORT), Venezuela (CI, PASSPORT), Honduras (DNI, PASSPORT), Panamá (CI, PASSPORT), España (DNI, PASSPORT), Ecuador (CI, PASSPORT), Aruba (CI, PASSPORT).


Departamento (department)

Dropdown de divisiones territoriales (departamentos / estados) para el país configurado. Por defecto Colombia.

{
"name": "departamento_comprador",
"description": "Seleccione el departamento del comprador",
"type": "department",
"country": "CO"
}

El valor almacenado es el nombre completo del departamento (p. ej. "Antioquia").


Lista Simple (select)

Dropdown simple. No activa visibilidad condicional de otras preguntas.

{
"name": "tipo_documento",
"description": "Seleccione el tipo de documento",
"type": "select",
"value": "cc",
"options": [
{ "name": "Cédula de Ciudadanía", "label": "Cédula de Ciudadanía", "value": "cc" },
{ "name": "Cédula de Extranjería", "label": "Cédula de Extranjería", "value": "ce" }
]
}

HTML correspondiente:

<span name="tipo_documento">_______________</span>

El SDK coloca automáticamente el label de la opción en el span.


Lista con Búsqueda (searchlist)

Dropdown con input de búsqueda. Idéntico a select en el JSON — solo cambia la UX. Úsalo cuando la lista tiene más de ~10 opciones.

{
"name": "pais_nacimiento",
"description": "Seleccione su país de nacimiento",
"type": "searchlist",
"options": [
{ "name": "Argentina", "label": "Argentina", "value": "AR" },
{ "name": "Brasil", "label": "Brasil", "value": "BR" }
]
}

El HTML es un único <span name="pais_nacimiento"> igual que select.


Lista de Cláusulas (clausula)

Dropdown con opciones predefinidas. Permite limitar otras preguntas vía prereq.

{
"name": "tipo_documento",
"description": "Seleccione el tipo de documento",
"type": "clausula",
"value": "cc",
"options": [
{ "name": "Cédula de Ciudadanía", "value": "cc" },
{ "name": "Cédula de Extranjería", "value": "ce" },
{ "name": "Pasaporte", "value": "pasaporte" }
]
}

HTML correspondiente:

<span name="tipo_documento_cc">C.C.</span>
<span name="tipo_documento_ce" hidden>C.E.</span>
<span name="tipo_documento_pasaporte" hidden>PASAPORTE</span>

Reglas:

  • Se crea un <span> por cada opción, con name = {nombre_pregunta}_{valor_opcion}.
  • El elemento que coincide con el value por defecto no debe tener hidden.
  • Todas las demás opciones deben tener hidden.
  • El SDK alterna la visibilidad a medida que el usuario selecciona distintas opciones.

Múltiples Opciones (check)

Campo de selección múltiple que se renderiza como una lista unida por comas.

{
"name": "servicios_incluidos",
"description": "Seleccione los servicios incluidos",
"type": "check",
"values": ["limpieza", "mantenimiento", "seguro"]
}
values es un arreglo de strings — NO options con objetos

El tipo check es el único tipo que usa un arreglo plano values: ["a", "b"] en lugar de una estructura options: [{...}]. Usar options aquí no renderizará nada.

Salida renderizada: <span name="servicios_incluidos">limpieza, mantenimiento</span> (si el usuario marca esas dos).


Imagen (image)

Input de subida de archivo (PNG o JPEG, máx. 8 MB). El valor almacenado es un data URI en base64, y el span se reemplaza por un elemento <img>.

{
"name": "foto_documento",
"description": "Suba una foto de su documento",
"type": "image"
}

HTML correspondiente:

<span name="foto_documento">___________</span>

Al diligenciar, el span se convierte en:

<span name="foto_documento"><img src="data:image/png;base64,..." class="object-contain"/></span>

Firma (signature)

Captura una firma dibujada en canvas o tipeada con una fuente tipo firma. Siempre obligatoria (no puede dejarse vacía).

{
"name": "firma_comprador",
"description": "Dibuje su firma",
"type": "signature",
"allow": ["draw", "font"]
}

El arreglo allow restringe los modos de captura disponibles para el usuario:

  • ["draw"] — solo dibujada a mano en canvas
  • ["font"] — solo tipeada en una fuente tipo firma
  • ["draw", "font"] — ambas permitidas
Tipo signature vs firma del firmante

Es distinto al placeholder de firma usado por signatureProfile. Usa preguntas signature cuando necesitas una segunda firma inline dentro del cuerpo del documento (p. ej., iniciales en cada cláusula). Para la firma principal del firmante usa <div id="comprador" class="sign-margin"> junto con signatureProfile — consulta Configuración del HTML.


Request (request)

Entrada de texto que valida su valor contra un endpoint HTTP externo y usa la respuesta para prellenar otros campos del documento.

Se cubre en una página dedicada porque requiere integración con backend: Tipo Request →.


Propiedades de Validación

Todos los tipos de pregunta soportan un conjunto de propiedades opcionales de validación para restringir la entrada del usuario.

PropiedadAplica aDescripción
maxlengthtext, name, phoneNúmero máximo de caracteres.
regexcualquier input de textoExpresión regular de JavaScript que debe cumplir el valor. Ejemplo: "^[A-Z]{3}\\d{3}$"
minnumber, currencyValor numérico mínimo (como string).
maxnumber, currency, dateValor numérico o de fecha máximo.
subYearsdateEdad mínima en años (p. ej. 18 significa que la fecha debe ser ≥ 18 años atrás).
subDaysdateDistancia mínima en días desde hoy.
afterSubYearsdateLa fecha debe estar al menos estos años en el futuro.
countryphone, identification, departmentCódigo ISO2 del país (p. ej. "CO", "MX").
groupQuestionnumberValida que un grupo de campos sume hasta un máximo. Ver abajo.

Ejemplo: fecha de nacimiento solo para mayores de edad

{
"name": "fecha_nacimiento",
"description": "Ingrese su fecha de nacimiento",
"type": "date",
"subYears": 18
}

Ejemplo: código alfanumérico estricto

{
"name": "codigo_referencia",
"description": "Ingrese el código de referencia (formato ABC-1234)",
"type": "text",
"regex": "^[A-Z]{3}-\\d{4}$",
"maxlength": 8
}

Ejemplo: groupQuestion (los campos deben sumar ≤ 100)

[
{
"name": "porcentaje_propietario",
"description": "Porcentaje del propietario",
"type": "number",
"groupQuestion": {
"id": "participacion",
"max": 100,
"errorMessage": "Los porcentajes no deben superar el 100%"
}
},
{
"name": "porcentaje_socio",
"description": "Porcentaje del socio",
"type": "number",
"groupQuestion": {
"id": "participacion",
"max": 100,
"errorMessage": "Los porcentajes no deben superar el 100%"
}
}
]

Todas las preguntas que comparten el mismo groupQuestion.id se validan en conjunto: su suma no debe superar max.


Preguntas Condicionales con prereq

La propiedad prereq controla la visibilidad condicional de una pregunta:

  • k (key): nombre de la pregunta de referencia
  • v (value): valor requerido en la pregunta de referencia para mostrar la pregunta actual

Estructura

"prereq": [
{ "k": "nombre_pregunta_referencia", "v": "valor_requerido" }
]

Varias entradas se combinan con AND (todas deben cumplirse).

Importante

La pregunta referenciada en k debe ser de tipo clausula. Solo clausula dispara visibilidad condicional.

Ejemplo Completo

[
{
"name": "tipo_documento",
"description": "Seleccione el tipo de documento del comprador",
"type": "clausula",
"value": "cc",
"options": [
{ "name": "Cédula de Ciudadanía", "value": "cc" },
{ "name": "Cédula de Extranjería", "value": "ce" }
]
},
{
"name": "numero_cc",
"description": "Ingrese el número de cédula de ciudadanía",
"type": "number",
"prereq": [{ "k": "tipo_documento", "v": "cc" }]
},
{
"name": "numero_ce",
"description": "Ingrese el número de cédula de extranjería",
"type": "number",
"prereq": [{ "k": "tipo_documento", "v": "ce" }]
}
]

prereqOptionals — Lógica OR

Para mostrar una pregunta cuando la referencia coincide con cualquiera de varios valores, usa prereqOptionals junto con prereq. Cada entrada tiene el formato {nombre_pregunta}_{valor_opcion}.

{
"name": "nit_empresa",
"description": "NIT de la empresa",
"type": "nit",
"prereq": [{ "k": "tipo_cliente", "v": "empresa" }],
"prereqOptionals": [
"tipo_cliente_empresa",
"tipo_cliente_consorcio"
]
}

La pregunta aparece cuando tipo_cliente es empresa o consorcio.


Perfiles de Firma (signatureProfile)

Define quiénes firman el documento y sus datos asociados. Este objeto no guarda los datos crudos del firmante — guarda referencias a las preguntas que contienen la información de cada firmante.

PropiedadTipoRequeridoDescripción
nameString | String[]RequeridoNombre de la pregunta con el nombre del firmante. Puede ser un arreglo de nombres de preguntas a concatenar (ver abajo).
identificationStringRequeridoNombre de la pregunta para la identificación. Puede tener múltiples opciones con |.
emailStringRequeridoNombre de la pregunta para el correo del firmante
phoneStringRequeridoNombre de la pregunta para el teléfono (recomendado para OTP)
typeStringRequeridoIdentificador único, usado como id (o name) en el Complete HTML

Ejemplo — Un Firmante

{
"name": "nombre_comprador",
"identification": "cedula_comprador",
"email": "email_comprador",
"phone": "telefono_comprador",
"type": "comprador"
}

Ejemplo — Múltiples Identificaciones

Si tienes varias preguntas de identificación (C.C, C.E, Pasaporte), sepáralas con | (pipe). El runtime toma la que tenga valor.

{
"name": "nombre_vendedor",
"identification": "cedula_vendedor|cedulae_vendedor|pasaporte_vendedor",
"email": "email_vendedor",
"phone": "telefono_vendedor",
"type": "vendedor"
}

Ejemplo — name como arreglo

Cuando el documento captura el nombre en varios campos (primer nombre + segundo nombre + apellido), pasa un arreglo de nombres de preguntas. El runtime los concatena con espacios.

{
"name": ["primer_nombre_comprador", "segundo_nombre_comprador", "apellido_comprador"],
"identification": "cedula_comprador",
"email": "email_comprador",
"phone": "telefono_comprador",
"type": "comprador"
}
Posicionamiento de firmas

Para la ubicación de los elementos <div> en el Complete HTML, consulta Configuración del HTML → Ubicación de Firmas.


Preguntas Obligatorias

La propiedad sign es un arreglo con los nombres de las preguntas que el usuario no puede saltar:

"sign": [
"nombre_comprador",
"email_comprador",
"cedula_comprador"
]
info
  • El usuario debe completar obligatoriamente las preguntas registradas en sign.
  • Las preguntas de tipo signature son obligatorias automáticamente — no necesitas listarlas en sign.

Diferencias Clave: clausula vs select vs searchlist

CaracterísticaClausulaSelectSearchlist
¿Dropdown?Sí, con input de búsqueda
Elementos HTML necesariosUn <span> por opciónUn <span>Un <span>
¿Puede limitar otras preguntas?✅ Sí❌ No❌ No
¿Referenciable en prereq.k?✅ Sí❌ No❌ No
Estructura de options{name, value}{name, label, value}{name, label, value}
Cantidad recomendada de opciones2–82–1010+