CLPASSINATURASSuporte à integração ↗
NESTA DOCUMENTAÇÃO

DOCUMENTAÇÃO PÚBLICA · API V1

Integre assinaturas
ao seu ERP.

Envie documentos, acompanhe os signatários e receba o resultado no seu sistema. A CLP fornece a página de assinatura com a marca da empresa e a trilha de evidências.

Referência conferida no código e nas rotas publicadas em 28/09/2026. Exemplos com dados fictícios.

Documentação aberta. Contratações abertas.

A execução exige conta habilitada, chave própria, remetente verificado e modalidade de proteção disponível. Esta página não executa chamadas nem recebe chaves. Não há sandbox público de assinaturas anunciado; combine a homologação com a CLP antes de enviar dados ou convites reais.

Comece pelo fluxo de envelopes.

Um envelope reúne um PDF, seus destinatários e o registro dos aceites. Para uma jornada com clientes assinando na página da CLP, use /v1/envelopes.

01 / ERPPDF e destinatários
02 / CLPConvites e página com marca
03 / CLIENTESConfirmação de acesso e aceites
04 / ERPWebhook, download e arquivo
  1. Após habilitação da conta, entre no portal, configure a marca e o remetente e gere sua chave de API. A verificação do remetente é assistida pela CLP.
  2. Escolha proteção pelo certificado da plataforma, quando disponível, ou importe o certificado próprio da empresa.
  3. Configure o webhook HTTPS e persista seu segredo no servidor.
  4. Envie o envelope com uma chave de idempotência estável para a operação do ERP.
  5. Aguarde envelope.completed, baixe os três arquivos e confirme os hashes antes de registrar o arquivamento.
Como o link chega ao cliente?

A CLP envia os convites ao e-mail de cada destinatário usando o remetente verificado. O ERP também pode consultar GET /v1/envelopes/{id}/signing-links e entregar cada link ao destinatário correspondente pelo seu próprio canal. A consulta não dispara outro convite e não desativa o e-mail enviado pela CLP.

cURL · links privados para distribuir pelo ERP
curl --fail-with-body "https://api.clpsistemas.com.br/v1/envelopes/$ENVELOPE_ID/signing-links" \
  -H "Authorization: Bearer $CLP_API_KEY"

A resposta contém envelope_id, expires_at e recipients, com recipient_id, name, email e signing_url. Só aparecem destinatários que ainda não aceitaram nem recusaram, em envelopes abertos e dentro do prazo. Links são privados: preserve o fragmento #, não registre a resposta em logs ou ferramentas de análise e entregue cada URL apenas à pessoa correspondente. A confirmação de acesso por e-mail continua obrigatória para visualizar o PDF.

Marca, logo, geração/revogação de chaves e cancelamento da mensalidade são geridos no portal. As rotas de sessão do portal não fazem parte do contrato público de autenticação por chave de API.

Autenticação entre servidores.

Endereço base: https://api.clpsistemas.com.br. Envie Authorization: Bearer SUA_CHAVE_CLP em todas as rotas /v1 desta referência. GET /public/plans é público.

cURL · leitura autenticada
curl --fail-with-body 'https://api.clpsistemas.com.br/v1/account/subscription' \
  -H "Authorization: Bearer $CLP_API_KEY"

Carregue CLP_API_KEY do cofre ou configuração protegida do seu servidor. Não coloque chaves em páginas web, aplicativos distribuídos, URLs, repositórios ou logs. A chave da empresa é diferente da credencial Asaas da CLP.

As respostas JSON usam snake_case. Campos opcionais sem valor podem estar ausentes. Datas são UTC em formato ISO 8601; identificadores de recursos usam UUID. A chave só acessa os recursos da própria empresa.

O limite padrão é de 60 requisições por minuto por chave. Em 429, aplique espera progressiva com variação aleatória. O cabeçalho Retry-After não é garantido.

Envie o PDF e os destinatários.

POST /v1/envelopes

Corpo multipart/form-data. Não defina manualmente o Content-Type ao usar FormData ou cURL; a biblioteca precisa incluir o delimitador.

