Skip to content

Precisa Laudos Estruturados

The data is already in the report. Bring it into your system.

An API available today to structure lab reports in PDF or photo, in Portuguese or English, as FHIR R4. LOINC, normalized unit and reference range come in when the catalog has the mapping and the report carries enough information.

Explore the input and the output

API available for pilot integrations. For health plans, laboratories and anyone integrating health data.

DOCUMENT → DATA

01 / THE DOCUMENT

Lab reportPDF
Apolipoprotein B112 mg/dL

02 / THE LINK

Apo B Apolipoprotein B 1884-6

03 / OBSERVATION

FHIR R4
Biomarker
Apolipoprotein B
LOINC
1884-6
Value
112 mg/dL
PDF, JPEG or PNGAsynchronous processingFHIR R4 + LOINC when mapped

The problem

Results from tests done outside your network never reach you.

Your system sees what was done inside your network. The rest arrives as a PDF, or doesn't arrive.

Negotiating lab by lab

Connecting each provider requires a bilateral agreement, and the agreement usually comes with a commercial counterpart. The data the patient already has in their inbox depends on no agreement at all.

Every lab writes differently

The same marker shows up with another name, another unit and another reference range at each provider. Without normalization, two reports do not compare.

A PDF is not data

Column layouts, urinalysis with no common format, DEXA, dates in different positions, the lab name sometimes only in the logo. Reading the text is the easy part.

The payload

What goes in, and what comes out.

Input

FICTIONAL EXAMPLE · NO PATIENT DATA

Demonstration laboratory

Clinical analyses · results report

BIOCHEMISTRY

Apolipoprotein B

Result

112 mg/dL

Reference value

Up to 90 mg/dL

Reference range reproduced only for this integration example.

Fictional document · no clinical validityPage 1 of 1
Native PDFScanned PDFJPEG or PNG photo

Lab reports in PDF or photo, in Portuguese or English. Coverage varies with the layout, the content and the capture quality.

Output

application/fhir+json
{
  "category": [
    {
      "coding": [
        {
          "code": "laboratory",
          "display": "Laboratory",
          "system": "http://terminology.hl7.org/CodeSystem/observation-category"
        }
      ]
    }
  ],
  "code": {
    "coding": [
      {
        "code": "1884-6",
        "display": "Apolipoprotein B [Mass/volume] in Serum or Plasma",
        "system": "http://loinc.org"
      },
      {
        "code": "ApoB",
        "display": "Apolipoprotein B",
        "system": "http://fhir-brasil.dev/biomarker-codes"
      }
    ],
    "text": "Apolipoprotein B"
  },
  "effectiveDateTime": "2026-03-14",
  "id": "DEMO-REPORT-001-ApoB",
  "interpretation": [
    {
      "coding": [
        {
          "code": "H",
          "display": "High",
          "system": "http://terminology.hl7.org/CodeSystem/v3-ObservationInterpretation"
        }
      ]
    }
  ],
  "performer": [
    {
      "display": "Demonstration laboratory"
    }
  ],
  "referenceRange": [
    {
      "high": {
        "code": "mg/dL",
        "system": "http://unitsofmeasure.org",
        "unit": "mg/dL",
        "value": 90
      }
    }
  ],
  "resourceType": "Observation",
  "status": "final",
  "subject": {
    "reference": "Patient/DEMO-001"
  },
  "valueQuantity": {
    "code": "mg/dL",
    "system": "http://unitsofmeasure.org",
    "unit": "mg/dL",
    "value": 112
  }
}
BundlePatientDiagnosticReportObservation[]Specimen?

The current Bundle gathers Patient, DiagnosticReport, one Observation per extracted biomarker and Specimen when the material is mapped. The JSON shown is an excerpt, not the whole response.

260

biomarkers modeled in the catalog

225

with an assigned LOINC code (86.5%)

203

reference ranges, with variants by sex and age

Count regenerated from @precisa-saude/fhir v1.1.0 on October 26, 2026, by the generator that also writes the catalog README: pnpm catalog:counts --json. The catalog is public and checking takes a minute: biomarkers.ts in fhir-brasil.

The path

The file's path.

API reference

The full documentation, with every response code and curl examples, is at docs.precisa-saude.com.br/api.

Step 01 of 04

Upload

You send a PDF or a photo through the API and receive the job identifier. Extraction continues after the request returns.

