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 outputAPI available for pilot integrations. For health plans, laboratories and anyone integrating health data.
01 / THE DOCUMENT
02 / THE LINK
Apo B Apolipoprotein B 1884-6
03 / OBSERVATION
FHIR R4- Biomarker
- Apolipoprotein B
- LOINC
- 1884-6
- Value
- 112 mg/dL
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
Demonstration laboratory
Clinical analyses · results report
BIOCHEMISTRY
Apolipoprotein B
112 mg/dL
Up to 90 mg/dL
Reference range reproduced only for this integration example.
Lab reports in PDF or photo, in Portuguese or English. Coverage varies with the layout, the content and the capture quality.
Output
{
"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
}
}
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.
biomarkers modeled in the catalog
with an assigned LOINC code (86.5%)
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.
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.
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.
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.
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.
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).
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
@precisa-saude/fhir-pdf
Apache 2.0 license
Reads the text layer of the report PDF
@precisa-saude/fhir-ocr-utils
Apache 2.0 license
Anchors biomarkers in already extracted text
@precisa-saude/fhir-rnds
Apache 2.0 license
RNDS client with mTLS
@precisa-saude/fhir-rnds-sandbox
Apache 2.0 license
Local RNDS mock. No ICP-Brasil certificate, no DATASUS accreditation
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.
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.