> ## Documentation Index
> Fetch the complete documentation index at: https://manual.laudos.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# PACS Integration API

> Consulte conexoes PACS e envie laudos via HL7 ORU^R01, DICOMweb STOW-RS ou MV Soul XML

# PACS Integration API

Endpoints para consultar conexoes PACS configuradas e enviar laudos ao PACS/RIS hospitalar. Suporta multiplos protocolos para compatibilidade com sistemas brasileiros e internacionais.

<Note>
  Conexoes PACS sao configuradas pela equipe Laudos.AI ou via plataforma em **Configuracoes > Integracoes**. A API permite consultar conexoes existentes e enviar laudos.
</Note>

***

## Endpoints

| Metodo | Endpoint            | Descricao                   |
| ------ | ------------------- | --------------------------- |
| `GET`  | `/pacs/connections` | Lista conexoes configuradas |
| `POST` | `/pacs/send`        | Envia laudo ao PACS         |

***

## Listar Conexoes

Retorna as conexoes PACS configuradas para o usuario autenticado. Campos sensiveis (senhas, credenciais) sao omitidos da resposta.

```
GET /pacs/connections
```

### Exemplos

<CodeGroup>
  ```bash cURL theme={null}
  curl -X GET "https://copilot.laudos.ai/api/v1/pacs/connections" \
    -H "Authorization: Bearer sk_live_xxx"
  ```

  ```typescript TypeScript theme={null}
  const response = await fetch('https://copilot.laudos.ai/api/v1/pacs/connections', {
    headers: { 'Authorization': `Bearer ${process.env.LAUDOSAI_API_KEY}` },
  });
  const { data } = await response.json();

  for (const conn of data) {
    console.log(`${conn.name}: ${conn.type} (${conn.protocol})`);
  }
  ```

  ```python Python theme={null}
  import requests

  response = requests.get(
      "https://copilot.laudos.ai/api/v1/pacs/connections",
      headers={"Authorization": "Bearer sk_live_xxx"}
  )

  connections = response.json()["data"]
  for conn in connections:
      print(f"{conn['name']}: {conn['type']} ({conn['protocol']})")
  ```
</CodeGroup>

### Resposta

```json theme={null}
{
  "data": [
    {
      "id": "conn_abc123",
      "name": "PACS Hospital Central",
      "type": "carestream",
      "protocol": "hl7",
      "host": "192.168.1.100",
      "port": 2575,
      "status": "connected",
      "created_at": "2025-08-01T10:00:00Z"
    }
  ],
  "meta": {
    "total": 1
  }
}
```

### Tipos de Conexao

| Tipo         | Protocolo | Sistemas Compativeis                    |
| ------------ | --------- | --------------------------------------- |
| `carestream` | HL7       | Carestream Vue PACS                     |
| `mvsoul`     | HL7/XML   | MV Soul, VIVACE                         |
| `tasy`       | HL7       | Philips Tasy                            |
| `pixeon`     | HL7       | Pixeon PACS                             |
| `dicomweb`   | STOW-RS   | Philips, Siemens, GE, Orthanc, dcm4chee |

***

## Enviar Laudo ao PACS

Envia um laudo para o PACS. O protocolo (HL7, DICOMweb, MV Soul XML) e detectado automaticamente com base na conexao, ou pode ser especificado manualmente.

```
POST /pacs/send
```

### Body Parameters

#### Obrigatorios

| Campo           | Tipo   | Descricao                         |
| --------------- | ------ | --------------------------------- |
| `connection_id` | string | ID da conexao PACS                |
| `report_text`   | string | Conteudo do laudo (HTML ou texto) |

Pelo menos um dos campos abaixo e obrigatorio:

| Campo                | Tipo   | Descricao                 |
| -------------------- | ------ | ------------------------- |
| `accession_number`   | string | Numero de acesso do exame |
| `study_instance_uid` | string | Study Instance UID DICOM  |

#### Dados do Paciente

| Campo            | Tipo   | Segmento HL7 | Descricao                       |
| ---------------- | ------ | ------------ | ------------------------------- |
| `patient_id`     | string | PID-3        | ID do paciente                  |
| `patient_name`   | string | PID-5        | Nome (Sobrenome, Nome)          |
| `patient_dob`    | string | PID-7        | Data de nascimento (YYYY-MM-DD) |
| `patient_gender` | string | PID-8        | M, F ou O                       |

#### Dados do Estudo e Medicos

| Campo                   | Tipo   | Descricao                             |
| ----------------------- | ------ | ------------------------------------- |
| `modality`              | string | CT, MR, US, XR, MG, etc.              |
| `study_description`     | string | Descricao do estudo                   |
| `study_date`            | string | Data do estudo (ISO 8601)             |
| `attending_doctor`      | string | Medico assistente                     |
| `ordering_provider`     | string | Medico solicitante                    |
| `reporting_radiologist` | string | Radiologista responsavel              |
| `report_status`         | string | `preliminary`, `final` ou `corrected` |
| `protocol`              | string | `auto`, `hl7`, `dicomweb` ou `mvsoul` |

