Pular para o conteúdo principal

Configuração JSON

Referência completa do arquivo de configuração JSON: estrutura raiz, tipos de perguntas, validações, condicionais e perfis de assinatura.


Localização e valores padrão​

A plataforma assume a Colômbia por padrão em vários tipos. Alguns aceitam uma substituição por meio do atributo country; outros são fixos.

TipoPadrãoSubstituição
currencyCOPNão suportado — sempre formatado como pesos colombianos
nitColômbiaNão suportado — formato NIT colombiano fixo (XXXXXX-X)
identificationCOcountry: "MX" | "CL" | "SV" | ... (veja a seção Identificação abaixo)
phoneDetecção automáticacountry: "co" | "mx" | ... (ISO2 em minúsculas)
departmentCOcountry: "CO" | "MX" | ...
dateEspanhol, calendário gregorianoNão localizável — é renderizado como "15 de enero de 2024"
Mercados não colombianos

Se o seu caso de uso exigir dólar americano ou outro formato de moeda, currency não é o tipo adequado: use number e formate o prefixo manualmente no HTML. Da mesma forma, nit se aplica somente à Colômbia; para identificadores fiscais de outros países, use text com um regex apropriado.


Propriedades principais do objeto raiz​

{
"name": "Minha primeira automação",
"description": "Contrato de serviços com um único signatário, para a equipe de vendas",
"preBuild": false,
"config": [],
"signatureProfile": [],
"sign": []
}
PropriedadeTipoObrigatórioDescrição
namestringObrigatórioNome da automação
descriptionstringOpcionalTexto que descreve o modelo, com até 500 caracteres. Apenas informativo: GET /template o retorna e ele não afeta o fluxo de preenchimento
configarrayObrigatórioArray de perguntas para o usuário
signatureProfilearrayObrigatórioDefinição dos signatários e aprovadores
signarrayObrigatórioNomes das perguntas obrigatórias
preBuildbooleanOpcionalSe true, inclui preenchimento automático
filesarrayOpcionalAnexos solicitados aos participantes com package: true. Veja Anexos
buildnumberGerenciado pelo servidorVersão do cache do SDK. Não o envie: a API rejeita a requisição se você o incluir. O servidor o incrementa automaticamente quando você atualiza o modelo, para invalidar o cache do SDK nos clientes.

Propriedade preBuild - Preenchimento automático​

Quando preBuild é true, você deve incluir preBuildData. Este campo habilita o preenchimento automático do modelo: alguns campos são completados antecipadamente para que o usuário só precise terminar de preencher o documento.

Em preBuildData, você declara as perguntas que serão preenchidas nesta primeira etapa. O último elemento do array deve ser o e-mail do usuário final, que receberá a solicitação de preenchimento por e-mail.

{
"preBuild": true,
"preBuildData": ["buyer_name", "buyer_email", "end_user_email"]
}

Anexos (files)​

Lista os documentos solicitados ao participante com package: true em signatureProfile: uma cópia do documento de identidade, um certificado, um comprovante.

"files": [
{ "name": "Cópia do documento de identidade", "approve": "pending" },
{ "name": "Certidão bancária", "approve": "pending", "optional": true },
{ "name": "Documento de identidade do cossignatário", "approve": "pending", "preReq": "has_cosigner" }
]
NomeTipoDescrição
nameString obrigatórioNome do documento, como o participante o vê.
approveString obrigatórioSempre "pending".
optionalBoolean opcionaltrue permite que o participante continue sem enviá-lo. Sem optional, o anexo é obrigatório.
preReqString opcionalNome de uma pergunta clausula de sim/não (opções s e n). O anexo só é solicitado se a resposta for s.

config e seus tipos de perguntas​

Nesta seção, são adicionadas todas as perguntas que o usuário deve preencher para gerar o documento para assinatura.

info
  • Cada pergunta em config é um objeto com propriedades específicas. Sempre exige name, description e type.
  • As perguntas também podem ter um valor padrão adicionando o atributo value (só faz sentido em clausula, select e searchlist).
{
"name": "unique_identifier",
"description": "Texto que o usuário vê",
"type": "question_type"
}

Resumo dos tipos de perguntas​

