Criando um Documento

Como criar um documento/enviar um documento para assinatura.

A criação de documentos difere um pouco das outras mutations por ter o upload de um arquivo. Primeiramente, vamos precisar escrever a mutation:

mutation CreateDocumentMutation(
  $document: DocumentInput!, # Definição das variáveis $document,
  $signers: [SignerInput!]!, # $signers e $file, com seus respectivos
  $file: Upload!             # tipos. (Os "!" indicam que são
) {                          # parâmetros obrigatórios)      
  createDocument(
    document: $document,     # Passa para os parâmetros da mutation o 
    signers: $signers,       # valor das variáveis.
    file: $file,             #
    organization_id: 123,    # OPCIONAL: Cria em outras organizações do usuário, senão usa a atual
    folder_id: "a1b2c3"      # OPCIONAL: Cria arquivado em uma pasta
  ) {
    id
    name
    refusable
    sortable
    created_at
    signatures {
      public_id
      name
      email
      created_at
      action { name }
      link { short_link }
      user { id name email }
    }
  }
}

Após, precisamos dos valores das variáveis definidas na mutation em um JSON:

/*
  Abaixo, um signatário receberá o link de assinatura por email,
  por ter sido passado o "email" e, para o que passou "name",
  será retornado o atributo "link" no documento com o link de
  assinatura.
  Quando usado "phone", existirão duas possíveis formas de envio,
  especificadas no uso do atributo "delivery_method". Este atributo
  possui as opções "DELIVERY_METHOD_WHATSAPP" para enviar por Whatsapp
  e "DELIVERY_METHOD_SMS" para enviar por SMS.
*/

{
  "document": {
    "name": "Contrato de marketing"
  },
  "signers": [{
    "email": "troque-esse-email-que-e-publico@tuamaeaquelaursa.com",
    "action": "SIGN"
  }, {
    "name": "Ronaldo Fuzinato",
    "action": "SIGN"
  }, {
    "phone": "+5554999999999",
    "delivery_method": "DELIVERY_METHOD_WHATSAPP",
    "action": "SIGN"
  }, {
    "phone": "+5554999999998",
    "delivery_method": "DELIVERY_METHOD_SMS",
    "action": "SIGN"
  }]
}

Percebeu que não foi colocado nenhum valor para a variável $file? Pois é, como é realizado o upload desse arquivo, a requisição precisa ser enviada como multipart/form-data, dessa forma o arquivo precisa ser um pouco diferente. Você pode fazer isso direto no Altair:

Caso você esteja em dúvida de como funciona o envio do documento para usar na sua integração, este repositório fornece mais informações e exemplos de como fazer o upload: https://github.com/jaydenseric/graphql-multipart-request-spec

Mais opções

// IMPORTANTE:
// - Se você copiar esse JSON, remova os comentários antes de usar
// - Alguns dos atributos abaixo não irão funcionar sem possuir um plano corporativo
// - Alguns dos atributos abaixo irão consumir créditos de verificação adicional

