O enrollment biométrico cadastra a imagem de referência de um usuário para uso em fluxos de verificação biométrica futuros. Após o cadastro, o fluxo BIOMETRIC não requer envio de referenceImage — a imagem cadastrada é usada automaticamente.
A imagem deve ser:
O método enroll usa HTTP PUT — chamadas subsequentes para o mesmo userExternalId atualizam a imagem de referência.
const result = await client.users.enroll('user-001', {
image: imageBase64,
cpf: '12345678901',
source: 'BANK_PROVIDED',
});
console.log(result.userExternalId); // user-001
console.log(result.enrolled); // true
console.log(result.enrolledAt); // 2024-01-15T10:30:00Z
from signdocs_brasil.models import EnrollUserRequest
result = client.users.enroll('user-001', EnrollUserRequest(
image=image_base64,
cpf='12345678901',
source='BANK_PROVIDED',
))
print(result.user_external_id) # user-001
print(result.enrolled) # True
print(result.enrolled_at)
result, _ := client.Users.Enroll(ctx, "user-001", &signdocs.EnrollUserRequest{
Image: imageBase64,
CPF: "12345678901",
})
fmt.Println(result.UserExternalID) // user-001
fmt.Println(result.Enrolled) // true
fmt.Println(result.EnrolledAt)
EnrollUserResponse result = client.users().enroll("user-001",
new EnrollUserRequest(imageBase64, "12345678901"));
System.out.println(result.userExternalId); // user-001
System.out.println(result.enrolled); // true
System.out.println(result.enrolledAt);
$result = $client->users->enroll('user-001', new EnrollUserRequest(
image: $imageBase64,
cpf: '12345678901',
));
echo $result->userExternalId; // user-001
echo $result->enrolled; // true
echo $result->enrolledAt;
Após o cadastro, crie transações BIOMETRIC normalmente. A etapa BIOMETRIC_MATCH usará a imagem cadastrada automaticamente — não é necessário enviar referenceImage no complete.
// 1. Criar transação biométrica (signatário já possui enrollment)
const tx = await client.transactions.create({
purpose: 'DOCUMENT_SIGNATURE',
policy: { profile: 'BIOMETRIC' },
signer: { name: 'João Silva', userExternalId: 'user-001' },
document: { content: pdfBase64, filename: 'contrato.pdf' },
});
// 2. Completar liveness normalmente
const steps = await client.steps.list(tx.transactionId);
const start = await client.steps.start(tx.transactionId, steps[0].stepId, {
captureMode: 'HOSTED_PAGE',
});
await client.steps.complete(tx.transactionId, steps[0].stepId, {
livenessSessionId: start.livenessSessionId,
});
// 3. Completar match SEM referenceImage (usa enrollment)
await client.steps.complete(tx.transactionId, steps[1].stepId, {});
// 4. Completar click e finalizar
await client.steps.start(tx.transactionId, steps[2].stepId);
await client.steps.complete(tx.transactionId, steps[2].stepId, { accepted: true });
await client.transactions.finalize(tx.transactionId);
# Match SEM referenceImage (usa enrollment)
client.steps.complete(tx.transaction_id, steps[1].step_id, CompleteBiometricMatchRequest())
// Match SEM referenceImage (usa enrollment)
client.Steps.Complete(ctx, tx.TransactionID, steps[1].StepID,
&signdocs.CompleteBiometricMatchRequest{})
// Match SEM referenceImage (usa enrollment)
client.steps().complete(tx.transactionId, steps.get(1).stepId, Map.of());
// Match SEM referenceImage (usa enrollment)
$client->steps->complete($tx->transactionId, $steps[1]->stepId, []);
Para mais detalhes sobre o fluxo biométrico completo, veja Verificação Biométrica.