### Exemplos

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST "https://copilot.laudos.ai/api/v1/pacs/send" \
    -H "Authorization: Bearer sk_live_xxx" \
    -H "Content-Type: application/json" \
    -d '{
      "connection_id": "conn_abc123",
      "report_text": "<h1>LAUDO RADIOLOGICO</h1><p><strong>Tecnica:</strong> TC de torax sem contraste.</p><p><strong>Analise:</strong> Parenquima pulmonar normal.</p><p><strong>Impressao:</strong> Exame normal.</p>",
      "report_status": "final",
      "accession_number": "ACC2026012600001",
      "patient_id": "PAT001",
      "patient_name": "Silva, Joao Carlos",
      "patient_dob": "1958-03-15",
      "patient_gender": "M",
      "modality": "CT",
      "reporting_radiologist": "Dr. Carlos Santos - CRM 11111"
    }'
  ```

  ```typescript TypeScript theme={null}
  const response = await fetch('https://copilot.laudos.ai/api/v1/pacs/send', {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${process.env.LAUDOSAI_API_KEY}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      connection_id: 'conn_abc123',
      report_text: '<h1>LAUDO RADIOLOGICO</h1><p>Exame normal.</p>',
      report_status: 'final',
      accession_number: 'ACC2026012600001',
      patient_id: 'PAT001',
      patient_name: 'Silva, Joao Carlos',
      modality: 'CT',
      reporting_radiologist: 'Dr. Carlos Santos - CRM 11111',
    }),
  });

  const result = await response.json();
  if (result.success) {
    console.log(`Laudo enviado via ${result.protocol} em ${result.duration_ms}ms`);
  }
  ```

  ```python Python theme={null}
  import requests

  response = requests.post(
      "https://copilot.laudos.ai/api/v1/pacs/send",
      headers={
          "Authorization": "Bearer sk_live_xxx",
          "Content-Type": "application/json"
      },
      json={
          "connection_id": "conn_abc123",
          "report_text": "<h1>LAUDO RADIOLOGICO</h1><p>Exame normal.</p>",
          "report_status": "final",
          "accession_number": "ACC2026012600001",
          "patient_id": "PAT001",
          "patient_name": "Silva, Joao Carlos",
          "modality": "CT",
          "reporting_radiologist": "Dr. Carlos Santos - CRM 11111"
      },
      timeout=120
  )

  result = response.json()
  if result["success"]:
      print(f"Enviado via {result['protocol']} em {result['duration_ms']}ms")
  ```
</CodeGroup>

### Resposta - Sucesso

```json theme={null}
{
  "success": true,
  "message": "Laudo enviado com sucesso",
  "protocol": "hl7",
  "duration_ms": 1250,
  "details": {
    "ack_type": "AA",
    "message_control_id": "MSG2026012614300001",
    "hl7_version": "2.5.1"
  }
}
```

### Resposta - Erro

```json theme={null}
{
  "success": false,
  "error": "connection_refused",
  "message": "Nao foi possivel conectar ao PACS",
  "protocol": "hl7",
  "details": {
    "host": "192.168.1.100",
    "port": 2575,
    "error_code": "ECONNREFUSED"
  }
}
```

***

## Protocolos Suportados

### HL7 ORU^R01 via MLLP

Protocolo padrao para sistemas brasileiros. Mensagens HL7 v2.5.1 enviadas via MLLP.

Sistemas compativeis: Carestream, MV Soul, Tasy, Pixeon, MV 2000, Wareline.

### DICOMweb STOW-RS

Protocolo REST para sistemas modernos. Laudos enviados como DICOM Structured Report.

Sistemas compativeis: Philips, Siemens, GE, Fujifilm, Agfa, Orthanc, dcm4chee.

### MV Soul XML API

API XML proprietaria para sistemas MV Soul e VIVACE.

***

## Codigos de Erro

| Codigo HTTP | Descricao                    |
| ----------- | ---------------------------- |
| `400`       | Campos obrigatorios ausentes |
| `401`       | API Key invalida             |
| `403`       | Sem permissao para PACS      |
| `404`       | Conexao PACS nao encontrada  |
| `500`       | Erro no envio ao PACS        |
| `504`       | Timeout de conexao           |

### Erros PACS

| Erro                    | Descricao             | Solucao                           |
| ----------------------- | --------------------- | --------------------------------- |
| `connection_refused`    | Conexao recusada      | Verificar IP/porta e firewall     |
| `connection_timeout`    | Timeout               | Verificar rede e status do PACS   |
| `ack_error`             | ACK negativo (AE/AR)  | Verificar dados do paciente/exame |
| `authentication_failed` | Falha na autenticacao | Verificar credenciais             |

***

## Boas Praticas

* Teste conexoes antes de enviar laudos em producao
* Implemente retry com backoff exponencial para falhas transientes
* Valide que o `accession_number` existe no RIS antes de enviar
* Use `report_status: "preliminary"` para laudos parciais, `"final"` para definitivos
* Configure timeout de pelo menos 120 segundos no cliente (conexoes remotas podem ser lentas)
* Libere porta 2575 (HL7) ou 443 (DICOMweb) no firewall