{
  "document": {
    "name": "Contrato de marketing",
    "message": "Mensagem customizada enviada para os emails dos signatários",
    "reminder": "WEEKLY", // Lembrete de assinatura semanal. DAILY para diário
    "sortable": true, // Signatários assinam na ordem do array "signers"
    "footer": "BOTTOM", // Adiciona rodapé. Aceita também os valores LEFT e RIGHT
    "refusable": true, // Permite recusa do documento
    "qualified": true, // Ativa assinatura qualificada, usando certificados
    "scrolling_required": true, // Só permite a assinatura do documento caso o signatário tiver rolado toda a página
    "stop_on_rejected": true, // Impede que outras pessoas assinem quando recusado
    "new_signature_style": true, // Ativa novos campos de assinatura
    "show_audit_page": false, // Evita criar a última página de auditoria em documentos com "new_signature_style": true
    "ignore_cpf": true, // Remove obrigatoriedade de preencher CPF para assinar
    "email_template_id": 1234, // Usa modelo de email específico, pelo ID do mesmo
    "deadline_at": "2023-11-24T02:59:59.999Z", // Bloqueia assinaturas após data
    "cc": [
      // Envia emails quando o documento for assinado por todos os signatários
      { "email": "email-cc-1@tuamaeaquelaursa.com" },
      { "email": "email-cc-2@tuamaeaquelaursa.com" }
    ],
    "expiration": {
      // Envia um lembrete em uma quantidade de dias "days_before antes do
      // vencimento do documento informada no "notify_at"
      "days_before": 7,
      "notify_at": "20/01/2026"
    },
    "configs": {
      "notification_finished": true, // Envia um email notificando todos os signatários que o documento foi assinado por todas as partes
      "notification_signed": true, // Envia um email ao signatário notificando que ele assinou o documento
      "signature_appearance": "ELETRONIC", // Força a aparência da assinatura, pode ser: DRAW, HANDWRITING, ELETRONIC, IMAGE
      "keep_metadata": true // Mantém os metadados do PDF em assinatura qualificada
    }
  },
  "signers": [{
    "email": "troque-esse-email-que-e-publico@tuamaeaquelaursa.com", // Envia email
    "action": "SIGN", // Assinar
    "configs": { "cpf": "12345678900" }, // Valida o CPF do signatário
    "security_verifications": [
      // Exigir validação por SMS ("verify_phone" é opcional):
      { "type": "SMS", "verify_phone": "+5554999999999" },
      // Exigir documento com foto (Aprovação manual):
      { "type": "MANUAL" }
    ],
    // Posiciona campos de assinatura:
    "positions": [{"x": "5.0", "y": "90.0", "z": 1, "element": "SIGNATURE"}]
  }, {
    "name": "Ronaldo Fuzinato", // Recebe link de assinatura para enviar
    "action": "SIGN_AS_A_WITNESS", // Assinar como testemunha
    // Exigir documento com foto (Documento com foto):
    "security_verifications": [{ "type": "UPLOAD" }],
    // Posiciona campos para nome do signatário:
    "positions": [{"x": "75.0", "y": "90.0", "z": 1, "element": "NAME"}]
  }, {
    "email": "troque-esse-email-que-e-publico-2@tuamaeaquelaursa.com", // Envia email
    "action": "APPROVE", // Aprovar
    // Exigir documento com foto (Documento, selfie e prova de vida):
    "security_verifications": [{ "type": "LIVE" }],
    // Posiciona campos de rúbrica:
    "positions": [{"x": "25.0", "y": "90.0", "z": 1, "element": "INITIALS"}]
  }, {
    "phone": "+5521999999999",
    "delivery_method": "DELIVERY_METHOD_SMS", // Envia SMS para "phone"
    "action": "RECOGNIZE", // Reconhecer
    // Exigir documento com foto (Biometria SERPRO):
    "security_verifications": [{ "type": "PF_FACIAL" }],
    // Posiciona campos de data de assinatura:
    "positions": [{"x": "55.0", "y": "90.0", "z": 1, "element": "DATE"}]
  }, {
    "phone": "+5521999999998",
    "delivery_method": "DELIVERY_METHOD_WHATSAPP", // Envia Whatsapp para "phone"
    "action": "SIGN", // Assinar
    // Posiciona campos de CPF:
    "positions": [{"x": "55.0", "y": "90.0", "z": 1, "element": "CPF"}]
  }]
}

Posicionar campos de assinatura "positions"

Como mostrado no exemplo acima, para adicionar campos de assinatura ao criar o documento você precisa adicionar o atributo "positions".

{
  ...
  "signers": [
    {
      ...
      "positions": [
        { "x": "100.0", "y": "100.0", "z": 1, "element": "SIGNATURE" }
      ]
    }
  ]
}

O "x" é posição horizontal de 0 a 100% O "y" é posição vertical de 0 a 100% O "z" é o número da página começando no 1

O "element" é o tipo de assinatura: "SIGNATURE": Assinatura "NAME": Nome do signatário "INITIALS": Rúbrica "DATE": Data de assinatura "CPF": CPF do signatário

Pra saber quais posições passar no x e y, você pode criar um documento de exemplo no painel do Autentique e buscar as posições ao resgatar o documento usando "positions":

query {
  document(id: "ID_DO_DOCUMENTO") {
    id
    signatures {
      public_id
      positions {
        element
        x
        y
        z
      }
    }
  }
}
Exigir verificação por SMS e/ou documento com foto "security_verifications"

Para exigir dos signatários a verificação por SMS e/ou documento com foto, é preciso adicionar o atributo "security_verifications" no signatário que você deseja que essas verificações sejam necessárias. Lembrando que você deve consultar no painel o custo de créditos de verificação adicionais necessários.

{
  ...
  "signers": [
    {
      ...
      "security_verifications": [
        { "type": "SMS", "verify_phone": "+5554999999999" },
        { "type": "MANUAL" }
      ]
    }
  ]
}

O "type" é o tipo de verificação: "SMS": Validação por SMS ("verify_phone" é opcional e exige celular especificado) "MANUAL": Exigir documento com foto (Aprovação manual) "UPLOAD": Exigir documento com foto (Documento com foto) "LIVE": Exigir documento com foto (Documento, selfie e prova de vida) "PF_FACIAL": Exigir documento com foto (Biometria SERPRO)

Apesar de ser possível ter múltiplas verificações para o mesmo signatário, dentre as seguintes opções somente é possível escolher uma delas por signatário: MANUAL, UPLOAD, LIVE e PF_FACIAL.

Criar documento a partir de modelo

Não há uma forma na API de você conseguir usar os modelos do painel para criar documentos, porém você consegue fazer algo parecido à partir do seu código:

  1. Criar um modelo fixo em HTML na máquina, demarcando os lugares com variáveis para substituir por valores. (Ex: "Eu, $NomeSignatario$ aceito esse contrato")

  2. Por código, duplicar esse HTML e nessa duplicata, substituir os campos de variáveis pelos valores reais. ( Ex: $NomeSignatario$ => Jorge Silva )

  3. Enviar esse arquivo HTML com os valores substituídos para a nossa API, através da mutation createDocument, igual como já funciona para outros tipos de arquivos