TipoInterface de entradaValor armazenadoRenderizado no span
texttexto livre"str"como está
nametexto"str"MAIÚSCULAS
emaile-mail"lower@x.com"como está
phonecampo de telefone internacional"+573001234567"como está
numbercampo numérico"50000""50,000" (ou com texto por extenso se addText)
currencycampo numérico"50000""$50,000 (CINQUENTA MIL PESOS)"
dateseletor de data"2024-01-15""15 de enero de 2024"
nitcampo numérico"9001234567""900123456-7" (formatado automaticamente)
identificationpaís + tipo de documento + número"CC 1084340519" (duas partes)string completa
departmentlista suspensa territorial"Antioquia"como está
selectlista suspensa simples"option_value"options[i].label correspondente
searchlistlista suspensa com busca"option_value"options[i].label correspondente
clausulalista suspensa com spans condicionais"option_value"mostra <span name="question_value">
checkmúltiplas caixas de seleçãoarray select: ["a","b"]"a, b" (separados por vírgula)
imageupload de arquivodata URI em base64<img src="..." class="object-contain"/>
signatureassinatura desenhada / digitadabase64 ou string<img> ou <span class="text-sign">
requestcampo de texto + validação externa"str"como está (mais os campos preenchidos pelo serviço)

request exige uma integração adicional no back-end e é tratado em sua própria página: veja Tipo Request.


Texto livre (text)​

Aceita qualquer texto sem restrições.

{
"name": "product_description",
"description": "Descreva brevemente o produto",
"type": "text"
}

Suporta as validações maxlength e regex (veja Propriedades de validação).


Nome (name)​

Igual a text, mas converte automaticamente para maiúsculas no HTML.

{
"name": "buyer_name",
"description": "Informe seu nome completo",
"type": "name"
}
info

Exemplo de resultado:

  • O usuário digita: john doe
  • Exibido no HTML: JOHN DOE

Número (number)​

Aceita apenas valores numéricos. Renderizado com separadores de milhar.

{
"name": "items_quantity",
"description": "Quantos itens você deseja?",
"type": "number"
}

Com texto por extenso (addText):

{
"name": "items_quantity",
"description": "Quantos itens você deseja?",
"type": "number",
"addText": true
}

Suporta os limites numéricos min e max.

addTextO usuário digita 5000Renderizado como
(omitir)50005,000
true50005,000 (CINCO MIL)

Moeda (currency)​

Formata automaticamente como moeda (pesos colombianos por padrão) com o valor por extenso.

{
"name": "total_amount",
"description": "Informe o valor em pesos",
"type": "currency"
}

Sem texto por extenso (removeText):

{
"name": "total_amount",
"description": "Informe o valor em pesos",
"type": "currency",
"removeText": true
}
removeTextO usuário digita 50000Renderizado como
(omitir)50000$50,000 (CINQUENTA MIL PESOS)
true50000$50,000

E-mail (email)​

Valida que se trata de um e-mail correto.

{
"name": "buyer_email",
"description": "Informe seu endereço de e-mail",
"type": "email"
}

Telefone (phone)​

Valida o número de telefone de acordo com o código de país selecionado.

{
"name": "buyer_phone",
"description": "Informe seu número de telefone",
"type": "phone"
}

Específico de um país:

{
"name": "buyer_phone",
"description": "Informe seu telefone colombiano",
"type": "phone",
"country": "co"
}

Quando country é definido, o campo fica travado no código de discagem desse país.


Data (date)​

Exibe um calendário para selecionar uma data.

{
"name": "delivery_date",
"description": "Selecione a data de entrega",
"type": "date"
}

A partir de hoje (min: "now"):

{
"name": "delivery_date",
"description": "Selecione a data de entrega",
"type": "date",
"min": "now"
}

Com min: "now", o calendário abre com a data de hoje já selecionada e não permite datas passadas.

Suporta min, max, subYears, subDays e afterSubYears para restrições de intervalo. Veja Propriedades de validação.


NIT (nit)​

Campo de identificação fiscal colombiana. Formata automaticamente como XXXXXX-X no documento renderizado.

{
"name": "company_tax_id",
"description": "Informe o NIT da empresa",
"type": "nit"
}
O usuário digitaRenderizado como
9001234567900123456-7
8301234830123-4

Identificação (identification)​

