Guias de Desenvolvimento

Signing Sessions

Guias dos SDKs

Upload de Documentos

Existem duas formas de enviar documentos para uma transação:

  1. Inline (base64) — conteúdo embutido na requisição. Ideal para documentos pequenos (< 5MB)
  2. URL pré-assinada — upload direto para S3. Recomendado para documentos maiores

Método 1: Upload Inline

Na criação da transação

O documento pode ser incluído diretamente na criação da transação (já demonstrado nos guias de fluxo):

document: { content: "<base64>", filename: "contrato.pdf" }

Upload separado

Crie a transação sem documento e faça upload depois.

// Criar sem documento
const tx = await client.transactions.create({
  purpose: 'DOCUMENT_SIGNATURE',
  policy: { profile: 'CLICK_ONLY' },
  signer: { name: 'João Silva', userExternalId: 'user-001' },
});
console.log(tx.status); // CREATED

// Upload separado
const updated = await client.documents.upload(tx.transactionId, {
  content: pdfBase64,
  filename: 'contrato.pdf',
});
console.log(updated.status); // DOCUMENT_UPLOADED
from signdocs_brasil.models import UploadDocumentRequest

# Criar sem documento
tx = client.transactions.create(CreateTransactionRequest(
    purpose='DOCUMENT_SIGNATURE',
    policy=Policy(profile='CLICK_ONLY'),
    signer=Signer(name='João Silva', user_external_id='user-001'),
))

# Upload separado
updated = client.documents.upload(
    tx.transaction_id,
    UploadDocumentRequest(content=pdf_base64, filename='contrato.pdf'),
)
// Criar sem documento
tx, _ := client.Transactions.Create(ctx, &signdocs.CreateTransactionRequest{
    Purpose: signdocs.TransactionPurposeDocumentSignature,
    Policy:  signdocs.Policy{Profile: signdocs.PolicyProfileClickOnly},
    Signer:  signdocs.Signer{Name: "João Silva", UserExternalID: "user-001"},
})

// Upload separado
updated, _ := client.Documents.Upload(ctx, tx.TransactionID, &signdocs.UploadDocumentRequest{
    Content:  pdfBase64,
    Filename: "contrato.pdf",
})
// Criar sem documento
CreateTransactionRequest request = new CreateTransactionRequest();
request.purpose = "DOCUMENT_SIGNATURE";
request.policy = new Policy("CLICK_ONLY");
request.signer = new Signer("João Silva", null, "user-001");
Transaction tx = client.transactions().create(request);

// Upload separado
Transaction updated = client.documents().upload(tx.transactionId,
    new UploadDocumentRequest(pdfBase64, "contrato.pdf"));
// Criar sem documento
$tx = $client->transactions->create(new CreateTransactionRequest(
    purpose: 'DOCUMENT_SIGNATURE',
    policy: new Policy(profile: 'CLICK_ONLY'),
    signer: new Signer(name: 'João Silva', userExternalId: 'user-001'),
));

// Upload separado
$updated = $client->documents->upload($tx->transactionId,
    new UploadDocumentRequest(content: $pdfBase64, filename: 'contrato.pdf'));

Método 2: Upload com URL Pré-Assinada

Recomendado para documentos maiores. Três passos: obter URL → upload direto → confirmar.

Passo 1: Obter URL pré-assinada

const presign = await client.documents.presign(tx.transactionId, {
  contentType: 'application/pdf',
  filename: 'contrato.pdf',
});
console.log(presign.uploadUrl);     // URL S3 temporária
console.log(presign.uploadToken);   // Token para confirmar upload
console.log(presign.s3Key);         // Chave do objeto no S3
console.log(presign.expiresIn);     // Tempo de expiração em segundos
console.log(presign.contentType);   // application/pdf
console.log(presign.instructions);  // Instruções de upload
from signdocs_brasil.models import PresignRequest

