SDK Node.js
Cliente oficial ForSign para Node.js e TypeScript — ESM + CJS, com tipos incluídos.
Pacote @forsigndigital/sdk no npm. Distribui ESM, CJS e tipos TypeScript em
um único bundle. Construído sobre axios e form-data.
Compatibilidade
- Node.js 18+
- TypeScript 4.5+ (opcional — tipos incluídos no pacote)
- Importável como ESM (
import) ou CommonJS (require)
Instalação
npm install @forsigndigital/sdkpnpm add @forsigndigital/sdkyarn add @forsigndigital/sdkConfigurando o cliente
O construtor aceita um baseURL opcional (padrão https://api.forsign.digital).
A autenticação é feita com ApiKeyCredential.
import { ForSignClient, ApiKeyCredential } from '@forsigndigital/sdk';
// Padrão
const client = new ForSignClient();
// Override do baseURL (raro — staging)
// const client = new ForSignClient('https://api-staging.forsign.digital');
client.setCredential(new ApiKeyCredential(process.env.FORSIGN_API_KEY!));Apenas server-side. Não exponha a API Key em código que roda no navegador. Em frameworks como Next.js, use o SDK em route handlers, server actions ou endpoints de API — nunca em componentes client-side.
Métodos disponíveis
Também: setOperationManualCompletion, setOperationAutomaticCompletion.
1. Upload + criação da operação
import {
ForSignClient,
ApiKeyCredential,
FileRequest,
Signer,
EmailNotification,
EmailDoubleAuthentication,
DefaultSignatureType,
SignatureType,
OperationBuilder,
Language,
} from '@forsigndigital/sdk';
const client = new ForSignClient();
client.setCredential(new ApiKeyCredential(process.env.FORSIGN_API_KEY!));
// 1. Upload — três fontes suportadas
const fileRequest = await FileRequest.fromUrl(
'https://exemplo.com/contrato.pdf',
'contrato.pdf',
);
// ou: FileRequest.fromBuffer(await fs.readFile('./contrato.pdf'), 'contrato.pdf')
// ou: FileRequest.fromStream(createReadStream('./contrato.pdf'), 'contrato.pdf')
const upload = await client.uploadFile(fileRequest);
const fileInfo = { id: upload.data.id, description: upload.data.fileName };
// 2. Assinante com 2FA por email
const signer = new Signer({
name: 'João Silva',
email: '[email protected]',
notificationType: new EmailNotification('[email protected]'),
doubleAuthenticationMethod: new EmailDoubleAuthentication('[email protected]'),
signatureType: new DefaultSignatureType(SignatureType.UserChoice),
});
signer.addSignatureInPosition(fileInfo, 1, '70%', '80%');
// 3. Builder fluente
const operationRequest = OperationBuilder
.initializeWithName('Contrato de prestação de serviços')
.setLanguage(Language.Portuguese)
.setExpirationDate(new Date(Date.now() + 15 * 24 * 60 * 60 * 1000))
.withExternalId('CRM-12345')
.withRedirectUrl('https://app.exemplo.com/sucesso/{operationId}')
.addSigner(signer)
.build();
const response = await client.createOperation(operationRequest);
for (const member of response.members) {
console.log(`${member.name}: ${member.signUrl}`);
}2. Aprovar (ou rejeitar) anexos
Depois que o assinante envia documentos solicitados, sua aplicação inspeciona
e decide. O memberId vem de response.members[i].id ou do webhook
AttachmentFilled.
const attachments = await client.getMemberAttachments(memberId);
const uploaded = attachments.filter((a) => a.isUploaded);
// Aprovar todos
await client.approveAttachments(
operationMemberId,
uploaded.map((a) => a.id),
);
// Ou rejeitar com motivo (motivo obrigatório por anexo)
await client.rejectAttachments(operationMemberId, [
{ id: 4321, reason: 'Documento ilegível, reenvie em alta resolução' },
]);3. Download após a operação concluída
import { writeFile } from 'node:fs/promises';
const zip = await client.downloadOperationZip(operationId);
await writeFile(`${zip.name}.zip`, zip.content);
// Anexo individual
const file = await client.downloadAttachment(attachmentId);
await writeFile(file.fileName, file.content);Tratamento de erros
O SDK lança ForSignApiError em respostas HTTP de erro. A exceção carrega
statusCode e messages: ValidationMessage[].
import { ForSignApiError } from '@forsigndigital/sdk';
try {
await client.createOperation(operationRequest);
} catch (err) {
if (err instanceof ForSignApiError) {
if (err.statusCode === 402) {
// Créditos insuficientes
} else if (err.statusCode === 422) {
for (const m of err.messages) {
console.error(`${m.key}: ${m.value}`);
}
} else {
console.error(`${err.statusCode}: ${err.message}`);
}
} else {
throw err;
}
}Códigos comuns: 401 (API key inválida), 402 (sem créditos), 403 (sem permissão),
404 (operação/membro não encontrado), 422 (validação).
Versões
- 2.0.0 — release atual no npm. Cobre o ciclo completo (upload → criação →
anexos → finalização → download) e expõe os mesmos primitivos do SDK .NET:
OperationBuilder,Signer,TagPosition,TextFormField, etc.