Integrando com Node.js
Use o SDK oficial @assinapi/sdk ou fetch nativo (Node 18+).
Secret key
Variável de ambiente ASSINAPI_SECRET_KEY (secret manager em produção).
Arquitetura
Seu servidor (Express/Fastify/Nest) → AssinAPI.
Criar envelope
- Cria um envelope (rascunho).
- npm install @assinapi/sdk
typescript
import { AssinAPI } from '@assinapi/sdk';
const assinapi = new AssinAPI({ apiKey: process.env.ASSINAPI_SECRET_KEY });
const envelope = await assinapi.envelopes.create({ title: 'Contrato de prestação de serviços', expirationDays: 7 });
console.log(envelope.id, envelope.status); // env_… DRAFTEnviar PDF
- Anexa o PDF ao envelope. O SHA-256 é calculado pela AssinAPI.
- npm install @assinapi/sdk
typescript
import { AssinAPI } from '@assinapi/sdk';
const assinapi = new AssinAPI({ apiKey: process.env.ASSINAPI_SECRET_KEY });
import { readFile } from 'node:fs/promises';
await assinapi.envelopes.addDocument('ENVELOPE_ID', { file: await readFile('contrato.pdf'), filename: 'contrato.pdf' });Adicionar signatário
- Adiciona um signatário (CPF obrigatório na assinatura avançada).
- npm install @assinapi/sdk
typescript
import { AssinAPI } from '@assinapi/sdk';
const assinapi = new AssinAPI({ apiKey: process.env.ASSINAPI_SECRET_KEY });
await assinapi.envelopes.addSigner('ENVELOPE_ID', {
name: 'João da Silva',
email: 'joao@email.com',
cpf: '529.982.247-25',
authenticationMethod: 'EMAIL_OTP',
});Enviar para assinatura
- Envia para assinatura. A resposta traz os signingLinks.
- npm install @assinapi/sdk
typescript
import { AssinAPI } from '@assinapi/sdk';
const assinapi = new AssinAPI({ apiKey: process.env.ASSINAPI_SECRET_KEY });
const sent = await assinapi.envelopes.send('ENVELOPE_ID');
for (const link of sent.signingLinks) console.log(link.name, link.signingUrl);Consultar status
- Consulta status do envelope e dos signatários.
- npm install @assinapi/sdk
typescript
import { AssinAPI } from '@assinapi/sdk';
const assinapi = new AssinAPI({ apiKey: process.env.ASSINAPI_SECRET_KEY });
const envelope = await assinapi.envelopes.get('ENVELOPE_ID');
console.log(envelope.status, envelope.signers.map((s) => s.status));Baixar documento assinado
- Retorna URLs temporárias do PDF assinado, certificado e manifesto.
- npm install @assinapi/sdk
typescript
import { AssinAPI } from '@assinapi/sdk';
const assinapi = new AssinAPI({ apiKey: process.env.ASSINAPI_SECRET_KEY });
const evidence = await assinapi.envelopes.evidence('ENVELOPE_ID');
console.log(evidence.downloads.documents[0].final); // URL temporária do PDF assinado
console.log(evidence.downloads.certificate);Receber webhooks
- Valide SEMPRE a assinatura HMAC (X-Signature) usando o corpo bruto.
- Rejeite eventos com X-Timestamp com mais de 5 minutos e deduplique por X-Event-Id.
- Responda 2xx rapidamente; processe de forma assíncrona. Falhas são reenviadas com backoff exponencial.
typescript
import { AssinAPI } from '@assinapi/sdk';
const assinapi = new AssinAPI({ apiKey: process.env.ASSINAPI_SECRET_KEY });
// Next.js Route Handler: app/api/webhooks/assinapi/route.ts
export async function POST(req: Request) {
const event = assinapi.webhooks.constructEvent({
payload: await req.text(),
headers: req.headers,
secret: process.env.ASSINAPI_WEBHOOK_SECRET!,
});
if (event.type === 'envelope.completed') {
// atualize o status no seu banco e baixe as evidências com assinapi.envelopes.evidence(...)
}
return new Response('ok');
}