API LeoRad AI
RESTGuia de integração com a API REST de IA da LeoRad: geração e edição de laudos, transcrição de áudio, revisão, tutoria e OCR de documentos.
https://api-ai.leorad.com.br#Visão Geral
A API LeoRad AI integra-se à plataforma LeoRad, uma solução especializada em análise, processamento e interação com laudos radiológicos. Desenvolvida com assistentes de inteligência artificial treinados para o domínio da radiologia, a plataforma permite que o radiologista foque na análise das imagens, otimizando o tempo de documentação e aumentando a eficiência do fluxo de trabalho.
A API segue o padrão REST, utiliza autenticação baseada em tokens e é ideal para integração com sistemas que precisam gerar, editar, revisar ou transcrever laudos, bem como extrair texto de documentos por OCR.
Métodos disponíveis
https://api-ai.leorad.com.br. A autenticação é obrigatória em todas as requisições.#Autenticação
A plataforma LeoRad utiliza dois tipos de tokens para diferentes cenários de integração. Entender a distinção entre eles é essencial para utilizar a API corretamente.
#Token de Login
O Token de Login é exclusivo para cada usuário da plataforma LeoRad. Ele é utilizado para autenticar o acesso à aplicação web e para obter o Token de API nas integrações REST.
Como obter seu Token de Login
- 1Crie sua conta: Acesse app.leorad.com.br e crie sua conta caso ainda não possua uma.
- 2Acesse seu Perfil: Após fazer login, clique no ícone de engrenagem no menu lateral para acessar as configurações do seu perfil.
- 3Gere o Token: Dentro do Perfil, selecione a opção "Token" e clique em "Gerar Token". O token será exibido e estará pronto para uso.
Acesso direto à aplicação web
O Token de Login pode ser utilizado para abrir a aplicação LeoRad diretamente, incorporando-o na URL de acesso:
https://app.leorad.com.br/<SEU_TOKEN_DE_LOGIN>#Token de API
Para utilizar a API LeoRad AI, é necessário obter um Token de API (JWT). Esse token é gerado a partir do seu Token de Login e deve ser incluído no cabeçalho de todas as requisições à API.
Obtendo o Token de API
Faça uma requisição POST para o endpoint abaixo, substituindo <SEU_TOKEN_DE_LOGIN> pelo token obtido na seção anterior:
curl -X POST \
"https://api-app.leorad.com.br/legacy-api/public/token-login/<SEU_TOKEN_DE_LOGIN>"Exemplo de resposta
{
"apiToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9..."
}Utilizando o Token de API
O apiToken retornado deve ser incluído no cabeçalho Authorization de todas as requisições à API LeoRad AI, precedido da palavra Bearer:
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9...401 Unauthorized, solicite um novo token repetindo o fluxo de autenticação.#Métodos da API
Todos os endpoints abaixo utilizam a URL base https://api-ai.leorad.com.br e exigem autenticação via Token de API no cabeçalho Authorization. O usuário é identificado pelo token — não é necessário enviar o campo user no corpo da requisição.
multipart/form-data (obrigatório quando incluírem arquivos binários) ou como application/json para parâmetros de texto. Toda resposta inclui o cabeçalho X-Request-Id, útil para suporte.Consumindo respostas em streaming
Os endpoints marcados como Streaming devolvem text/plain; charset=utf-8 em pedaços, à medida que o modelo gera o texto — o que reduz drasticamente o tempo até o primeiro caractere. Se preferir uma resposta única, envie stream=false (no corpo, na query string ou no cabeçalho X-Stream: false).
// Leitura de uma resposta em streaming (text/plain)
const reader = response.body.getReader();
const decoder = new TextDecoder();
let texto = '';
while (true) {
const { done, value } = await reader.read();
if (done) break;
const chunk = decoder.decode(value, { stream: true });
texto += chunk;
// Exiba o chunk assim que ele chega para dar retorno imediato ao usuário
console.log(chunk);
}#POST /assistant
Gera um laudo radiológico completo a partir do ditado do médico (áudio), de instruções em texto e, opcionalmente, de exames anexados. Quando um arquivo de áudio é enviado, o endpoint executa duas etapas: a transcrição (STT) e, em seguida, a geração do laudo. A resposta é transmitida via streaming, permitindo exibição progressiva do conteúdo.
| Parâmetro | Tipo | Requerido | Descrição |
|---|---|---|---|
| agent | string | Não | Agente de IA a ser utilizado. Quando omitido, aplica-se o agente configurado no perfil do usuário e, na ausência dele, fastAgent. O agente determina a especialidade, a profundidade da análise e o custo em créditos da requisição — a lista completa está logo abaixo. |
| orderContent | string | Não | Instruções em texto para a geração do laudo (o "ditado" escrito). Pode ser usado sozinho ou em conjunto com o áudio. É também por este campo que os dados do exame são enviados ao agente — indicação clínica, pedido médico, medidas, sexo, idade, prioridade, contraste, exame e laudo anteriores. São os mesmos dados dos parâmetros opcionais da integração por iframe: lá eles chegam pela query string e o aplicativo os converte em um bloco de texto no topo da caixa de mensagem, que é exatamente o que vai neste campo. Na API, monte esse bloco você mesmo — o formato está descrito abaixo. |
| editorContent | string | Não | Conteúdo HTML já presente no editor (modelo/máscara ou laudo parcial). Serve como estrutura base para o laudo gerado. |
| files | binary | array | Não | Áudio do ditado e/ou anexos (imagens, PDF). Formatos de áudio: flac, m4a, mp3, mp4, mpeg, mpga, oga, ogg, wav, webm. Em requisições JSON, aceita também [{ "url": "https://…" }] — útil para arquivos grandes, já que o corpo da requisição é limitado a 6 MB. |
| language | string | Não | Idioma do laudo gerado. Valores: pt-BR (padrão), pt-PT, en, es, fr, it, de, ar, pl. |
| languageSpeech | string | Não | Idioma do áudio para o reconhecimento de voz. Exemplos: pt-BR, pt-PT, en, es. Quando omitido, usa a preferência do usuário. |
| modelSpeech | string | Não | Versão do LEO Speech Engine usada na transcrição. Valores: v1, v2, v3, v4. Quando omitido — ou quando a versão pedida estiver desativada — aplica-se o padrão configurado para a conta. |
| termsSpeech | string | Não | Termos frequentes na fala do usuário, usados para melhorar a precisão do reconhecimento de voz. |
| conversationId | string | Não | Somente para fastAgent e fastTurbo: continua uma conversa anterior, preservando o contexto. O identificador é devolvido no registro de execução da chamada anterior. |
| stream | boolean | Não | Envie false para receber o laudo em uma única resposta, em vez de streaming. |
Agentes disponíveis
São os mesmos agentes oferecidos no aplicativo LeoRad, com o mesmo custo em créditos. Os agentes fastAgent e fastTurbo mantêm memória de conversa (ver conversationId); os demais tratam cada requisição de forma independente.
Rápidos
fastAgentFast1 créditopadrãoModelo otimizado para velocidade e eficiência energética. Atende todas as modalidades de exames (US, RX, TC, RM, MMG, etc.) com foco na agilidade. Ideal para laudos de rotina que exigem resposta rápida com menor consumo de recursos.
fastTurboFast Turbo1 créditoModelo otimizado para ultra velocidade e eficiência energética. Atende todas as modalidades de exames (US, RX, TC, RM, MMG, etc.) com foco na agilidade. Ideal para laudos de rotina que exigem resposta rápida com menor consumo de recursos.
Geral
generalGeral3 créditosOferece interpretação abrangente para todos os tipos de exames (US, RX, TC, RM, MMG, etc.). Combina análise diagnóstica com explicações didáticas detalhadas, ideal para casos que requerem correlação clínica e contextualização diagnóstica em qualquer modalidade de imagem.
Direct — raciocínio avançado
directAgent2Direct Fast2 créditosModelo desenvolvido para casos complexos que demandam análise detalhada. Apresenta melhor desempenho na interpretação de imagens médicas em relação aos outros modelos, adequado para diagnósticos diferenciais e situações que requerem maior precisão diagnóstica. É a opção mais rápida e econômica da linha Direct.
directAgentDirect3 créditosModelo desenvolvido para casos complexos que demandam análise detalhada. Apresenta melhor desempenho na interpretação de imagens médicas em relação aos outros modelos, adequado para diagnósticos diferenciais e situações que requerem maior precisão diagnóstica.
directAgentProDirect Pro5 créditosMesma linha do Direct, na configuração de maior capacidade de raciocínio. Indicado para os casos mais difíceis, em que a profundidade da análise compensa o tempo de resposta e o custo mais altos.
Especialidades
endoscopyEndoscopia3 créditosFocado na interpretação de exames endoscópicos do trato gastrointestinal. Identifica lesões, alterações mucosas e fornece correlação com achados histopatológicos, auxiliando no diagnóstico de patologias digestivas.
densitometryDensitometria3 créditosDedicado à avaliação de exames de densitometria óssea (DEXA). Calcula scores precisos, classifica osteoporose/osteopenia e fornece orientações para acompanhamento e tratamento de distúrbios do metabolismo ósseo. Pode processar imagens das tabelas oriundas dos aparelhos de DEXA.
ultrassomUltrassom2 créditosModelo focado na elaboração de laudos de ultrassom em todas as especialidades. Auxilia na estruturação e redação de relatórios profissionais a partir das transcrições médicas, abrangendo ultrassom obstétrico, abdominal, pélvico, tireoide e demais modalidades ultrassonográficas.
ultrassom2Ultrassom PRO3 créditosMesma especialidade do Ultrassom, processada pelos modelos de raciocínio avançado da linha Direct — com análise de imagem nativa. Indicado para exames ultrassonográficos que exigem maior profundidade de análise.
anamneseAnamnese3 créditosModelo dedicado ao processamento e estruturação de informações da anamnese a partir de áudios de consultas médicas. Organiza o histórico do paciente, queixas principais, antecedentes e evolução clínica de forma clara e objetiva para auxiliar na elaboração de relatórios médicos completos.
pathologyPatologia3 créditosModelo dedicado ao processamento e estruturação de informações de patologias a partir de transcrições médicas. Organiza as informações de patologias, como lesões e alterações, fornecendo correlação com achados histopatológicos e auxiliando no diagnóstico.
radiographyRadiografia1 créditoModelo dedicado ao processamento e estruturação de informações de radiografia a partir de transcrições médicas. Organiza as informações do exame, como lesões e alterações, fornecendo correlação com os achados radiográficos.
echocardioEcocardio3 créditosCalcula todos os parâmetros derivados e classificações do ecocardiograma (ASC, FEVE, massa, IMVE, ERP, E/e′, PSAP, geometria do VE, função diastólica ASE 2016 e graus de estenose).
orderContentO aplicativo LeoRad monta um bloco de texto com um dado por linha e o coloca antes do pedido do médico. Reproduza o mesmo formato na API — cada linha corresponde a um parâmetro da integração por iframe:
ind(indicação clínica),part(pedido médico) emea(medidas) entram sem rótulo, apenas o valor;- os demais entram rotulados:
Sexo: Feminino,Idade: 45 anos(age+age-unitpor extenso),Prioridade: Urgente,Contraste: Sim — 10ml de gadolínio(contrast+contrast-details),Exame Anterior: …,Laudo Anterior: …; mod(modelo/máscara) não vai aqui — é o conteúdo doeditorContent;files(anexos) vai no parâmetrofiles.
prev-report, por exemplo) devem ser convertidos para texto puro. Depois do bloco, em uma nova linha, vem a instrução livre do médico.mp3 ou ogg para reduzir o tempo de processamento e os custos da requisição. O corpo da requisição é limitado a 6 MB; acima disso, envie os arquivos por URL.Exemplo de requisição (JavaScript)
const formData = new FormData();
formData.append('agent', 'fastAgent');
formData.append('language', 'pt-BR');
formData.append('languageSpeech', 'pt-BR');
formData.append('modelSpeech', 'v2');
formData.append('files', audioBlob, 'ditado.mp3');
// Dados do exame + pedido do médico, um por linha, no mesmo formato
// que a integração por iframe usa (ver /devs/iframe#parametros-opcionais).
formData.append('orderContent', [
'Dor abdominal há 3 dias', // ind — sem rótulo
'US de abdome total', // part — sem rótulo
'Fígado 14,2 cm; baço 9,1 cm', // mea — sem rótulo
'Sexo: Feminino', // sex
'Idade: 45 anos', // age + age-unit
'Prioridade: Urgente', // prior
'Contraste: Não', // contrast (+ contrast-details)
'Exame Anterior: TC de abdome em 2024',
'Laudo Anterior: Fígado de dimensões normais...',
'Compare com o exame anterior e destaque as mudanças.',
].join('
'));
const response = await fetch('https://api-ai.leorad.com.br/assistant', {
method: 'POST',
headers: {
'Authorization': 'Bearer <SEU_TOKEN_DE_API>',
},
body: formData,
});
if (!response.ok) {
throw new Error(await response.text());
}
// A resposta chega em chunks de texto
const reader = response.body.getReader();
const decoder = new TextDecoder();
let laudo = '';
while (true) {
const { done, value } = await reader.read();
if (done) break;
laudo += decoder.decode(value, { stream: true });
}
console.log('Laudo gerado:', laudo);#POST /speech
Recebe um arquivo de áudio e devolve a transcrição do conteúdo falado como texto puro, sem qualquer formatação de laudo. Útil para capturar o ditado do radiologista e tratá-lo no seu próprio sistema.
| Parâmetro | Tipo | Requerido | Descrição |
|---|---|---|---|
| file | binary | Sim | Arquivo de áudio a ser transcrito. Formatos suportados: flac, m4a, mp3, mp4, mpeg, mpga, oga, ogg, wav, webm. O campo files também é aceito, como item único ou array. |
| languageSpeech | string | Não | Idioma para o reconhecimento de voz. Exemplos: pt-BR, pt-PT, en, es. Quando omitido, usa a preferência do usuário. |
| prompt | string | Não | Prompt adicional para orientar o modelo na transcrição (por exemplo, termos técnicos recorrentes). Quando omitido, usa o prompt configurado para a conta. |
413 Payload Too Large — divida o áudio em trechos menores ou use um formato mais compactado.Resposta
Ultrassonografia de abdome total. Fígado de dimensões normais, com contornos regulares e ecotextura homogênea.Exemplo de requisição (JavaScript)
const formData = new FormData();
formData.append('languageSpeech', 'pt-BR');
formData.append('file', audioBlob, 'ditado.mp3');
const response = await fetch('https://api-ai.leorad.com.br/speech', {
method: 'POST',
headers: {
'Authorization': 'Bearer <SEU_TOKEN_DE_API>',
},
body: formData,
});
// A resposta é o texto puro da transcrição
const transcricao = await response.text();
console.log('Transcrição:', transcricao);#POST /reviewer
Revisa um laudo pronto e devolve, em JSON estruturado, as correções de gramática e digitação (como pares "errado ➡️ certo", prontos para substituição automática), a informação sobre uso de contraste e as inconsistências encontradas no texto. Ideal para controle de qualidade antes da assinatura.
| Parâmetro | Tipo | Requerido | Descrição |
|---|---|---|---|
| editorContent | string | Sim | Texto ou HTML do laudo a ser revisado. Limite de 100.000 caracteres. |
| language | string | Não | Idioma da revisão. Valores: pt-BR (padrão), pt-PT, en, es, fr, it, de, ar, pl. |
| contexto | array | Não | Dados do exame vindos do RIS/PACS (sexo, idade, indicação clínica, contraste), no formato [{ "rotulo": "Contraste", "valor": "Iodado" }]. Quando enviados, a revisão cruza esses dados com o texto do laudo e aponta divergências. |
result.grammar cada item é uma troca literal no formato errado ➡️ certo, pensada para ser aplicada diretamente sobre o texto. Já result.errors traz observações em linguagem natural, para leitura humana. O campo contrast assume "Sim", "Não" ou "Não informado".Exemplo de resposta
{
"service": "leorad-ai-processor",
"message": "Revisão processada com sucesso",
"timestamp": "2025-01-20T14:32:07.812Z",
"requestId": "8f1c0e4a-...",
"fallback": false,
"result": {
"grammar": [
"dimenções ➡️ dimensões"
],
"contrast": "Não informado",
"errors": [
"A técnica descreve exame sem contraste, mas as conclusões citam realce pós-contraste."
]
}
}Exemplo de requisição (JavaScript)
const response = await fetch('https://api-ai.leorad.com.br/reviewer', {
method: 'POST',
headers: {
'Authorization': 'Bearer <SEU_TOKEN_DE_API>',
'Content-Type': 'application/json',
},
body: JSON.stringify({
language: 'pt-BR',
editorContent: '<p>Fígado de dimenções normais, com contornos regulares.</p>',
}),
});
const { result } = await response.json();
console.log('Correções:', result.grammar);
console.log('Contraste:', result.contrast);
console.log('Inconsistências:', result.errors);#POST /tutor
Produz uma revisão comentada do laudo, com fins didáticos — apontando o que pode ser melhorado, diagnósticos diferenciais a considerar e problemas de estrutura — seguida de uma versão reescrita do laudo inteiro. A resposta é texto em Markdown transmitido via streaming.
| Parâmetro | Tipo | Requerido | Descrição |
|---|---|---|---|
| editorContent | string | Sim | Texto ou HTML do laudo a ser analisado. Limite de 100.000 caracteres. |
| language | string | Não | Idioma dos comentários e do laudo sugerido. Valores: pt-BR (padrão), pt-PT, en, es, fr, it, de, ar, pl. |
| stream | boolean | Não | Envie false para receber todo o texto em uma única resposta. |
<report> e </report> ao final da resposta — o que permite exibir os comentários e oferecer a substituição do laudo separadamente.Exemplo de requisição (JavaScript)
const response = await fetch('https://api-ai.leorad.com.br/tutor', {
method: 'POST',
headers: {
'Authorization': 'Bearer <SEU_TOKEN_DE_API>',
'Content-Type': 'application/json',
},
body: JSON.stringify({
language: 'pt-BR',
editorContent: '<p>Fígado de dimensões normais, com contornos regulares.</p>',
}),
});
// Resposta em streaming (Markdown). O laudo sugerido vem dentro de <report>…</report>
const texto = await response.text();
const laudoSugerido = texto.match(/<report>([\s\S]*?)<\/report>/)?.[1] ?? '';
console.log('Comentários + laudo:', texto);
console.log('Somente o laudo sugerido:', laudoSugerido);#POST /scan
Extrai o texto contido em imagens e documentos por meio de OCR (reconhecimento óptico de caracteres). Indicado para digitalizar laudos e pedidos médicos em papel, ou para ler exames anteriores em PDF. Aceita vários arquivos por requisição e devolve o texto via streaming.
| Parâmetro | Tipo | Requerido | Descrição |
|---|---|---|---|
| file | binary | Sim | Imagem ou PDF a ser processado. Em multipart/form-data o campo pode ser repetido para enviar vários arquivos. Alternativamente, envie JSON com files: [{ "url": "https://…" }] — recomendado para lotes grandes, já que o corpo da requisição é limitado a 6 MB. |
| agent | string | Não | Motor de OCR a ser utilizado. Um valor não reconhecido cai em V1.V1OCR por modelo multimodal — todos os arquivos em uma única leitura. Melhor para documentos com layout complexo.V2Agente de OCR especializado da LeoRad, com aplicação das substituições de texto configuradas na conta.V3OCR dedicado de alta fidelidade, arquivo a arquivo. Melhor para documentos longos e digitalizações densas. |
| language | string | Não | Idioma do documento. Valores: pt-BR (padrão), pt-PT, en, es, fr, it, de, ar, pl. |
| stream | boolean | Não | Envie false para receber todo o texto extraído em uma única resposta. |
V3 não aceita arquivos de áudio — eles são descartados antes do processamento. Se nenhum arquivo compatível restar, a requisição retorna 400 Bad Request.Exemplo de requisição (JavaScript)
const formData = new FormData();
formData.append('agent', 'V3');
// O campo "file" pode ser repetido para enviar vários arquivos
formData.append('file', pagina1, 'laudo-p1.jpg');
formData.append('file', pagina2, 'laudo-p2.jpg');
const response = await fetch('https://api-ai.leorad.com.br/scan', {
method: 'POST',
headers: {
'Authorization': 'Bearer <SEU_TOKEN_DE_API>',
},
body: formData,
});
// Resposta em streaming: o texto extraído chega conforme é reconhecido
const texto = await response.text();
console.log('Texto extraído:', texto);
// Alternativa para lotes grandes: enviar os arquivos por URL
// body: JSON.stringify({ agent: 'V3', files: [{ url: 'https://…/laudo.pdf' }] })#Erros
A API usa os códigos de status HTTP convencionais. Erros de processamento devolvem um corpo JSON descritivo — exceto quando ocorrem durante um streaming já iniciado, caso em que o status já foi enviado como 200 e a resposta simplesmente termina com o conteúdo produzido até ali.
| Código | Significado |
|---|---|
| 400 | Parâmetro obrigatório ausente ou inválido (agente desconhecido, laudo vazio, nenhum arquivo compatível). |
| 401 | Token de API ausente, inválido ou expirado. |
| 403 | A conta não tem permissão para usar a API ou está sem créditos disponíveis. |
| 413 | Arquivo acima do limite aceito pelo endpoint. |
| 422 | Arquivo enviado por URL não pôde ser baixado (URL expirada ou objeto inexistente). |
| 500 | Falha interna do serviço. |
| 502 | O provedor de IA não respondeu ou devolveu um erro. Tente novamente. |
Formato do corpo de erro
{
"service": "Assistant",
"error": "AIError",
"message": "Descrição legível do problema",
"provider": "vertex-ai"
}X-Request-Id devolvido em cada resposta: é por ele que a equipe de suporte localiza a execução nos registros do serviço.#Migração da API anterior
A API de IA da LeoRad migrou do serviço voice-processor ( https://voice-processor.leorad.com.br) para o ai-processor (https://api-ai.leorad.com.br). Se você já integrava com a versão anterior, estes são os pontos de atenção:
https://voice-processor.leorad.com.br por https://api-ai.leorad.com.br./ai/assistant → /assistant, /ai/speech → /speech, /ai/scan → /scan./ai/review foi substituído por /reviewer, que devolve JSON estruturado (grammar, contrast, errors) em vez de texto livre. A revisão comentada com fins didáticos passou a ter endpoint próprio: /tutor.user no corpo não causa erro, mas o valor é ignorado./tutor (revisão comentada com laudo sugerido) não existia na API anterior./assistant ganhou echocardio, ultrassom2 e directAgentPro; o /scan ganhou o motor V3./assistant, /tutor e /scan transmitem text/plain em pedaços. Para manter o comportamento de resposta única, envie stream=false.#Suporte
Em caso de dúvidas, sugestões ou problemas técnicos relacionados à integração com a API LeoRad AI, nossa equipe de suporte está disponível para ajudar.
Entre em contato
Nossa equipe de suporte técnico está disponível para auxiliar na integração, esclarecer dúvidas sobre os endpoints ou resolver qualquer problema encontrado durante o desenvolvimento.
contato@leorad.com.br