presign = client.documents.presign(tx.transaction_id, PresignRequest(
    content_type='application/pdf',
    filename='contrato.pdf',
))
print(presign.upload_url)
print(presign.upload_token)
print(presign.s3_key)
print(presign.expires_in)
print(presign.content_type)
presign, _ := client.Documents.Presign(ctx, tx.TransactionID, &signdocs.PresignRequest{
    ContentType: "application/pdf",
    Filename:    "contrato.pdf",
})
fmt.Println(presign.UploadURL)
fmt.Println(presign.UploadToken)
fmt.Println(presign.S3Key)
fmt.Println(presign.ExpiresIn)
fmt.Println(presign.ContentType)
PresignResponse presign = client.documents().presign(tx.transactionId,
    new PresignRequest("application/pdf", "contrato.pdf"));
System.out.println(presign.uploadUrl);
System.out.println(presign.getUploadToken());
System.out.println(presign.s3Key);
System.out.println(presign.expiresIn);
System.out.println(presign.contentType);
$presign = $client->documents->presign($tx->transactionId, new PresignRequest(
    contentType: 'application/pdf',
    filename: 'contrato.pdf',
));
echo $presign->uploadUrl;
echo $presign->uploadToken;
echo $presign->s3Key;
echo $presign->expiresIn;
echo $presign->contentType;

Passo 2: Upload direto para S3

Faça uma requisição HTTP PUT para a URL pré-assinada com o header Content-Type retornado. Esta chamada é feita diretamente, não através do SDK.

const fileBuffer = fs.readFileSync('contrato.pdf');

await fetch(presign.uploadUrl, {
  method: 'PUT',
  headers: { 'Content-Type': presign.contentType },
  body: fileBuffer,
});
import requests

with open('contrato.pdf', 'rb') as f:
    file_content = f.read()

requests.put(
    presign.upload_url,
    headers={'Content-Type': presign.content_type},
    data=file_content,
)
fileContent, _ := os.ReadFile("contrato.pdf")

req, _ := http.NewRequest("PUT", presign.UploadURL, bytes.NewReader(fileContent))
req.Header.Set("Content-Type", presign.ContentType)
http.DefaultClient.Do(req)
byte[] fileContent = Files.readAllBytes(Path.of("contrato.pdf"));

HttpRequest uploadReq = HttpRequest.newBuilder()
    .uri(URI.create(presign.uploadUrl))
    .header("Content-Type", presign.contentType)
    .PUT(HttpRequest.BodyPublishers.ofByteArray(fileContent))
    .build();
HttpClient.newHttpClient().send(uploadReq, HttpResponse.BodyHandlers.discarding());
$fileContent = file_get_contents('contrato.pdf');

$ch = curl_init($presign->uploadUrl);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_POSTFIELDS, $fileContent);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type: ' . $presign->contentType,
]);
curl_exec($ch);
curl_close($ch);

Passo 3: Confirmar upload

Após o upload, confirme informando o uploadToken recebido no passo 1.

const confirmed = await client.documents.confirm(tx.transactionId, {
  uploadToken: presign.uploadToken,
});
console.log(confirmed.status); // DOCUMENT_UPLOADED
from signdocs_brasil.models import ConfirmDocumentRequest

confirmed = client.documents.confirm(tx.transaction_id, ConfirmDocumentRequest(
    upload_token=presign.upload_token,
))
confirmed, _ := client.Documents.Confirm(ctx, tx.TransactionID, &signdocs.ConfirmDocumentRequest{
    UploadToken: presign.UploadToken,
})
Transaction confirmed = client.documents().confirm(tx.transactionId,
    new ConfirmDocumentRequest(presign.getUploadToken()));
$confirmed = $client->documents->confirm($tx->transactionId, new ConfirmDocumentRequest(
    uploadToken: $presign->uploadToken,
));

Download do documento assinado

Após finalizar a transação, obtenha a URL de download do PDF assinado.

const download = await client.documents.download(tx.transactionId);
console.log(download.downloadUrl);  // URL pré-assinada (expira em minutos)
console.log(download.filename);     // contrato.pdf
console.log(download.contentType);  // application/pdf
download = client.documents.download(tx.transaction_id)
print(download.download_url)
print(download.filename)
download, _ := client.Documents.Download(ctx, tx.TransactionID)
fmt.Println(download.DownloadURL)
fmt.Println(download.Filename)
DownloadResponse download = client.documents().download(tx.transactionId);
System.out.println(download.downloadUrl);
System.out.println(download.filename);
$download = $client->documents->download($tx->transactionId);
echo $download->downloadUrl;
echo $download->filename;