Skip to main content

Reports API

Gerencie laudos radiologicos com suporte a HTML, metadados DICOM e integracao com PACS.

Base URL

https://copilot.laudos.ai/api/v1

Endpoints

MetodoEndpointDescricao
GET/reportsListar laudos
GET/reports/:idObter laudo
POST/reportsCriar laudo
PUT/reports/:idAtualizar laudo
DELETE/reports/:idExcluir laudo

Listar Laudos

GET
Retorna uma lista paginada de laudos do usuario autenticado.

Query Parameters

ParametroTipoPadraoDescricao
limitinteger20Maximo de resultados (1-100)
offsetinteger0Pular N resultados
sortstringdescOrdenacao: asc ou desc
exam_typestring-Filtrar por tipo: CT, MR, US, XR, MG
modalitystring-Filtrar por modalidade DICOM
searchstring-Busca por titulo ou conteudo
statusstring-Filtrar por status: draft, final, corrected
created_afterstring-Data ISO 8601 (ex: 2024-01-01)
created_beforestring-Data ISO 8601

Exemplo

curl -X GET "https://copilot.laudos.ai/api/v1/reports?limit=10&exam_type=CT&sort=desc" \
  -H "Authorization: Bearer sk_live_xxx"

Resposta

{
  "data": [
    {
      "id": "rpt_abc123def456",
      "title": "TC de Torax",
      "content": "<h1>LAUDO RADIOLOGICO</h1><p>...</p>",
      "exam_type": "CT",
      "modality": "CT",
      "status": "final",
      "accession_number": "ACC12345",
      "patient_id": "PAT001",
      "patient_name": "Silva, Joao",
      "study_date": "2024-01-15T10:30:00Z",
      "created_at": "2024-01-15T14:22:00Z",
      "updated_at": "2024-01-15T14:45:00Z",
      "word_count": 245,
      "character_count": 1580
    }
  ],
  "meta": {
    "total": 156,
    "limit": 10,
    "offset": 0,
    "has_more": true
  }
}

Obter Laudo

GET
Retorna um laudo especifico pelo ID.

Path Parameters

ParametroTipoDescricao
idstringID do laudo (formato: rpt_xxx ou UUID)

Exemplo

curl -X GET "https://copilot.laudos.ai/api/v1/reports/rpt_abc123def456" \
  -H "Authorization: Bearer sk_live_xxx"

Resposta

{
  "data": {
    "id": "rpt_abc123def456",
    "title": "TC de Torax",
    "content": "<h1>LAUDO RADIOLOGICO</h1><h2>TC DE TORAX</h2><p><strong>Tecnica:</strong> Tomografia computadorizada helicoidal do torax, sem administracao de meio de contraste endovenoso.</p><p><strong>Achados:</strong> Parenquima pulmonar com atenuacao normal. Nao ha nodulos ou massas pulmonares. Arvore bronquica de calibre normal.</p><p><strong>Impressao:</strong> Exame dentro dos limites da normalidade.</p>",
    "content_plain": "LAUDO RADIOLOGICO\n\nTC DE TORAX\n\nTecnica: Tomografia computadorizada helicoidal...",
    "exam_type": "CT",
    "modality": "CT",
    "status": "final",
    "accession_number": "ACC12345",
    "study_instance_uid": "1.2.840.113619.2.55.3.604688119.969.1234567890.123",
    "patient_id": "PAT001",
    "patient_name": "Silva, Joao",
    "patient_dob": "1958-03-15",
    "patient_gender": "M",
    "study_date": "2024-01-15T10:30:00Z",
    "study_description": "TC de Torax sem contraste",
    "referring_physician": "Dr. Carlos Lima",
    "reporting_radiologist": "Dra. Maria Santos",
    "institution": "Hospital Central",
    "critical_findings": [],
    "created_at": "2024-01-15T14:22:00Z",
    "updated_at": "2024-01-15T14:45:00Z",
    "word_count": 245,
    "character_count": 1580
  }
}

Criar Laudo

POST
Cria um novo laudo radiologico.

Body Parameters

CampoTipoObrigatorioDescricao
titlestringSimTitulo do laudo
contentstringSimConteudo HTML do laudo
exam_typestringNaoTipo: CT, MR, US, XR, MG, NM, PT
modalitystringNaoModalidade DICOM
statusstringNaoStatus: draft, final, corrected
accession_numberstringNaoNumero de acesso
study_instance_uidstringNaoStudy Instance UID
patient_idstringNaoID do paciente
patient_namestringNaoNome (Sobrenome, Nome)
patient_dobstringNaoData nascimento (YYYY-MM-DD)
patient_genderstringNaoGenero: M, F, O
study_datestringNaoData do estudo (ISO 8601)
study_descriptionstringNaoDescricao do estudo
referring_physicianstringNaoMedico solicitante
reporting_radiologiststringNaoRadiologista
institutionstringNaoInstituicao

Exemplo

