API do TesseraSign
Integre seu ERP, CRM ou sistema externo ao TesseraSign para enviar documentos para assinatura eletrônica, acompanhar o status em tempo real e receber notificações automáticas via webhooks quando cada signatário agir.
Autenticação
Todas as requisições à API devem incluir uma chave de integração (API Key) no cabeçalho Authorization, no formato Bearer. A chave identifica sua organização e determina quais documentos você pode consultar.
Authorization: Bearer tsk_live_a1b2c3d4e5f6...Authorization: Bearer <chave>. Outros formatos (x-api-key, query param, header api-key) não são suportados e sempre retornam 401.URL Base
Todos os endpoints partem desta URL base:
https://tesserasign.base44.app/functions/publicApiNão há versionamento por caminho de URL — a versão atual é v1. O roteamento é feito por método HTTP e query params:
Criar Documento para Assinatura
Envia o PDF como binário (multipart/form-data), cria o envelope de assinatura, registra os signatários, envia os e-mails de convite automaticamente e configura o webhook de retorno.
/functions/publicApiCria um novo documento, abre o envelope e envia convites aos signatários.
Corpo da requisição (multipart/form-data)
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| file | File (binary) | Sim | Arquivo PDF em binário. O nome do arquivo é extraído automaticamente do File. |
| reference_id | string | Sim | Identificador único no seu sistema (ex: ID do contrato no ERP). |
| signers | string (JSON) | Sim | Array de signatários serializado como JSON string. Ex: [{"name":"João","email":"joao@x.com"}]. |
| message | string | Não | Mensagem personalizada enviada no e-mail de convite. |
| expires_at | string (ISO 8601) | Não | Data de expiração. Padrão: 30 dias. |
| signature_type | string | Não | simple | advanced | qualified. Padrão: advanced. |
| delivery_method | string | Não | email | sms | whatsapp | link. Padrão: email. |
| source_system | string | Não | Nome do sistema de origem (ex: "Arcarius ERP"). |
| filename | string | Não | Sobrescreve o nome do arquivo (opcional — por padrão usa o nome do File enviado). |
file binário em uma requisição multipart/form-data. Não defina Content-Type manualmente — o cliente HTTP define o boundary automaticamente. O campo signers é uma string JSON dentro do multipart (não um array nativo).Exemplo — curl
curl -X POST https://tesserasign.base44.app/functions/publicApi \
-H "Authorization: Bearer tsk_live_a1b2c3d4e5f6..." \
-F "file=@acordo-colaboracao.pdf" \
-F "reference_id=ACORD-2026-1234" \
-F "source_system=Arcarius ERP" \
-F 'signers=[{"name":"João Silva","email":"joao@empresa.com","cpf":"12345678901","phone":"11999999999"},{"name":"Maria Santos","email":"maria@empresa.com","cpf":"98765432109"}]' \
-F "message=Prezado(a), favor assinar o acordo de colaboração." \
-F "expires_at=2026-10-25T23:59:59Z" \
-F "signature_type=advanced"Exemplo — JavaScript (fetch)
const formData = new FormData();
formData.append("file", pdfFile); // pdfFile = File/Blob object
formData.append("reference_id", "ACORD-2026-1234");
formData.append("signers", JSON.stringify([
{ name: "João Silva", email: "joao@empresa.com" }
]));
const res = await fetch("https://tesserasign.base44.app/functions/publicApi", {
method: "POST",
headers: {
"Authorization": "Bearer tsk_live_a1b2c3d4e5f6..."
// NÃO defina Content-Type — o fetch define o boundary do multipart automaticamente
},
body: formData
});
const data = await res.json();
console.log(data.document_id, data.signers[0].sign_url);Resposta — 201 Created
{
"document_id": "6f7a8b9c0d1e2f3a4b5c6d7e",
"envelope_id": "7a8b9c0d1e2f3a4b5c6d7e8f",
"status": "pending",
"reference_id": "ACORD-2026-1234",
"signers": [
{
"signer_id": "abc123def456",
"name": "João Silva",
"email": "joao@empresa.com",
"status": "pending",
"sign_url": "https://tesserasign.base44.app/sign/a1b2c3d4e5f6"
},
{
"signer_id": "ghi789jkl012",
"name": "Maria Santos",
"email": "maria@empresa.com",
"status": "pending",
"sign_url": "https://tesserasign.base44.app/sign/b3c4d5e6f7g8"
}
],
"created_at": "2026-09-25T13:33:00.000Z"
}sign_url em cada signatário é o link de assinatura enviado por e-mail. Você pode usá-lo para redirecionar o signatário diretamente do seu sistema, se preferir não depender do e-mail.Consultar Status do Documento
Retorna o status atual do documento, dos signatários e o link do PDF assinado (quando concluído).
/functions/publicApi?id={document_id}Consulta o status de um documento criado via API.
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| id | string (query) | Sim | O document_id retornado na criação do documento. |
curl -X GET "https://tesserasign.base44.app/functions/publicApi?id=6f7a8b9c0d1e2f3a4b5c6d7e" \
-H "Authorization: Bearer tsk_live_a1b2c3d4e5f6..."Resposta — 200 OK (pendente)
{
"document_id": "6f7a8b9c0d1e2f3a4b5c6d7e",
"reference_id": null,
"status": "pending",
"signed_pdf_url": null,
"signed_at": null,
"created_at": "2026-09-25T13:33:00.000Z",
"signers": [
{
"name": "João Silva",
"email": "joao@empresa.com",
"status": "pending",
"signed_at": null
},
{
"name": "Maria Santos",
"email": "maria@empresa.com",
"status": "pending",
"signed_at": null
}
]
}Resposta — 200 OK (assinado)
{
"document_id": "6f7a8b9c0d1e2f3a4b5c6d7e",
"reference_id": null,
"status": "signed",
"signed_pdf_url": "https://storage.tesserasign.app/signed/abc123.pdf",
"signed_at": "2026-09-25T15:45:00.000Z",
"created_at": "2026-09-25T13:33:00.000Z",
"signers": [
{
"name": "João Silva",
"email": "joao@empresa.com",
"status": "signed",
"signed_at": "2026-09-25T15:30:00.000Z"
},
{
"name": "Maria Santos",
"email": "maria@empresa.com",
"status": "signed",
"signed_at": "2026-09-25T15:42:00.000Z"
}
]
}Baixar PDF Assinado
Quando o documento está totalmente assinado (status: "signed"), este endpoint redireciona (HTTP 302) para a URL pública do PDF assinado com todas as evidências criptográficas incorporadas.
/functions/publicApi?id={document_id}&download=pdfRedireciona para o PDF assinado. Use -L (follow redirects) no curl.
curl -L -X GET "https://tesserasign.base44.app/functions/publicApi?id=6f7a8b9c0d1e2f3a4b5c6d7e&download=pdf" \
-H "Authorization: Bearer tsk_live_a1b2c3d4e5f6..." \
-o acordo-assinado.pdfdocument.signed antes de tentar o download.Webhooks
O TesseraSign envia notificações em tempo real para o endpoint do Arcarius (https://arcarius.base44.app/functions/webhookTesseraAssinatura), configurado automaticamente na criação do documento — não é necessário informá-lo na requisição. As notificações são entregues via POST comContent-Type: application/json e um timeout de 15 segundos.
Eventos disponíveis
document.viewedDisparado quando o signatário abre o link de assinatura pela primeira vez.
document.signedDisparado quando todos os signatários concluem a assinatura. Inclui signed_pdf_url.
document.rejectedDisparado quando um signatário recusa assinar. Inclui decline_reason.
document.expiredDisparado quando o envelope expira sem conclusão.
Payload enviado (exemplo — document.signed)
{
"event": "document.signed",
"document_id": "6f7a8b9c0d1e2f3a4b5c6d7e",
"envelope_id": "7a8b9c0d1e2f3a4b5c6d7e8f",
"reference_id": "ACORD-2026-1234",
"status": "signed",
"signed_pdf_url": "https://storage.tesserasign.app/signed/abc123.pdf",
"signed_at": "2026-09-25T15:45:00.000Z",
"signers": [
{
"name": "João Silva",
"cpf": "***.456.***-**",
"email": "joao@empresa.com",
"status": "signed",
"signed_at": "2026-09-25T15:30:00.000Z",
"declined_at": null,
"decline_reason": null,
"ip": "189.45.12.34",
"geolocation": { "city": "São Paulo", "region": "SP" }
}
],
"occurred_at": "2026-09-25T15:45:00.000Z"
}Exemplo de recebimento (Node.js/Express)
app.post("/webhooks/tesserasign", express.json(), (req, res) => {
const { event, document_id, reference_id, status, signed_pdf_url } = req.body;
switch (event) {
case "document.viewed":
console.log("Documento visualizado:", reference_id);
break;
case "document.signed":
console.log("Documento assinado:", reference_id, "PDF:", signed_pdf_url);
// Atualize seu ERP, salve o signed_pdf_url, etc.
break;
case "document.rejected":
console.log("Documento recusado:", reference_id);
break;
case "document.expired":
console.log("Documento expirado:", reference_id);
break;
}
// Responda 2xx para confirmar o recebimento
res.status(200).json({ ok: true });
});Política de retentativas
- Seu endpoint deve responder com HTTP 2xx em até 15 segundos para confirmar o recebimento.
- Qualquer outro status ou timeout dispara retentativa automática.
- Até 3 tentativas com backoff crescente (imediato, +1 min, +5 min).
- Após 3 falhas, o webhook é marcado como
failede não retenta mais. - O evento
document.viewedé enviado apenas uma vez por documento.
Códigos de Erro
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| 400 | Bad Request | Não | Parâmetros obrigatórios ausentes ou inválidos no corpo da requisição. |
| 401 | Unauthorized | Não | Chave de API ausente, inválida ou organização inativa. |
| 404 | Not Found | Não | Documento não encontrado ou não pertence à sua organização. |
| 405 | Method Not Allowed | Não | Método HTTP não suportado neste endpoint. |
| 409 | Conflict | Não | Tentativa de baixar PDF de documento ainda não assinado. |
| 500 | Server Error | Não | Erro interno inesperado. Tente novamente ou contate o suporte. |
// Exemplo de resposta de erro
{
"error": "reference_id is required"
}Status de Documento
Os status retornados pela API seguem este mapeamento:
Plataforma de assinatura eletrônica com validade jurídica · ICP-Brasil
Dúvidas sobre a API? Contate o administrador da sua organização.