POST /v1/extractions202 Accepted

Retention and persistence

  • The service does not retain clinical data durably.
  • The uploaded document and the generated result exist, encrypted, only while the job is running.
  • They are deleted when the job ends and, in every case, no later than 15 minutes after upload.
  • There is no copy in backups, snapshots or another region.
  • What persists is the job record, with no clinical content: identifier, tenant, declared purpose, state and timestamps.

Compliance

A common language for health.

01

LOINC

LOINC codes assigned to 225 of the 260 biomarkers in the catalog (86.5%), with the names used in Portuguese and English reports. The six axes of each code are checked every month against the official LOINC server, and each mapping has a public decision record. Without a matching LOINC concept, the marker stays uncoded.

1884-6Apolipoprotein B
02

FHIR R4

The output is a Bundle with Patient, DiagnosticReport, Observation and Specimen when mapped. The BRDiagnosticoLaboratorioClinico profile is an interoperability reference, with no claim of full conformance at this stage.

PatientDiagnosticReportObservationSpecimen?
03

SNOMED CT

Text results come out coded. Negative, reactive, present, trace and the urine dipstick crosses, twelve answers in total, carry in the same value the LOINC answer code and the SNOMED CT concept, so whoever works with either one reads the Bundle without a conversion table. An answer outside that set is passed through as the text printed on the report.

LA6577-6260385009Negativo
04

Data

Processing in sa-east-1. The configured model receives the content required for interpretation under residency controls; the provider’s logging and retention are part of the validation before production. We act as a data processor, with a limited purpose and under contract, under Brazil’s data protection law, the LGPD (Law 13,709/2018).

sa-east-1

fhir-brasil was presented at the LOINC Conference, Cologne, October 6 to 9, 2026.

Open source

The terminology layer is open.

The biomarker catalog, the reference ranges and the name normalization are published under Apache 2.0. You can audit them before any contract.

  • @precisa-saude/fhir

    Apache 2.0 license

    FHIR R4 types, biomarker catalog with a decision record per mapping, reference ranges, alias normalization

    npmGitHub

  • @precisa-saude/fhir-pdf

    Apache 2.0 license

    Reads the text layer of the report PDF

    npmGitHub

  • @precisa-saude/fhir-ocr-utils

    Apache 2.0 license

    Anchors biomarkers in already extracted text

    npmGitHub

  • @precisa-saude/fhir-rnds

    Apache 2.0 license

    RNDS client with mTLS

    npmGitHub

  • @precisa-saude/fhir-rnds-sandbox

    Apache 2.0 license

    Local RNDS mock. No ICP-Brasil certificate, no DATASUS accreditation

    npmGitHub

TypeScript
pnpm add @precisa-saude/fhir

import { codeToLoinc, getReferenceRange } from '@precisa-saude/fhir';

codeToLoinc('ApoB');
// '1884-6'

getReferenceRange('ApoB', { sex: 'male', age: 42 });
// { min: 0, max: 90, optimalMin: 0, optimalMax: 70, unit: 'mg/dL',
//   kind: 'decision-threshold', source: 'sbc-lipids-2025' }

The range printed on the report takes precedence in referenceRange. The catalog acts as a fallback when the biomarker has a catalog range and there is enough context on sex, age and pregnancy; without that, the output does not invent a range.

The extraction is private. The vocabulary is not.

Scope

The limits, stated.

  • • We issue no diagnosis or clinical conclusion. Reading the result belongs to whoever cares for the patient.
  • • A result can be partial when pages failed or content was skipped. Those cases require review and must not proceed as a final result.
  • • The response separates reading confidence from interpretation confidence. A code without a safe LOINC match stays without LOINC; the service does not invent the code.
  • • The integrator defines routing, clinical review and the history kept after delivery.
  • • Administrative metadata the PDF does not carry, such as the performing facility’s CNES and the patient identifier, is filled in by you.

Questions

Before the first meeting.

A native PDF, a scanned PDF or a JPEG or PNG photo, in Portuguese or English. A photo counts as one page. Coverage varies with the laboratory’s layout, the content available and the capture quality: a page below the legibility floor is refused before any model call, with a request to retake it.

Contact

Let's talk about integration.

Tell us which system receives the data today and where the reports you can't read come from. With that we can show how those reports arrive structured in your system.

By sending, you agree to our Privacy Policy (in Portuguese).