API + Connector JS

Documentação completa de assinatura PDF e XML

Padrão oficial de integração da 4signer. API em snake_case e Connector JS em camelCase. Esta página cobre autenticação, Agent Desktop, fluxos de assinatura PDF/XML, parâmetros e exemplos prontos para produção.

Autenticação

Toda chamada da API exige token da conta no header Authorization no formato Bearer.

Onde obter o token da conta

  1. Acesse o painel da 4signer com usuário administrador.
  2. Abra Acesso de API.
  3. Crie ou copie o token da conta.
  4. Use no backend quando aplicável ou no Connector JS para fluxos de assinatura no cliente, sempre com escopo controlado por conta/ambiente.
Header Obrigatório Descrição
Authorization Sim Bearer TOKEN_DA_ACCOUNT
Accept Sim application/json
X-Account-Slug Opcional Use quando sua operação exigir contexto explícito de conta.
Authorization: Bearer TOKEN_DA_ACCOUNT
Accept: application/json
X-Account-Slug: conta-opcional

Segurança: trate o token como segredo, armazene em variável de ambiente e faça rotação imediata em caso de exposição.

Agent Desktop

O Agent Desktop e instalado na maquina da pessoa que assina. Ele conecta com certificados locais (A3 token/cartao e stores do sistema), executa a assinatura no proprio dispositivo e devolve para a API somente a prova criptografica para finalizar o PDF/XML.

Tela do Agent

4signer Agent Desktop

● ONLINE Local API: http://127.0.0.1:9876

certificates: A3 Token SafeNet (2 encontrados)

provider: pkcs11 / windows_store

last_action: assinatura XML diploma concluida

  1. Frontend chama o Connector com certificateMode: 'local'.
  2. Connector cria sessão na API e solicita bootstrap local.
  3. Agent assina localmente e devolve prova para API.
  4. API finaliza status e disponibiliza o arquivo assinado.

PDF

Endpoint base: POST /api/v1/signatures/pdf

Campo Obrigatório Descrição
signature_methodSimremote_provider | local_pfx | stored_a1
processing_modeSimremote_provider=async, local_pfx/stored_a1=sync
pdfSimArquivo PDF
providerCloudProvider para assinatura em nuvem
pfx + pfx_passwordlocal_pfxCertificado A1 em arquivo
request_optionsOpcionalOpções adicionais de assinatura (array)

Para provider=vidaas, informe request_options[vidaas][login_hint] e escolha o modo em request_options[vidaas][auth_mode]: push (padrão) ou qrcode.

Para provider=birdid, escolha o modo com request_options[birdid][auth_mode]: authorization_code (padrão) ou push.

curl -X POST "https://4signer.com/api/v1/signatures/pdf" \
  -H "Authorization: Bearer TOKEN_DA_ACCOUNT" \
  -H "Accept: application/json" \
  -F "signature_method=remote_provider" \
  -F "provider=vidaas" \
  -F "processing_mode=async" \
  -F "pdf=@/tmp/documento.pdf" \
  -F "request_options[vidaas][auth_mode]=push" \
  -F "request_options[vidaas][login_hint]=12345678901"
curl -X POST "https://4signer.com/api/v1/signatures/pdf" \
  -H "Authorization: Bearer TOKEN_DA_ACCOUNT" \
  -H "Accept: application/json" \
  -F "signature_method=remote_provider" \
  -F "provider=vidaas" \
  -F "processing_mode=async" \
  -F "pdf=@/tmp/documento.pdf" \
  -F "request_options[vidaas][auth_mode]=qrcode" \
  -F "request_options[vidaas][login_hint]=12345678901"
curl -X POST "https://4signer.com/api/v1/signatures/pdf" \
  -H "Authorization: Bearer TOKEN_DA_ACCOUNT" \
  -H "Accept: application/json" \
  -F "signature_method=remote_provider" \
  -F "provider=birdid" \
  -F "processing_mode=async" \
  -F "pdf=@/tmp/documento.pdf" \
  -F "request_options[birdid][auth_mode]=authorization_code"
import { createSignerConnector } from '@4signer/signer-connector-sdk'

const connector = createSignerConnector({
  apiBaseUrl: 'https://4signer.com/api/v1',
  bearerToken: 'TOKEN_DA_ACCOUNT'
})

