Introdução
Conceitos essenciais, glossário, limites e convenções da API ForSign.
A ForSign expõe uma API REST pra automatizar todo o ciclo de uma assinatura eletrônica — do upload do PDF ao download dos documentos finalizados. Antes de escrever a primeira linha de código, vale entender o conceito central e o vocabulário da plataforma.
A "Operação" — o conceito central
Quase tudo na ForSign gira em torno de uma operação. Pense nela como o contêiner que junta tudo o que precisa acontecer pra um conjunto de documentos ser assinado: os PDFs, quem assina, em que ordem, que formulários preenchem, que anexos enviam, e como tudo se encerra.
- · contrato.pdf
- · anexo-tecnico.pdf
- · Fulano · Contratante
- · Ciclano · Observador
- · Nome da mãe · Text
- · Data de nascimento · Date
- · Selfie · obrigatório
- · RG · opcional
pt-br, ordem sequencial, prazo até 30/12/2025, finalização automática, redirect pós-assinaturaCada operação tem um identificador único — o ID da operação (o campo id
retornado na criação) — que você usa pra rastrear, cancelar, finalizar ou baixar
os documentos depois. É um número sequencial por conta. Toda ação posterior à
criação é "uma operação sobre uma operação".
id ≠ externalId — não confunda. O id (um número) é o identificador
da operação e é o que vai em todos os endpoints seguintes, sempre na URL como
{operationId}. Já o externalId é um rótulo opcional e seu (ex:
PEDIDO-123) que você envia na criação só pra correlacionar com seu sistema; ele
não endereça a operação em lugar nenhum.
Glossário
Termos que aparecem em vários endpoints e que vale a pena fixar:
| Termo | O que é |
|---|---|
| Operação | O contêiner principal. Junta documentos, membros, formulários, anexos e regras. |
ID da operação (id) | Identificador da operação, retornado no campo id da criação. Número sequencial por conta. É o valor usado em todos os endpoints que agem sobre a operação. Nas URLs aparece como {operationId}. |
externalId | Opcional. Seu identificador próprio (ex: nº do pedido), enviado na criação pra correlacionar com seu sistema. Não é usado pra endereçar a operação. |
| Membro | Qualquer pessoa participando da operação — pode ser assinante ou observador. |
| Assinante | Membro com observer: false. Realmente assina o documento. |
| Observador | Membro com observer: true. Acompanha o processo e recebe o documento final, mas não assina. |
| Documento | PDF que será assinado. Subido via /v2/document/upload, referenciado em files[].id na criação. |
| Anexo | Arquivo complementar enviado pelo assinante (RG, selfie, comprovante). Pode ter fluxo de aprovação. |
| Formulário | Campos que o assinante preenche antes de assinar (formFields[]). |
| Assinatura | A marca visual do assinante no PDF. Posicionada por coordenadas (positions[]) ou tag textual. |
| Rubrica | Marca menor, geralmente em cada página. Aplicada via tag (#rubrica) ou coordenadas. |
| Operação imutável | Após criada, a estrutura da operação (membros, documentos, formulários) não pode ser editada. Pra mudar algo, cancele e recrie. |
Limites e quotas
Coisas que vale saber antes de planejar a integração:
| Item | Limite |
|---|---|
| Tamanho máximo do PDF | 10 MB por arquivo |
| Formato aceito no upload | Apenas PDF |
| Documentos por operação | Sem limite rígido — combine via files[] |
| Membros por operação | Sem limite rígido — atenção a memberMovementWarning em operações com 10+ |
| Idiomas suportados | pt-br, en, es |
| Canais de notificação | Email, SMS, Whatsapp, None (Desativado) |
| Tipos de assinatura | Click, Draw, Text, UserChoice, Certificate, CloudCertificate |
| Webhook retry | Até 5 tentativas em 24h com backoff exponencial |
| Webhook timeout | 30 segundos por entrega |
| Rate limit | Sob demanda — entre em contato com o suporte caso precise |
Formato das respostas
Toda resposta bem-sucedida usa o mesmo envelope:
{
"success": true,
"statusCode": 200,
"data": { /* o resultado do endpoint */ },
"messages": [{ "value": "Mensagem amigável e localizada" }]
}success—trueem caso de sucesso.statusCode— o código HTTP, repetido no corpo.data— o resultado do endpoint (objeto, lista ounull).messages[]— mensagens amigáveis (no campovalue), localizadas pelo headerContent-Language(pt-brpor padrão).
Campos null são omitidos do JSON e enums vêm como texto (ex.: "Completed", não 5).
Convenção de erros
Os status codes mais comuns:
| Status | Quando ocorre |
|---|---|
200 OK / 201 Created | Sucesso. O corpo segue o envelope acima. |
400 Bad Request | Payload inválido (campo faltando, formato errado, regra de negócio violada). |
401 Unauthorized | X-Api-Key ausente ou inválida. |
403 Forbidden | A chave não tem permissão para esse recurso. |
404 Not Found | Recurso (operação, anexo, documento) não existe ou não pertence à sua conta. |
429 Too Many Requests | Rate limit excedido — espere e tente de novo. |
500 Internal Server Error | Erro do nosso lado. Tente novamente; persistindo, contate o suporte. |
Erros de validação (400)
Erros de validação trazem os detalhes por campo em detail[]:
{
"statusCode": 400,
"description": "O arquivo não foi enviado",
"detail": [
{ "code": "NotEmptyValidator", "target": "File", "message": "Arquivo é obrigatório" }
]
}description— mensagem amigável (a primeira falha), localizada.detail[]— cada item temtarget(o campo),messageecode.
Demais erros
Os outros erros (403, 404, 500, e 401 quando há corpo) usam o envelope padrão com success: false:
{
"success": false,
"statusCode": 404,
"messages": [{ "value": "Operação não encontrada" }]
}As mensagens são localizadas pelo header Content-Language que você envia (pt-br por padrão).
Versões da API
Endpoints novos vivem em /api/v2/, alguns legados em /api/v1/. A versão
correta está sempre indicada na URL de cada endpoint nesta documentação —
sempre confira antes de copiar o exemplo.
Ambiente de testes
A ForSign não tem sandbox público. Pra fazer integração contra um ambiente isolado (sem afetar sua conta de produção), abra um chamado no nosso suporte solicitando acesso a um ambiente de testes.