Guias de Desenvolvimento

Política e Conformidade

Signing Sessions

Sessão de Confiança

Modelos de Solução

Guias dos SDKs

TCLE e Consentimento em Telemedicina com Assinatura Eletrônica — Modelo de Solução

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.


⚡ Caminho de 15 minutos

  1. Crie credenciais HML em app.signdocs.com.br/admin/api-clients e obtenha um token via POST /oauth2/token.
  2. Escolha a modalidade: 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.
  3. Entregue ao paciente o link url + ?cs= + clientSecret (ou embuta na sua tela de pré-consulta).
  4. Receba o webhook TRANSACTION.COMPLETED e libere a teleconsulta.
  5. Baixe o pacote de evidências (GET /v1/evidence/{evidenceId}) e anexe ao prontuário do paciente.

Resultado: consentimento registrado, consulta liberada e evidência .p7m arquivada no prontuário.


1. O problema de negócio

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.

2. Arquitetura do fluxo

Existem duas modalidades para capturar o consentimento, e a escolha depende de como o TCLE se materializa no seu processo:

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.

3. Pré-requisitos

🟠 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 campo sandbox.otpCode da resposta — nada é enviado ao paciente.

4. Autenticação OAuth2

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'),
))

5. Modalidade A — consentimento como ação (Sessão de Confiança)

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, considere BIOMETRIC — veja os padrões no guia de consentimento com Sessão de Confiança.

6. Modalidade B — TCLE em PDF (Sessão de Assinatura CLICK_ONLY)

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 em metadata torna 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:

  1. Embutido na plataforma (recomendado): o paciente já está logado na sala de espera virtual; redirecione (ou abra em modal) para url?cs={clientSecret}. Perfil CLICK_ONLY é suficiente — o canal já é autenticado.
  2. E-mail automático da SignDocs: inclua 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.
  3. Seu próprio canal (e-mail transacional, WhatsApp, SMS): envie o link montado pelo seu provedor. Nesse caso o canal não é autenticado — use 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.

8. Acompanhamento e evidência

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.

9. Metadata e minimização de dados (LGPD)

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:

⚠️ 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.


Webhooks: reagindo à conclusão

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.

Escolhendo o perfil de política

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.

Caminho sem código

O gatilho natural é o agendamento: consulta marcada → TCLE enviado automaticamente.

Erros comuns

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.

Perguntas frequentes

TCLE digital tem validade jurídica?

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.

Termo de consentimento em telemedicina precisa de certificado ICP-Brasil do paciente?

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.

Como comprovar o consentimento LGPD do paciente em uma auditoria?

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.

Posso anexar a evidência ao prontuário eletrônico?

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.

O que acontece se o paciente não assinar o TCLE antes da consulta?

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.

Qual a diferença entre registrar o consentimento como ação e assinar um PDF de TCLE?

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.

Próximos passos