const result = await connector.sign({
  documentId: 'pdf-vidaas-001',
  documentType: 'pdf',
  certificateMode: 'cloud',
  providerHint: 'vidaas',
  documentContentBase64: pdfBase64,
  requestOptions: {
    vidaas: {
      auth_mode: 'qrcode', // ou 'push'
      login_hint: '12345678901'
    }
  }
})

console.log(result.status)

PDF simples

Assinatura básica sem customização visual.

curl -X POST "https://4signer.com/api/v1/signatures/pdf" \
  -H "Authorization: Bearer TOKEN_DA_ACCOUNT" \
  -H "Accept: application/json" \
  -F "signature_method=local_pfx" \
  -F "processing_mode=sync" \
  -F "pdf=@/tmp/documento.pdf" \
  -F "pfx=@/tmp/certificado.pfx" \
  -F "pfx_password=SENHA"

PDF com aparência

Exemplo com request_options para assinatura visual, incluindo imagem e posicionamento no PDF.

curl -X POST "https://4signer.com/api/v1/signatures/pdf" \
  -H "Authorization: Bearer TOKEN_DA_ACCOUNT" \
  -F "signature_method=local_pfx" \
  -F "processing_mode=sync" \
  -F "pdf=@/tmp/documento.pdf" \
  -F "pfx=@/tmp/certificado.pfx" \
  -F "pfx_password=SENHA" \
  -F "request_options[appearance][enabled]=true" \
  -F "request_options[appearance][page]=1" \
  -F "request_options[appearance][x]=100" \
  -F "request_options[appearance][y]=120" \
  -F "request_options[appearance][width]=180" \
  -F "request_options[appearance][height]=60" \
  -F "request_options[appearance][image_base64]=iVBORw0KGgoAAA..."

x, y, width e height controlam a caixa da aparência na página. Troque image_base64 para usar outra imagem de assinatura.

PDF sem aparência

Assinatura invisível com validade criptográfica.

curl -X POST "https://4signer.com/api/v1/signatures/pdf" \
  -H "Authorization: Bearer TOKEN_DA_ACCOUNT" \
  -H "Accept: application/json" \
  -F "signature_method=local_pfx" \
  -F "processing_mode=sync" \
  -F "pdf=@/tmp/documento.pdf" \
  -F "pfx=@/tmp/certificado.pfx" \
  -F "pfx_password=SENHA" \
  -F "request_options[use_visible_signature]=0"

PDF com A1

local_pfx e envio de arquivo PFX (endpoint direto da API). Para fluxo em nuvem no Connector JS, use certificateMode: 'cloud' com providerHint.

A1 via arquivo PFX (local_pfx)

curl -X POST "https://4signer.com/api/v1/signatures/pdf" \
  -H "Authorization: Bearer TOKEN_DA_ACCOUNT" \
  -F "signature_method=local_pfx" \
  -F "processing_mode=sync" \
  -F "pdf=@/tmp/documento.pdf" \
  -F "pfx=@/tmp/certificado-a1.pfx" \
  -F "pfx_password=SENHA_CERTIFICADO"

A1 credencial cadastrada (stored_a1)

curl -X POST "https://4signer.com/api/v1/signatures/pdf" \
  -H "Authorization: Bearer TOKEN_DA_ACCOUNT" \
  -F "signature_method=stored_a1" \
  -F "processing_mode=sync" \
  -F "pdf=@/tmp/documento.pdf"

PDF com A3 Desktop (Connector)

import { createSignerConnector } from '@4signer/signer-connector-sdk'

const connector = createSignerConnector({
  apiBaseUrl: 'https://4signer.com/api/v1',
  bearerToken: 'TOKEN_DA_ACCOUNT'
})

const result = await connector.sign({
  documentId: 'pdf-001',
  documentType: 'pdf',
  certificateMode: 'local',
  documentContentBase64: pdfBase64
})

console.log(result.status)

PDF em nuvem

Requer provider e credencial. Operação assíncrona.

curl -X POST "https://4signer.com/api/v1/signatures/pdf" \
  -H "Authorization: Bearer TOKEN_DA_ACCOUNT" \
  -H "Accept: application/json" \
  -F "signature_method=remote_provider" \
  -F "processing_mode=async" \
  -F "provider=clicksign" \
  -F "pdf=@/tmp/documento.pdf"