Campo ou cabeçalhoRegra
Idempotency-KeyCabeçalho obrigatório, de 1 a 128 caracteres. Uma chave por envio lógico.
pdfArquivo PDF de até 20 MB e 200 páginas, sem senha, assinatura prévia, scripts, ações automáticas ou anexos embutidos.
titleTexto obrigatório, de 1 a 200 caracteres.
recipientsString contendo um array JSON de 1 a 5 objetos {"name":"…","email":"…"}. Nome de 2 a 200 caracteres; e-mails distintos.
external_idReferência opcional do ERP, até 128 caracteres. Não é filtro de pesquisa nem substitui o ID do envelope.
protection_modeplatform ou customer. Omitido: escolhe customer se houver certificate_id; caso contrário, platform.
certificate_idUUID obrigatório em customer; deve ser omitido em platform.
cURL · novo envelope
curl --fail-with-body 'https://api.clpsistemas.com.br/v1/envelopes' \
  -H "Authorization: Bearer $CLP_API_KEY" \
  -H 'Idempotency-Key: erp-pedido-1042-v1' \
  -F '[email protected];type=application/pdf' \
  --form-string 'title=Contrato de prestação de serviços' \
  --form-string 'external_id=PEDIDO-1042' \
  --form-string 'protection_mode=platform' \
  --form-string 'recipients=[{"name":"Ana Exemplo","email":"[email protected]"},{"name":"Bruno Exemplo","email":"[email protected]"}]'
Mesmo envio em Node.js no servidor
Node.js · somente no servidor
import { readFile } from 'node:fs/promises';

const form = new FormData();
form.set('pdf', new Blob([await readFile('./contrato.pdf')],
  { type: 'application/pdf' }), 'contrato.pdf');
form.set('title', 'Contrato de prestação de serviços');
form.set('external_id', 'PEDIDO-1042');
form.set('protection_mode', 'platform');
form.set('recipients', JSON.stringify([
  { name: 'Ana Exemplo', email: '[email protected]' },
  { name: 'Bruno Exemplo', email: '[email protected]' }
]));