Exemplo de criação de documento com NodeJS

Se você usa o Postman, você pode gerar esses exemplos à partir da collection para o Postman disponibilizada aqui na documentação.

var axios = require('axios');
var FormData = require('form-data');
var fs = require('fs');
var data = new FormData();
data.append('operations', '{"query":"mutation CreateDocumentMutation($document: DocumentInput!, $signers: [SignerInput!]!, $file: Upload!) {createDocument(document: $document, signers: $signers, file: $file) {id name refusable sortable created_at signatures { public_id name email created_at action { name } link { short_link } user { id name email }}}}", "variables":{"document": {"name": "Contrato de teste"},"signers": [{"email": "troque-esse-email-que-e-publico@tuamaeaquelaursa.com","action": "SIGN"}],"file":null}}');
data.append('map', '{"file": ["variables.file"]}');
data.append('file', fs.createReadStream('/path/to/file'));
var config = {
  method: 'post',
  url: 'https://api.autentique.com.br/v2/graphql',
  headers: {
    'Authorization': 'Bearer TOKEN_DE_API',
    ...data.getHeaders()
  },
  data : data
};
axios(config)
  .then(function(response) { console.log(JSON.stringify(response.data)); })
  .catch(function(error) { console.log(error); });

Desse exemplo é só substituir o token de API, email do signatário e caminho para o arquivo.

Exemplo de criação de documento com PHP

Se você usa o Postman, você pode gerar esses exemplos à partir da collection para o Postman disponibilizada aqui na documentação.

<?php

$curl = curl_init();
curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://api.autentique.com.br/v2/graphql',
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS => array('operations' => '{"query":"mutation CreateDocumentMutation($document: DocumentInput!, $signers: [SignerInput!]!, $file: Upload!) {createDocument(document: $document, signers: $signers, file: $file) {id name refusable sortable created_at signatures { public_id name email created_at action { name } link { short_link } user { id name email }}}}", "variables":{"document": {"name": "Contrato de teste"},"signers": [{"email": "troque-esse-email-que-e-publico@tuamaeaquelaursa.com","action": "SIGN"}],"file":null}}','map' => '{"file": ["variables.file"]}','file'=> new CURLFILE('/path/to/file')),
  CURLOPT_HTTPHEADER => array('Authorization: Bearer TOKEN_DE_API'),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;

Desse exemplo é só substituir o token de API, email do signatário e caminho para o arquivo.

Exemplo de criação de documento com Python3

Se você usa o Postman, você pode gerar esses exemplos à partir da collection para o Postman disponibilizada aqui na documentação.

import requests

url = "https://api.autentique.com.br/v2/graphql"
payload = {
  'operations': '{"query":"mutation CreateDocumentMutation($document: DocumentInput!, $signers: [SignerInput!]!, $file: Upload!) {createDocument(document: $document, signers: $signers, file: $file) {id name refusable sortable created_at signatures { public_id name email created_at action { name } link { short_link } user { id name email }}}}", "variables":{"document": {"name": "Contrato de teste"},"signers": [{"email": "troque-esse-email-que-e-publico@tuamaeaquelaursa.com","action": "SIGN"}],"file":null}}',
  'map': '{"file": ["variables.file"]}'
}
files = [
  ('file',open('/path/to/file.pdf','rb'))
]
headers = {
  'Authorization': 'Bearer TOKEN_DE_API'
}

response = requests.request("POST", url, headers=headers, data=payload, files=files)
print(response.text)

Desse exemplo é só substituir o token de API, email do signatário e caminho para o arquivo.

Exemplo de criação de documento com C#

Se você usa o Postman, você pode gerar esses exemplos à partir da collection para o Postman disponibilizada aqui na documentação.

var client = new RestClient("https://api.autentique.com.br/v2/graphql");
var request = new RestRequest(Method.POST);

request.AddHeader("Authorization", "Bearer TOKEN_DE_API");
request.AddParameter("operations", "{\"query\":\"mutation CreateDocumentMutation($document: DocumentInput!, $signers: [SignerInput!]!, $file: Upload!) {createDocument(document: $document, signers: $signers, file: $file) {id name refusable sortable created_at signatures { public_id name email created_at action { name } link { short_link } user { id name email }}}}\", \"variables\":{\"document\": {\"name\": \"Contrato de teste\"},\"signers\": [{\"email\": \"troque-esse-email-que-e-publico@tuamaeaquelaursa.com\",\"action\": \"SIGN\"}],\"file\":null}}");
request.AddParameter("map", "{\"file\": [\"variables.file\"]}");
request.AddFile("file", "/path/to/file");
IRestResponse response = client.Execute(request);

Console.WriteLine(response.Content);

Desse exemplo é só substituir o token de API, email do signatário e caminho para o arquivo.

Você pode conferir o que é cada um desses parâmetros direto na documentação completa da API GraphQL, no menu Docs do Altair. Se você não sabe como fazer isso, confira o nosso tutorial em Usando o Altair.

Last updated