{
  "schema_version": 1,
  "reference": {
    "url": "https://integracao.mobilemed.com.br/doc/api_data.json",
    "captured_at_utc": "2026-09-21T17:37:47Z",
    "sha256": "3391e5329943dce35ef6cca2dab749866b17c7f2e178ca9db6e4bca7d13d00ea",
    "bytes": 51799
  },
  "operation_count": 26,
  "live_mobilemed_status": "authenticated business behavior unavailable: no authorized MOBILEMED_TOKEN supplied",
  "public_auth_probe_status": "Post-deployment: all 4 public authentication scenarios match the frozen real Mobilemed responses; authenticated business behavior remains unverified.",
  "interpretation": "Documentation and route/source references are evidence of contract shape, not proof of runtime parity.",
  "operations": [
    {
      "index": 1,
      "id": "POST /v1/exam/{accessionNumber}/comment",
      "operation": "createComment",
      "group": "Exame",
      "vendor": {
        "raw_path": "/v1/exam/:accessionNumber/comment",
        "description": "Cria comentario para o exame",
        "headers": [],
        "parameters": [
          {
            "name": "accessionNumber",
            "type": "String",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "Accession Number do exame"
          },
          {
            "name": "status",
            "type": "String",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "Novo status do exame. Só é permitida a alteração quando o exame ainda não foi assinado. Opções disponíveis: 0 para novo (a ser laudado), 3 para pendente, e 7 para reconvocar."
          }
        ],
        "request_examples": [
          {
            "title": "Request-Example:",
            "media_type": "json",
            "verbatim": "{\n  \"comment\": \"Example of a comment body\",\n  \"status\": 0\n}"
          }
        ],
        "success_fields": [],
        "error_fields": [],
        "success_codes": [
          200
        ],
        "error_codes": [
          "unknown (not stated by public reference)"
        ],
        "success_examples": [
          {
            "title": "Success-Response:",
            "media_type": "json",
            "verbatim": "HTTP/1.1 200 OK\n{\n  \"Comment was created successfully\"\n}"
          }
        ],
        "error_examples": [],
        "null_semantics": "unknown unless a field description or example explicitly contains null",
        "files": [
          "unknown (not stated by public reference)"
        ],
        "pagination": "unknown (not stated by public reference)",
        "effects": "mutation is implied by POST/name/description; transaction, idempotency and follow-up visibility are unknown",
        "source": {
          "url": "https://integracao.mobilemed.com.br/doc/api_data.json",
          "filename": "routes/exam.js"
        }
      },
      "themis": {
        "openapi_operation_id": "createComment",
        "documented": true,
        "response_codes": [
          "200",
          "400",
          "404",
          "406"
        ],
        "openapi_contract": {
          "parameters": [
            {
              "name": "accessionNumber",
              "in": "path",
              "required": true,
              "schema": {
                "type": "string",
                "maxLength": 16
              },
              "description": "Accession Number do exame"
            },
            {
              "name": "api",
              "in": "header",
              "required": false,
              "schema": {
                "type": "string",
                "enum": [
                  "one",
                  "mob"
                ]
              },
              "description": "Opcional; quando presente, aceita one ou mob."
            }
          ],
          "request_body": {
            "required": true,
            "content": {
              "application/json": {
                "type": "object",
                "required": [
                  "comment"
                ],
                "properties": {
                  "comment": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 2000
                  },
                  "status": {
                    "type": "integer",
                    "enum": [
                      0,
                      3,
                      7
                    ],
                    "description": "Novo status do exame (0 novo, 3 pendente, 7 reconvocar). Aceito também como string (\"3\")."
                  }
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "OK",
              "content_types": [
                "application/json"
              ]
            },
            "400": {
              "description": "Exame inexistente na organização da credencial (ou pertencente a outra organização — o cliente não distingue); Exame já assinado, sem alterações permitidas; Corpo/parâmetros inválidos (validação). Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "404": {
              "description": "Token desconhecido (ou ambíguo). Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "406": {
              "description": "Header `token` ausente (tem precedência sobre `api` inválido), ou header `api` inválido depois de o token ser reconhecido. Token desconhecido responde 404 antes da validação de `api`. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            }
          }
        },
        "source_and_test_references": [
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam.controller.ts",
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam-read.service.spec.ts",
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam-write.service.spec.ts"
        ],
        "assessment": "route documented; behavioral parity requires replay/live evidence"
      }
    },
    {
      "index": 2,
      "id": "GET /v1/exam/{accessionNumber}",
      "operation": "find",
      "group": "Exame",
      "vendor": {
        "raw_path": "/v1/exam/:accessionNumber",
        "description": "Retorna exame de acordo com o Accession Number fornecido. Os retornos de status e prioridade poderão ser: Status: Novo (0), Assinado (1), Laudando (2), Pendente (3), Revisar (4), Reassinado (5), Digitado (6), Reconvocar (7), Digitadoia (8), A Preparar (9), Pré Laudado (10) e Digitando (11); Prioridades: Rotina (1), Ambulatório (2), Urgência (3), Emergência (4), Plantão (5) e Internado (6). Marcações Clínicas: Com Contraste (1), Sem Contraste (2), Bilateral (3), Esquerdo (4), Direito (5), Não Oncológico (6), Oncológico (7), Precisa ser comparado (8), Com AVC (9), Sem AVC (10), Oncológico Benigno (11), Oncológico Maligno (12), Com trauma (13), Sem trauma (14).",
        "headers": [
          {
            "name": "format",
            "type": "String",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "Formato do laudo a ser retornado. Opções disponíveis: pdf, html, rtf e text."
          },
          {
            "name": "base64",
            "type": "bool",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "Retorno do laudo em base64. Opções disponíveis: true e false."
          },
          {
            "name": "group",
            "type": "bool",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "Agrupa laudos de exames duplicados em um único corpo de forma sequencial. Opções disponíveis: true e false. Formato PDF apenas em base64."
          },
          {
            "name": "marcacaoClinica",
            "type": "bool",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "Retorno de marcações clínicas do exame. Opções disponíveis: true e false."
          }
        ],
        "parameters": [
          {
            "name": "accessionNumber",
            "type": "String",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "Accession Number do exame"
          }
        ],
        "request_examples": [],
        "success_fields": [],
        "error_fields": [],
        "success_codes": [
          200
        ],
        "error_codes": [
          "unknown (not stated by public reference)"
        ],
        "success_examples": [
          {
            "title": "Success-Response:",
            "media_type": "json",
            "verbatim": "HTTP/1.1 200 OK\n{\n  \"study\": {\n      \"id\": 123456789,\n      \"accessionNumber\": \"12345678\",\n      \"studyUID\": \"1.2.99.1.96.99.192.168.0.218\",\n      \"studyDate\": \"2020-12-01\",\n      \"company\": {\n          \"name\": \"MOBILEMED\"\n      },\n      \"auxiliaryField01\": \"CAMPO AUXILIAR 01\",\n      \"description\": \"DESCRICAO DO ESTUDO\",\n      \"modality\": \"OT\",\n      \"status\": {\n          \"id\": 0,\n          \"description\": \"Assinado\"\n      },\n      \"priority\": {\n          \"id\": 1,\n          \"description\": \"Rotina\"\n      },\n      \"clinicalMarkings\": [\n          {\n              \"id\": 2,\n              \"description\": \"Sem Contraste\"\n          },\n          {\n              \"id\": 3,\n              \"description\": \"Bilateral\"\n          },\n          {\n              \"id\": 8,\n              \"description\": \"Precisa ser comparado\"\n          },\n          {\n              \"id\": 14,\n              \"description\": \"Sem trauma\"\n          }\n      ],\n      \"patient\": {\n         \"codigo_paciente\": \"123456\",\n          \"name\": \"NOME DO PACIENTE\",\n          \"birthday\": \"2000-12-01\",\n          \"sex\": \"M\"\n      },\n      \"publicViewerUrl\": \"https://link-do-viewer-publico\",\n      \"report\": {\n          \"id\": 123456789,\n          \"publishedAt\": \"2020-12-01T12:00:00.000Z\",\n          \"performingPhysician\": {\n              \"name\": \"NOME DO MÉDICO EXECUTANTE\",\n              \"crm\": {\n                  \"code\": 123456,\n                  \"uf\": \"SP\"\n              },\n          \"email\": \"emailmedico@hotmail.com\"\n          },\n          \"content\": \"http://link-do-laudo.pdf\"\n      }\n  }\n}"
          }
        ],
        "error_examples": [],
        "null_semantics": "unknown unless a field description or example explicitly contains null",
        "files": [
          "unknown (not stated by public reference)"
        ],
        "pagination": "unknown (not stated by public reference)",
        "effects": "read-only is implied by GET; caching and consistency are unknown",
        "source": {
          "url": "https://integracao.mobilemed.com.br/doc/api_data.json",
          "filename": "routes/exam.js"
        }
      },
      "themis": {
        "openapi_operation_id": "find",
        "documented": true,
        "response_codes": [
          "200",
          "400",
          "404",
          "406"
        ],
        "openapi_contract": {
          "parameters": [
            {
              "name": "accessionNumber",
              "in": "path",
              "required": true,
              "schema": {
                "type": "string",
                "maxLength": 16
              },
              "description": "Accession Number do exame"
            },
            {
              "name": "format",
              "in": "header",
              "required": false,
              "schema": {
                "type": "string",
                "enum": [
                  "pdf",
                  "html",
                  "rtf",
                  "text"
                ]
              },
              "description": "Formato do laudo a ser retornado. Opções disponíveis: pdf, html, rtf e text. Sem este header, `report.content` é a URL assinada (1 h) do PDF gravado, ou `null` se não há PDF."
            },
            {
              "name": "base64",
              "in": "header",
              "required": false,
              "schema": {
                "type": "string",
                "enum": [
                  "true",
                  "false"
                ]
              },
              "description": "Retorno do laudo em base64. Opções disponíveis: true e false. Padrão: true quando `format` é informado."
            },
            {
              "name": "group",
              "in": "header",
              "required": false,
              "schema": {
                "type": "string",
                "enum": [
                  "true",
                  "false"
                ]
              },
              "description": "Agrupa laudos disponíveis de itens relacionados (pai e cópias, exame principal e associados, ou mesmo StudyUID), em ordem determinística e sem duplicatas. Opções: true e false. Com format=pdf, mobilemed retorna um único PDF base64 em report.content. Em legacy, report.groupedContent é uma extensão deprecated; report.content já contém o PDF completo e não deve ser concatenado outra vez."
            },
            {
              "name": "marcacaoClinica",
              "in": "header",
              "required": false,
              "schema": {
                "type": "string",
                "enum": [
                  "true",
                  "false"
                ]
              },
              "description": "Retorno de marcações clínicas do exame (`clinicalMarkings`). Opções disponíveis: true e false."
            },
            {
              "name": "api",
              "in": "header",
              "required": false,
              "schema": {
                "type": "string",
                "enum": [
                  "one",
                  "mob"
                ]
              },
              "description": "Opcional; quando presente, aceita one ou mob."
            }
          ],
          "request_body": null,
          "responses": {
            "200": {
              "description": "OK",
              "content_types": [
                "application/json"
              ]
            },
            "400": {
              "description": "Exame inexistente na organização da credencial (ou pertencente a outra organização — o cliente não distingue). Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "404": {
              "description": "Token desconhecido (ou ambíguo). Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "406": {
              "description": "Header `token` ausente (tem precedência sobre `api` inválido), ou header `api` inválido depois de o token ser reconhecido. Token desconhecido responde 404 antes da validação de `api`. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            }
          }
        },
        "source_and_test_references": [
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam.controller.ts",
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam-read.service.spec.ts",
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam-write.service.spec.ts"
        ],
        "assessment": "route documented; behavioral parity requires replay/live evidence"
      }
    },
    {
      "index": 3,
      "id": "GET /v1/exam/studyUID/{studyUID}",
      "operation": "findByStudyUID",
      "group": "Exame",
      "vendor": {
        "raw_path": "/v1/exam/studyUID/:studyUID",
        "description": "Retorna exame de acordo com o StudyUID fornecido, incluindo comentário, médico solicitante, contraste, subespecialidade, anexos e os exames duplicados associados ao mesmo StudyUID. Os retornos de status e prioridade poderão ser: Status: Novo (0), Assinado (1), Laudando (2), Pendente (3), Revisar (4), Reassinado (5), Digitado (6), Reconvocar (7), Digitadoia (8), A Preparar (9), Pré Laudado (10) e Digitando (11); Prioridades: Rotina (1), Ambulatório (2), Urgência (3), Emergência (4), Plantão (5) e Internado (6).",
        "headers": [
          {
            "name": "token",
            "type": "String",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "Token da integração"
          },
          {
            "name": "api",
            "type": "String",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "Ambiente da API (mob/one)"
          },
          {
            "name": "format",
            "type": "String",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "Formato do laudo a ser retornado. Opções disponíveis: pdf, html, rtf e text. Quando não informado, retorna o link do laudo em PDF."
          },
          {
            "name": "base64",
            "type": "bool",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "Retorno do laudo e dos anexos em base64. Opções disponíveis: true e false. Padrão: true quando o header format é informado."
          },
          {
            "name": "group",
            "type": "bool",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "Agrupa laudos de exames duplicados em um único corpo de forma sequencial. Opções disponíveis: true e false. Formato PDF apenas em base64."
          }
        ],
        "parameters": [
          {
            "name": "studyUID",
            "type": "String",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "StudyUID do exame"
          }
        ],
        "request_examples": [],
        "success_fields": [],
        "error_fields": [],
        "success_codes": [
          200
        ],
        "error_codes": [
          400,
          404,
          406,
          500
        ],
        "success_examples": [
          {
            "title": "Success-Response:",
            "media_type": "json",
            "verbatim": "HTTP/1.1 200 OK\n{\n  \"study\": {\n      \"id\": 123456789,\n      \"accessionNumber\": \"12345678\",\n      \"studyUID\": \"1.2.99.1.96.99.192.168.0.218\",\n      \"studyDate\": \"2020-12-01\",\n      \"company\": {\n          \"name\": \"MOBILEMED\"\n      },\n      \"auxiliaryField01\": \"CAMPO AUXILIAR 01\",\n      \"modality\": \"OT\",\n      \"status\": {\n          \"id\": 1,\n          \"description\": \"Assinado\"\n      },\n      \"priority\": {\n          \"id\": 1,\n          \"description\": \"Rotina\"\n      },\n      \"patient\": {\n         \"codigo_paciente\": \"123456\",\n          \"name\": \"NOME DO PACIENTE\",\n          \"birthday\": \"2000-12-01\",\n          \"sex\": \"M\"\n      },\n      \"publicViewerUrl\": \"https://link-do-viewer-publico\",\n      \"report\": {\n          \"id\": 123456789,\n          \"publishedAt\": \"2020-12-01T12:00:00.000Z\",\n          \"performingPhysician\": {\n              \"name\": \"NOME DO MÉDICO EXECUTANTE\",\n              \"crm\": {\n                  \"code\": 123456,\n                  \"uf\": \"SP\"\n              },\n          \"email\": \"emailmedico@hotmail.com\"\n          },\n          \"content\": \"http://link-do-laudo.pdf\"\n      },\n      \"comment\": \"COMENTÁRIO DO EXAME\",\n      \"applicantPhysician\": \"NOME DO MÉDICO SOLICITANTE\",\n      \"contrast\": {\n          \"description\": \"campo auxiliar 02\"\n      },\n      \"subspecialty\": {\n          \"description\": \"DESCRICAO DO ESTUDO\",\n          \"subspecialtyCode\": \"123\"\n      },\n      \"attachments\": [\n          {\n              \"anexoID\": 123456,\n              \"mimeType\": \"application/pdf\",\n              \"arquivo\": \"caminho/do/anexo.pdf\"\n          }\n      ]\n  },\n  \"associatedExams\": [\n      {\n          \"study\": {\n              \"id\": 123456790,\n              \"accessionNumber\": \"12345679\",\n              \"studyUID\": \"1.2.99.1.96.99.192.168.0.218\",\n              \"...\": \"demais campos do exame, sem comment, applicantPhysician e attachments\",\n              \"contrast\": {\n                  \"description\": \"\"\n              },\n              \"subspecialty\": {\n                  \"description\": \"DESCRICAO DO ESTUDO\",\n                  \"subspecialtyCode\": \"123\"\n              }\n          }\n      }\n  ]\n}"
          }
        ],
        "error_examples": [
          {
            "title": "Error-400:",
            "media_type": "json",
            "verbatim": "HTTP/1.1 400 Bad Request\n{\n  \"message\": \"Could not find any study\"\n}"
          },
          {
            "title": "Error-404:",
            "media_type": "json",
            "verbatim": "HTTP/1.1 404 Not Found\n{\n  \"error\": { \"message\": \"No integration found for the given token\" }\n}"
          },
          {
            "title": "Error-406:",
            "media_type": "json",
            "verbatim": "HTTP/1.1 406 Not Acceptable\n{\n  \"error\": { \"error_code\": 406, \"error_msg\": \"\\\"Integration token\\\" not provided\" }\n}"
          },
          {
            "title": "Error-500:",
            "media_type": "json",
            "verbatim": "HTTP/1.1 500 Internal Server Error\n{\n  \"error\": { \"message\": \"Erro ao pesquisar o exame\" }\n}"
          }
        ],
        "null_semantics": "unknown unless a field description or example explicitly contains null",
        "files": [
          "unknown (not stated by public reference)"
        ],
        "pagination": "unknown (not stated by public reference)",
        "effects": "read-only is implied by GET; caching and consistency are unknown",
        "source": {
          "url": "https://integracao.mobilemed.com.br/doc/api_data.json",
          "filename": "routes/exam.js"
        }
      },
      "themis": {
        "openapi_operation_id": "findByStudyUID",
        "documented": true,
        "response_codes": [
          "200",
          "400",
          "404",
          "406"
        ],
        "openapi_contract": {
          "parameters": [
            {
              "name": "studyUID",
              "in": "path",
              "required": true,
              "schema": {
                "type": "string",
                "maxLength": 64
              },
              "description": "StudyUID (Study Instance UID) do exame"
            },
            {
              "name": "format",
              "in": "header",
              "required": false,
              "schema": {
                "type": "string",
                "enum": [
                  "pdf",
                  "html",
                  "rtf",
                  "text"
                ]
              },
              "description": "Formato do laudo a ser retornado. Opções disponíveis: pdf, html, rtf e text. Sem este header, `report.content` é a URL assinada (1 h) do PDF gravado, ou `null` se não há PDF."
            },
            {
              "name": "base64",
              "in": "header",
              "required": false,
              "schema": {
                "type": "string",
                "enum": [
                  "true",
                  "false"
                ]
              },
              "description": "Retorno do laudo em base64. Opções disponíveis: true e false. Padrão: true quando `format` é informado."
            },
            {
              "name": "group",
              "in": "header",
              "required": false,
              "schema": {
                "type": "string",
                "enum": [
                  "true",
                  "false"
                ]
              },
              "description": "Agrupa laudos disponíveis de itens relacionados (pai e cópias, exame principal e associados, ou mesmo StudyUID), em ordem determinística e sem duplicatas. Opções: true e false. Com format=pdf, mobilemed retorna um único PDF base64 em report.content. Em legacy, report.groupedContent é uma extensão deprecated; report.content já contém o PDF completo e não deve ser concatenado outra vez."
            },
            {
              "name": "marcacaoClinica",
              "in": "header",
              "required": false,
              "schema": {
                "type": "string",
                "enum": [
                  "true",
                  "false"
                ]
              },
              "description": "Retorno de marcações clínicas do exame (`clinicalMarkings`). Opções disponíveis: true e false."
            },
            {
              "name": "api",
              "in": "header",
              "required": false,
              "schema": {
                "type": "string",
                "enum": [
                  "one",
                  "mob"
                ]
              },
              "description": "Opcional; quando presente, aceita one ou mob."
            }
          ],
          "request_body": null,
          "responses": {
            "200": {
              "description": "OK",
              "content_types": [
                "application/json"
              ]
            },
            "400": {
              "description": "Exame inexistente na organização da credencial (ou pertencente a outra organização — o cliente não distingue). Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "404": {
              "description": "Token desconhecido (ou ambíguo). Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "406": {
              "description": "Header `token` ausente (tem precedência sobre `api` inválido), ou header `api` inválido depois de o token ser reconhecido. Token desconhecido responde 404 antes da validação de `api`. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            }
          }
        },
        "source_and_test_references": [
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam.controller.ts",
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam-read.service.spec.ts",
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam-write.service.spec.ts"
        ],
        "assessment": "route documented; behavioral parity requires replay/live evidence"
      }
    },
    {
      "index": 4,
      "id": "GET /v1/exam/{accessionNumber}/comments",
      "operation": "getComments",
      "group": "Exame",
      "vendor": {
        "raw_path": "/v1/exam/:accessionNumber/comments",
        "description": "Retorna uma array de comentários feitos no exame, de acordo com o Accession Number fornecido.",
        "headers": [],
        "parameters": [
          {
            "name": "accessionNumber",
            "type": "String",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "Accession Number do exame"
          }
        ],
        "request_examples": [],
        "success_fields": [],
        "error_fields": [],
        "success_codes": [
          200
        ],
        "error_codes": [
          "unknown (not stated by public reference)"
        ],
        "success_examples": [
          {
            "title": "Success-Response:",
            "media_type": "json",
            "verbatim": "HTTP/1.1 200 OK\n[\n  {\n      \"comentario\": \"Comentário exemplo 1\",\n      \"data_criacao\": \"2023-03-03 02:01\",\n      \"data_alteracao\": \"2023-03-03 02:01\"\n  },\n  {\n      \"comentario\": \"Comentário exemplo 2\",\n      \"data_criacao\": \"2023-03-03 02:01\",\n      \"data_alteracao\": \"2023-03-03 02:01\"\n  }\n]"
          }
        ],
        "error_examples": [],
        "null_semantics": "unknown unless a field description or example explicitly contains null",
        "files": [
          "unknown (not stated by public reference)"
        ],
        "pagination": "unknown (not stated by public reference)",
        "effects": "read-only is implied by GET; caching and consistency are unknown",
        "source": {
          "url": "https://integracao.mobilemed.com.br/doc/api_data.json",
          "filename": "routes/exam.js"
        }
      },
      "themis": {
        "openapi_operation_id": "getComments",
        "documented": true,
        "response_codes": [
          "200",
          "400",
          "404",
          "406"
        ],
        "openapi_contract": {
          "parameters": [
            {
              "name": "accessionNumber",
              "in": "path",
              "required": true,
              "schema": {
                "type": "string",
                "maxLength": 16
              },
              "description": "Accession Number do exame"
            },
            {
              "name": "api",
              "in": "header",
              "required": false,
              "schema": {
                "type": "string",
                "enum": [
                  "one",
                  "mob"
                ]
              },
              "description": "Opcional; quando presente, aceita one ou mob."
            }
          ],
          "request_body": null,
          "responses": {
            "200": {
              "description": "OK",
              "content_types": [
                "application/json"
              ]
            },
            "400": {
              "description": "Exame inexistente na organização da credencial (ou pertencente a outra organização — o cliente não distingue). Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "404": {
              "description": "Token desconhecido (ou ambíguo). Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "406": {
              "description": "Header `token` ausente (tem precedência sobre `api` inválido), ou header `api` inválido depois de o token ser reconhecido. Token desconhecido responde 404 antes da validação de `api`. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            }
          }
        },
        "source_and_test_references": [
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam.controller.ts",
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam-read.service.spec.ts",
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam-write.service.spec.ts"
        ],
        "assessment": "route documented; behavioral parity requires replay/live evidence"
      }
    },
    {
      "index": 5,
      "id": "GET /v1/exam/logs/integration",
      "operation": "integrationLogs",
      "group": "Exame",
      "vendor": {
        "raw_path": "/v1/exam/logs/integration",
        "description": "Retorna uma array de logs de integração, com no máximo 20 por página, ou retorna um link para download dos logs em Excel.",
        "headers": [],
        "parameters": [
          {
            "name": "success",
            "type": "bool",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "Retorno de logs que obtiveram ou não sucesso na integração. Opções disponíveis: true e false."
          },
          {
            "name": "startDate",
            "type": "date",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "Data do começo do relatório. Formato YYYY-MM-DD."
          },
          {
            "name": "finalDate",
            "type": "date",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "Data do fim do relatório. Formato YYYY-MM-DD."
          },
          {
            "name": "page",
            "type": "number",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "Número da página do relatório."
          },
          {
            "name": "xlsx",
            "type": "bool",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "Retorno do relatório em um link para download em formato xlsx. Opções disponíveis: true e false."
          }
        ],
        "request_examples": [],
        "success_fields": [],
        "error_fields": [],
        "success_codes": [
          200
        ],
        "error_codes": [
          "unknown (not stated by public reference)"
        ],
        "success_examples": [
          {
            "title": "Success-Response:",
            "media_type": "json",
            "verbatim": "HTTP/1.1 200 OK\n{\n\"totalLogs\": {\n  \"total\": 417,\n  \"pages\": 21\n},\n\"logs\":\n  [\n     {\n      \"accessionNumber\": \"12313123\",\n      \"studyIUID\": 123.123.123.123.12.312.3.123,\n      \"codigoPedido\": 3656753,\n      \"statusRetorno\": 0,\n      \"descricaoErro\": \"Error: connect ECONNREFUSED 127.0.0.1:8082\"\n     },\n     {\n      \"accessionNumber\": \"12313123\",\n      \"studyIUID\": 123.123.123.123.12.312.3.123,\n      \"codigoPedido\": 3656753,\n      \"statusRetorno\": 0,\n      \"descricaoErro\": \"Error: connect ECONNREFUSED 127.0.0.1:8082\"\n     }\n ]"
          }
        ],
        "error_examples": [],
        "null_semantics": "unknown unless a field description or example explicitly contains null",
        "files": [
          "unknown (not stated by public reference)"
        ],
        "pagination": "documented",
        "effects": "read-only is implied by GET; caching and consistency are unknown",
        "source": {
          "url": "https://integracao.mobilemed.com.br/doc/api_data.json",
          "filename": "routes/exam.js"
        }
      },
      "themis": {
        "openapi_operation_id": "integrationLogs",
        "documented": true,
        "response_codes": [
          "200",
          "400",
          "404",
          "406"
        ],
        "openapi_contract": {
          "parameters": [
            {
              "name": "success",
              "in": "query",
              "required": false,
              "schema": {
                "type": "boolean"
              },
              "description": "Retorno de logs que obtiveram ou não sucesso na integração. Opções disponíveis: true e false. Sem o filtro, vêm os dois."
            },
            {
              "name": "startDate",
              "in": "query",
              "required": false,
              "schema": {
                "type": "string",
                "format": "date"
              },
              "description": "Data do começo do relatório. Formato YYYY-MM-DD."
            },
            {
              "name": "finalDate",
              "in": "query",
              "required": false,
              "schema": {
                "type": "string",
                "format": "date"
              },
              "description": "Data do fim do relatório. Formato YYYY-MM-DD."
            },
            {
              "name": "page",
              "in": "query",
              "required": false,
              "schema": {
                "type": "integer",
                "minimum": 1
              },
              "description": "Número da página do relatório (padrão 1)."
            },
            {
              "name": "xlsx",
              "in": "query",
              "required": false,
              "schema": {
                "type": "boolean"
              },
              "description": "Retorno do relatório em um link para download em formato xlsx. Opções disponíveis: true e false."
            },
            {
              "name": "api",
              "in": "header",
              "required": false,
              "schema": {
                "type": "string",
                "enum": [
                  "one",
                  "mob"
                ]
              },
              "description": "Opcional; quando presente, aceita one ou mob."
            }
          ],
          "request_body": null,
          "responses": {
            "200": {
              "description": "OK",
              "content_types": [
                "application/json"
              ]
            },
            "400": {
              "description": "Corpo/parâmetros inválidos (validação). Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "404": {
              "description": "Token desconhecido (ou ambíguo). Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "406": {
              "description": "Header `token` ausente (tem precedência sobre `api` inválido), ou header `api` inválido depois de o token ser reconhecido. Token desconhecido responde 404 antes da validação de `api`. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            }
          }
        },
        "source_and_test_references": [
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam.controller.ts",
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam-read.service.spec.ts",
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam-write.service.spec.ts"
        ],
        "assessment": "route documented; behavioral parity requires replay/live evidence"
      }
    },
    {
      "index": 6,
      "id": "GET /v1/exam/{accessionNumber}/keyimages",
      "operation": "keyImagesJPEG",
      "group": "Exame",
      "vendor": {
        "raw_path": "/v1/exam/:accessionNumber/keyimages",
        "description": "Busca as imagens chaves em JPEG",
        "headers": [],
        "parameters": [
          {
            "name": "accessionNumber",
            "type": "String",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "Accession Number do exame"
          }
        ],
        "request_examples": [],
        "success_fields": [],
        "error_fields": [],
        "success_codes": [
          200
        ],
        "error_codes": [
          "unknown (not stated by public reference)"
        ],
        "success_examples": [
          {
            "title": "Success-Response:",
            "media_type": "json",
            "verbatim": "HTTP/1.1 200 OK\n{\n  \"images\": [\n      \"http://link.com/images\"\n  ]\n}"
          }
        ],
        "error_examples": [],
        "null_semantics": "unknown unless a field description or example explicitly contains null",
        "files": [
          "jpeg"
        ],
        "pagination": "unknown (not stated by public reference)",
        "effects": "read-only is implied by GET; caching and consistency are unknown",
        "source": {
          "url": "https://integracao.mobilemed.com.br/doc/api_data.json",
          "filename": "routes/exam.js"
        }
      },
      "themis": {
        "openapi_operation_id": "keyImagesJPEG",
        "documented": true,
        "response_codes": [
          "200",
          "400",
          "404",
          "406"
        ],
        "openapi_contract": {
          "parameters": [
            {
              "name": "accessionNumber",
              "in": "path",
              "required": true,
              "schema": {
                "type": "string",
                "maxLength": 16
              },
              "description": "Accession Number do exame"
            },
            {
              "name": "api",
              "in": "header",
              "required": false,
              "schema": {
                "type": "string",
                "enum": [
                  "one",
                  "mob"
                ]
              },
              "description": "Opcional; quando presente, aceita one ou mob."
            }
          ],
          "request_body": null,
          "responses": {
            "200": {
              "description": "OK",
              "content_types": [
                "application/json"
              ]
            },
            "400": {
              "description": "Exame inexistente na organização da credencial (ou pertencente a outra organização — o cliente não distingue). Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "404": {
              "description": "Token desconhecido (ou ambíguo). Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "406": {
              "description": "Header `token` ausente (tem precedência sobre `api` inválido), ou header `api` inválido depois de o token ser reconhecido. Token desconhecido responde 404 antes da validação de `api`. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            }
          }
        },
        "source_and_test_references": [
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam.controller.ts",
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam-read.service.spec.ts",
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam-write.service.spec.ts"
        ],
        "assessment": "route documented; behavioral parity requires replay/live evidence"
      }
    },
    {
      "index": 7,
      "id": "POST /v1/exam/{accessionNumber}/report",
      "operation": "receiveReport",
      "group": "Exame",
      "vendor": {
        "raw_path": "/v1/exam/:acessionNumber/report",
        "description": "Recebe laudo do exame pelo seu respectivo Accession Number. São suportados os formatos HTML, RTF e PDF, que deverão ser específicados no atributo 'reportFormat' do body. Caso \"reportFormat\" seja PDF, o laudo não poderá ser alterado, somente refeito do zero. Caso a opção \"useIntegrationUser\" seja false, deverá ser enviado o campo \"physicianCrmUf\" com o CRM e UF do médico executante, que estejam cadastrados no Portal Mobilemed.",
        "headers": [],
        "parameters": [
          {
            "name": "accessionNumber",
            "type": "String",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "Accession Number do exame ou deverá colocar a palavra \"study\" caso deseje utilizar o StudyIUID como parâmetro do exame, enviando seu valor através do \"body\" de requisição."
          }
        ],
        "request_examples": [
          {
            "title": "Request-Example:",
            "media_type": "json",
            "verbatim": "{\n  \"reportFormat\": \"html\",\n  \"physicianCrmUf\": \"12345-SP\",\n  \"report\": \"PHA+PHN0cm9uZz5UT01PR1JBRklBIENPTVBVVEFET1JJWkFEQSBERSBBQkRPTUUgRSBQRUxWRTwvc3Ryb25nPjwvcD4KPHA\"\n}"
          },
          {
            "title": "Request-Example:",
            "media_type": "json",
            "verbatim": "{\n \"reportFormat\": \"pdf\",\n \"useIntegrationUser\": true,\n \"report\": \"base64\",\n \"studyIUID\": \"1.2.4352.434313124\"\n}"
          }
        ],
        "success_fields": [],
        "error_fields": [],
        "success_codes": [
          200
        ],
        "error_codes": [
          "unknown (not stated by public reference)"
        ],
        "success_examples": [
          {
            "title": "Success-Response:",
            "media_type": "json",
            "verbatim": "HTTP/1.1 200 OK\n{\n  \"Exam report set successfully\"\n}"
          }
        ],
        "error_examples": [],
        "null_semantics": "unknown unless a field description or example explicitly contains null",
        "files": [
          "pdf",
          "base64",
          "rtf"
        ],
        "pagination": "unknown (not stated by public reference)",
        "effects": "mutation is implied by POST/name/description; transaction, idempotency and follow-up visibility are unknown",
        "source": {
          "url": "https://integracao.mobilemed.com.br/doc/api_data.json",
          "filename": "routes/exam.js"
        }
      },
      "themis": {
        "openapi_operation_id": "receiveReport",
        "documented": true,
        "response_codes": [
          "200",
          "400",
          "404",
          "406"
        ],
        "openapi_contract": {
          "parameters": [
            {
              "name": "accessionNumber",
              "in": "path",
              "required": true,
              "schema": {
                "type": "string",
                "maxLength": 16
              },
              "description": "Accession Number do exame, ou a palavra `study` para usar o `studyIUID` do body"
            },
            {
              "name": "api",
              "in": "header",
              "required": false,
              "schema": {
                "type": "string",
                "enum": [
                  "one",
                  "mob"
                ]
              },
              "description": "Opcional; quando presente, aceita one ou mob."
            }
          ],
          "request_body": {
            "required": true,
            "content": {
              "application/json": {
                "type": "object",
                "required": [
                  "reportFormat",
                  "report"
                ],
                "properties": {
                  "reportFormat": {
                    "type": "string",
                    "enum": [
                      "html",
                      "rtf",
                      "pdf"
                    ],
                    "description": "Sem distinção de caixa"
                  },
                  "report": {
                    "type": "string",
                    "contentEncoding": "base64",
                    "description": "Documento em base64 (ou data URL)"
                  },
                  "physicianCrmUf": {
                    "type": "string",
                    "description": "\"<crm>-<uf>\" do médico executante; obrigatório quando useIntegrationUser não é true",
                    "example": "12345-SP"
                  },
                  "useIntegrationUser": {
                    "type": "boolean",
                    "description": "true: assina em nome da credencial (sem médico)"
                  },
                  "studyIUID": {
                    "type": "string",
                    "description": "Localizador quando o path traz `study` no lugar do accession"
                  }
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "OK",
              "content_types": [
                "application/json"
              ]
            },
            "400": {
              "description": "Exame inexistente na organização da credencial (ou pertencente a outra organização — o cliente não distingue); Exame já assinado, sem alterações permitidas; Corpo/parâmetros inválidos (validação); report não é base64; reportFormat pdf com conteúdo que não é PDF; sem physicianCrmUf; physicianCrmUf mal formado; path `study` sem studyIUID. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "404": {
              "description": "Token desconhecido (ou ambíguo); CRM/UF sem médico cadastrado. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "406": {
              "description": "Header `token` ausente (tem precedência sobre `api` inválido), ou header `api` inválido depois de o token ser reconhecido. Token desconhecido responde 404 antes da validação de `api`. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            }
          }
        },
        "source_and_test_references": [
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam.controller.ts",
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam-read.service.spec.ts",
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam-write.service.spec.ts"
        ],
        "assessment": "route documented; behavioral parity requires replay/live evidence"
      }
    },
    {
      "index": 8,
      "id": "POST /v1/exam/reintegrateReports",
      "operation": "reintegrateReports",
      "group": "Exame",
      "vendor": {
        "raw_path": "/v1/exam/reintegrateReports",
        "description": "Recebe uma array de Accession Numbers para a reintegração manual de exames, com número máximo de 20 por requisição.",
        "headers": [],
        "parameters": [],
        "request_examples": [
          {
            "title": "Request-Example:",
            "media_type": "json",
            "verbatim": "{\n  accessionNumbers:\n      [{\n          \"accessionNumber\": \"12345\"\n      },\n      {\n          \"accessionNumber\": \"23456\"\n      },\n      {\n          \"accessionNumber\": \"34567\"\n      }]\n}"
          }
        ],
        "success_fields": [],
        "error_fields": [],
        "success_codes": [
          200
        ],
        "error_codes": [
          "unknown (not stated by public reference)"
        ],
        "success_examples": [
          {
            "title": "Success-Response:",
            "media_type": "json",
            "verbatim": "HTTP/1.1 200 OK\n{\n  \"Exams sended to reintegration queue.\"\n}"
          }
        ],
        "error_examples": [],
        "null_semantics": "unknown unless a field description or example explicitly contains null",
        "files": [
          "unknown (not stated by public reference)"
        ],
        "pagination": "unknown (not stated by public reference)",
        "effects": "mutation is implied by POST/name/description; transaction, idempotency and follow-up visibility are unknown",
        "source": {
          "url": "https://integracao.mobilemed.com.br/doc/api_data.json",
          "filename": "routes/exam.js"
        }
      },
      "themis": {
        "openapi_operation_id": "reintegrateReports",
        "documented": true,
        "response_codes": [
          "200",
          "400",
          "404",
          "406"
        ],
        "openapi_contract": {
          "parameters": [
            {
              "name": "api",
              "in": "header",
              "required": false,
              "schema": {
                "type": "string",
                "enum": [
                  "one",
                  "mob"
                ]
              },
              "description": "Opcional; quando presente, aceita one ou mob."
            }
          ],
          "request_body": {
            "required": true,
            "content": {
              "application/json": {
                "type": "object",
                "required": [
                  "accessionNumbers"
                ],
                "properties": {
                  "accessionNumbers": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 20,
                    "items": {
                      "type": "object",
                      "required": [
                        "accessionNumber"
                      ],
                      "properties": {
                        "accessionNumber": {
                          "type": "string",
                          "maxLength": 64
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "OK",
              "content_types": [
                "application/json"
              ]
            },
            "400": {
              "description": "Corpo/parâmetros inválidos (validação). Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "404": {
              "description": "Token desconhecido (ou ambíguo). Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "406": {
              "description": "Header `token` ausente (tem precedência sobre `api` inválido), ou header `api` inválido depois de o token ser reconhecido. Token desconhecido responde 404 antes da validação de `api`. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            }
          }
        },
        "source_and_test_references": [
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam.controller.ts",
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam-read.service.spec.ts",
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam-write.service.spec.ts"
        ],
        "assessment": "route documented; behavioral parity requires replay/live evidence"
      }
    },
    {
      "index": 9,
      "id": "POST /v1/exam/{accessionNumber}/replicate",
      "operation": "replicate",
      "group": "Exame",
      "vendor": {
        "raw_path": "/v1/exam/:accessionNumber/replicate",
        "description": "Replica entradas de um exame de acordo com o Accession Number da entrada principal já existente no portal",
        "headers": [],
        "parameters": [
          {
            "name": "accessionNumber",
            "type": "String",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "Accession Number da entrada principal do exame"
          }
        ],
        "request_examples": [
          {
            "title": "Request-Example:",
            "media_type": "json",
            "verbatim": "{\n  \"exams\": [\n            {\n                \"accessionNumber\": \"1111\",\n                \"studyDescription\": \"DESCRICAO DO ESTUDO\"\n            },\n            {\n                \"accessionNumber\": \"2222\",\n                \"studyDescription\": \"DESCRICAO DO ESTUDO\"\n            }\n        ]\n}"
          }
        ],
        "success_fields": [],
        "error_fields": [],
        "success_codes": [
          200
        ],
        "error_codes": [
          "unknown (not stated by public reference)"
        ],
        "success_examples": [
          {
            "title": "Success-Response:",
            "media_type": "json",
            "verbatim": "HTTP/1.1 200 OK\n{\n  \"Exams replicated successfully\"\n}"
          }
        ],
        "error_examples": [],
        "null_semantics": "unknown unless a field description or example explicitly contains null",
        "files": [
          "unknown (not stated by public reference)"
        ],
        "pagination": "unknown (not stated by public reference)",
        "effects": "mutation is implied by POST/name/description; transaction, idempotency and follow-up visibility are unknown",
        "source": {
          "url": "https://integracao.mobilemed.com.br/doc/api_data.json",
          "filename": "routes/exam.js"
        }
      },
      "themis": {
        "openapi_operation_id": "replicate",
        "documented": true,
        "response_codes": [
          "200",
          "400",
          "404",
          "406",
          "409"
        ],
        "openapi_contract": {
          "parameters": [
            {
              "name": "accessionNumber",
              "in": "path",
              "required": true,
              "schema": {
                "type": "string",
                "maxLength": 16
              },
              "description": "Accession Number da entrada principal do exame"
            },
            {
              "name": "api",
              "in": "header",
              "required": false,
              "schema": {
                "type": "string",
                "enum": [
                  "one",
                  "mob"
                ]
              },
              "description": "Opcional; quando presente, aceita one ou mob."
            }
          ],
          "request_body": {
            "required": true,
            "content": {
              "application/json": {
                "type": "object",
                "required": [
                  "exams"
                ],
                "properties": {
                  "exams": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 50,
                    "items": {
                      "type": "object",
                      "required": [
                        "accessionNumber"
                      ],
                      "properties": {
                        "accessionNumber": {
                          "type": "string",
                          "maxLength": 64
                        },
                        "studyDescription": {
                          "type": "string",
                          "maxLength": 255
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "OK",
              "content_types": [
                "application/json"
              ]
            },
            "400": {
              "description": "Exame inexistente na organização da credencial (ou pertencente a outra organização — o cliente não distingue); corpo/parâmetros inválidos (validação); ou exame sem paciente vinculado. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "404": {
              "description": "Token desconhecido (ou ambíguo). Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "406": {
              "description": "Header `token` ausente (tem precedência sobre `api` inválido), ou header `api` inválido depois de o token ser reconhecido. Token desconhecido responde 404 antes da validação de `api`. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "409": {
              "description": "Accession Number já existe na organização. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            }
          }
        },
        "source_and_test_references": [
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam.controller.ts",
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam-read.service.spec.ts",
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam-write.service.spec.ts"
        ],
        "assessment": "route documented; behavioral parity requires replay/live evidence"
      }
    },
    {
      "index": 10,
      "id": "POST /v1/exam/{accessionNumber}/mammography",
      "operation": "saveMammography",
      "group": "Exame",
      "vendor": {
        "raw_path": "/v1/exam/:accessionNumber/mammography",
        "description": "Recebe a ficha de mamografia vinculada ao exame pelo Accession Number. Grava o JSON mammography no laudo ( tb_exame_laudo ) e marca is_mammography como true no servidor. Reenvio sobrescreve o JSON inteiro. Exame assinado (status 1 ou 5) não pode ser alterado. O campo is_mammography no body é ignorado.",
        "headers": [
          {
            "name": "token",
            "type": "String",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "Token da integração"
          },
          {
            "name": "api",
            "type": "String",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "Ambiente da API (mob/one)"
          }
        ],
        "parameters": [
          {
            "name": "accessionNumber",
            "type": "String",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "Accession Number do exame"
          }
        ],
        "request_examples": [
          {
            "title": "Request-Example:",
            "media_type": "json",
            "verbatim": "{\n  \"mammography\": {\n    \"cnes\": \"\",\n    \"service_name\": \"\",\n    \"exam_date\": \"2026-08-18\",\n    \"exam_number\": \"\",\n    \"never_menstruated\": false,\n    \"last_menstruation\": null,\n    \"forgot_last_menstruation\": false,\n    \"menopause_age\": null,\n    \"forgot_menopause_age\": false,\n    \"use_hormone\": \"no\",\n    \"is_pregnant\": \"no\",\n    \"film_quantity\": 0,\n    \"exibir_dados_preparo_exame\": false,\n    \"data_modal\": {\n      \"info_pessoais\": { \"nome_mae\": \"\", \"data_nascimento\": null, \"escolaridade\": \"\" },\n      \"info_residenciais\": { \"lougradouro\": \"\", \"numero\": \"\", \"complemento\": \"\", \"bairro\": \"\", \"uf\": \"\", \"cep\": \"\", \"referencia\": \"\" },\n      \"anamnese\": { \"risk_of_cancer\": \"no\", \"had_mammography\": \"no\", \"mammography_year\": \"\", \"breast_examined\": \"yes\", \"nodule\": \"no\" },\n      \"right\": { \"surgery\": [] },\n      \"left\": { \"surgery\": [] },\n      \"no_surgery\": false\n    },\n    \"right\": { \"breast_was_not_radiographed\": false, \"skin\": \"not_filled\", \"breast_type\": \"not_filled\", \"took_ultrasound\": [] },\n    \"left\": { \"breast_was_not_radiographed\": false, \"skin\": \"not_filled\", \"breast_type\": \"not_filled\", \"took_ultrasound\": [] },\n    \"radiological_classification\": {},\n    \"recommendations\": {},\n    \"comments\": \"\"\n  }\n}"
          }
        ],
        "success_fields": [],
        "error_fields": [],
        "success_codes": [
          200
        ],
        "error_codes": [
          400,
          404,
          406,
          500
        ],
        "success_examples": [
          {
            "title": "Success-Response:",
            "media_type": "json",
            "verbatim": "HTTP/1.1 200 OK\n{\n  \"message\": \"Mammography report saved successfully\"\n}"
          }
        ],
        "error_examples": [
          {
            "title": "Error-400:",
            "media_type": "json",
            "verbatim": "HTTP/1.1 400 Bad Request\n{\n  \"message\": \"No mammography payload was sent\"\n}"
          },
          {
            "title": "Error-400-signed:",
            "media_type": "json",
            "verbatim": "HTTP/1.1 400 Bad Request\n{\n  \"message\": \"Exam already signed, no changes allowed\"\n}"
          },
          {
            "title": "Error-400-company:",
            "media_type": "json",
            "verbatim": "HTTP/1.1 400 Bad Request\n{\n  \"message\": \"No company id was found\"\n}"
          },
          {
            "title": "Error-400-accession:",
            "media_type": "json",
            "verbatim": "HTTP/1.1 400 Bad Request\n{\n  \"message\": \"No accession number was sent\"\n}"
          },
          {
            "title": "Error-404:",
            "media_type": "json",
            "verbatim": "HTTP/1.1 404 Not Found\n{\n  \"message\": \"Could not find any study\"\n}"
          },
          {
            "title": "Error-406:",
            "media_type": "json",
            "verbatim": "HTTP/1.1 406 Not Acceptable\n{\n  \"error\": { \"error_code\": 406, \"error_msg\": \"\\\"Integration token\\\" not provided\" }\n}"
          },
          {
            "title": "Error-500:",
            "media_type": "json",
            "verbatim": "HTTP/1.1 500 Internal Server Error\n{\n  \"message\": \"Erro ao gravar laudo de mamografia\"\n}"
          }
        ],
        "null_semantics": "unknown unless a field description or example explicitly contains null",
        "files": [
          "unknown (not stated by public reference)"
        ],
        "pagination": "unknown (not stated by public reference)",
        "effects": "mutation is implied by POST/name/description; transaction, idempotency and follow-up visibility are unknown",
        "source": {
          "url": "https://integracao.mobilemed.com.br/doc/api_data.json",
          "filename": "routes/exam.js"
        }
      },
      "themis": {
        "openapi_operation_id": "saveMammography",
        "documented": true,
        "response_codes": [
          "200",
          "400",
          "404",
          "406"
        ],
        "openapi_contract": {
          "parameters": [
            {
              "name": "accessionNumber",
              "in": "path",
              "required": true,
              "schema": {
                "type": "string",
                "maxLength": 16
              },
              "description": "Accession Number do exame"
            },
            {
              "name": "api",
              "in": "header",
              "required": false,
              "schema": {
                "type": "string",
                "enum": [
                  "one",
                  "mob"
                ]
              },
              "description": "Opcional; quando presente, aceita one ou mob."
            }
          ],
          "request_body": {
            "required": true,
            "content": {
              "application/json": {
                "type": "object",
                "required": [
                  "mammography"
                ],
                "properties": {
                  "mammography": {
                    "type": "object",
                    "additionalProperties": true,
                    "description": "Ficha de mamografia — o JSON é gravado como veio."
                  }
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "OK",
              "content_types": [
                "application/json"
              ]
            },
            "400": {
              "description": "Exame inexistente na organização da credencial (ou pertencente a outra organização — o cliente não distingue); Exame já assinado, sem alterações permitidas; Corpo/parâmetros inválidos (validação); sem mammography. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "404": {
              "description": "Token desconhecido (ou ambíguo). Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "406": {
              "description": "Header `token` ausente (tem precedência sobre `api` inválido), ou header `api` inválido depois de o token ser reconhecido. Token desconhecido responde 404 antes da validação de `api`. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            }
          }
        },
        "source_and_test_references": [
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam.controller.ts",
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam-read.service.spec.ts",
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam-write.service.spec.ts"
        ],
        "assessment": "route documented; behavioral parity requires replay/live evidence"
      }
    },
    {
      "index": 11,
      "id": "POST /v1/exam/{accessionNumber}/attachment",
      "operation": "setAttachment",
      "group": "Exame",
      "vendor": {
        "raw_path": "/v1/exam/:accessionNumber/attachment",
        "description": "Atribui anexos comuns ao exame pelo seu respectivo Accession Number. Os tipos de anexos suportados são imagens (jpg, png, gif, bmp) ou PDF, até 1mb.",
        "headers": [],
        "parameters": [
          {
            "name": "accessionNumber",
            "type": "String",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "Accession Number do exame"
          }
        ],
        "request_examples": [
          {
            "title": "Request-Example:",
            "media_type": "json",
            "verbatim": "{\n  \"attachments\": [\n      \"PHA+PHN0cm9uZz5UT01PR1JBRklBIENPTVBVVEFET1JJWkFEQSBERSBBQkRPTUUgRSBQRUxWRTwvc3Ryb25nPjwvcD4KPH1\",\n      \"PHA+PHN0cm9uZz5UT01PR1JBRklBIENPTVBVVEFET1JJWkFEQSBERSBBQkRPTUUgRSBQRUxWRTwvc3Ryb25nPjwvcD4KPH2\",\n      \"PHA+PHN0cm9uZz5UT01PR1JBRklBIENPTVBVVEFET1JJWkFEQSBERSBBQkRPTUUgRSBQRUxWRTwvc3Ryb25nPjwvcD4KPH3\",\n      ...\n  ]\n}"
          }
        ],
        "success_fields": [],
        "error_fields": [],
        "success_codes": [
          200
        ],
        "error_codes": [
          "unknown (not stated by public reference)"
        ],
        "success_examples": [
          {
            "title": "Success-Response:",
            "media_type": "json",
            "verbatim": "HTTP/1.1 200 OK\n{\n  \"Attachments successfully attached to exam\"\n}"
          }
        ],
        "error_examples": [],
        "null_semantics": "unknown unless a field description or example explicitly contains null",
        "files": [
          "pdf",
          "attachment"
        ],
        "pagination": "unknown (not stated by public reference)",
        "effects": "mutation is implied by POST/name/description; transaction, idempotency and follow-up visibility are unknown",
        "source": {
          "url": "https://integracao.mobilemed.com.br/doc/api_data.json",
          "filename": "routes/exam.js"
        }
      },
      "themis": {
        "openapi_operation_id": "setAttachment",
        "documented": true,
        "response_codes": [
          "200",
          "400",
          "404",
          "406"
        ],
        "openapi_contract": {
          "parameters": [
            {
              "name": "accessionNumber",
              "in": "path",
              "required": true,
              "schema": {
                "type": "string",
                "maxLength": 16
              },
              "description": "Accession Number do exame"
            },
            {
              "name": "api",
              "in": "header",
              "required": false,
              "schema": {
                "type": "string",
                "enum": [
                  "one",
                  "mob"
                ]
              },
              "description": "Opcional; quando presente, aceita one ou mob."
            }
          ],
          "request_body": {
            "required": true,
            "content": {
              "application/json": {
                "type": "object",
                "required": [
                  "attachments"
                ],
                "properties": {
                  "attachments": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 20,
                    "items": {
                      "type": "string",
                      "contentEncoding": "base64"
                    }
                  }
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "OK",
              "content_types": [
                "application/json"
              ]
            },
            "400": {
              "description": "Exame inexistente na organização da credencial (ou pertencente a outra organização — o cliente não distingue); Corpo/parâmetros inválidos (validação); item vazio ou não base64; acima de 1 MB; tipo não suportado. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "404": {
              "description": "Token desconhecido (ou ambíguo). Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "406": {
              "description": "Header `token` ausente (tem precedência sobre `api` inválido), ou header `api` inválido depois de o token ser reconhecido. Token desconhecido responde 404 antes da validação de `api`. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            }
          }
        },
        "source_and_test_references": [
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam.controller.ts",
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam-read.service.spec.ts",
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam-write.service.spec.ts"
        ],
        "assessment": "route documented; behavioral parity requires replay/live evidence"
      }
    },
    {
      "index": 12,
      "id": "POST /v1/exam/{accessionNumber}/resident-physician",
      "operation": "setPhysician",
      "group": "Exame",
      "vendor": {
        "raw_path": "/v1/exam/:accessionNumber/resident-physician",
        "description": "Atribui o médico executante ao exame ainda não laudado pelo seu respectivo Accesion Number",
        "headers": [],
        "parameters": [
          {
            "name": "accessionNumber",
            "type": "String",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "Accession Number do exame"
          }
        ],
        "request_examples": [
          {
            "title": "Request-Example:",
            "media_type": "json",
            "verbatim": "{\n  \"crm_uf\": \"12345-SP\"\n}"
          }
        ],
        "success_fields": [],
        "error_fields": [],
        "success_codes": [
          200
        ],
        "error_codes": [
          "unknown (not stated by public reference)"
        ],
        "success_examples": [
          {
            "title": "Success-Response:",
            "media_type": "json",
            "verbatim": "HTTP/1.1 200 OK\n{\n  \"Physician assigned to the exam\"\n}"
          }
        ],
        "error_examples": [],
        "null_semantics": "unknown unless a field description or example explicitly contains null",
        "files": [
          "unknown (not stated by public reference)"
        ],
        "pagination": "unknown (not stated by public reference)",
        "effects": "mutation is implied by POST/name/description; transaction, idempotency and follow-up visibility are unknown",
        "source": {
          "url": "https://integracao.mobilemed.com.br/doc/api_data.json",
          "filename": "routes/exam.js"
        }
      },
      "themis": {
        "openapi_operation_id": "setPhysician",
        "documented": true,
        "response_codes": [
          "200",
          "400",
          "404",
          "406"
        ],
        "openapi_contract": {
          "parameters": [
            {
              "name": "accessionNumber",
              "in": "path",
              "required": true,
              "schema": {
                "type": "string",
                "maxLength": 16
              },
              "description": "Accession Number do exame"
            },
            {
              "name": "api",
              "in": "header",
              "required": false,
              "schema": {
                "type": "string",
                "enum": [
                  "one",
                  "mob"
                ]
              },
              "description": "Opcional; quando presente, aceita one ou mob."
            }
          ],
          "request_body": {
            "required": true,
            "content": {
              "application/json": {
                "type": "object",
                "required": [
                  "crm_uf"
                ],
                "properties": {
                  "crm_uf": {
                    "type": "string",
                    "minLength": 3,
                    "maxLength": 64,
                    "example": "12345-SP"
                  }
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "OK",
              "content_types": [
                "application/json"
              ]
            },
            "400": {
              "description": "Exame inexistente na organização da credencial (ou pertencente a outra organização — o cliente não distingue); Exame já assinado, sem alterações permitidas; Corpo/parâmetros inválidos (validação); crm_uf mal formado. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "404": {
              "description": "Token desconhecido (ou ambíguo); CRM/UF sem médico cadastrado. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "406": {
              "description": "Header `token` ausente (tem precedência sobre `api` inválido), ou header `api` inválido depois de o token ser reconhecido. Token desconhecido responde 404 antes da validação de `api`. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            }
          }
        },
        "source_and_test_references": [
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam.controller.ts",
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam-read.service.spec.ts",
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam-write.service.spec.ts"
        ],
        "assessment": "route documented; behavioral parity requires replay/live evidence"
      }
    },
    {
      "index": 13,
      "id": "POST /v1/exam/{accessionNumber}/priority",
      "operation": "setPriority",
      "group": "Exame",
      "vendor": {
        "raw_path": "/v1/exam/:accessionNumber/priority",
        "description": "Atribui nova prioridade ao exame. As prioridades disponíveis são: Rotina (1), Ambulatório (2), Urgência (3), Emergência (4), Plantão (5)",
        "headers": [],
        "parameters": [
          {
            "name": "accessionNumber",
            "type": "String",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "Accession Number do exame"
          }
        ],
        "request_examples": [
          {
            "title": "Request-Example:",
            "media_type": "json",
            "verbatim": "{\n  \"priority_id\": \"2\"\n}"
          }
        ],
        "success_fields": [],
        "error_fields": [],
        "success_codes": [
          200
        ],
        "error_codes": [
          "unknown (not stated by public reference)"
        ],
        "success_examples": [
          {
            "title": "Success-Response:",
            "media_type": "json",
            "verbatim": "HTTP/1.1 200 OK\n{\n  \"Exam priority changed successfully\"\n}"
          }
        ],
        "error_examples": [],
        "null_semantics": "unknown unless a field description or example explicitly contains null",
        "files": [
          "unknown (not stated by public reference)"
        ],
        "pagination": "unknown (not stated by public reference)",
        "effects": "mutation is implied by POST/name/description; transaction, idempotency and follow-up visibility are unknown",
        "source": {
          "url": "https://integracao.mobilemed.com.br/doc/api_data.json",
          "filename": "routes/exam.js"
        }
      },
      "themis": {
        "openapi_operation_id": "setPriority",
        "documented": true,
        "response_codes": [
          "200",
          "400",
          "404",
          "406"
        ],
        "openapi_contract": {
          "parameters": [
            {
              "name": "accessionNumber",
              "in": "path",
              "required": true,
              "schema": {
                "type": "string",
                "maxLength": 16
              },
              "description": "Accession Number do exame"
            },
            {
              "name": "api",
              "in": "header",
              "required": false,
              "schema": {
                "type": "string",
                "enum": [
                  "one",
                  "mob"
                ]
              },
              "description": "Opcional; quando presente, aceita one ou mob."
            }
          ],
          "request_body": {
            "required": true,
            "content": {
              "application/json": {
                "type": "object",
                "required": [
                  "priority_id"
                ],
                "properties": {
                  "priority_id": {
                    "oneOf": [
                      {
                        "type": "integer"
                      },
                      {
                        "type": "string"
                      }
                    ],
                    "description": "1 Rotina, 2 Ambulatório, 3 Urgência, 4 Emergência, 5 Plantão, 6 Internado"
                  }
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "OK",
              "content_types": [
                "application/json"
              ]
            },
            "400": {
              "description": "Exame inexistente na organização da credencial (ou pertencente a outra organização — o cliente não distingue); Exame já assinado, sem alterações permitidas; Corpo/parâmetros inválidos (validação); id fora de 1..6. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "404": {
              "description": "Token desconhecido (ou ambíguo). Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "406": {
              "description": "Header `token` ausente (tem precedência sobre `api` inválido), ou header `api` inválido depois de o token ser reconhecido. Token desconhecido responde 404 antes da validação de `api`. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            }
          }
        },
        "source_and_test_references": [
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam.controller.ts",
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam-read.service.spec.ts",
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam-write.service.spec.ts"
        ],
        "assessment": "route documented; behavioral parity requires replay/live evidence"
      }
    },
    {
      "index": 14,
      "id": "POST /v1/exam/{accessionNumber}/release",
      "operation": "setRelease",
      "group": "Exame",
      "vendor": {
        "raw_path": "/v1/exam/:accessionNumber/release",
        "description": "Libera ou revoga a liberação de um exame já assinado",
        "headers": [],
        "parameters": [
          {
            "name": "accessionNumber",
            "type": "String",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "Accession Number do exame"
          }
        ],
        "request_examples": [
          {
            "title": "Request-Example:",
            "media_type": "json",
            "verbatim": "{\n    \"release\":true\n}"
          }
        ],
        "success_fields": [],
        "error_fields": [],
        "success_codes": [
          200
        ],
        "error_codes": [
          "unknown (not stated by public reference)"
        ],
        "success_examples": [
          {
            "title": "Success-Response:",
            "media_type": "json",
            "verbatim": "HTTP/1.1 200 OK\n{\n  \"Exam released\"\n}"
          }
        ],
        "error_examples": [],
        "null_semantics": "unknown unless a field description or example explicitly contains null",
        "files": [
          "unknown (not stated by public reference)"
        ],
        "pagination": "unknown (not stated by public reference)",
        "effects": "mutation is implied by POST/name/description; transaction, idempotency and follow-up visibility are unknown",
        "source": {
          "url": "https://integracao.mobilemed.com.br/doc/api_data.json",
          "filename": "routes/exam.js"
        }
      },
      "themis": {
        "openapi_operation_id": "setRelease",
        "documented": true,
        "response_codes": [
          "200",
          "400",
          "404",
          "406"
        ],
        "openapi_contract": {
          "parameters": [
            {
              "name": "accessionNumber",
              "in": "path",
              "required": true,
              "schema": {
                "type": "string",
                "maxLength": 16
              },
              "description": "Accession Number do exame"
            },
            {
              "name": "api",
              "in": "header",
              "required": false,
              "schema": {
                "type": "string",
                "enum": [
                  "one",
                  "mob"
                ]
              },
              "description": "Opcional; quando presente, aceita one ou mob."
            }
          ],
          "request_body": {
            "required": true,
            "content": {
              "application/json": {
                "type": "object",
                "required": [
                  "release"
                ],
                "properties": {
                  "release": {
                    "type": "boolean",
                    "description": "Aceita também \"true\"/\"false\"."
                  }
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "OK",
              "content_types": [
                "application/json"
              ]
            },
            "400": {
              "description": "Exame inexistente na organização da credencial (ou pertencente a outra organização — o cliente não distingue); Corpo/parâmetros inválidos (validação); exame sem laudo assinado. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "404": {
              "description": "Token desconhecido (ou ambíguo). Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "406": {
              "description": "Header `token` ausente (tem precedência sobre `api` inválido), ou header `api` inválido depois de o token ser reconhecido. Token desconhecido responde 404 antes da validação de `api`. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            }
          }
        },
        "source_and_test_references": [
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam.controller.ts",
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam-read.service.spec.ts",
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam-write.service.spec.ts"
        ],
        "assessment": "route documented; behavioral parity requires replay/live evidence"
      }
    },
    {
      "index": 15,
      "id": "POST /v1/exam/{accessionNumber}/description",
      "operation": "updateDescription",
      "group": "Exame",
      "vendor": {
        "raw_path": "/v1/exam/:accessionNumber/description",
        "description": "Atualiza a descriçao do exame",
        "headers": [],
        "parameters": [
          {
            "name": "accessionNumber",
            "type": "String",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "Accession Number do exame"
          }
        ],
        "request_examples": [
          {
            "title": "Request-Example:",
            "media_type": "json",
            "verbatim": "{\n  \"description\": \"Example of a Description\"\n}"
          }
        ],
        "success_fields": [],
        "error_fields": [],
        "success_codes": [
          200
        ],
        "error_codes": [
          "unknown (not stated by public reference)"
        ],
        "success_examples": [
          {
            "title": "Success-Response:",
            "media_type": "json",
            "verbatim": "HTTP/1.1 200 OK\n{\n  \"Description was changed successfully\"\n}"
          }
        ],
        "error_examples": [],
        "null_semantics": "unknown unless a field description or example explicitly contains null",
        "files": [
          "unknown (not stated by public reference)"
        ],
        "pagination": "unknown (not stated by public reference)",
        "effects": "mutation is implied by POST/name/description; transaction, idempotency and follow-up visibility are unknown",
        "source": {
          "url": "https://integracao.mobilemed.com.br/doc/api_data.json",
          "filename": "routes/exam.js"
        }
      },
      "themis": {
        "openapi_operation_id": "updateDescription",
        "documented": true,
        "response_codes": [
          "200",
          "400",
          "404",
          "406"
        ],
        "openapi_contract": {
          "parameters": [
            {
              "name": "accessionNumber",
              "in": "path",
              "required": true,
              "schema": {
                "type": "string",
                "maxLength": 16
              },
              "description": "Accession Number do exame"
            },
            {
              "name": "api",
              "in": "header",
              "required": false,
              "schema": {
                "type": "string",
                "enum": [
                  "one",
                  "mob"
                ]
              },
              "description": "Opcional; quando presente, aceita one ou mob."
            }
          ],
          "request_body": {
            "required": true,
            "content": {
              "application/json": {
                "type": "object",
                "required": [
                  "description"
                ],
                "properties": {
                  "description": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 255
                  }
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "OK",
              "content_types": [
                "application/json"
              ]
            },
            "400": {
              "description": "Exame inexistente na organização da credencial (ou pertencente a outra organização — o cliente não distingue); Exame já assinado, sem alterações permitidas; Corpo/parâmetros inválidos (validação). Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "404": {
              "description": "Token desconhecido (ou ambíguo). Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "406": {
              "description": "Header `token` ausente (tem precedência sobre `api` inválido), ou header `api` inválido depois de o token ser reconhecido. Token desconhecido responde 404 antes da validação de `api`. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            }
          }
        },
        "source_and_test_references": [
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam.controller.ts",
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam-read.service.spec.ts",
          "ris-backend/src/mobilemed-compat/exam/mobilemed-exam-write.service.spec.ts"
        ],
        "assessment": "route documented; behavioral parity requires replay/live evidence"
      }
    },
    {
      "index": 16,
      "id": "GET /v1/physician",
      "operation": "findByCrmUf",
      "group": "Physician",
      "vendor": {
        "raw_path": "/v1/physician?crm=1234&uf=SP",
        "description": "Busca médico pelo CRM e UF",
        "headers": [],
        "parameters": [
          {
            "name": "crm",
            "type": "String",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "CRM do médico"
          },
          {
            "name": "uf",
            "type": "String",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "UF de CRM do médico"
          }
        ],
        "request_examples": [],
        "success_fields": [],
        "error_fields": [],
        "success_codes": [
          200
        ],
        "error_codes": [
          "unknown (not stated by public reference)"
        ],
        "success_examples": [
          {
            "title": "Success-Response:",
            "media_type": "json",
            "verbatim": "HTTP/1.1 200 OK\n{\n  \"physician\": {\n  \"name\": \"Dr. Mobilemed\",\n  \"crm\": {\n      \"code\": 1234,\n      \"uf\": \"SP\"\n  },\n  \"signature\":\"77+9UE5HDQoaCgAAAA1JSERSAAAD77+9AAAAeAgGAAAAYS3vv706AAAgAElEQVR4Xu+/vQd0XO+/vXXvv71/YO+/\"\n  }\n}"
          }
        ],
        "error_examples": [],
        "null_semantics": "unknown unless a field description or example explicitly contains null",
        "files": [
          "unknown (not stated by public reference)"
        ],
        "pagination": "unknown (not stated by public reference)",
        "effects": "read-only is implied by GET; caching and consistency are unknown",
        "source": {
          "url": "https://integracao.mobilemed.com.br/doc/api_data.json",
          "filename": "routes/physician.js"
        }
      },
      "themis": {
        "openapi_operation_id": "findByCrmUF",
        "documented": true,
        "response_codes": [
          "200",
          "400",
          "404",
          "406"
        ],
        "openapi_contract": {
          "parameters": [
            {
              "name": "crm",
              "in": "query",
              "required": true,
              "schema": {
                "type": "string",
                "maxLength": 32
              },
              "description": "CRM do médico"
            },
            {
              "name": "uf",
              "in": "query",
              "required": true,
              "schema": {
                "type": "string",
                "minLength": 2,
                "maxLength": 2
              },
              "description": "UF do CRM do médico"
            },
            {
              "name": "api",
              "in": "header",
              "required": false,
              "schema": {
                "type": "string",
                "enum": [
                  "one",
                  "mob"
                ]
              },
              "description": "Opcional; quando presente, aceita one ou mob."
            }
          ],
          "request_body": null,
          "responses": {
            "200": {
              "description": "OK",
              "content_types": [
                "application/json"
              ]
            },
            "400": {
              "description": "Corpo/parâmetros inválidos (validação). Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "404": {
              "description": "Token desconhecido (ou ambíguo); CRM/UF sem médico cadastrado. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "406": {
              "description": "Header `token` ausente (tem precedência sobre `api` inválido), ou header `api` inválido depois de o token ser reconhecido. Token desconhecido responde 404 antes da validação de `api`. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            }
          }
        },
        "source_and_test_references": [
          "ris-backend/src/mobilemed-compat/physician/mobilemed-physician.controller.ts",
          "ris-backend/src/mobilemed-compat/physician/mobilemed-physician.service.spec.ts"
        ],
        "assessment": "route documented; behavioral parity requires replay/live evidence"
      }
    },
    {
      "index": 17,
      "id": "POST /v1/results/add-print-count",
      "operation": "addPrintCount",
      "group": "Result",
      "vendor": {
        "raw_path": "/v1/results/add-print-count",
        "description": "Adiciona o valor do contador de impressão",
        "headers": [],
        "parameters": [],
        "request_examples": [
          {
            "title": "Request-Example:",
            "media_type": "json",
            "verbatim": "{\n    \"exam_id\": 1\n}"
          }
        ],
        "success_fields": [],
        "error_fields": [],
        "success_codes": [
          201
        ],
        "error_codes": [
          "unknown (not stated by public reference)"
        ],
        "success_examples": [
          {
            "title": "Success-Response:",
            "media_type": "json",
            "verbatim": "HTTP/1.1 201 OK"
          }
        ],
        "error_examples": [],
        "null_semantics": "unknown unless a field description or example explicitly contains null",
        "files": [
          "unknown (not stated by public reference)"
        ],
        "pagination": "unknown (not stated by public reference)",
        "effects": "mutation is implied by POST/name/description; transaction, idempotency and follow-up visibility are unknown",
        "source": {
          "url": "https://integracao.mobilemed.com.br/doc/api_data.json",
          "filename": "routes/results.js"
        }
      },
      "themis": {
        "openapi_operation_id": "addPrintCount",
        "documented": true,
        "response_codes": [
          "201",
          "400",
          "404",
          "406"
        ],
        "openapi_contract": {
          "parameters": [
            {
              "name": "api",
              "in": "header",
              "required": false,
              "schema": {
                "type": "string",
                "enum": [
                  "one",
                  "mob"
                ]
              },
              "description": "Opcional; quando presente, aceita one ou mob."
            }
          ],
          "request_body": {
            "required": true,
            "content": {
              "application/json": {
                "type": "object",
                "required": [
                  "exam_id"
                ],
                "properties": {
                  "exam_id": {
                    "oneOf": [
                      {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 9007199254740991
                      },
                      {
                        "type": "string",
                        "pattern": "^[1-9][0-9]*$"
                      },
                      {
                        "type": "string",
                        "format": "uuid"
                      }
                    ],
                    "description": "ID externo seguro como número ou texto decimal, ou alias UUID; resolução sempre na organização da credencial."
                  }
                }
              }
            }
          },
          "responses": {
            "201": {
              "description": "Criado — sem corpo",
              "content_types": []
            },
            "400": {
              "description": "Exame inexistente na organização da credencial (ou pertencente a outra organização — o cliente não distingue); Corpo/parâmetros inválidos (validação). Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "404": {
              "description": "Token desconhecido (ou ambíguo). Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "406": {
              "description": "Header `token` ausente (tem precedência sobre `api` inválido), ou header `api` inválido depois de o token ser reconhecido. Token desconhecido responde 404 antes da validação de `api`. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            }
          }
        },
        "source_and_test_references": [
          "ris-backend/src/mobilemed-compat/results/mobilemed-results.controller.ts",
          "ris-backend/src/mobilemed-compat/results/mobilemed-results.service.spec.ts"
        ],
        "assessment": "route documented; behavioral parity requires replay/live evidence"
      }
    },
    {
      "index": 18,
      "id": "GET /v1/results/signed/{code}",
      "operation": "getDigitalSign",
      "group": "Result",
      "vendor": {
        "raw_path": "/v1/results/signed/:code",
        "description": "Busca o Laudo e as informações assinadas digitalmente",
        "headers": [],
        "parameters": [
          {
            "name": "code",
            "type": "String",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "Codigo do laudo digital"
          }
        ],
        "request_examples": [],
        "success_fields": [],
        "error_fields": [],
        "success_codes": [
          201
        ],
        "error_codes": [
          "unknown (not stated by public reference)"
        ],
        "success_examples": [
          {
            "title": "Success-Response:",
            "media_type": "json",
            "verbatim": "HTTP/1.1 201 OK\n * {\n      \"id\": 2580085,\n      \"exame_id\": 3800516,\n      \"usuario_id\": 3573,\n      \"html\": \"<p style=\\\"text-align: center;\\\"><strong><span style=\\\"font-family: arial, helvetica, sans-serif; font-size: 11pt;\\\">ANGIOTOMOGRAFIA DA AORTA ABDOMINAL</span></strong></p>\\n<p><strong><br />Hist&oacute;ria cl&iacute;nica/indica&ccedil;&atilde;o para o exame: </strong><span style=\\\"color: #ff0000;\\\">inserir conforme dados cl&iacute;nicos informado.</span></p>\\n<p><span style=\\\"font-family: arial, helvetica, sans-serif; font-size: 11pt;\\\"><strong>T&eacute;cnica do exame: </strong><strong><br /></strong><span style=\\\"color: #ff0000;\\\">ATEN&Ccedil;&Atilde;O na cita&ccedil;&atilde;o do uso ou n&atilde;o de contraste</span></span></p>\\n<p><span style=\\\"font-family: arial, helvetica, sans-serif; font-size: 11pt;\\\">Cortes tomogr&aacute;ficos computadorizados obtidos em aparelho multislice, AP&Oacute;S a inje&ccedil;&atilde;o endovenosa.</span></p>\\n<p><strong><span style=\\\"font-family: arial, helvetica, sans-serif; font-size: 11pt;\\\">An&aacute;lise:</span></strong></p>\\n<p style=\\\"text-align: center;\\\"><strong><span style=\\\"font-family: arial, helvetica, sans-serif; font-size: 11pt;\\\">Aorta abdominal</span></strong></p>\\n<p><span style=\\\"font-family: arial, helvetica, sans-serif; font-size: 11pt;\\\">Aorta abdominal de calibre normal em toda extens&atilde;o, sem aneurimas ou dissec&ccedil;&atilde;o.</span></p>\\n<p><span style=\\\"font-family: arial, helvetica, sans-serif; font-size: 11pt; color: #ff0000;\\\">Aneurisma fusiforme do segmento infra-renal da aorta, iniciando-se a cerca de ..... cm da emerg&ecirc;ncia da art&eacute;ria renal ....., medindo cerca de ...... x ...... cm e extendendo-se por .... cm no sentido longitudinal.</span></p>\\n<p><span style=\\\"font-family: arial, helvetica, sans-serif; font-size: 11pt;\\\">N&atilde;o foi identificada estenose no tronco cel&iacute;aco, nas art&eacute;rias mesent&eacute;ricas superior e inferior ou nas art&eacute;rias renais, sendo cada rim irrigado por ... ramos arteriais.</span></p>\\n<p><span style=\\\"font-family: arial, helvetica, sans-serif; font-size: 11pt;\\\">Rim direito irrigado por .... art&eacute;rias, sem altera&ccedil;&otilde;es significativas.</span></p>\\n<p><span style=\\\"font-family: arial, helvetica, sans-serif; font-size: 11pt;\\\">Rim esquerdo irrigado por .... art&eacute;rias, sem altera&ccedil;&otilde;es significativas.</span></p>\\n<p><span style=\\\"font-family: arial, helvetica, sans-serif; font-size: 11pt;\\\">Sistema arterial il&iacute;aco p&eacute;rvio, sem estenoses ou aneurismas.</span></p>\\n<p>&nbsp;</p>\\n<p><strong><span style=\\\"font-family: arial, helvetica, sans-serif; font-size: 11pt;\\\">Medidas da aorta:</span></strong></p>\\n<p><span style=\\\"font-family: arial, helvetica, sans-serif; font-size: 11pt;\\\">Transi&ccedil;&atilde;o tor&aacute;co-abdominal: ... cm.</span></p>\\n<p><span style=\\\"font-family: arial, helvetica, sans-serif; font-size: 11pt;\\\">Altura da emerg&ecirc;ncia das art&eacute;rias renais: ... cm.</span></p>\\n<p><span style=\\\"font-family: arial, helvetica, sans-serif; font-size: 11pt;\\\">Segmento infrarrenal: ... cm.</span></p>\\n<p><span style=\\\"font-family: arial, helvetica, sans-serif; font-size: 11pt;\\\">Art&eacute;ria il&iacute;aca comum direita: ... cm.</span></p>\\n<p><span style=\\\"font-family: arial, helvetica, sans-serif; font-size: 11pt;\\\">Art&eacute;ria il&iacute;aca externa direita: ... cm.</span></p>\\n<p><span style=\\\"font-family: arial, helvetica, sans-serif; font-size: 11pt;\\\">Art&eacute;ria il&iacute;aca comum esquerda: ... cm.</span></p>\\n<p><span style=\\\"font-family: arial, helvetica, sans-serif; font-size: 11pt;\\\">Art&eacute;ria il&iacute;aca externa esquerda: ... cm.</span></p>\\n<p>&nbsp;</p>\\n<p><strong><span style=\\\"font-family: arial, helvetica, sans-serif; font-size: 11pt;\\\">Achados adicionais:<br /><br /></span></strong></p>\\n<p style=\\\"margin-bottom: 12.0pt;\\\"><strong>Avalia&ccedil;&atilde;o comparativa com exames anteriores: </strong><strong><br /></strong><span style=\\\"color: red;\\\">(Caso n&atilde;o tenha compara&ccedil;&atilde;o, retirar esse item)<br /></span>Foi realizada avalia&ccedil;&atilde;o comparativa com as<span style=\\\"color: red;\\\"> imagens do exame anterior ou laudo</span> datado ../../...., observando-se...</p>\\n<p><strong>Impress&atilde;o de Diagn&oacute;stico/Conclus&atilde;o: </strong></p>\\n<p>&nbsp;</p>\",\n      \"pdf_nome\": null,\n      \"pdf_path\": \"producao/exame/laudo_signed/1602792111470-LQsMdB9EnUIvjvJE_jD_Tt3~VYyD70.pdf\",\n      \"data_criacao\": \"2020-10-05T17:06:29.000Z\",\n      \"data_alteracao\": \"2020-10-15T20:01:53.000Z\",\n      \"status_id\": 1,\n      \"data_conclusao\": \"2020-10-15T20:01:44.000Z\",\n      \"endereco_ip\": \"170.83.36.90\",\n      \"birads\": null,\n      \"digital_sign\": {\n          \"signatureRSA\": {\n              \"signatureAlgorithm\": \"SHA256withRSA\",\n              \"algorithmHash\": \"SHA256\",\n              \"validation\": {\n                  \"valid\": true,\n                  \"description\": \"O documento não foi modificado após a aplicação da assinatura.\"\n              }\n          },\n          \"datetimeSignature\": \"15/10/2020 17:01:50\",\n          \"signatory\": {\n              \"holder\": \"MATHEUS MARTINS DE CARVALHO\",\n              \"document\": \"49149161857\",\n              \"isICPBrasil\": true,\n              \"validation\": {\n                  \"valid\": true,\n                  \"description\": \"A identidade do signatário e suas cadeias são válidas.\"\n              }\n          },\n          \"timestamp\": {\n              \"issuer\": \"SAFEWEB FEA3E2412B80\",\n              \"dateTimeSignature\": \"15/10/2020 17:01:50\",\n              \"validation\": {\n                  \"valid\": true,\n                  \"description\": \"A data e hora da assinatura são de uma autoridade de carimbo do tempo confiável.\"\n              }\n          },\n          \"valid\": true\n      }\n   }"
          }
        ],
        "error_examples": [],
        "null_semantics": "unknown unless a field description or example explicitly contains null",
        "files": [
          "unknown (not stated by public reference)"
        ],
        "pagination": "unknown (not stated by public reference)",
        "effects": "read-only is implied by GET; caching and consistency are unknown",
        "source": {
          "url": "https://integracao.mobilemed.com.br/doc/api_data.json",
          "filename": "routes/results.js"
        }
      },
      "themis": {
        "openapi_operation_id": "getDigitalSign",
        "documented": true,
        "response_codes": [
          "200",
          "201",
          "404",
          "406"
        ],
        "openapi_contract": {
          "parameters": [
            {
              "name": "code",
              "in": "path",
              "required": true,
              "schema": {
                "type": "string",
                "description": "ID externo decimal REPORT ou alias UUID"
              },
              "description": "ID externo decimal REPORT ou alias UUID"
            },
            {
              "name": "api",
              "in": "header",
              "required": false,
              "schema": {
                "type": "string",
                "enum": [
                  "one",
                  "mob"
                ]
              },
              "description": "Opcional; quando presente, aceita one ou mob."
            }
          ],
          "request_body": null,
          "responses": {
            "200": {
              "description": "Sucesso — perfil legacy",
              "content_types": [
                "application/json"
              ]
            },
            "201": {
              "description": "Sucesso — perfil mobilemed",
              "content_types": [
                "application/json"
              ]
            },
            "404": {
              "description": "Token desconhecido (ou ambíguo); laudo inexistente. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "406": {
              "description": "Header `token` ausente (tem precedência sobre `api` inválido), ou header `api` inválido depois de o token ser reconhecido. Token desconhecido responde 404 antes da validação de `api`. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            }
          }
        },
        "source_and_test_references": [
          "ris-backend/src/mobilemed-compat/results/mobilemed-results.controller.ts",
          "ris-backend/src/mobilemed-compat/results/mobilemed-results.service.spec.ts"
        ],
        "assessment": "route documented; behavioral parity requires replay/live evidence"
      }
    },
    {
      "index": 19,
      "id": "POST /v1/results/get-exams",
      "operation": "getExams",
      "group": "Result",
      "vendor": {
        "raw_path": "/v1/results/get-exams",
        "description": "Retorna os exames",
        "headers": [],
        "parameters": [],
        "request_examples": [
          {
            "title": "Request-Example:",
            "media_type": "json",
            "verbatim": "{\n    \"cpf\": \"12345678910\",\n    \"dataNasc\": \"01/01/2000\",\n    \"protocolo\": \"ABCDE\",\n    \"data\": 1\n}"
          }
        ],
        "success_fields": [],
        "error_fields": [],
        "success_codes": [
          200
        ],
        "error_codes": [
          "unknown (not stated by public reference)"
        ],
        "success_examples": [
          {
            "title": "Success-Response:",
            "media_type": "json",
            "verbatim": "HTTP/1.1 200 OK\n{\n\n[\n  {\n      \"id\": 1,\n      \"empresa_id\": 1,\n      \"status_id\": 1,\n      \"nome_paciente\": \"NOME DO PACIENTE\",\n      \"idade_paciente\": 12,\n      \"estudo_descricao\": \"ESTUDO\",\n      \"data_realizacao\": \"2020-05-26T17:15:40.000Z\",\n      \"viewer_path\": \"\",\n      \"count_anexos_paciente\": 1,\n      \"laudo\": [\n          {\n              \"pdf_path\": \"\",\n              \"status_id\": 1\n          }\n      ],\n      \"anexos\": [\n          {\n              \"file_path\": \"\",\n              \"is_excluido\": false\n          }\n      ]\n  }\n]"
          }
        ],
        "error_examples": [],
        "null_semantics": "unknown unless a field description or example explicitly contains null",
        "files": [
          "unknown (not stated by public reference)"
        ],
        "pagination": "unknown (not stated by public reference)",
        "effects": "mutation is implied by POST/name/description; transaction, idempotency and follow-up visibility are unknown",
        "source": {
          "url": "https://integracao.mobilemed.com.br/doc/api_data.json",
          "filename": "routes/results.js"
        }
      },
      "themis": {
        "openapi_operation_id": "getExams",
        "documented": true,
        "response_codes": [
          "200",
          "400",
          "404",
          "406"
        ],
        "openapi_contract": {
          "parameters": [
            {
              "name": "api",
              "in": "header",
              "required": false,
              "schema": {
                "type": "string",
                "enum": [
                  "one",
                  "mob"
                ]
              },
              "description": "Opcional; quando presente, aceita one ou mob."
            }
          ],
          "request_body": {
            "required": true,
            "content": {
              "application/json": {
                "type": "object",
                "required": [
                  "cpf",
                  "dataNasc"
                ],
                "properties": {
                  "cpf": {
                    "type": "string",
                    "maxLength": 32,
                    "description": "CPF do paciente (só os dígitos contam)"
                  },
                  "dataNasc": {
                    "type": "string",
                    "maxLength": 10,
                    "description": "Nascimento, dd/mm/yyyy"
                  },
                  "protocolo": {
                    "type": "string",
                    "maxLength": 64,
                    "description": "Número de protocolo (opcional)"
                  },
                  "data": {
                    "type": "integer",
                    "minimum": 0,
                    "description": "Janela em meses: 1, 3 ou 12 (0/ausente = sem filtro)"
                  }
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "OK",
              "content_types": [
                "application/json"
              ]
            },
            "400": {
              "description": "Corpo/parâmetros inválidos (validação); CPF sem dígitos; dataNasc fora de dd/mm/yyyy. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "404": {
              "description": "Token desconhecido (ou ambíguo). Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "406": {
              "description": "Header `token` ausente (tem precedência sobre `api` inválido), ou header `api` inválido depois de o token ser reconhecido. Token desconhecido responde 404 antes da validação de `api`. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            }
          }
        },
        "source_and_test_references": [
          "ris-backend/src/mobilemed-compat/results/mobilemed-results.controller.ts",
          "ris-backend/src/mobilemed-compat/results/mobilemed-results.service.spec.ts"
        ],
        "assessment": "route documented; behavioral parity requires replay/live evidence"
      }
    },
    {
      "index": 20,
      "id": "POST /v1/results/get-all-exams",
      "operation": "getExams",
      "group": "Result",
      "vendor": {
        "raw_path": "/v1/results/get-all-exams",
        "description": "Retorna os exames",
        "headers": [],
        "parameters": [],
        "request_examples": [
          {
            "title": "Request-Example:",
            "media_type": "json",
            "verbatim": "{\n    \"cpf\": \"12345678910\",\n    \"dataNasc\": \"01/01/2000\",\n    \"data\": 1\n    \"grupoId\": 1\n}"
          }
        ],
        "success_fields": [],
        "error_fields": [],
        "success_codes": [
          200
        ],
        "error_codes": [
          "unknown (not stated by public reference)"
        ],
        "success_examples": [
          {
            "title": "Success-Response:",
            "media_type": "json",
            "verbatim": "HTTP/1.1 200 OK\n{\n\n[\n  {\n      \"id\": 1,\n      \"empresa_id\": 1,\n      \"status_id\": 1,\n      \"nome_paciente\": \"NOME DO PACIENTE\",\n      \"idade_paciente\": 12,\n      \"estudo_descricao\": \"ESTUDO\",\n      \"data_realizacao\": \"2020-05-26T17:15:40.000Z\",\n      \"viewer_path\": \"\",\n      \"count_anexos_paciente\": 1,\n      \"laudo\": [\n          {\n              \"pdf_path\": \"\",\n              \"status_id\": 1\n          }\n      ],\n      \"anexos\": [\n          {\n              \"file_path\": \"\",\n              \"is_excluido\": false\n          }\n      ]\n  }\n]"
          }
        ],
        "error_examples": [],
        "null_semantics": "unknown unless a field description or example explicitly contains null",
        "files": [
          "unknown (not stated by public reference)"
        ],
        "pagination": "unknown (not stated by public reference)",
        "effects": "mutation is implied by POST/name/description; transaction, idempotency and follow-up visibility are unknown",
        "source": {
          "url": "https://integracao.mobilemed.com.br/doc/api_data.json",
          "filename": "routes/results.js"
        }
      },
      "themis": {
        "openapi_operation_id": "getAllExams",
        "documented": true,
        "response_codes": [
          "200",
          "400",
          "404",
          "406"
        ],
        "openapi_contract": {
          "parameters": [
            {
              "name": "api",
              "in": "header",
              "required": false,
              "schema": {
                "type": "string",
                "enum": [
                  "one",
                  "mob"
                ]
              },
              "description": "Opcional; quando presente, aceita one ou mob."
            }
          ],
          "request_body": {
            "required": true,
            "content": {
              "application/json": {
                "type": "object",
                "required": [
                  "cpf",
                  "dataNasc"
                ],
                "properties": {
                  "cpf": {
                    "type": "string",
                    "maxLength": 32,
                    "description": "CPF do paciente (só os dígitos contam)"
                  },
                  "dataNasc": {
                    "type": "string",
                    "maxLength": 10,
                    "description": "Nascimento, dd/mm/yyyy"
                  },
                  "data": {
                    "type": "integer",
                    "minimum": 0,
                    "description": "Janela em meses: 1, 3 ou 12 (0/ausente = sem filtro)"
                  },
                  "grupoId": {
                    "oneOf": [
                      {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 9007199254740991
                      },
                      {
                        "type": "string",
                        "pattern": "^[1-9][0-9]*$"
                      },
                      {
                        "type": "string",
                        "format": "uuid"
                      }
                    ],
                    "description": "ID externo seguro como número ou texto decimal, ou alias UUID; resolução sempre na organização da credencial."
                  }
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "OK",
              "content_types": [
                "application/json"
              ]
            },
            "400": {
              "description": "Corpo/parâmetros inválidos (validação); CPF sem dígitos; dataNasc fora de dd/mm/yyyy. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "404": {
              "description": "Token desconhecido (ou ambíguo). Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "406": {
              "description": "Header `token` ausente (tem precedência sobre `api` inválido), ou header `api` inválido depois de o token ser reconhecido. Token desconhecido responde 404 antes da validação de `api`. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            }
          }
        },
        "source_and_test_references": [
          "ris-backend/src/mobilemed-compat/results/mobilemed-results.controller.ts",
          "ris-backend/src/mobilemed-compat/results/mobilemed-results.service.spec.ts"
        ],
        "assessment": "route documented; behavioral parity requires replay/live evidence"
      }
    },
    {
      "index": 21,
      "id": "GET /v1/results/getAllPais",
      "operation": "getPais",
      "group": "Result",
      "vendor": {
        "raw_path": "/v1/results/getAllPais",
        "description": "Busca o pais na tabela de pais",
        "headers": [],
        "parameters": [
          {
            "name": "Busca",
            "type": "String",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "todos os paises na tabela de pais"
          }
        ],
        "request_examples": [],
        "success_fields": [],
        "error_fields": [],
        "success_codes": [
          201
        ],
        "error_codes": [
          "unknown (not stated by public reference)"
        ],
        "success_examples": [
          {
            "title": "Success-Response:",
            "media_type": "json",
            "verbatim": "HTTP/1.1 201 OK\n * {\n      \"id\": 1,\n      \"nome\": Brasil,\n      \"sigla\": BR,\n   }"
          }
        ],
        "error_examples": [],
        "null_semantics": "unknown unless a field description or example explicitly contains null",
        "files": [
          "unknown (not stated by public reference)"
        ],
        "pagination": "unknown (not stated by public reference)",
        "effects": "read-only is implied by GET; caching and consistency are unknown",
        "source": {
          "url": "https://integracao.mobilemed.com.br/doc/api_data.json",
          "filename": "routes/results.js"
        }
      },
      "themis": {
        "openapi_operation_id": "getAllPais",
        "documented": true,
        "response_codes": [
          "200",
          "201",
          "404",
          "406"
        ],
        "openapi_contract": {
          "parameters": [
            {
              "name": "api",
              "in": "header",
              "required": false,
              "schema": {
                "type": "string",
                "enum": [
                  "one",
                  "mob"
                ]
              },
              "description": "Opcional; quando presente, aceita one ou mob."
            }
          ],
          "request_body": null,
          "responses": {
            "200": {
              "description": "Sucesso — perfil legacy",
              "content_types": [
                "application/json"
              ]
            },
            "201": {
              "description": "Sucesso — perfil mobilemed",
              "content_types": [
                "application/json"
              ]
            },
            "404": {
              "description": "Token desconhecido (ou ambíguo). Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "406": {
              "description": "Header `token` ausente (tem precedência sobre `api` inválido), ou header `api` inválido depois de o token ser reconhecido. Token desconhecido responde 404 antes da validação de `api`. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            }
          }
        },
        "source_and_test_references": [
          "ris-backend/src/mobilemed-compat/results/mobilemed-results.controller.ts",
          "ris-backend/src/mobilemed-compat/results/mobilemed-results.service.spec.ts"
        ],
        "assessment": "route documented; behavioral parity requires replay/live evidence"
      }
    },
    {
      "index": 22,
      "id": "GET /v1/results/report-pdf-link/{laudo_hash}",
      "operation": "getReportPdfLink",
      "group": "Result",
      "vendor": {
        "raw_path": "/v1/results/report-pdf-link/:laudo_hash",
        "description": "Busca link do laudo pelo hash",
        "headers": [],
        "parameters": [
          {
            "name": "hash",
            "type": "Integer",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "do laudo"
          }
        ],
        "request_examples": [],
        "success_fields": [],
        "error_fields": [],
        "success_codes": [
          201
        ],
        "error_codes": [
          "unknown (not stated by public reference)"
        ],
        "success_examples": [
          {
            "title": "Success-Response:",
            "media_type": "json",
            "verbatim": "HTTP/1.1 201 OK\n * {\n      \"https://www.exemplo.com.br/laudo/1602792111470-LQsMdB9EnUIvjvJE_jD_Tt3~VYyD70.pdf\"\n   }"
          }
        ],
        "error_examples": [],
        "null_semantics": "unknown unless a field description or example explicitly contains null",
        "files": [
          "unknown (not stated by public reference)"
        ],
        "pagination": "unknown (not stated by public reference)",
        "effects": "read-only is implied by GET; caching and consistency are unknown",
        "source": {
          "url": "https://integracao.mobilemed.com.br/doc/api_data.json",
          "filename": "routes/results.js"
        }
      },
      "themis": {
        "openapi_operation_id": "getReportPdfLink",
        "documented": true,
        "response_codes": [
          "200",
          "201",
          "404",
          "406"
        ],
        "openapi_contract": {
          "parameters": [
            {
              "name": "laudo_hash",
              "in": "path",
              "required": true,
              "schema": {
                "type": "string",
                "description": "ID externo decimal REPORT ou alias UUID"
              },
              "description": "ID externo decimal REPORT ou alias UUID"
            },
            {
              "name": "api",
              "in": "header",
              "required": false,
              "schema": {
                "type": "string",
                "enum": [
                  "one",
                  "mob"
                ]
              },
              "description": "Opcional; quando presente, aceita one ou mob."
            }
          ],
          "request_body": null,
          "responses": {
            "200": {
              "description": "Sucesso — perfil legacy",
              "content_types": [
                "application/json"
              ]
            },
            "201": {
              "description": "Sucesso — perfil mobilemed",
              "content_types": [
                "application/json"
              ]
            },
            "404": {
              "description": "Token desconhecido (ou ambíguo); laudo inexistente; laudo sem PDF gravado. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "406": {
              "description": "Header `token` ausente (tem precedência sobre `api` inválido), ou header `api` inválido depois de o token ser reconhecido. Token desconhecido responde 404 antes da validação de `api`. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            }
          }
        },
        "source_and_test_references": [
          "ris-backend/src/mobilemed-compat/results/mobilemed-results.controller.ts",
          "ris-backend/src/mobilemed-compat/results/mobilemed-results.service.spec.ts"
        ],
        "assessment": "route documented; behavioral parity requires replay/live evidence"
      }
    },
    {
      "index": 23,
      "id": "POST /v1/results/send-email",
      "operation": "sendEmail",
      "group": "Result",
      "vendor": {
        "raw_path": "/v1/results/send-email",
        "description": "Envia um email sobre o exame",
        "headers": [],
        "parameters": [],
        "request_examples": [
          {
            "title": "Request-Example:",
            "media_type": "json",
            "verbatim": "{\n    \"exame_id\": 1,\n    \"email\": \"examplo@exemplo.com.br\"\n}"
          }
        ],
        "success_fields": [],
        "error_fields": [],
        "success_codes": [
          201
        ],
        "error_codes": [
          "unknown (not stated by public reference)"
        ],
        "success_examples": [
          {
            "title": "Success-Response:",
            "media_type": "json",
            "verbatim": "HTTP/1.1 201 OK"
          }
        ],
        "error_examples": [],
        "null_semantics": "unknown unless a field description or example explicitly contains null",
        "files": [
          "unknown (not stated by public reference)"
        ],
        "pagination": "unknown (not stated by public reference)",
        "effects": "mutation is implied by POST/name/description; transaction, idempotency and follow-up visibility are unknown",
        "source": {
          "url": "https://integracao.mobilemed.com.br/doc/api_data.json",
          "filename": "routes/results.js"
        }
      },
      "themis": {
        "openapi_operation_id": "sendEmail",
        "documented": true,
        "response_codes": [
          "201",
          "400",
          "404",
          "406"
        ],
        "openapi_contract": {
          "parameters": [
            {
              "name": "api",
              "in": "header",
              "required": false,
              "schema": {
                "type": "string",
                "enum": [
                  "one",
                  "mob"
                ]
              },
              "description": "Opcional; quando presente, aceita one ou mob."
            }
          ],
          "request_body": {
            "required": true,
            "content": {
              "application/json": {
                "type": "object",
                "required": [
                  "exame_id",
                  "email"
                ],
                "properties": {
                  "exame_id": {
                    "oneOf": [
                      {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 9007199254740991
                      },
                      {
                        "type": "string",
                        "pattern": "^[1-9][0-9]*$"
                      },
                      {
                        "type": "string",
                        "format": "uuid"
                      }
                    ],
                    "description": "ID externo seguro como número ou texto decimal, ou alias UUID; resolução sempre na organização da credencial."
                  },
                  "email": {
                    "type": "string",
                    "format": "email"
                  }
                }
              }
            }
          },
          "responses": {
            "201": {
              "description": "Criado — sem corpo",
              "content_types": []
            },
            "400": {
              "description": "Exame inexistente na organização da credencial (ou pertencente a outra organização — o cliente não distingue); Corpo/parâmetros inválidos (validação). Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "404": {
              "description": "Token desconhecido (ou ambíguo). Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "406": {
              "description": "Header `token` ausente (tem precedência sobre `api` inválido), ou header `api` inválido depois de o token ser reconhecido. Token desconhecido responde 404 antes da validação de `api`. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            }
          }
        },
        "source_and_test_references": [
          "ris-backend/src/mobilemed-compat/results/mobilemed-results.controller.ts",
          "ris-backend/src/mobilemed-compat/results/mobilemed-results.service.spec.ts"
        ],
        "assessment": "route documented; behavioral parity requires replay/live evidence"
      }
    },
    {
      "index": 24,
      "id": "GET /v1/viewer/{accessionNumber}",
      "operation": "getViewerUrl",
      "group": "Viewer",
      "vendor": {
        "raw_path": "/v1/viewer/:accessionNumber",
        "description": "Retorna link de acesso às imagens do exame de acordo com o Acession Number fornecido",
        "headers": [],
        "parameters": [
          {
            "name": "accessionNumber",
            "type": "String",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "Accession Number do exame"
          },
          {
            "name": "forMedic",
            "type": "bool",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "(Opcional) Link para o viewer principal dos médicos executantes. Opções disponíveis: true e false (padrão)."
          }
        ],
        "request_examples": [],
        "success_fields": [],
        "error_fields": [],
        "success_codes": [
          200
        ],
        "error_codes": [
          "unknown (not stated by public reference)"
        ],
        "success_examples": [
          {
            "title": "Success-Response:",
            "media_type": "json",
            "verbatim": "HTTP/1.1 200 OK\n{\n  \"url\": \"https://link-do-viewer-publico\"\n}"
          }
        ],
        "error_examples": [],
        "null_semantics": "unknown unless a field description or example explicitly contains null",
        "files": [
          "unknown (not stated by public reference)"
        ],
        "pagination": "unknown (not stated by public reference)",
        "effects": "read-only is implied by GET; caching and consistency are unknown",
        "source": {
          "url": "https://integracao.mobilemed.com.br/doc/api_data.json",
          "filename": "routes/viewer.js"
        }
      },
      "themis": {
        "openapi_operation_id": "getViewerUrl",
        "documented": true,
        "response_codes": [
          "200",
          "400",
          "404",
          "406"
        ],
        "openapi_contract": {
          "parameters": [
            {
              "name": "accessionNumber",
              "in": "path",
              "required": true,
              "schema": {
                "type": "string",
                "maxLength": 16
              },
              "description": "Accession Number do exame"
            },
            {
              "name": "forMedic",
              "in": "query",
              "required": false,
              "schema": {
                "type": "boolean"
              },
              "description": "(Opcional) Link para o viewer principal dos médicos executantes. Opções disponíveis: true e false (padrão). true retorna /medico/estudo/:token, leitura médica com imagens antes do laudo e laudos finais HTML/texto/PDF; false retorna /compartilhar/:token, sujeito à liberação do paciente. O mesmo link acompanha laudos futuros exclusivamente do exame e organização autorizados."
            },
            {
              "name": "api",
              "in": "header",
              "required": false,
              "schema": {
                "type": "string",
                "enum": [
                  "one",
                  "mob"
                ]
              },
              "description": "Opcional; quando presente, aceita one ou mob."
            }
          ],
          "request_body": null,
          "responses": {
            "200": {
              "description": "OK",
              "content_types": [
                "application/json"
              ]
            },
            "400": {
              "description": "Corpo/parâmetros inválidos (validação). Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "404": {
              "description": "Token desconhecido (ou ambíguo); exame sem imagens ou inexistente. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "406": {
              "description": "Header `token` ausente (tem precedência sobre `api` inválido), ou header `api` inválido depois de o token ser reconhecido. Token desconhecido responde 404 antes da validação de `api`. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            }
          }
        },
        "source_and_test_references": [
          "ris-backend/src/mobilemed-compat/viewer/mobilemed-viewer.controller.ts",
          "ris-backend/src/mobilemed-compat/viewer/mobilemed-viewer.service.spec.ts"
        ],
        "assessment": "route documented; behavioral parity requires replay/live evidence"
      }
    },
    {
      "index": 25,
      "id": "GET /v1/viewer/list/bydate",
      "operation": "getViewerUrlByDate",
      "group": "Viewer",
      "vendor": {
        "raw_path": "/v1/viewer/list/bydate",
        "description": "Retorna o link de acesso às imagens de todos os exames realizados no período informado (janela de 1 minuto a 31 dias)",
        "headers": [],
        "parameters": [
          {
            "name": "dataInicial",
            "type": "String",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "Data/hora inicial do período, no formato YYYYMMDDTHHmm (ex: 20260514T0900)"
          },
          {
            "name": "dataFinal",
            "type": "String",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "Data/hora final do período, no formato YYYYMMDDTHHmm (ex: 20260514T1000)"
          },
          {
            "name": "forMedic",
            "type": "bool",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "(Opcional) Link para o viewer principal dos médicos executantes. Opções disponíveis: true e false (padrão)."
          },
          {
            "name": "page",
            "type": "Number",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "(Opcional) Página da listagem. Padrão: 1."
          },
          {
            "name": "pageSize",
            "type": "Number",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "(Opcional) Quantidade de exames por página. Padrão: 20. Máximo: 20."
          }
        ],
        "request_examples": [],
        "success_fields": [],
        "error_fields": [],
        "success_codes": [
          200
        ],
        "error_codes": [
          "unknown (not stated by public reference)"
        ],
        "success_examples": [
          {
            "title": "Success-Response:",
            "media_type": "json",
            "verbatim": "HTTP/1.1 200 OK\n{\n  \"exams\": [\n    {\n      \"accessionNumber\": \"12313123\",\n      \"patient\": {\n        \"codigo_paciente\": \"PAC001\",\n        \"name\": \"Fulano de Tal\"\n      },\n      \"description\": \"Tomografia de crânio\",\n      \"studyDate\": \"2026-07-28\",\n      \"url\": \"https://link-do-viewer-publico\"\n    }\n  ],\n  \"pagination\": {\n    \"totalExams\": 1,\n    \"totalPages\": 1,\n    \"currentPage\": 1,\n    \"currentPageTotal\": 1\n  }\n}"
          }
        ],
        "error_examples": [],
        "null_semantics": "unknown unless a field description or example explicitly contains null",
        "files": [
          "unknown (not stated by public reference)"
        ],
        "pagination": "unknown (not stated by public reference)",
        "effects": "read-only is implied by GET; caching and consistency are unknown",
        "source": {
          "url": "https://integracao.mobilemed.com.br/doc/api_data.json",
          "filename": "routes/viewer.js"
        }
      },
      "themis": {
        "openapi_operation_id": "getViewerUrlByDate",
        "documented": true,
        "response_codes": [
          "200",
          "400",
          "404",
          "406"
        ],
        "openapi_contract": {
          "parameters": [
            {
              "name": "dataInicial",
              "in": "query",
              "required": true,
              "schema": {
                "type": "string",
                "pattern": "^\\d{8}T\\d{4}$"
              },
              "description": "Data/hora inicial do período, no formato YYYYMMDDTHHmm (ex: 20260514T0900)"
            },
            {
              "name": "dataFinal",
              "in": "query",
              "required": true,
              "schema": {
                "type": "string",
                "pattern": "^\\d{8}T\\d{4}$"
              },
              "description": "Data/hora final do período, no formato YYYYMMDDTHHmm (ex: 20260514T1000)"
            },
            {
              "name": "forMedic",
              "in": "query",
              "required": false,
              "schema": {
                "type": "boolean"
              },
              "description": "(Opcional) Link para o viewer principal dos médicos executantes. Opções disponíveis: true e false (padrão). true retorna /medico/estudo/:token, leitura médica com imagens antes do laudo e laudos finais HTML/texto/PDF; false retorna /compartilhar/:token, sujeito à liberação do paciente. O mesmo link acompanha laudos futuros exclusivamente do exame e organização autorizados."
            },
            {
              "name": "page",
              "in": "query",
              "required": false,
              "schema": {
                "type": "integer",
                "minimum": 1
              },
              "description": "(Opcional) Página da listagem. Padrão: 1."
            },
            {
              "name": "pageSize",
              "in": "query",
              "required": false,
              "schema": {
                "type": "integer",
                "minimum": 1,
                "maximum": 20
              },
              "description": "(Opcional) Quantidade de exames por página. Padrão: 20. Máximo: 20."
            },
            {
              "name": "api",
              "in": "header",
              "required": false,
              "schema": {
                "type": "string",
                "enum": [
                  "one",
                  "mob"
                ]
              },
              "description": "Opcional; quando presente, aceita one ou mob."
            }
          ],
          "request_body": null,
          "responses": {
            "200": {
              "description": "OK",
              "content_types": [
                "application/json"
              ]
            },
            "400": {
              "description": "Corpo/parâmetros inválidos (validação); janela inválida. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "404": {
              "description": "Token desconhecido (ou ambíguo). Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "406": {
              "description": "Header `token` ausente (tem precedência sobre `api` inválido), ou header `api` inválido depois de o token ser reconhecido. Token desconhecido responde 404 antes da validação de `api`. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            }
          }
        },
        "source_and_test_references": [
          "ris-backend/src/mobilemed-compat/viewer/mobilemed-viewer.controller.ts",
          "ris-backend/src/mobilemed-compat/viewer/mobilemed-viewer.service.spec.ts"
        ],
        "assessment": "route documented; behavioral parity requires replay/live evidence"
      }
    },
    {
      "index": 26,
      "id": "POST /v1/worklist",
      "operation": "createWorklist",
      "group": "Worklist",
      "vendor": {
        "raw_path": "/v1/worklist",
        "description": "Cria um registro de worklist. O corpo pode ser enviado em JSON ou XML e aceita propriedades adicionais. Os campos abaixo representam os dados mínimos recomendados para identificar o paciente e o exame; a rota armazena o objeto recebido sem impor um schema global.",
        "headers": [
          {
            "name": "token",
            "type": "String",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "Token de integração fornecido pela Mobilemed."
          },
          {
            "name": "api",
            "type": "String",
            "required": false,
            "nullable": "unknown (not stated by public reference)",
            "description": "Ambiente da API utilizado pela integração."
          },
          {
            "name": "adapter",
            "type": "String",
            "required": false,
            "nullable": "unknown (not stated by public reference)",
            "description": "Identificador do adapter da integração, quando aplicável."
          },
          {
            "name": "Content-Type",
            "type": "String",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "Formato do corpo: application/json ou application/xml."
          }
        ],
        "parameters": [],
        "request_examples": [
          {
            "title": "Request-Example:",
            "media_type": "json",
            "verbatim": "{\n  \"patient_id\": 12345,\n  \"patient_name\": \"Joao da Silva\",\n  \"patient_birthdate\": \"1985-04-12\",\n  \"patient_sex\": \"M\",\n  \"accession_number\": 987654,\n  \"referring_physician\": \"Dra. Maria Oliveira\",\n  \"modality\": \"CT\",\n  \"study_description\": \"Tomografia de cranio\",\n  \"date_exam\": \"2026-08-19\",\n  \"time_exam\": \"14:30:00\",\n  \"insurence_plan\": \"Particular\",\n  \"patient_comments\": 1,\n  \"patient_cpf\": \"12345678900\",\n  \"register_read\": false\n}"
          },
          {
            "title": "XML-Request-Example:",
            "media_type": "xml",
            "verbatim": "<worklist>\n  <patient_id>12345</patient_id>\n  <patient_name>Joao da Silva</patient_name>\n  <patient_birthdate>1985-04-12</patient_birthdate>\n  <patient_sex>M</patient_sex>\n  <accession_number>987654</accession_number>\n  <modality>CT</modality>\n  <study_description>Tomografia de cranio</study_description>\n  <date_exam>2026-08-19</date_exam>\n  <time_exam>14:30:00</time_exam>\n</worklist>"
          }
        ],
        "success_fields": [],
        "error_fields": [
          {
            "name": "InvalidWorklist",
            "type": "unknown",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "Dados inválidos para o adapter informado."
          },
          {
            "name": "MissingToken",
            "type": "unknown",
            "required": true,
            "nullable": "unknown (not stated by public reference)",
            "description": "Token de integração não informado."
          }
        ],
        "success_codes": [
          201
        ],
        "error_codes": [
          "unknown (not stated by public reference)"
        ],
        "success_examples": [
          {
            "title": "Success-Response:",
            "media_type": "json",
            "verbatim": "HTTP/1.1 201 Created\n{}"
          }
        ],
        "error_examples": [],
        "null_semantics": "unknown unless a field description or example explicitly contains null",
        "files": [
          "unknown (not stated by public reference)"
        ],
        "pagination": "unknown (not stated by public reference)",
        "effects": "mutation is implied by POST/name/description; transaction, idempotency and follow-up visibility are unknown",
        "source": {
          "url": "https://integracao.mobilemed.com.br/doc/api_data.json",
          "filename": "routes/worklist.js"
        }
      },
      "themis": {
        "openapi_operation_id": "createWorklist",
        "documented": true,
        "response_codes": [
          "200",
          "201",
          "400",
          "404",
          "406",
          "409"
        ],
        "openapi_contract": {
          "parameters": [
            {
              "name": "api",
              "in": "header",
              "required": false,
              "schema": {
                "type": "string",
                "enum": [
                  "one",
                  "mob"
                ]
              },
              "description": "Opcional; quando presente, aceita one ou mob."
            },
            {
              "name": "adapter",
              "in": "header",
              "required": false,
              "schema": {
                "type": "string",
                "maxLength": 64
              },
              "description": "Nome salvo nesta credencial, ou preset mobilemed/kai."
            }
          ],
          "request_body": {
            "required": true,
            "content": {
              "application/json": {
                "type": "object",
                "additionalProperties": true,
                "description": "Objeto JSON completo; campos conhecidos abaixo são recomendados. Somente legacy exige DTO global.",
                "properties": {
                  "patient_id": {
                    "oneOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "integer"
                      }
                    ],
                    "description": "Código do paciente no sistema de origem"
                  },
                  "patient_name": {
                    "type": "string",
                    "description": "Nome do paciente (obrigatório)"
                  },
                  "patient_birthdate": {
                    "type": "string",
                    "description": "yyyy-mm-dd (ou yyyymmdd)"
                  },
                  "patient_sex": {
                    "type": "string",
                    "enum": [
                      "M",
                      "F",
                      "O",
                      "U"
                    ]
                  },
                  "patient_cpf": {
                    "type": "string",
                    "description": "Só dígitos"
                  },
                  "accession_number": {
                    "oneOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "integer"
                      }
                    ],
                    "description": "Único na organização, até 16 caracteres (obrigatório)"
                  },
                  "referring_physician": {
                    "type": "string",
                    "description": "Médico solicitante"
                  },
                  "modality": {
                    "type": "string",
                    "description": "Sigla DICOM (CT, MR, MG, US, CR, DX…) (obrigatório)"
                  },
                  "study_description": {
                    "type": "string"
                  },
                  "date_exam": {
                    "type": "string",
                    "description": "yyyy-mm-dd (ou yyyymmdd) (obrigatório)"
                  },
                  "time_exam": {
                    "type": "string",
                    "description": "hh:mm:ss (ou hhmmss) (obrigatório)"
                  },
                  "insurence_plan": {
                    "type": "string",
                    "description": "Convênio (sic, grafia da MobileMed)"
                  },
                  "patient_comments": {
                    "description": "Preservado na fonte; não produz campo operacional."
                  },
                  "register_read": {
                    "description": "Preservado na fonte; não produz campo operacional."
                  }
                }
              },
              "application/xml": {
                "type": "string",
                "description": "`<worklist>` (tags snake_case) ou `<MWL_ITEM>` (tags PascalCase, Guardião Pixeon), valores em CDATA."
              }
            }
          },
          "responses": {
            "200": {
              "description": "Somente legacy: repetição idempotente.",
              "content_types": [
                "application/json"
              ]
            },
            "201": {
              "description": "Mobilemed: fonte aceita (RAW_ONLY ou PROJECTED), inclusive noop. Legacy: criação.",
              "content_types": [
                "application/json"
              ]
            },
            "400": {
              "description": "Dados inválidos para a worklist — `message` é um array de mensagens. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "404": {
              "description": "Token desconhecido (ou ambíguo). Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "406": {
              "description": "Header `token` ausente (tem precedência sobre `api` inválido), ou header `api` inválido depois de o token ser reconhecido. Token desconhecido responde 404 antes da validação de `api`. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            },
            "409": {
              "description": "Accession Number já existe na organização. Somente legacy identificado recebe statusCode, timestamp e path.",
              "content_types": [
                "application/json"
              ]
            }
          }
        },
        "source_and_test_references": [
          "ris-backend/src/mobilemed-compat/mobilemed-compat.controller.ts",
          "ris-backend/src/mobilemed-compat/mobilemed-compat.controller.spec.ts",
          "ris-backend/src/mobilemed-compat/worklist/normalize-worklist-payload.spec.ts"
        ],
        "assessment": "route documented; behavioral parity requires replay/live evidence"
      }
    }
  ],
  "public_auth_probe_baseline_status": "4 read-only cases captured separately: 2 exact matches and 2 deployed-staging precedence mismatches",
  "post_deployment_authentication_verification": {
    "checked_at": "2026-09-21T19:55:15.858378+00:00",
    "base_url": "https://integracao.themishealth.com.br",
    "reference": "frozen real Mobilemed authentication responses captured 2026-09-21; synthetic invalid token only",
    "request_user_agent": "OneLaudos-Parity-Verification/1.0",
    "transport_observation": "The public hosting edge returned 403 (code 1010) for the default Python urllib user agent. The explicitly identified verification client reached the API. This hosting restriction is separate from API contract parity.",
    "results": [
      {
        "case": "missing-token",
        "status": 406,
        "body": {
          "error": {
            "error_code": 406,
            "error_msg": "\"Integration token\" not provided"
          }
        },
        "expected_status": 406,
        "expected_body": {
          "error": {
            "error_code": 406,
            "error_msg": "\"Integration token\" not provided"
          }
        },
        "matched": true
      },
      {
        "case": "invalid-token",
        "status": 404,
        "body": {
          "error": {
            "message": "No integration found for the given token"
          }
        },
        "expected_status": 404,
        "expected_body": {
          "error": {
            "message": "No integration found for the given token"
          }
        },
        "matched": true
      },
      {
        "case": "missing-token-invalid-api",
        "status": 406,
        "body": {
          "error": {
            "error_code": 406,
            "error_msg": "\"Integration token\" not provided"
          }
        },
        "expected_status": 406,
        "expected_body": {
          "error": {
            "error_code": 406,
            "error_msg": "\"Integration token\" not provided"
          }
        },
        "matched": true
      },
      {
        "case": "invalid-token-invalid-api",
        "status": 404,
        "body": {
          "error": {
            "message": "No integration found for the given token"
          }
        },
        "expected_status": 404,
        "expected_body": {
          "error": {
            "message": "No integration found for the given token"
          }
        },
        "matched": true
      }
    ],
    "deployment_commit": "558a239bcb0a6c292193d44cb34f413b12ad6581",
    "deployment_run": "https://github.com/Themis-Health/themis-platform/actions/runs/35645255282"
  }
}