curl -X POST "https://copilot.laudos.ai/api/v1/reports" \
  -H "Authorization: Bearer sk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "TC de Torax",
    "content": "<h1>LAUDO RADIOLOGICO</h1><p>Exame normal.</p>",
    "exam_type": "CT",
    "modality": "CT",
    "status": "final",
    "accession_number": "ACC12345",
    "patient_id": "PAT001",
    "patient_name": "Silva, Joao",
    "patient_dob": "1958-03-15",
    "patient_gender": "M",
    "reporting_radiologist": "Dra. Maria Santos"
  }'

Resposta

{
  "data": {
    "id": "rpt_xyz789ghi012",
    "title": "TC de Torax",
    "content": "<h1>LAUDO RADIOLOGICO</h1><p>Exame normal.</p>",
    "exam_type": "CT",
    "status": "final",
    "created_at": "2024-01-15T14:22:00Z",
    "updated_at": "2024-01-15T14:22:00Z"
  }
}

Atualizar Laudo

PUT
Atualiza campos de um laudo existente. Apenas os campos enviados serao atualizados.

Path Parameters

ParametroTipoDescricao
idstringID do laudo

Body Parameters

Todos os campos sao opcionais. Apenas os campos enviados serao atualizados.

Exemplo

curl -X PUT "https://copilot.laudos.ai/api/v1/reports/rpt_abc123def456" \
  -H "Authorization: Bearer sk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "TC de Torax - Corrigido",
    "status": "corrected",
    "content": "<h1>LAUDO RADIOLOGICO</h1><p>Exame corrigido.</p>"
  }'

Resposta

{
  "data": {
    "id": "rpt_abc123def456",
    "title": "TC de Torax - Corrigido",
    "status": "corrected",
    "updated_at": "2024-01-15T15:30:00Z"
  }
}

Excluir Laudo

DELETE
Exclui permanentemente um laudo.
Esta acao e irreversivel. Laudos ja enviados ao PACS nao podem ser excluidos.

Exemplo

curl -X DELETE "https://copilot.laudos.ai/api/v1/reports/rpt_abc123def456" \
  -H "Authorization: Bearer sk_live_xxx"

Resposta

{
  "data": {
    "id": "rpt_abc123def456",
    "deleted": true
  }
}

Objeto Report

Campos Completos

CampoTipoDescricao
idstringIdentificador unico (formato: rpt_xxx)
titlestringTitulo do laudo
contentstringConteudo HTML completo
content_plainstringConteudo em texto puro
exam_typestringTipo de exame (CT, MR, US, etc.)
modalitystringModalidade DICOM
statusstringStatus do laudo
accession_numberstringNumero de acesso HL7/DICOM
study_instance_uidstringStudy Instance UID DICOM
patient_idstringID do paciente
patient_namestringNome (formato: Sobrenome, Nome)
patient_dobstringData de nascimento (YYYY-MM-DD)
patient_genderstringGenero: M, F, O
study_datestringData/hora do estudo (ISO 8601)
study_descriptionstringDescricao do estudo
referring_physicianstringMedico solicitante
reporting_radiologiststringRadiologista responsavel
institutionstringNome da instituicao
critical_findingsarrayLista de achados criticos
word_countintegerContagem de palavras
character_countintegerContagem de caracteres
created_atstringData de criacao (ISO 8601)
updated_atstringData de atualizacao (ISO 8601)

Status do Laudo

ValorDescricao
draftRascunho, nao finalizado
finalLaudo final, pronto para envio ao PACS
correctedLaudo corrigido apos envio inicial

Tipos de Exame Suportados

CodigoDescricao
CTTomografia Computadorizada
MRRessonancia Magnetica
USUltrassonografia
XRRadiografia Simples
MGMamografia
NMMedicina Nuclear
PTPET-CT
CRRadiografia Computadorizada
DXRadiografia Digital
RFFluoroscopia

Tratamento de Erros

Codigos de Erro

Codigo HTTPTipoDescricao
400bad_requestRequisicao malformada
401unauthorizedAPI Key invalida ou ausente
403forbiddenSem permissao para este recurso
404not_foundLaudo nao encontrado
409conflictConflito (laudo ja enviado ao PACS)
422validation_errorErro de validacao nos campos
429rate_limitedLimite de requisicoes excedido
500internal_errorErro interno do servidor

Exemplo de Resposta de Erro

{
  "error": {
    "code": "validation_error",
    "message": "O campo 'title' e obrigatorio",
    "details": {
      "field": "title",
      "reason": "required"
    }
  }
}

Tratamento em Codigo

import { LaudosAI, LaudosAIError } from '@laudosai/sdk';

try {
  const { data } = await client.reports.get('invalid-id');
} catch (error) {
  if (error instanceof LaudosAIError) {
    console.error(`Erro ${error.code}: ${error.message}`);

    if (error.isNotFoundError()) {
      console.log('Laudo nao encontrado');
    }
    if (error.isValidationError()) {
      console.log('Campos invalidos:', error.details);
    }
    if (error.isRateLimitError()) {
      console.log('Aguarde antes de tentar novamente');
    }
  }
}