Campo estruturado de identificação do signatário. O usuário escolhe um país, um tipo de documento e informa o número. O valor armazenado tem duas partes separadas por um espaço: "{ID_TYPE} {NUMBER}".

{
"name": "buyer_id",
"description": "Informe a identificação do comprador",
"type": "identification",
"country": "CO"
}
Ação do usuárioValor armazenadoRenderizado no span
Escolhe CC, informa 1084340519"CC 1084340519"CC 1084340519
Escolhe CE, informa A0123456"CE A0123456"CE A0123456
Quando usar

Use identification para os documentos dos signatários em vez de text ou number. O runtime divide o valor em identificationType e identification ao compor o perfil do signatário, o que é necessário para os fluxos de verificação de identidade.

Países suportados: Colômbia (CC, CE, PPT, DL, PASSPORT), México (CURP, PASSPORT), Chile (RUT, RUN, PASSPORT), El Salvador (DUI, PASSPORT), Costa Rica (CCCR, PASSPORT), Peru (DNI, PASSPORT), Uruguai (CI, PASSPORT), Venezuela (CI, PASSPORT), Honduras (DNI, PASSPORT), Panamá (CI, PASSPORT), Espanha (DNI, PASSPORT), Equador (CI, PASSPORT), Aruba (CI, PASSPORT).


Departamento (department)​

Lista suspensa de divisões territoriais (departamentos / estados) do país configurado. Colômbia por padrão.

{
"name": "buyer_department",
"description": "Selecione o departamento do comprador",
"type": "department",
"country": "CO"
}

O valor armazenado é o nome completo do departamento (por exemplo, "Antioquia").


Lista simples (select)​

Lista suspensa simples. Não aciona a visibilidade condicional de outras perguntas.

{
"name": "document_type",
"description": "Selecione o tipo de documento",
"type": "select",
"value": "id_card",
"options": [
{ "name": "Documento nacional de identidade", "label": "Documento nacional de identidade", "value": "id_card" },
{ "name": "Documento de estrangeiro", "label": "Documento de estrangeiro", "value": "foreign_id" }
]
}

HTML correspondente:

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

O SDK coloca automaticamente o label da opção no span.


Lista com busca (searchlist)​

Lista suspensa com campo de busca. Idêntica a select no JSON — só a experiência de uso muda. Use quando a lista tiver mais de ~10 opções.

{
"name": "country_of_birth",
"description": "Selecione seu país de nascimento",
"type": "searchlist",
"options": [
{ "name": "Argentina", "label": "Argentina", "value": "AR" },
{ "name": "Brasil", "label": "Brasil", "value": "BR" }
]
}

O HTML é um único <span name="country_of_birth">, assim como em select.


Lista de cláusulas (clausula)​

Lista suspensa com opções predefinidas. Permite limitar outras perguntas por meio de prereq.

{
"name": "document_type",
"description": "Selecione o tipo de documento",
"type": "clausula",
"value": "id_card",
"options": [
{ "name": "Documento nacional de identidade", "value": "id_card" },
{ "name": "Documento de estrangeiro", "value": "foreign_id" },
{ "name": "Passaporte", "value": "passport" }
]
}

HTML correspondente:

<span name="document_type_id_card">Documento de identidade</span>
<span name="document_type_foreign_id" hidden>Documento de estrangeiro</span>
<span name="document_type_passport" hidden>Passaporte</span>

Regras:

  • É criado um <span> por opção, com name = {question_name}_{option_value}.
  • O elemento correspondente ao value padrão não deve ter hidden.
  • Todas as outras opções devem ter hidden.
  • O SDK alterna a visibilidade conforme o usuário escolhe opções diferentes.

Múltiplas caixas de seleção (check)​

Campo de múltipla escolha renderizado como uma lista separada por vírgulas.

{
"name": "included_services",
"description": "Selecione os serviços incluídos",
"type": "check",
"values": ["cleaning", "maintenance", "insurance"]
}
values é um array de strings — NÃO options com objetos

O tipo check é o único que usa um array simples values: ["a", "b"] em vez de uma estrutura options: [{...}]. Usar options aqui não renderizará nada.

Resultado renderizado: <span name="included_services">cleaning, maintenance</span> (se o usuário marcar essas duas).


