Capture o Termo de Consentimento Livre e Esclarecido (TCLE) e o consentimento LGPD do paciente antes da teleconsulta — com validade jurídica fundada na MP 2.200-2/2001 (art. 10, §2º), trilha de auditoria completa e pacote de evidências assinado com certificado ICP-Brasil. Em vez de termos impressos, e-mails de "li e concordo" sem prova ou telas de aceite que não geram evidência, sua plataforma passa a ter um registro verificável de quem consentiu, com o quê e quando — pronto para anexar ao prontuário eletrônico e apresentar em auditoria.
Público-alvo: healthtechs, clínicas com prontuário eletrônico (PEP) e plataformas de telemedicina que precisam registrar o consentimento do paciente de forma auditável e com mínima fricção.
POST /oauth2/token.POST /v1/trust-sessions se o consentimento é uma ação registrada na plataforma, ou POST /v1/signing-sessions com perfil CLICK_ONLY se existe um PDF de TCLE a ser assinado.url + ?cs= + clientSecret (ou embuta na sua tela de pré-consulta).TRANSACTION.COMPLETED e libere a teleconsulta.GET /v1/evidence/{evidenceId}) e anexe ao prontuário do paciente.Resultado: consentimento registrado, consulta liberada e evidência .p7m arquivada no prontuário.
Toda teleconsulta, teleinterconsulta ou procedimento mediado por plataforma digital precisa ser precedido de consentimento informado do paciente — é o que a prática clínica e a regulamentação de telemedicina (Resolução CFM 2.314/2022) esperam de quem opera nesse mercado. Na prática, muitas plataformas ainda resolvem isso com um checkbox sem registro probatório, um PDF enviado por e-mail que ninguém devolve assinado, ou — pior — papel impresso escaneado na recepção. Quando um paciente questiona um atendimento ou um auditor pede a prova do consentimento, o que existe é um booleano num banco de dados, sem identificação do consentidor, sem carimbo de horário confiável e sem integridade verificável.
A LGPD eleva o custo desse improviso: dado de saúde é dado pessoal sensível, e quando a base legal do tratamento é o consentimento, ele precisa ser livre, informado, inequívoco e — para dados sensíveis — fornecido de forma específica e destacada. Um checkbox anônimo dificilmente sustenta esse ônus de prova. O que sustenta é uma trilha auditável: identificação do paciente, teor exato do que foi apresentado, timestamp do servidor, IP, dispositivo e um pacote de evidências com integridade criptográfica. Este guia não substitui a orientação do seu DPO ou jurídico — para o enquadramento fino de cada perfil de assinatura, consulte perfis de assinatura e níveis legais.
O fluxo automatizado entrega exatamente isso com fricção mínima para o paciente: um clique de aceite (perfil CLICK_ONLY) quando ele já está autenticado na sua plataforma, ou aceite + código OTP (CLICK_PLUS_OTP) quando o link chega por um canal não autenticado. O consentimento vira um evento estruturado no seu sistema — a consulta só é liberada quando o webhook TRANSACTION.COMPLETED chega, e a evidência é arquivada no prontuário eletrônico automaticamente.
Existem duas modalidades para capturar o consentimento, e a escolha depende de como o TCLE se materializa no seu processo:
POST /v1/trust-sessions): o consentimento é uma ação registrada. O teor do termo é apresentado na própria plataforma (ou embutido em action.description) e o paciente confirma, sem PDF envolvido. Ideal para o aceite pré-teleconsulta recorrente.CLICK_ONLY (POST /v1/signing-sessions): existe um documento TCLE em PDF (modelo institucional, protocolo de pesquisa, termo específico de procedimento) que o paciente precisa visualizar e assinar. A evidência inclui o hash SHA-256 do PDF.Agendamento confirmado (seu sistema / PEP / agenda)
│
▼
POST /oauth2/token ───────► access_token
│
├── consentimento é uma AÇÃO na plataforma?
│ │
│ ▼
│ POST /v1/trust-sessions (Modalidade A)
│ action + policy CLICK_ONLY
│
└── existe um PDF de TCLE a assinar?
│
▼
POST /v1/signing-sessions (Modalidade B)
document + policy CLICK_ONLY
│
▼
Paciente abre url?cs={clientSecret} e aceita
│
▼
Webhook TRANSACTION.COMPLETED ───► sua API libera a teleconsulta
│
▼
GET /v1/evidence/{evidenceId} ───► evidência .p7m anexada ao prontuário
| Primitiva | Quando usar neste cenário |
|---|---|
Sessão de Confiança (/v1/trust-sessions) |
Consentimento como ação, sem documento: aceite pré-teleconsulta, consentimento LGPD para tratamento de dados de saúde. UX mais leve — o paciente não abre PDF. |
Sessão de Assinatura (/v1/signing-sessions) |
Há um PDF de TCLE a ser assinado (1 paciente, 1 documento). A evidência carrega o hash do PDF. |
Envelope (/v1/envelopes) |
Só quando mais de uma pessoa assina o mesmo TCLE — ex.: paciente + responsável legal de menor. Fora isso, não use. |
Para um mergulho na Modalidade A, leia o guia dedicado de captura de consentimento com Sessão de Confiança.
transactions:read transactions:write steps:write evidence:read webhooks:write.npm install @signdocs-brasil/api (TypeScript) ou pip install signdocs-brasil (Python). Para Go, Java, PHP e C#, veja o guia de autenticação dos SDKs.🟠 HML vs Produção — desenvolva sempre em HML (
https://api-hml.signdocs.com.br). As credenciais HML não consomem cota do plano e os dados expiram em 7 dias. Em HML, o OTP de teste vem no camposandbox.otpCodeda resposta — nada é enviado ao paciente.
A API usa OAuth2 client_credentials (servidor-a-servidor). Troque client_id + client_secret por um access_token:
export SIGNDOCS_BASE_URL="https://api-hml.signdocs.com.br"
ACCESS_TOKEN=$(curl -s -X POST "$SIGNDOCS_BASE_URL/oauth2/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=client_credentials&client_id=$SIGNDOCS_CLIENT_ID&client_secret=$SIGNDOCS_CLIENT_SECRET" \
| jq -r '.access_token')
Com os SDKs, a renovação do token é automática:
import { SignDocsBrasilClient } from '@signdocs-brasil/api';
const client = new SignDocsBrasilClient({
clientId: process.env.SIGNDOCS_CLIENT_ID!,
clientSecret: process.env.SIGNDOCS_CLIENT_SECRET!,
baseUrl: process.env.SIGNDOCS_BASE_URL, // https://api-hml.signdocs.com.br
});
import os
from signdocs_brasil import SignDocsBrasilClient, ClientConfig
client = SignDocsBrasilClient(ClientConfig(
client_id=os.environ['SIGNDOCS_CLIENT_ID'],
client_secret=os.environ['SIGNDOCS_CLIENT_SECRET'],
base_url=os.environ.get('SIGNDOCS_BASE_URL', 'https://api-hml.signdocs.com.br'),
))
Use quando o termo é apresentado na sua própria interface (tela de pré-consulta, app do paciente) e o que você precisa registrar é o ato de consentir. O campo action.description deve carregar o teor resumido e inequívoco do consentimento — é ele que aparece no pacote de evidências e no verificador público.
Crie a sessão no momento em que o paciente confirma presença na pré-consulta:
curl -s -X POST "$SIGNDOCS_BASE_URL/v1/trust-sessions" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-H "X-Idempotency-Key: $(uuidgen)" \
-d '{
"action": {
"type": "telemedicine_consultation_consent",
"description": "Consentimento informado para teleconsulta de Cardiologia em 15/07/2026 14:00 — inclui ciência das limitações da modalidade remota e autorização para tratamento de dados de saúde (LGPD) com a finalidade exclusiva do atendimento"
},
"policy": { "profile": "CLICK_ONLY" },
"signer": {
"name": "Maria Souza",
"cpf": "123.456.789-09",
"email": "maria@example.com"
},
"metadata": {
"regulation": "CFM-2314-2022",
"consultation_id": "TLC-2026-7421",
"patient_id": "PAC-000889",
"doctor_crm": "SP-123456"
},
"returnUrl": "https://app.suaclinica.com.br/pre-consulta/done",
"locale": "pt-BR",
"expiresInMinutes": 60
}'
A resposta 201 traz sessionId, url e clientSecret.
import { randomUUID } from 'node:crypto';
const resp = await fetch(`${process.env.SIGNDOCS_BASE_URL}/v1/trust-sessions`, {
method: 'POST',
headers: {
Authorization: `Bearer ${accessToken}`,
'Content-Type': 'application/json',
'X-Idempotency-Key': randomUUID(),
},
body: JSON.stringify({
action: {
type: 'telemedicine_consultation_consent',
description:
'Consentimento informado para teleconsulta de Cardiologia em 15/07/2026 14:00 — ' +
'inclui ciência das limitações da modalidade remota e autorização para tratamento ' +
'de dados de saúde (LGPD) com a finalidade exclusiva do atendimento',
},
policy: { profile: 'CLICK_ONLY' },
signer: { name: 'Maria Souza', cpf: '123.456.789-09', email: 'maria@example.com' },
metadata: {
regulation: 'CFM-2314-2022',
consultation_id: 'TLC-2026-7421',
patient_id: 'PAC-000889',
doctor_crm: 'SP-123456',
},
returnUrl: 'https://app.suaclinica.com.br/pre-consulta/done',
locale: 'pt-BR',
expiresInMinutes: 60,
}),
});
if (!resp.ok) throw new Error(`SignDocs error: ${resp.status} ${await resp.text()}`);
const { sessionId, url, clientSecret } = await resp.json();
import os, uuid, requests
resp = requests.post(
f"{os.environ['SIGNDOCS_BASE_URL']}/v1/trust-sessions",
headers={
"Authorization": f"Bearer {access_token}",
"Content-Type": "application/json",
"X-Idempotency-Key": str(uuid.uuid4()),
},
json={
"action": {
"type": "telemedicine_consultation_consent",
"description": (
"Consentimento informado para teleconsulta de Cardiologia em 15/07/2026 14:00 — "
"inclui ciência das limitações da modalidade remota e autorização para tratamento "
"de dados de saúde (LGPD) com a finalidade exclusiva do atendimento"
),
},
"policy": {"profile": "CLICK_ONLY"},
"signer": {"name": "Maria Souza", "cpf": "123.456.789-09", "email": "maria@example.com"},
"metadata": {
"regulation": "CFM-2314-2022",
"consultation_id": "TLC-2026-7421",
"patient_id": "PAC-000889",
"doctor_crm": "SP-123456",
},
"returnUrl": "https://app.suaclinica.com.br/pre-consulta/done",
"locale": "pt-BR",
"expiresInMinutes": 60,
},
timeout=10,
)
resp.raise_for_status()
session = resp.json() # sessionId, url, clientSecret
✅ Dica — se o link vai sair da sua plataforma (e-mail, WhatsApp) em vez de ser aberto por um paciente já logado, troque o perfil para
CLICK_PLUS_OTP: o paciente aceita e confirma com um código enviado ao e-mail ou celular, provando a posse do canal. Para pesquisa clínica (TCLE sob CNS 466/2012) ou procedimentos de maior risco, considereBIOMETRIC— veja os padrões no guia de consentimento com Sessão de Confiança.
Use quando existe um documento TCLE materializado — o modelo institucional da clínica, o termo específico de um procedimento, o TCLE de um protocolo de pesquisa. O paciente visualiza o PDF na página hospedada e aceita com um clique; o pacote de evidências inclui o hash SHA-256 do documento.
PDF_BASE64=$(base64 -w0 tcle-teleconsulta.pdf)
curl -s -X POST "$SIGNDOCS_BASE_URL/v1/signing-sessions" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d "{
\"purpose\": \"DOCUMENT_SIGNATURE\",
\"policy\": { \"profile\": \"CLICK_ONLY\" },
\"signer\": { \"name\": \"Maria Souza\", \"email\": \"maria@example.com\", \"userExternalId\": \"PAC-000889\" },
\"document\": { \"content\": \"$PDF_BASE64\", \"filename\": \"tcle-teleconsulta.pdf\" },
\"metadata\": { \"consultation_id\": \"TLC-2026-7421\", \"patient_id\": \"PAC-000889\", \"tcle_version\": \"v3.2\" },
\"returnUrl\": \"https://app.suaclinica.com.br/pre-consulta/done\",
\"locale\": \"pt-BR\",
\"expiresInMinutes\": 60
}"
import { readFileSync } from 'fs';
const pdfBase64 = readFileSync('tcle-teleconsulta.pdf').toString('base64');
const session = await client.signingSessions.create({
purpose: 'DOCUMENT_SIGNATURE',
policy: { profile: 'CLICK_ONLY' },
signer: { name: 'Maria Souza', email: 'maria@example.com', userExternalId: 'PAC-000889' },
document: { content: pdfBase64, filename: 'tcle-teleconsulta.pdf' },
metadata: {
consultation_id: 'TLC-2026-7421',
patient_id: 'PAC-000889',
tcle_version: 'v3.2',
},
returnUrl: 'https://app.suaclinica.com.br/pre-consulta/done',
locale: 'pt-BR',
expiresInMinutes: 60,
});
console.log('Session ID:', session.sessionId);
console.log('Link do paciente:', `${session.url}?cs=${session.clientSecret}`);
import base64
from signdocs_brasil import CreateSigningSessionRequest, Policy, Signer, InlineDocument
with open('tcle-teleconsulta.pdf', 'rb') as f:
pdf_base64 = base64.b64encode(f.read()).decode()
session = client.signing_sessions.create(CreateSigningSessionRequest(
purpose='DOCUMENT_SIGNATURE',
policy=Policy(profile='CLICK_ONLY'),
signer=Signer(name='Maria Souza', email='maria@example.com', user_external_id='PAC-000889'),
document=InlineDocument(content=pdf_base64, filename='tcle-teleconsulta.pdf'),
metadata={
'consultation_id': 'TLC-2026-7421',
'patient_id': 'PAC-000889',
'tcle_version': 'v3.2',
},
return_url='https://app.suaclinica.com.br/pre-consulta/done',
locale='pt-BR',
expires_in_minutes=60,
))
print('Session ID:', session.session_id)
print('Link do paciente:', f'{session.url}?cs={session.client_secret}')
⚠️ Versione o TCLE — grave a versão do termo em
metadata(ex.:tcle_version). Quando o texto do TCLE mudar, você precisa saber exatamente qual versão cada paciente aceitou. O hash SHA-256 do PDF no pacote de evidências prova o conteúdo, mas a versão emmetadatatorna a consulta trivial no seu lado.
O link de aceite é a composição de url + ?cs= + clientSecret. O clientSecret é de uso único — trate-o como segredo e nunca registre em logs.
Três formas de entrega, da menor para a maior fricção:
url?cs={clientSecret}. Perfil CLICK_ONLY é suficiente — o canal já é autenticado.owner na criação da sessão com owner.email diferente de signer.email — a API envia o convite ao paciente por e-mail. Sem isso, nenhum e-mail é disparado e a entrega é sua.CLICK_PLUS_OTP para que o paciente prove a posse do e-mail ou telefone antes de concluir.⚠️ WhatsApp é canal de entrega, não integração nativa — o envio via WhatsApp usa a sua própria API do WhatsApp Business (ou n8n/Make). A SignDocs gera o link; a entrega é do integrador.
Prefira webhooks (seção seguinte) para reagir à conclusão. Para consultas pontuais de estado e para baixar a evidência ao final:
# Estado da sessão (Modalidade B)
curl -s "$SIGNDOCS_BASE_URL/v1/signing-sessions/$SESSION_ID" \
-H "Authorization: Bearer $ACCESS_TOKEN"
# Estado da sessão (Modalidade A)
curl -s "$SIGNDOCS_BASE_URL/v1/trust-sessions/$SESSION_ID/status" \
-H "Authorization: Bearer $ACCESS_TOKEN"
# Pacote de evidências (após COMPLETED)
curl -s "$SIGNDOCS_BASE_URL/v1/evidence/$EVIDENCE_ID" \
-H "Authorization: Bearer $ACCESS_TOKEN" -o evidencia-tcle.p7m.json
// Espera server-side (alternativa simples ao webhook em scripts)
const result = await client.signingSessions.waitForCompletion(session.sessionId);
console.log('Status:', result.status); // COMPLETED
console.log('Evidence ID:', result.evidenceId);
// Baixa o pacote de evidências e anexa ao prontuário
const evidence = await client.evidence.get(result.evidenceId);
await prontuario.anexar('PAC-000889', 'TLC-2026-7421', evidence);
result = client.signing_sessions.wait_for_completion(session.session_id)
print('Status:', result.status) # COMPLETED
print('Evidence ID:', result.evidence_id)
evidence = client.evidence.get(result.evidence_id)
prontuario.anexar('PAC-000889', 'TLC-2026-7421', evidence)
O pacote de evidências é um JSON assinado em PKCS#7/CMS (.p7m) com certificado ICP-Brasil A1. Ele consolida a prova de integridade do consentimento: timestamp ISO do servidor, trilha de auditoria completa (IP, user-agent, geolocalização, etapas executadas), hash SHA-256 do documento (Modalidade B) ou o teor da ação (Modalidade A). Qualquer terceiro — auditor, perito, juiz — pode verificar em GET /v1/verify/{evidenceId} ou no verificador público, sem depender de você. Detalhes em evidências de Sessão de Confiança.
O campo metadata é a ponte entre a SignDocs e o seu prontuário — e é também onde a disciplina LGPD se aplica na prática. Regras de bolso:
consultation_id, patient_id, tcle_version, doctor_crm. Nunca CID, diagnóstico, medicação ou anotação clínica.action.description na Modalidade A) deve descrever a finalidade do tratamento de dados, não o conteúdo clínico do atendimento.evidenceId original — a evidência do consentimento passado permanece válida como prova de que o tratamento tinha base legal no período.url?cs=... como dado pessoal em trânsito: não o registre em logs de aplicação nem em ferramentas de analytics.⚠️ Este guia não é parecer jurídico — a adequação da base legal (consentimento vs. tutela da saúde, art. 11 da LGPD) depende do seu contexto e deve ser validada com seu DPO. O que a API garante é a prova do consentimento, qualquer que seja o enquadramento escolhido.
O padrão do cenário é: a teleconsulta só é liberada quando o consentimento é registrado. Registre um webhook e trate TRANSACTION.COMPLETED como o gatilho de liberação:
curl -s -X POST "$SIGNDOCS_BASE_URL/v1/webhooks" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"url": "https://api.suaclinica.com.br/webhooks/signdocs",
"events": ["TRANSACTION.COMPLETED", "TRANSACTION.FAILED", "SIGNING_SESSION.EXPIRED"]
}'
Eventos relevantes para o cenário:
| Evento | O que fazer |
|---|---|
TRANSACTION.COMPLETED |
Marcar o consentimento como registrado, liberar a sala da teleconsulta, baixar e anexar a evidência ao prontuário. Use metadata.consultation_id para correlacionar. |
TRANSACTION.FAILED |
Notificar a recepção/atendimento para contato ativo com o paciente. |
SIGNING_SESSION.EXPIRED |
Paciente não aceitou dentro de expiresInMinutes — recrie a sessão e reenvie o link (ex.: lembrete 1h antes da consulta). |
Cada entrega vem assinada com HMAC-SHA256 (headers X-SignDocs-Signature + X-SignDocs-Timestamp) — valide a assinatura antes de processar e trate entregas repetidas de forma idempotente (a entrega é at-least-once). Especificação completa, incluindo validação HMAC e política de reentrega, em webhooks.
✅ Dica — a liberação da consulta deve ser idempotente por
evidenceId: se o mesmo evento chegar duas vezes, a segunda entrega não pode duplicar o registro no prontuário.
| Perfil | Fricção | Quando usar no TCLE de telemedicina |
|---|---|---|
CLICK_ONLY |
Mínima (1 clique) | Default recomendado: paciente já autenticado na sua plataforma (sala de espera virtual, app com login). A identidade vem do seu canal; a SignDocs registra a ação com trilha completa. |
CLICK_PLUS_OTP |
Baixa (clique + código) | Link entregue por canal não autenticado (e-mail, WhatsApp, SMS). O OTP prova a posse do canal pelo paciente. |
BIOMETRIC |
Média (selfie + liveness) | Pesquisa clínica (TCLE sob CNS 466/2012), procedimentos de maior risco, ou quando a identificação inequívoca do participante é exigência do protocolo. |
DIGITAL_CERTIFICATE |
Alta (certificado ICP-Brasil) | Não é para o paciente — é para o médico assinar documentos clínicos quando a norma exigir certificado ICP-Brasil. |
A validade jurídica dos perfis eletrônicos (CLICK_ONLY, CLICK_PLUS_OTP, BIOMETRIC) se funda na MP 2.200-2/2001, art. 10, §2º — admissão de outros meios de comprovação de autoria e integridade aceitos pelas partes. DIGITAL_CERTIFICATE é assinatura com certificado ICP-Brasil. A recomendação default é CLICK_ONLY porque, para consentimento recorrente de teleconsulta, a fricção é o principal inimigo da adesão — e a trilha de auditoria já entrega a prova necessária. Suba de nível conforme o risco do procedimento. Comparativo completo em perfis de assinatura e níveis legais.
O gatilho natural é o agendamento: consulta marcada → TCLE enviado automaticamente.
Watch Events (Google Calendar / Calendly / seu CRM) → Enviar Documento (Upload) → Criar Sessão de Assinatura (perfil CLICK_PLUS_OTP) → Send Email / WhatsApp com {{signingUrl}}. Um segundo cenário com o trigger instantâneo reage a TRANSACTION.COMPLETED e marca a consulta como liberada no seu sistema. Guia: integração Make.com.New Event (agenda/CRM) → SignDocs Brasil — Create Signing Session → Email by Zapier / WhatsApp. Um REST Hook trigger de conclusão dispara o Zap de liberação. Guia: integração Zapier.n8n-nodes-signdocs-brasil; para entrega do link por WhatsApp/Telegram, parta do template n8n. Guia: integração n8n.401 — token expirado ou inválido
{ "type": "https://docs.signdocs.com.br/errors#unauthorized", "title": "Unauthorized", "status": 401, "detail": "Access token expired" }
Renove o token via POST /oauth2/token. Com os SDKs a renovação é automática; em HTTP puro, renove antes de cada lote ou trate o 401 com retry pós-renovação.
422 — CLICK_PLUS_OTP sem canal de OTP
{ "type": "https://docs.signdocs.com.br/errors#validation", "title": "Unprocessable Entity", "status": 422, "detail": "policy.profile CLICK_PLUS_OTP requires signer.email or signer.phone" }
O OTP precisa de destino: informe signer.email (default) ou signer.phone + otpChannel: "sms".
422 — perfil de política fora do enum
{ "type": "https://docs.signdocs.com.br/errors#validation", "title": "Unprocessable Entity", "status": 422, "detail": "policy.profile must be one of CLICK_ONLY, CLICK_PLUS_OTP, BIOMETRIC, BIOMETRIC_PLUS_OTP, DIGITAL_CERTIFICATE, CUSTOM" }
Valores como CLICK ou OTP não existem. Use exatamente um dos valores do enum.
403 na criação de webhook
{ "status": 403, "title": "Forbidden" }
Bloqueio na borda (CloudFront): a URL do webhook aponta para localhost ou IP privado. Em desenvolvimento, use um túnel público (ngrok, Cloudflare Tunnel) ou um receptor como webhook.site.
Sessão expirada antes do aceite
O paciente clicou o link após expiresInMinutes. Não reutilize a sessão: crie uma nova (o clientSecret é de uso único) e reenvie o link. Trate SIGNING_SESSION.EXPIRED no webhook para automatizar o reenvio.
Sim. O consentimento capturado eletronicamente tem validade fundada na MP 2.200-2/2001, art. 10, §2º, que admite meios de comprovação de autoria e integridade aceitos pelas partes. O pacote de evidências — timestamp do servidor, trilha de auditoria, hash SHA-256 e assinatura PKCS#7 com certificado ICP-Brasil — é a materialização dessa prova. Para o enquadramento de cada perfil, veja perfis de assinatura e níveis legais.
Não. Exigir certificado digital do paciente inviabilizaria a telemedicina na prática. O aceite eletrônico (CLICK_ONLY ou CLICK_PLUS_OTP) com trilha auditável é a forma usual de registrar o consentimento do paciente. Certificado ICP-Brasil (DIGITAL_CERTIFICATE) fica reservado a documentos em que a norma o exija — tipicamente assinados pelo médico, não pelo paciente.
Apresente o pacote de evidências: ele registra quem consentiu (nome, identificadores informados), o teor exato do que foi apresentado, o momento (timestamp UTC do servidor) e o contexto (IP, dispositivo, etapas executadas). A verificação é independente — GET /v1/verify/{evidenceId} ou o verificador público — de modo que o auditor não precisa confiar no seu banco de dados.
Sim, e é a prática recomendada: baixe o .p7m via GET /v1/evidence/{evidenceId} no handler do webhook TRANSACTION.COMPLETED e anexe ao prontuário do paciente junto com o evidenceId. Assim a assinatura eletrônica do consentimento fica vinculada ao registro clínico e recuperável por consulta_id/patient_id.
A sessão expira após expiresInMinutes e o evento SIGNING_SESSION.EXPIRED é emitido. O padrão recomendado: não liberar a sala da teleconsulta enquanto TRANSACTION.COMPLETED não chegar, e automatizar o reenvio de uma nova sessão (lembrete 1h antes). Como a consulta é bloqueada — e não cancelada — o paciente ainda consegue consentir no último minuto pelo link novo.
Na Sessão de Confiança (ação), o teor do consentimento vive em action.description e o paciente confirma sem abrir documento — UX ideal para o aceite recorrente pré-consulta. Na Sessão de Assinatura, existe um PDF materializado e a evidência inclui o hash do arquivo — necessário quando o protocolo, o CEP/CONEP ou a sua política interna exigem um documento formal. As duas geram pacote de evidências com a mesma força probatória; escolha pela presença ou não do documento.
.p7m é montado e verificado.