Carimbo de tempo (RFC3161)

Use request_options[timestamp] para habilitar ACT/TSA em PDF e XML.

Campo Descrição
request_options[timestamp][enabled]Ativa o carimbo (1/true)
request_options[timestamp][url]URL RFC3161 da TSA
request_options[timestamp][username/password]Credenciais básicas (quando exigido)
request_options[timestamp][token]Token Bearer opcional
curl -X POST "https://4signer.com/api/v1/signatures/pdf" \
  -H "Authorization: Bearer TOKEN_DA_ACCOUNT" \
  -F "signature_method=local_pfx" \
  -F "processing_mode=sync" \
  -F "pdf=@/tmp/documento.pdf" \
  -F "pfx=@/tmp/certificado.pfx" \
  -F "pfx_password=SENHA" \
  -F "request_options[timestamp][enabled]=1" \
  -F "request_options[timestamp][url]=https://tsa.exemplo.com/rfc3161" \
  -F "request_options[timestamp][username]=tsa_user" \
  -F "request_options[timestamp][password]=tsa_pass"

XML

Endpoint base: POST /api/v1/signatures/xml

Campo Obrigatório Descrição
signature_profileOpcionalfiscal | xml-xades-diploma
signature_policyOpcionalEx.: nfe-4.00, cte-4.00, diploma-icpbrasil-xades-1.0
signature_policy_parametersOpcionalDefine tag alvo e parâmetros de policy

XML Fiscal (NFe/CTe/NFSe)

Escolha a tag com signature_policy_parameters[signed_element_local_name].

curl -X POST "https://4signer.com/api/v1/signatures/xml" \
  -H "Authorization: Bearer TOKEN_DA_ACCOUNT" \
  -F "signature_method=local_pfx" \
  -F "processing_mode=sync" \
  -F "xml=@/tmp/nfe.xml" \
  -F "pfx=@/tmp/certificado.pfx" \
  -F "pfx_password=SENHA" \
  -F "signature_profile=fiscal" \
  -F "signature_policy=nfe-4.00" \
  -F "signature_policy_parameters[signed_element_local_name]=infNFe" \
  -F "signature_policy_parameters[id_attribute]=Id"

XML Diploma

A tag também é definida por policy parameters. Ex.: DadosDiploma e Diploma.

curl -X POST "https://4signer.com/api/v1/signatures/xml/diploma" \
  -H "Authorization: Bearer TOKEN_DA_ACCOUNT" \
  -F "signature_method=remote_provider" \
  -F "processing_mode=async" \
  -F "xml=@/tmp/diploma.xml" \
  -F "signature_policy=diploma-ra-icpbrasil-xades-1.0" \
  -F "signature_policy_parameters[signed_element_local_name]=Diploma" \
  -F "signature_policy_parameters[id_attribute]=id" \
  -F "request_options[timestamp][enabled]=1" \
  -F "request_options[timestamp][url]=https://tsa.exemplo.com/rfc3161"

Connector JS

No Connector, a seleção da tag XML é feita por xmlPolicyParameters.signed_element_local_name.

Instalação do SDK

Você pode integrar por npm, script ESM direto ou script legado (sem bundler) usando o loader oficial.

npm (recomendado)

npm install @4signer/signer-connector-sdk

Script ESM (sem npm)

<script type="module">
  import { createSignerConnector } from 'https://cdn.jsdelivr.net/npm/@4signer/signer-connector-sdk@1.0.0/src/index.js'

  const connector = createSignerConnector({
    apiBaseUrl: 'https://4signer.com/api/v1',
    bearerToken: 'TOKEN_DA_ACCOUNT'
  })
</script>

Projeto legado com <script> clássico

Use o loader para expor window.createSignerConnector.

<script>
  window.__4signerConnectorSdk = {
    moduleUrl: 'https://cdn.jsdelivr.net/npm/@4signer/signer-connector-sdk@1.0.0/src/index.js'
  }