Imagem (image)​

Campo de upload de arquivo (PNG ou JPEG, máx. 8 MB). O valor armazenado é uma data URI em base64, e o span é substituído por um elemento <img>.

{
"name": "id_photo",
"description": "Envie uma foto do seu documento de identidade",
"type": "image"
}

HTML correspondente:

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

Depois de preenchido, o span se torna:

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

Assinatura (signature)​

Captura uma assinatura desenhada em canvas ou digitada com uma fonte de estilo assinatura. Sempre obrigatória (não pode ficar em branco).

{
"name": "buyer_signature",
"description": "Desenhe sua assinatura",
"type": "signature",
"allow": ["draw", "font"]
}

O array allow restringe os modos de captura disponíveis para o usuário:

  • ["draw"] — somente desenhada à mão no canvas
  • ["font"] — somente digitada com uma fonte de estilo assinatura
  • ["draw", "font"] — ambos permitidos
Tipo signature vs assinatura do signatário

Isto é diferente do espaço de assinatura usado por signatureProfile. Use perguntas signature quando precisar de uma segunda assinatura em linha dentro do corpo do documento (por exemplo, rubricas em cada cláusula). Para a assinatura principal do signatário, use <div name="buyer" class="sign-margin"> junto com signatureProfile — veja Configuração HTML.

A exceção é a assinatura no ato: se você referenciar a pergunta em signatureProfile[].signature, essa assinatura passa a ser a do próprio signatário, capturada dentro do formulário. Veja Perfis de assinatura.


Request (request)​

Campo de texto que valida seu valor em um endpoint HTTP externo e usa a resposta para preencher outros campos do documento.

Tratado em uma página dedicada porque exige integração no back-end: Tipo Request →.


Propriedades de validação​

Todos os tipos de perguntas suportam um conjunto de propriedades de validação opcionais para restringir a entrada do usuário.

PropriedadeTipoAplica-se aDescrição
maxlengthNumber (inteiro ≥ 1)text, name, email, nit, request, phoneNúmero máximo de caracteres.
regexStringqualquer campo de textoRegex JavaScript com a qual o valor deve corresponder. Exemplo: "^[A-Z]{3}\\d{3}$"
minString ou Numbernumber, currency, dateEm number e currency, valor mínimo. Em date, data mínima ("2024-01-15") ou "now": pré-seleciona a data de hoje e bloqueia datas passadas.
maxString ou Numbernumber, currency, dateEm number e currency, valor máximo. Em date, data máxima ("2024-12-31").
subYearsNumber (inteiro ≥ 0)dateIdade mínima em anos (por exemplo, 18 significa que a data deve ser de pelo menos 18 anos atrás).
subDaysNumber (inteiro ≥ 0)dateA data deve ser anterior a hoje em pelo menos essa quantidade de dias.
afterSubYearsNumber (inteiro ≥ 0)dateA data não pode ser anterior a essa quantidade de anos atrás (por exemplo, 5 bloqueia datas com mais de 5 anos).
addTextBooleannumberAdiciona o valor escrito por extenso: 5.000 (CINCO MIL). Veja Número.
countryStringphone, identification, departmentCódigo de país ISO2 (por exemplo, "CO", "MX").
allowArray<String>signatureModos de captura permitidos: "draw", "font" ou ambos. Pelo menos um. Veja Assinatura.
groupQuestionObjectnumberValida que um grupo de campos some, no máximo, um valor: id e max obrigatórios, errorMessage opcional. Veja abaixo.
Um atributo desconhecido faz o modelo inteiro ser rejeitado

A API valida cada pergunta contra uma lista fechada de atributos: os desta tabela, mais name, description, type, value, help, options, select, values, endpoint, removeText, prereq e prereqOptionals. Se uma pergunta tiver qualquer outro atributo —um nome escrito errado, como maxLength—, POST e PUT /template respondem 400 e não salvam nada. O mesmo acontece com um valor fora do intervalo, como um maxlength igual a 0 ou um allow vazio.

Exemplo: data de nascimento somente para maiores de idade​

{
"name": "birth_date",
"description": "Informe sua data de nascimento",
"type": "date",
"subYears": 18
}

Exemplo: código alfanumérico estrito​