const response = await fetch('https://api.clpsistemas.com.br/v1/envelopes', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.CLP_API_KEY}`,
    'Idempotency-Key': 'erp-pedido-1042-v1'
  },
  body: form,
  signal: AbortSignal.timeout(60000)
});
if (!response.ok) throw new Error(`CLP retornou HTTP ${response.status}`);
const envelope = await response.json();
// Persista envelope.id junto à operação do ERP, sem registrar credenciais.
// Timeout: consulte/reenvie com a mesma chave, nunca com uma chave nova automática.

O exemplo pressupõe Node.js com fetch, Blob e FormData nativos. O arquivo e a chave ficam no servidor. Guarde o ID retornado junto à operação do ERP.

Resposta 201: envelope criado

Exemplo parcial. Um 201 confirma a criação e o enfileiramento dos convites, não o recebimento do e-mail nem a conclusão da assinatura.

JSON · exemplo parcial, IDs fictícios
{
  "id": "11111111-1111-4111-8111-111111111111",
  "title": "Contrato de prestação de serviços",
  "external_id": "PEDIDO-1042",
  "status": "sent",
  "sequence": 1,
  "protection_mode": "platform",
  "created_at": "2026-09-28T15:00:00Z",
  "expires_at": "2026-10-05T15:00:00Z"
}

Repetição: os mesmos dados e bytes, com a mesma chave, retornam o envelope existente com 200. Conteúdo diferente retorna 409 idempotency_conflict. Após timeout, repita com a mesma chave; não gere outra automaticamente. Uma alteração legítima no documento é um novo envio.

Consultar andamento

cURL · substitua pelo ID retornado
curl --fail-with-body "https://api.clpsistemas.com.br/v1/envelopes/$ENVELOPE_ID" \
  -H "Authorization: Bearer $CLP_API_KEY"

A consulta individual retorna {"envelope": {...}, "recipients": [...]}. Cada destinatário informa id, name, email e, quando existentes, viewed_at, accepted_at e declined_at. A criação retorna diretamente o objeto do envelope, sem esse agrupamento.

GET /v1/envelopes?page=1 retorna um array de até 100 envelopes, do mais recente para o mais antigo. Não há total nem cursor nessa resposta. Incremente a página até receber menos de 100 itens; deduplique por ID se novos envios ocorrerem durante a paginação.

Os convites são enviados aos participantes em paralelo. A ordem no array não cria uma sequência de assinaturas. Todos precisam aceitar para iniciar a finalização.

Duas modalidades de proteção.

GET /v1/envelopes/protection informa enabled, available, legal_name e, quando presentes, document e expires_at. Confira available antes de integrar a modalidade platform.

  • platform: a CLP seleciona o certificado do prestador. Não envie certificate_id. Sem certificado utilizável, a criação retorna 503 platform_seal_unavailable.
  • customer: use o A1 da empresa da conta. Envie seu certificate_id e mantenha a validade e a autorização atualizadas.

Os signatários registram seus próprios aceites eletrônicos. A proteção final do PDF por certificado do prestador ou da empresa não representa a vontade das partes nem converte esses aceites em assinaturas pessoais ICP-Brasil.

Importar o A1 da empresa

POST /v1/certificates, multipart: arquivo pfx de até 256 KB, campo password com a senha do arquivo e accept_authorization=true para registrar a autorização de uso. Em produção, use multipart; o envio JSON não contempla a confirmação exigida.

O certificado deve ter chave privada utilizável, estar válido e, em produção, ser ICP-Brasil e pertencer ao CPF/CNPJ da conta. A senha abre o arquivo durante a importação; a aplicação não a persiste para cada assinatura. O retorno 201 traz metadados, incluindo id, document, not_after, status e icp_brasil.

GET /v1/certificates lista os certificados; GET /v1/certificates/{id} consulta um deles. DELETE /v1/certificates/{id} bloqueia seu uso e retorna 204. Antes de excluir, confira envelopes ainda pendentes que dependam do certificado.

Receba eventos. Valide a origem.

Configuração da empresa

cURL · substitua pelo seu receptor público
curl --fail-with-body -X PUT 'https://api.clpsistemas.com.br/v1/account/webhook' \
  -H "Authorization: Bearer $CLP_API_KEY" \
  -H 'Content-Type: application/json' \
  --data '{"url":"https://erp.example.com/webhooks/clp","rotate_secret":false}'

A resposta contém url e secret. Guarde o segredo no servidor. Enviar rotate_secret=true troca o segredo usado nas próximas tentativas; coordene a alteração com o receptor. A URL deve ser HTTPS, porta 443, pública e sem redirecionamentos ou endereços internos.

POST /v1/account/webhook/test enfileira webhook.test e retorna 202 com delivery_id. Consulte GET /v1/account/webhook/deliveries para as últimas 50 entregas, tentativas e erros. DELETE /v1/account/webhook remove a configuração. Reenvio manual de uma entrega fica disponível no portal.

Eventos de documentos

EventoQuando usar
envelope.completedPDF final e evidências disponíveis; inicie o download autenticado.
envelope.expiringAviso próximo ao prazo de guarda, com envelope_id, retain_until e days_remaining. Janela de aviso de três dias e um dia.
envelope.expiredEncerramento da disponibilidade, com envelope_id, sequence e expired_at.
webhook.testConferência do receptor; não representa assinatura concluída.

Não há evento individual de cada aceite, leitura, recusa ou cancelamento nesta versão. Consulte o envelope para esses estados. Os eventos signature.completed e signature.failed pertencem à assinatura direta, não ao fluxo de aceites.

JSON · exemplo parcial de conclusão
{
  "id": "22222222-2222-4222-8222-222222222222",
  "event": "envelope.completed",
  "created_at": "2026-09-28T15:30:00Z",
  "account_id": "33333333-3333-4333-8333-333333333333",
  "data": {
    "envelope": {
      "id": "11111111-1111-4111-8111-111111111111",
      "external_id": "PEDIDO-1042",
      "status": "completed",
      "sequence": 4
    },
    "files": [
      "original",
      "final",
      "evidence"
    ],
    "download_endpoint": "/v1/envelopes/11111111-1111-4111-8111-111111111111/files/{kind}"
  }
}

O exemplo acima é parcial. O webhook não inclui o PDF nem uma URL pública permanente. Construa o download no endereço base da API com o ID validado e um kind permitido.

Autenticação HMAC-SHA256

Cabeçalhos: X-Clp-Delivery-Id, X-Clp-Event, X-Clp-Timestamp (Unix, em segundos) e X-Clp-Signature. Calcule sha256= + HMAC hexadecimal de timestamp + ponto + corpo bruto UTF-8, usando o segredo como chave.

Node.js · verifique antes de interpretar o JSON
import { createHmac, timingSafeEqual } from 'node:crypto';

// Supply the original request bytes, before any JSON parser or body transformation.
// Resolve the secret from the receiver's account configuration, never from the body.
export function verifyClpWebhook({ rawBody, timestamp, signature, secret, nowMs = Date.now() }) {
  if (!Buffer.isBuffer(rawBody) || typeof secret !== 'string' || secret.length === 0) return false;
  if (typeof timestamp !== 'string' || !/^\d{1,12}$/.test(timestamp)) return false;
  if (typeof signature !== 'string' || !/^sha256=[0-9a-fA-F]{64}$/.test(signature)) return false;
  if (!Number.isFinite(nowMs) || Math.abs(nowMs / 1000 - Number(timestamp)) > 300) return false;
  const expected = createHmac('sha256', secret).update(timestamp + '.', 'utf8').update(rawBody).digest();
  const supplied = Buffer.from(signature.slice(7), 'hex');
  return supplied.length === expected.length && timingSafeEqual(supplied, expected);
}

// After authentication: validate JSON, match body.id/body.event to delivery headers,
// persist the event with a unique (account, event.id) constraint, then acknowledge 2xx.
// Download files in a durable background job. An HMAC check alone is not deduplication.

Baixar o verificador Node.js completo ↗. Capture os bytes antes do parser JSON. Não reserialize o corpo para verificar. Faça a comparação em tempo constante e aceite apenas relógios dentro da tolerância de cinco minutos. Sincronize o relógio do servidor.

  1. Resolva o segredo pela configuração da conta no receptor, não por um account_id ainda não autenticado.
  2. Verifique a assinatura e só então interprete o JSON; confira se id e event correspondem aos cabeçalhos.
  3. Persista o evento com unicidade por empresa e ID; responda 2xx somente depois. Não confirme sucesso se a gravação falhar.
  4. Processe o download em uma fila durável. Repetições válidas já persistidas também podem receber 2xx.

Eventos podem repetir e chegar fora de ordem. As retentativas conservam o ID e usam novo timestamp. A entrega é tentada por até sete dias, respeitando a disponibilidade dos arquivos. HTTP 2xx confirma recebimento do evento, não seu arquivamento. Use sequence quando presente e consulte o estado atual; mantenha também reconciliação periódica pela API.

Baixe, confira e arquive.

Após completed, use GET /v1/envelopes/{id}/files/{kind}, sendo kind original, final ou evidence. Os dois primeiros retornam PDF; evidence retorna JSON como arquivo. A autorização continua sendo a chave da empresa.

cURL · salvar o arquivo e os cabeçalhos
curl --fail-with-body \
  "https://api.clpsistemas.com.br/v1/envelopes/$ENVELOPE_ID/files/final" \
  -H "Authorization: Bearer $CLP_API_KEY" \
  --dump-header final.headers --output final.pdf

# Baixe também /files/original e /files/evidence.
# Só arquive como concluído se o HTTP for 200 e os três hashes coincidirem.

Compare o SHA-256 dos bytes com original_sha256, final_sha256 e evidence_sha256 do envelope. Cada download também traz X-Content-Sha256. Grave os três artefatos de forma durável antes do recibo:

JSON · corpo de POST /v1/envelopes/{id}/delivery-receipts
{
  "original_sha256": "SUBSTITUA_PELO_SHA256_DO_ORIGINAL",
  "final_sha256": "SUBSTITUA_PELO_SHA256_DO_FINAL",
  "evidence_sha256": "SUBSTITUA_PELO_SHA256_DAS_EVIDENCIAS"
}

O recibo retorna archived_at e, quando aplicável, retain_until. Não antecipa a exclusão, não estende a guarda e não substitui o armazenamento no ERP.

Prazo e links temporários

expires_at é o prazo para coletar os aceites; retain_until é o prazo de disponibilidade dos arquivos. Não confunda o prazo de assinatura com a guarda de um ou dois anos do plano. Consulte o envelope para o prazo vigente, inclusive após renovação ou cancelamento.

A guarda segue o plano: até um ano no Essencial e dois no Profissional, enquanto ativo; Empresarial enquanto a assinatura estiver ativa. Após encerramento, a janela de exportação é de 30 dias, respeitado o limite de idade do documento. retain_until pode estar ausente quando não há uma data determinada. Conserve suas cópias conforme os requisitos da sua atividade.

GET /v1/envelopes/{id}/files/{kind}/link retorna direct, expires_at e, se disponível, url. Com direct=false, utilize o download autenticado normal. Um link direto vale no máximo dois minutos e nunca além do prazo do envelope; não registre ou redistribua a URL. Não envie a chave CLP ao host de armazenamento.

Estados e recuperação.

EstadoSignificado / ação
sentAguardando aceites. Convites podem ainda estar na fila de envio.
acceptedTodos aceitaram; a finalização ainda precisa terminar. Não trate como PDF disponível.
completedFinalização concluída e arquivos disponíveis dentro do prazo.
sealing_failedA proteção final falhou. Os aceites ficam preservados; trate o erro e solicite retry.
declinedUm participante recusou; o fluxo não prossegue para assinatura final.
canceledCancelado enquanto aguardava os aceites.
expired / purgedPrazo encerrado / artefatos eliminados. Não há recuperação de arquivos pela API.
  • POST /v1/envelopes/{id}/resend: reenvia aos pendentes; até três operações por hora, apenas enquanto aberto. Retorno 202.
  • POST /v1/envelopes/{id}/cancel: cancela apenas quando status=sent. Retorno 200 com status=canceled.
  • POST /v1/envelopes/{id}/retry: retoma sealing_failed; retorna 202. Consulte até a conclusão.
  • PUT /v1/envelopes/{id}/certificate: em falha e antes de existir PDF final, envie {"certificate_id":"UUID_DO_NOVO_CERTIFICADO"} para customer ou {} para a plataforma selecionar seu certificado atual. Retorno 202.

Referência dos endpoints.

Rotas para integração por chave da empresa. Administração, sessão do portal e confirmação de assinatura pelo destinatário não integram esta referência. O OpenAPI inclui o piloto opcional de conferência com IA.

MétodoCaminhoUso
GET/public/plansConsultar os planos públicos e suas franquias.
GET/v1/account/subscriptionConsultar vigência, plano e uso compartilhado de documentos.
POST/v1/account/renewCriar ou reutilizar a fatura do ciclo; depende do provedor de pagamento habilitado.
GET/v1/account/invoicesListar até 200 faturas, da mais recente para a mais antiga.
GET/v1/account/invoices/{id}Consultar uma fatura da empresa.
POST/v1/account/invoices/{id}/checkConferir a fatura no provedor de pagamento.
GET/v1/account/usageConsultar histórico mensal de assinaturas diretas; franquia total em account/subscription.
PUT/v1/account/webhookConfigurar URL HTTPS e obter o segredo HMAC.
DELETE/v1/account/webhookRemover a configuração de webhook.
POST/v1/account/webhook/testEnfileirar webhook.test; 202 não comprova entrega.
GET/v1/account/webhook/deliveriesListar as 50 entregas de webhook mais recentes.
POST/v1/certificatesImportar certificado próprio, com autorização expressa em multipart.
GET/v1/certificatesListar certificados da empresa.
GET/v1/certificates/{id}Consultar metadados de um certificado.
DELETE/v1/certificates/{id}Bloquear o uso e remover o certificado do cofre.
GET/v1/envelopes/protectionConsultar disponibilidade da proteção pelo prestador.
POST/v1/envelopesCriar envelope e enfileirar convites; não retorna links individuais.
GET/v1/envelopesListar envelopes em array, 100 por página.
GET/v1/envelopes/{id}Consultar envelope e situação dos destinatários.
GET/v1/envelopes/{id}/signing-linksConsultar links privados dos destinatários pendentes; exige envelope aberto e não expirado.
GET/v1/envelopes/{id}/files/{kind}Baixar original, final ou evidence com autenticação.
GET/v1/envelopes/{id}/files/{kind}/linkObter link curto quando disponível; direct=false exige download normal.
POST/v1/envelopes/{id}/cancelCancelar envelope em sent.
POST/v1/envelopes/{id}/resendReenviar convites pendentes, até três operações/hora.
POST/v1/envelopes/{id}/delivery-receiptsRegistrar arquivamento após conferir os hashes dos três arquivos.
POST/v1/envelopes/{id}/retryRetomar uma finalização em sealing_failed.
PUT/v1/envelopes/{id}/certificateRetomar falha com certificado válido antes de existir PDF final; {} em platform.
POST/v1/signaturesAssinar diretamente com certificado próprio; sem fluxo de aceites nem guarda do PDF.
GET/v1/signaturesListar registros de assinaturas diretas, com paginação e filtros.
GET/v1/signatures/{id}Consultar auditoria de uma assinatura direta.
POST/v1/verifyVerificar integridade e cadeia das assinaturas do PDF; não é análise jurídica.
GET/v1/ai/capabilitiesConsultar disponibilidade e franquia do piloto de IA.
POST/v1/ai/analysesAnalisar PDF com autorização específica; não envia convites.
GET/v1/ai/analyses/{id}Consultar análise da empresa enquanto o rascunho estiver disponível.
DELETE/v1/ai/analyses/{id}Descartar o resultado do rascunho; não altera resumo já vinculado a envelope.
POST/v1/ai/analyses/{id}/compareConferir dados do ERP contra trechos extraídos, sem nova chamada ao modelo.

Mensalidade e faturas

GET /v1/account/subscription informa vigência e usage.documents_used, document_limit, documents_remaining e período de uso. Um limite nulo significa ausência de franquia mensal; campos opcionais podem ser omitidos no JSON.

POST /v1/account/renew cria ou reutiliza a fatura do ciclo. No adaptador Asaas, o pagamento é feito no checkout_url retornado quando disponível. Consulte a fatura por ID e use POST /v1/account/invoices/{id}/check para conferência no provedor. Retorno do navegador não confirma pagamento.

Asaas configurado em produção. A execução requer conta habilitada; o cadastro comercial está disponível no portal. O modelo é fatura mensal; não há débito automático do cartão. Os eventos invoice.created, invoice.paid, subscription.activated e subscription.suspended tratam da conta CLP. O webhook de pagamento Asaas é interno à operação CLP e não deve ser configurado pelo ERP.

Assinatura direta com certificado próprio.

POST /v1/signatures aplica a assinatura do certificado da empresa diretamente ao PDF. Não cria destinatários, convites, página de aceite ou evidências de consentimento. Para obter esses recursos, use envelopes.

Envie multipart com pdf, certificate_id e Idempotency-Key. Os campos reason, location e contact são opcionais. O certificado da plataforma não é permitido nessa rota.

cURL · certificado próprio, fora do fluxo de envelopes
curl --fail-with-body 'https://api.clpsistemas.com.br/v1/signatures' \
  -H "Authorization: Bearer $CLP_API_KEY" \
  -H 'Idempotency-Key: erp-assinatura-direta-1042-v1' \
  -F '[email protected];type=application/pdf' \
  --form-string "certificate_id=$CERTIFICATE_ID" \
  --dump-header assinatura.headers --output assinatura.resposta

# Confira o status e o Content-Type antes de tratar a resposta como PDF.

A resposta normal é PDF com X-Signature-Id e X-Signed-Sha256. Com ?response=json, retorna signature e signed_pdf_base64. Armazene a resposta: o endpoint direto não guarda o PDF para download posterior.

Em repetição já concluída, o servidor retorna JSON com replay=true e o registro, sem os bytes do PDF, mesmo se a primeira resposta foi binária. Confira Content-Type e Idempotent-Replay antes de salvar o resultado como PDF. Não faça nova assinatura automaticamente para tentar recuperar um arquivo perdido.

Aparência visual opcional

O campo multipart appearance recebe JSON. Modos: invisible (padrão), rect e anchor. Em rect, informe page, x, y, width e height; em anchor, anchor_text. A opção visual não substitui a validação criptográfica. Consulte as opções no OpenAPI e homologue o posicionamento em seus modelos.

GET /v1/signatures aceita page (padrão 1), pageSize (1–200, padrão 50), from, to e certificateId; retorna items, page, page_size e total. O filtro to é exclusivo. GET /v1/signatures/{id} retorna o registro de auditoria.

POST /v1/verify recebe o PDF em multipart (campo pdf), ou JSON com pdf_base64. Retorna valid, signature_count, file_size, signatures e warnings. Leia os resultados de integridade e cadeia e os avisos; o relatório técnico não equivale a uma análise jurídica do contrato.

Limites e tratamento de erros.

Franquias: Essencial 500 documentos/mês; Profissional 1.500; Empresarial sem franquia mensal. Até cinco signatários por envelope e cinco certificados ativos por empresa. API e portal compartilham a franquia. Envelope conta uma vez no envio; assinatura direta conta quando concluída. Reenvios e repetições idempotentes não duplicam o consumo.

JSON · exemplo de erro tratado
{
  "error": {
    "code": "idempotency_conflict",
    "message": "Esta chave já foi usada com outro conteúdo.",
    "request_id": "ID_DA_REQUISICAO"
  }
}
HTTPCódigos comunsAção
400missing_idempotency_key, invalid_recipients, invalid_pdf, authorization_requiredCorrija os campos; não repita sem alteração.
401 / 403unauthorized / account_suspendedConfira a chave, revogação e a situação da empresa.
402Condição de mensalidade informada no erroConsulte a assinatura e regularize a conta.
404envelope_not_found, certificate_not_found, file_unavailableConfira ID, conta e disponibilidade do arquivo.
409idempotency_conflict, quota_exceeded, sender_pending, already_signed, certificate_unusableResolva o conflito; consulte o recurso antes de reenviar.
410link_unavailablePrazo encerrado ou link indisponível. Use a cópia arquivada.
413 / 422pdf_size, payload_too_large / certificate_expiredReduza o arquivo ou substitua o certificado, conforme o código.
429Limite geral ou resend_limitAguarde. O limite geral pode retornar corpo vazio.
500 / 503internal_error / platform_seal_unavailablePreserve request_id. Falha de configuração exige suporte; erros transitórios pedem consulta e repetição idempotente limitada.

Não presuma JSON em toda resposta: limites de infraestrutura, 429 e downloads podem ter outro formato. Confira status e Content-Type. Envie request_id ao suporte sem incluir chave, senha, PDF ou URL temporária.

Conferência com IA: piloto por API.

Seu ERP envia o PDF, recebe os trechos extraídos e compara os campos da operação antes de autorizar os convites. O piloto está ativado para contas habilitadas, com 100 análises por mês por empresa, separadas da franquia de documentos — inclusive no Empresarial. Consulte os limites atuais em GET /v1/ai/capabilities.

  1. Envie POST /v1/ai/analyses em multipart com pdf, allow_ai_processing=true e Idempotency-Key. Essa autorização cobre o envio do texto ao Google Gemini. Aceita PDF com texto selecionável, até 10 MB, 50 páginas e 100 mil caracteres; não faz OCR.
  2. Leia id e status; se receber 202, consulte GET /v1/ai/analyses/{id}. Rascunhos duram 24 horas. Retentativas devem usar a mesma chave e o mesmo PDF.
  3. Quando concluído, envie POST /v1/ai/analyses/{id}/compare com JSON como {"monthly_amount_brl":249.90,"term_months":12}. Também aceita party_documents, até dez CPF/CNPJ válidos. Pelo menos um campo é obrigatório; outros campos são rejeitados. Os dados esperados não são enviados ao modelo.
  4. Leia comparison.status: no_difference_detected, needs_review ou inconclusive. Cada conferência contém trechos e páginas. Sempre revise o PDF: ausência de diferença não significa aprovação jurídica.
  5. Após revisão, crie o envelope com o mesmo PDF, ai_analysis_id e ai_reviewed=true. Se desejar mostrar trechos revisados aos destinatários, acrescente include_ai_summary=true. Nada é enviado automaticamente pela análise.

DELETE /v1/ai/analyses/{id} descarta o rascunho; não remove um resumo já vinculado a envelope. Alterações no PDF exigem nova análise. Falhas após envio ao provedor podem consumir a franquia; compare não faz nova chamada ao modelo. O envio manual continua disponível sem IA.

Explorar a demonstração fictícia da conferência ↗

Antes de liberar a integração.

  • Autenticação e isolamento entre contas; chave inválida, revogada e ausente.
  • Mesmo envio repetido e timeout sem duplicar envelope; chave reutilizada com outro PDF deve falhar.
  • Até cinco destinatários: leitura, aceite, recusa, cancelamento e expiração.
  • Webhook válido, corpo alterado, relógio fora da tolerância, duplicação e indisponibilidade do receptor.
  • PDF final e evidências baixados, hashes conferidos, guarda durável e recibo somente depois.
  • Certificado indisponível/vencido, falha de finalização, reenvio e retomada controlada.
  • Limite de uso, retenção e reconciliação após interrupção do ERP.

Use dados sintéticos e destinatários de teste autorizados na homologação combinada. Os exemplos desta documentação não criam um ambiente sandbox nem autorizam envios a terceiros.

Alinhar a integração com a CLP
Voltar ao início ↑

Conteúdo para integradores

Guias de C#, PHP e Node.js, webhooks e integração ao ERP →