</script>
<script src="/sdk/signer-connector-legacy-loader.js" defer></script>
<script>
  window.addEventListener('4signer:connector-ready', async function () {
    const connector = window.createSignerConnector({
      apiBaseUrl: 'https://4signer.com/api/v1',
      bearerToken: 'TOKEN_DA_ACCOUNT'
    })

    const result = await connector.sign({
      documentId: 'legacy-001',
      documentType: 'pdf',
      certificateMode: 'cloud',
      documentContentBase64: pdfBase64
    })

    console.log(result.status)
  })
</script>
import { createSignerConnector } from '@4signer/signer-connector-sdk'

const connector = createSignerConnector({
  apiBaseUrl: 'https://4signer.com/api/v1',
  bearerToken: 'TOKEN_DA_ACCOUNT'
})

const result = await connector.sign({
  documentId: 'diploma-001',
  documentType: 'xml',
  certificateMode: 'local',
  documentContentBase64: diplomaXmlBase64,
  xmlProfile: 'xml-xades-diploma',
  xmlPolicy: 'diploma-icpbrasil-xades-1.0',
  xmlPolicyParameters: {
    signed_element_local_name: 'DadosDiploma',
    id_attribute: 'id'
  },
  requestOptions: {
    timestamp: {
      enabled: true,
      url: 'https://tsa.exemplo.com/rfc3161'
    }
  }
})

console.log(result.status)

Discovery de certificados em nuvem

Liste os certificados disponíveis do usuário para BirdID ou VIDaaS antes da assinatura.

curl

curl -X POST "https://4signer.com/api/v1/connector/v1/providers/birdid/certificates/discovery" \
  -H "Authorization: Bearer TOKEN_DA_ACCOUNT" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "username": "12345678901",
    "identification_type": "CPF"
  }'

Connector JS

const discovery = await connector.discoverCertificates({
  provider: 'birdid', // birdid | vidaas
  username: '12345678901',
  identificationType: 'CPF'
})

console.log(discovery.certificates)

Depois da autenticação OAuth, use /certificates/list para obter os certificados efetivos do token.

curl (pós-auth)

curl -X POST "https://4signer.com/api/v1/connector/v1/providers/birdid/certificates/list" \
  -H "Authorization: Bearer TOKEN_DA_ACCOUNT" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "signature_id": "UUID_DA_ASSINATURA"
  }'

Connector JS (pós-auth)

const certificates = await connector.listCertificates({
  provider: 'birdid',
  signatureId: 'UUID_DA_ASSINATURA'
  // ou accessToken / username
})

console.log(certificates.certificates)

Webhooks

Webhook notifica sua aplicacao quando o status da assinatura muda. A configuracao e feita no painel da conta em Webhooks.

Campo Uso
urlEndpoint HTTPS que recebera os eventos
secretChave para validar assinatura HMAC no header
max_attemptsQuantidade maxima de tentativas de entrega
retry_interval_secondsIntervalo entre retries quando falhar
timeout_secondsTimeout HTTP por tentativa de envio

Evento atual de entrega: signature.status_changed.

Headers enviados

Content-Type: application/json
Accept: application/json
X-Signer-Event: signature.status_changed
X-Signer-Delivery-Id: 9123
X-Signer-Signature-Timestamp: 2026-02-17T14:32:11Z
X-Signer-Signature: sha256=HMAC_DO_PAYLOAD

Payload do evento

{
  "event": "signature.status_changed",
  "occurred_at": "2026-02-17T14:32:11Z",
  "account": {
    "id": 9
  },
  "signature": {
    "id": "sig_01J...",
    "provider": "clicksign",
    "processing_mode": "async",
    "status_from": "pending_provider",
    "status_to": "signed",
    "external_id": "pedido-123",
    "error_code": null,
    "error_message": null,
    "started_at": "2026-02-17T14:31:00Z",
    "completed_at": "2026-02-17T14:32:11Z",
    "duration_ms": 71000
  }
}

Entrega considerada sucesso com resposta HTTP 2xx. Em falha, o sistema reenvia ate max_attempts.

Respostas e erros

Sucesso (sync)

{
  "id": "sig_01J...",
  "status": "completed",
  "signed_file_base64": "..."
}

Assíncrono (cloud)

{
  "id": "sig_01J...",
  "status": "pending_provider",
  "webhook_status": "scheduled"
}