{
"name": "reference_code",
"description": "Informe o código de referência (formato ABC-1234)",
"type": "text",
"regex": "^[A-Z]{3}-\\d{4}$",
"maxlength": 8
}

Exemplo: groupQuestion (os campos devem somar ≤ 100)​

[
{
"name": "owner_percentage",
"description": "Porcentagem do proprietário",
"type": "number",
"groupQuestion": {
"id": "ownership",
"max": 100,
"errorMessage": "As porcentagens não devem exceder 100%"
}
},
{
"name": "partner_percentage",
"description": "Porcentagem do sócio",
"type": "number",
"groupQuestion": {
"id": "ownership",
"max": 100,
"errorMessage": "As porcentagens não devem exceder 100%"
}
}
]

Todas as perguntas que compartilham o mesmo groupQuestion.id são validadas em conjunto: a soma delas não deve exceder max.


Perguntas condicionais com prereq​

A propriedade prereq controla a visibilidade condicional de uma pergunta:

  • k (key): nome da pergunta de referência
  • v (value): valor exigido na pergunta de referência para exibir a pergunta atual

Estrutura​

"prereq": [
{ "k": "reference_question_name", "v": "required_value" }
]

Várias entradas são combinadas com E (todas devem corresponder).

Importante

A pergunta referenciada em k deve ser do tipo clausula. Somente clausula aciona a visibilidade condicional.

Exemplo completo​

[
{
"name": "document_type",
"description": "Selecione o tipo de documento do comprador",
"type": "clausula",
"value": "id_card",
"options": [
{ "name": "Documento nacional de identidade", "value": "id_card" },
{ "name": "Documento de estrangeiro", "value": "foreign_id" }
]
},
{
"name": "id_card_number",
"description": "Informe o número do documento nacional de identidade",
"type": "number",
"prereq": [{ "k": "document_type", "v": "id_card" }]
},
{
"name": "foreign_id_number",
"description": "Informe o número do documento de estrangeiro",
"type": "number",
"prereq": [{ "k": "document_type", "v": "foreign_id" }]
}
]

prereqOptionals — lógica OU​

Para exibir uma pergunta quando a referência corresponder a qualquer um de vários valores, use prereqOptionals junto com prereq. Cada entrada tem o formato {question_name}_{option_value}.

{
"name": "company_tax_id",
"description": "NIT da empresa",
"type": "nit",
"prereq": [{ "k": "client_type", "v": "company" }],
"prereqOptionals": [
"client_type_company",
"client_type_consortium"
]
}

A pergunta aparece quando client_type é company ou consortium.


Perfis de assinatura (signatureProfile)​

Define quem assina o documento e seus dados associados. Este objeto não armazena os dados brutos dos signatários — ele armazena referências às perguntas que contêm as informações de cada signatário.

NomeTipoDescrição
nameString obrigatórioNome da pergunta que contém o nome do signatário.
identificationString opcionalNome da pergunta de identificação. Várias opções permitidas com |.
emailString condicionalNome da pergunta email que contém o e-mail do signatário, ou de um campo preFill. Envie email, phone ou ambos, a menos que o signatário tenha signature.
phoneString condicionalNome da pergunta phone que contém o telefone do signatário (recomendado para OTP), ou de um campo preFill. Envie email, phone ou ambos, a menos que o signatário tenha signature.
typeString obrigatórioIdentificador único do signatário. É o name do espaço de assinatura do signatário no HTML Completo: <div name="…" class="sign-margin">.
roleString opcional"APPROVER" faz o participante aprovar o documento em vez de assiná-lo. Sem role, ele é signatário.
orderNumber opcionalTurno de assinatura. Com order, a assinatura é sequencial: o participante recebe o convite depois que os de turno anterior assinarem.
packageBoolean opcionaltrue se forem solicitados anexos a este participante. O modelo deve declarar quais em files.
countryString opcionalUm valor fixo, não o nome de uma pergunta: código ISO2 do país do documento do signatário (por exemplo, "CO"). Use junto com identificationType quando a identificação for solicitada com uma pergunta que não seja do tipo identification, que já traz país e tipo.
identificationTypeString opcionalUm valor fixo, não o nome de uma pergunta: o tipo de documento do signatário (por exemplo, "CC"). Mesmo caso de country.
signatureString opcionalNome de uma pergunta type: "signature" em config que o signatário usa para assinar dentro do formulário (assinatura no ato). Com signature, email e phone deixam de ser obrigatórios.
name é uma única pergunta

name deve ser uma string. A API rejeita um array de nomes de perguntas com "signatureProfile[0].name" must be a string. Se o documento coletar o nome em vários campos (primeiro nome, nome do meio, sobrenome), adicione uma pergunta name que peça o nome completo e use-a como name do signatário.

Exemplo - Um signatário​

{
"name": "buyer_name",
"identification": "buyer_id",
"email": "buyer_email",
"phone": "buyer_phone",
"type": "buyer"
}

Exemplo - Várias identificações​

Se você tiver várias perguntas de identificação (documento de identidade, documento de estrangeiro, passaporte), separe-as com | (pipe). O runtime escolhe a que tiver valor.

{
"name": "seller_name",
"identification": "seller_id_card|seller_foreign_id|seller_passport",
"email": "seller_email",
"phone": "seller_phone",
"type": "seller"
}

E-mail e telefone do signatário​

email e phone não carregam os dados do signatário: carregam o nome do campo de onde a Auco os lê ao criar o processo. Por isso POST e PUT /template validam cada um deles em relação ao modelo:

  • Deve ser o name de uma pergunta de config do tipo correspondente —email para email, phone para phone—, ou o name de um campo preFill, o array de valores fixos do modelo (name e value).
  • Se o nome não for nem uma pergunta nem um campo preFill, a API responde 400 com PROFILE_FIELD_NOT_FOUND: <field>.
  • Se a pergunta existir, mas tiver outro tipo —por exemplo, um email apontando para uma pergunta text—, responde 400 com PROFILE_FIELD_TYPE_INVALID: <field> must be type email (ou phone).
  • Um signatário sem email nem phone e sem signature é rejeitado com a mensagem do validador: "signatureProfile[0]" must contain at least one of [email, phone].
Uma pergunta text para o e-mail

Se o seu modelo pedir o e-mail do signatário com uma pergunta text, a API a rejeita com PROFILE_FIELD_TYPE_INVALID. Altere o tipo dessa pergunta para email: além de passar na validação, o formulário verifica se o e-mail tem um formato válido.

Assinatura no ato (signature)​

Um signatário com signature assina enquanto preenche o formulário, com a pergunta de assinatura que você referenciar. Como nada é enviado a ele, não precisa de email nem de phone; se os tiver, eles são validados mesmo assim.

  • A pergunta deve existir em config com type: "signature". A API não verifica isso, portanto confira antes de salvar.
  • A convenção é usar o mesmo valor nos três lugares: o name da pergunta, o type e o signature do signatário.
  • O formulário deve ser aberto com a assinatura no ato habilitada (signNow). Sem isso, a pergunta de assinatura não tem efeito sobre o signatário.
{
"config": [
{
"name": "client_name",
"description": "Informe seu nome completo",
"type": "name"
},
{
"name": "client",
"description": "Assine aqui",
"type": "signature",
"allow": ["draw"]
}
],
"signatureProfile": [
{
"name": "client_name",
"type": "client",
"signature": "client"
}
]
}
Posicionamento da assinatura

Para o posicionamento dos elementos <div> no HTML Completo, veja Configuração HTML → Posicionamento da assinatura.


Perguntas obrigatórias​

A propriedade sign é um array com os nomes das perguntas que o usuário não pode pular:

"sign": [
"buyer_name",
"buyer_email",
"buyer_id"
]
info
  • O usuário deve obrigatoriamente preencher as perguntas registradas em sign.
  • As perguntas do tipo signature são automaticamente obrigatórias — não é necessário listá-las em sign.

Principais diferenças: clausula vs select vs searchlist​

CaracterísticaClausulaSelectSearchlist
Lista suspensa?SimSimSim, com campo de busca
Elementos HTML necessáriosUm <span> por opçãoUm <span>Um <span>
Pode limitar outras perguntas?✅ Sim❌ Não❌ Não
Pode ser referenciada em prereq.k?✅ Sim❌ Não❌ Não
Estrutura das opções{name, value}{name, label, value}{name, label, value}
Quantidade de opções recomendada2–82–1010+