HIV VL - Laboratory
Laboratory-level endpoints for HIV Viral Load (VL) analytics. These endpoints provide testing data grouped by testing facility (laboratory), including sample counts, viral suppression rates, gender and age breakdowns, turnaround times, rejection data, and PMTCT indicators.
Common parameters
Most laboratory endpoints accept the following query parameters for filtering and aggregating data. These parameters allow you to narrow results by date range, geographic location, and level of detail.
- Name
interval_dates- Type
- JSON array
- Description
Date range filter as a JSON array with two dates in
YYYY-MM-DDformat:["2025-01-01","2025-12-31"]. Defaults to the last 12 months if not provided.
- Name
province- Type
- string
- Description
Filter by province name. Supports multi-select by passing the parameter multiple times.
- Name
district- Type
- string
- Description
Filter by district name. Supports multi-select by passing the parameter multiple times.
- Name
health_facility- Type
- string
- Description
Filter by a specific health facility name.
- Name
facility_type- Type
- string
- Description
Grouping level for aggregated results. Accepted values:
"province","district","health_facility".
- Name
disaggregation- Type
- string
- Description
Enable or disable data disaggregation. Accepted values:
"True"or"False".
Request with parameters
curl -G https://api.openldr.org.mz/hiv/vl/laboratories/tested_samples/ \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
--data-urlencode 'interval_dates=["2025-01-01","2025-12-31"]' \
--data-urlencode "province=Maputo Cidade" \
--data-urlencode "facility_type=district" \
--data-urlencode "disaggregation=True"
Registered samples
Returns the total number of VL samples registered per month, with suppression breakdowns by gender. Use this endpoint to monitor monthly sample intake and suppression trends at the laboratory level.
- Name
year- Type
- integer
- Description
The calendar year of the result.
- Name
month- Type
- integer
- Description
The month number (1-12).
- Name
month_name- Type
- string
- Description
The full name of the month.
- Name
total- Type
- integer
- Description
Total number of samples registered.
- Name
total_not_null- Type
- integer
- Description
Total samples with a valid viral load result.
- Name
total_null- Type
- integer
- Description
Total samples without a viral load result.
- Name
suppressed- Type
- integer
- Description
Number of samples with a suppressed viral load.
- Name
not_suppressed- Type
- integer
- Description
Number of samples with a not suppressed viral load.
- Name
male_suppressed- Type
- integer
- Description
Number of suppressed results from male patients.
- Name
male_not_suppressed- Type
- integer
- Description
Number of not suppressed results from male patients.
- Name
female_suppressed- Type
- integer
- Description
Number of suppressed results from female patients.
- Name
female_not_suppressed- Type
- integer
- Description
Number of not suppressed results from female patients.
Request
curl -G https://api.openldr.org.mz/hiv/vl/laboratories/registered_samples/ \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
--data-urlencode 'interval_dates=["2025-01-01","2025-12-31"]'
Response
[
{
"year": 2025,
"month": 1,
"month_name": "January",
"total": 15840,
"total_not_null": 14520,
"total_null": 1320,
"suppressed": 12450,
"not_suppressed": 2070,
"male_suppressed": 4980,
"male_not_suppressed": 870,
"female_suppressed": 7470,
"female_not_suppressed": 1200
}
]
Registered samples by month
Returns the total number of VL samples registered per month with suppression breakdowns by gender, additionally grouped by testing facility.
- Name
year- Type
- integer
- Description
The calendar year of the result.
- Name
month- Type
- integer
- Description
The month number (1-12).
- Name
month_name- Type
- string
- Description
The full name of the month.
- Name
testing_facility- Type
- string
- Description
The name of the testing laboratory.
- Name
total- Type
- integer
- Description
Total number of samples registered.
- Name
total_not_null- Type
- integer
- Description
Total samples with a valid viral load result.
- Name
total_null- Type
- integer
- Description
Total samples without a viral load result.
- Name
suppressed- Type
- integer
- Description
Number of samples with a suppressed viral load.
- Name
not_suppressed- Type
- integer
- Description
Number of samples with a not suppressed viral load.
- Name
male_suppressed- Type
- integer
- Description
Number of suppressed results from male patients.
- Name
male_not_suppressed- Type
- integer
- Description
Number of not suppressed results from male patients.
- Name
female_suppressed- Type
- integer
- Description
Number of suppressed results from female patients.
- Name
female_not_suppressed- Type
- integer
- Description
Number of not suppressed results from female patients.
Request
curl -G https://api.openldr.org.mz/hiv/vl/laboratories/registered_samples_by_month/ \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
--data-urlencode 'interval_dates=["2025-01-01","2025-12-31"]'
Response
[
{
"year": 2025,
"month": 1,
"month_name": "January",
"testing_facility": "Laboratorio Central de Maputo",
"total": 5230,
"total_not_null": 4890,
"total_null": 340,
"suppressed": 4210,
"not_suppressed": 680,
"male_suppressed": 1680,
"male_not_suppressed": 290,
"female_suppressed": 2530,
"female_not_suppressed": 390
}
]
Tested samples
Returns the number of VL samples tested grouped by testing facility, with suppression breakdowns.
- Name
testing_facility- Type
- string
- Description
The name of the testing laboratory.
- Name
total- Type
- integer
- Description
Total number of samples tested.
- Name
total_not_null- Type
- integer
- Description
Total samples with a valid viral load result.
- Name
total_null- Type
- integer
- Description
Total samples without a viral load result.
- Name
suppressed- Type
- integer
- Description
Number of samples with a suppressed viral load.
- Name
not_suppressed- Type
- integer
- Description
Number of samples with a not suppressed viral load.
Request
curl -G https://api.openldr.org.mz/hiv/vl/laboratories/tested_samples/ \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
--data-urlencode 'interval_dates=["2025-01-01","2025-12-31"]'
Response
[
{
"testing_facility": "Laboratorio Central de Maputo",
"total": 48920,
"total_not_null": 45670,
"total_null": 3250,
"suppressed": 39240,
"not_suppressed": 6430
},
{
"testing_facility": "Laboratorio Provincial de Gaza",
"total": 32150,
"total_not_null": 30420,
"total_null": 1730,
"suppressed": 26180,
"not_suppressed": 4240
}
]
Tested samples by month
Returns the number of VL samples tested per month, with suppression breakdowns by gender.
- Name
year- Type
- integer
- Description
The calendar year of the result.
- Name
month- Type
- integer
- Description
The month number (1-12).
- Name
month_name- Type
- string
- Description
The full name of the month.
- Name
total- Type
- integer
- Description
Total number of samples tested.
- Name
total_not_null- Type
- integer
- Description
Total samples with a valid viral load result.
- Name
total_null- Type
- integer
- Description
Total samples without a viral load result.
- Name
suppressed- Type
- integer
- Description
Number of samples with a suppressed viral load.
- Name
not_suppressed- Type
- integer
- Description
Number of samples with a not suppressed viral load.
- Name
male_suppressed- Type
- integer
- Description
Number of suppressed results from male patients.
- Name
male_not_suppressed- Type
- integer
- Description
Number of not suppressed results from male patients.
- Name
female_suppressed- Type
- integer
- Description
Number of suppressed results from female patients.
- Name
female_not_suppressed- Type
- integer
- Description
Number of not suppressed results from female patients.
Request
curl -G https://api.openldr.org.mz/hiv/vl/laboratories/tested_samples_by_month/ \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
--data-urlencode 'interval_dates=["2025-01-01","2025-12-31"]'
Response
[
{
"year": 2025,
"month": 1,
"month_name": "January",
"total": 14520,
"total_not_null": 13680,
"total_null": 840,
"suppressed": 11740,
"not_suppressed": 1940,
"male_suppressed": 4690,
"male_not_suppressed": 820,
"female_suppressed": 7050,
"female_not_suppressed": 1120
}
]
Tested samples by gender
Returns monthly tested sample counts disaggregated by gender and suppression status.
- Name
year- Type
- integer
- Description
The calendar year of the result.
- Name
month- Type
- integer
- Description
The month number (1-12).
- Name
month_name- Type
- string
- Description
The full name of the month.
- Name
male_suppressed- Type
- integer
- Description
Number of suppressed results from male patients.
- Name
male_not_suppressed- Type
- integer
- Description
Number of not suppressed results from male patients.
- Name
female_suppressed- Type
- integer
- Description
Number of suppressed results from female patients.
- Name
female_not_suppressed- Type
- integer
- Description
Number of not suppressed results from female patients.
Request
curl -G https://api.openldr.org.mz/hiv/vl/laboratories/tested_samples_by_gender/ \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
--data-urlencode 'interval_dates=["2025-01-01","2025-12-31"]'
Response
[
{
"year": 2025,
"month": 1,
"month_name": "January",
"male_suppressed": 4690,
"male_not_suppressed": 820,
"female_suppressed": 7050,
"female_not_suppressed": 1120
},
{
"year": 2025,
"month": 2,
"month_name": "February",
"male_suppressed": 4420,
"male_not_suppressed": 760,
"female_suppressed": 6680,
"female_not_suppressed": 1050
}
]
Tested samples by gender by lab
Returns monthly tested sample counts disaggregated by gender and suppression status, additionally grouped by testing facility.
- Name
year- Type
- integer
- Description
The calendar year of the result.
- Name
month- Type
- integer
- Description
The month number (1-12).
- Name
month_name- Type
- string
- Description
The full name of the month.
- Name
testing_facility- Type
- string
- Description
The name of the testing laboratory.
- Name
male_suppressed- Type
- integer
- Description
Number of suppressed results from male patients.
- Name
male_not_suppressed- Type
- integer
- Description
Number of not suppressed results from male patients.
- Name
female_suppressed- Type
- integer
- Description
Number of suppressed results from female patients.
- Name
female_not_suppressed- Type
- integer
- Description
Number of not suppressed results from female patients.
Request
curl -G https://api.openldr.org.mz/hiv/vl/laboratories/tested_samples_by_gender_by_lab/ \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
--data-urlencode 'interval_dates=["2025-01-01","2025-12-31"]'
Response
[
{
"year": 2025,
"month": 1,
"month_name": "January",
"testing_facility": "Laboratorio Central de Maputo",
"male_suppressed": 1680,
"male_not_suppressed": 290,
"female_suppressed": 2530,
"female_not_suppressed": 390
}
]
Tested samples by age
Returns monthly tested sample counts disaggregated by age group. Age groups follow the standard VL stratification bands.
- Name
year- Type
- integer
- Description
The calendar year of the result.
- Name
month- Type
- integer
- Description
The month number (1-12).
- Name
month_name- Type
- string
- Description
The full name of the month.
- Name
age_group- Type
- string
- Description
The age group band (e.g., "0-14", "15-19", "20-24", "25-29", "30-34", "35-39", "40-44", "45-49", "50+").
- Name
total- Type
- integer
- Description
Total number of samples tested in the age group.
Request
curl -G https://api.openldr.org.mz/hiv/vl/laboratories/tested_samples_by_age/ \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
--data-urlencode 'interval_dates=["2025-01-01","2025-12-31"]'
Response
[
{
"year": 2025,
"month": 1,
"month_name": "January",
"age_group": "0-14",
"total": 1240
},
{
"year": 2025,
"month": 1,
"month_name": "January",
"age_group": "15-19",
"total": 890
},
{
"year": 2025,
"month": 1,
"month_name": "January",
"age_group": "20-24",
"total": 2150
}
]
Tested samples by test reason
Returns monthly tested sample counts disaggregated by the reason for testing, including routine monitoring, treatment failure suspicion, and unspecified reasons.
- Name
year- Type
- integer
- Description
The calendar year of the result.
- Name
month- Type
- integer
- Description
The month number (1-12).
- Name
month_name- Type
- string
- Description
The full name of the month.
- Name
routine- Type
- integer
- Description
Number of samples tested for routine viral load monitoring.
- Name
treatment_failure- Type
- integer
- Description
Number of samples tested due to suspected treatment failure.
- Name
reason_not_specified- Type
- integer
- Description
Number of samples where the test reason was not specified.
- Name
total- Type
- integer
- Description
Total number of samples tested in the month.
Request
curl -G https://api.openldr.org.mz/hiv/vl/laboratories/tested_samples_by_test_reason/ \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
--data-urlencode 'interval_dates=["2025-01-01","2025-12-31"]'
Response
[
{
"year": 2025,
"month": 1,
"month_name": "January",
"routine": 11230,
"treatment_failure": 1850,
"reason_not_specified": 1440,
"total": 14520
},
{
"year": 2025,
"month": 2,
"month_name": "February",
"routine": 10580,
"treatment_failure": 1720,
"reason_not_specified": 1310,
"total": 13610
}
]
Tested samples pregnant
Returns monthly tested sample counts for pregnant women, with viral suppression breakdowns. Supports PMTCT program monitoring at the laboratory level.
- Name
year- Type
- integer
- Description
The calendar year of the result.
- Name
month- Type
- integer
- Description
The month number (1-12).
- Name
month_name- Type
- string
- Description
The full name of the month.
- Name
total- Type
- integer
- Description
Total number of samples from pregnant women.
- Name
suppressed- Type
- integer
- Description
Number of suppressed results from pregnant women.
- Name
not_suppressed- Type
- integer
- Description
Number of not suppressed results from pregnant women.
Request
curl -G https://api.openldr.org.mz/hiv/vl/laboratories/tested_samples_pregnant/ \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
--data-urlencode 'interval_dates=["2025-01-01","2025-12-31"]'
Response
[
{
"year": 2025,
"month": 1,
"month_name": "January",
"total": 2340,
"suppressed": 2050,
"not_suppressed": 290
},
{
"year": 2025,
"month": 2,
"month_name": "February",
"total": 2180,
"suppressed": 1920,
"not_suppressed": 260
}
]
Tested samples breastfeeding
Returns monthly tested sample counts for breastfeeding women, with viral suppression breakdowns. Supports PMTCT program monitoring at the laboratory level.
- Name
year- Type
- integer
- Description
The calendar year of the result.
- Name
month- Type
- integer
- Description
The month number (1-12).
- Name
month_name- Type
- string
- Description
The full name of the month.
- Name
total- Type
- integer
- Description
Total number of samples from breastfeeding women.
- Name
suppressed- Type
- integer
- Description
Number of suppressed results from breastfeeding women.
- Name
not_suppressed- Type
- integer
- Description
Number of not suppressed results from breastfeeding women.
Request
curl -G https://api.openldr.org.mz/hiv/vl/laboratories/tested_samples_breastfeeding/ \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
--data-urlencode 'interval_dates=["2025-01-01","2025-12-31"]'
Response
[
{
"year": 2025,
"month": 1,
"month_name": "January",
"total": 1870,
"suppressed": 1650,
"not_suppressed": 220
},
{
"year": 2025,
"month": 2,
"month_name": "February",
"total": 1740,
"suppressed": 1540,
"not_suppressed": 200
}
]
Rejected samples
Returns the total number of rejected VL samples grouped by testing facility.
- Name
testing_facility- Type
- string
- Description
The name of the testing laboratory.
- Name
total- Type
- integer
- Description
Total number of rejected samples at the laboratory.
Request
curl -G https://api.openldr.org.mz/hiv/vl/laboratories/rejected_samples/ \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
--data-urlencode 'interval_dates=["2025-01-01","2025-12-31"]'
Response
[
{
"testing_facility": "Laboratorio Central de Maputo",
"total": 2340
},
{
"testing_facility": "Laboratorio Provincial de Gaza",
"total": 1520
}
]
Rejected samples by month
Returns the number of rejected VL samples per month, useful for monitoring sample quality trends over time.
- Name
year- Type
- integer
- Description
The calendar year of the result.
- Name
month- Type
- integer
- Description
The month number (1-12).
- Name
month_name- Type
- string
- Description
The full name of the month.
- Name
total- Type
- integer
- Description
Total number of rejected samples in the month.
Request
curl -G https://api.openldr.org.mz/hiv/vl/laboratories/rejected_samples_by_month/ \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
--data-urlencode 'interval_dates=["2025-01-01","2025-12-31"]'
Response
[
{
"year": 2025,
"month": 1,
"month_name": "January",
"total": 720
},
{
"year": 2025,
"month": 2,
"month_name": "February",
"total": 650
}
]
TAT by lab
Returns turnaround time (TAT) averages for each stage of the sample processing pipeline, grouped by testing facility.
- Name
testing_facility- Type
- string
- Description
The name of the testing laboratory.
- Name
collection_reception- Type
- float
- Description
Average days from sample collection to laboratory reception.
- Name
reception_registration- Type
- float
- Description
Average days from laboratory reception to sample registration.
- Name
registration_analysis- Type
- float
- Description
Average days from sample registration to analysis.
- Name
analysis_validation- Type
- float
- Description
Average days from analysis to result validation.
Request
curl -G https://api.openldr.org.mz/hiv/vl/laboratories/tat_by_lab/ \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
--data-urlencode 'interval_dates=["2025-01-01","2025-12-31"]'
Response
[
{
"testing_facility": "Laboratorio Central de Maputo",
"collection_reception": 3.5,
"reception_registration": 0.8,
"registration_analysis": 2.1,
"analysis_validation": 0.5
},
{
"testing_facility": "Laboratorio Provincial de Gaza",
"collection_reception": 4.8,
"reception_registration": 1.2,
"registration_analysis": 3.0,
"analysis_validation": 0.7
}
]
TAT by month
Returns monthly turnaround time (TAT) averages for each stage of the sample processing pipeline at the laboratory level.
- Name
year- Type
- integer
- Description
The calendar year of the result.
- Name
month- Type
- integer
- Description
The month number (1-12).
- Name
month_name- Type
- string
- Description
The full name of the month.
- Name
collection_reception- Type
- float
- Description
Average days from sample collection to laboratory reception.
- Name
reception_registration- Type
- float
- Description
Average days from laboratory reception to sample registration.
- Name
registration_analysis- Type
- float
- Description
Average days from sample registration to analysis.
- Name
analysis_validation- Type
- float
- Description
Average days from analysis to result validation.
Request
curl -G https://api.openldr.org.mz/hiv/vl/laboratories/tat_by_month/ \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
--data-urlencode 'interval_dates=["2025-01-01","2025-12-31"]'
Response
[
{
"year": 2025,
"month": 1,
"month_name": "January",
"collection_reception": 4.2,
"reception_registration": 1.3,
"registration_analysis": 2.8,
"analysis_validation": 0.7
},
{
"year": 2025,
"month": 2,
"month_name": "February",
"collection_reception": 3.9,
"reception_registration": 1.1,
"registration_analysis": 2.5,
"analysis_validation": 0.6
}
]
Suppression
Returns monthly viral suppression data at the laboratory level, showing total tested, suppressed, and not suppressed counts over time.
- Name
year- Type
- integer
- Description
The calendar year of the result.
- Name
month- Type
- integer
- Description
The month number (1-12).
- Name
month_name- Type
- string
- Description
The full name of the month.
- Name
total- Type
- integer
- Description
Total number of samples tested in the month.
- Name
suppressed- Type
- integer
- Description
Number of suppressed results in the month.
- Name
not_suppressed- Type
- integer
- Description
Number of not suppressed results in the month.
Request
curl -G https://api.openldr.org.mz/hiv/vl/laboratories/suppression/ \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
--data-urlencode 'interval_dates=["2025-01-01","2025-12-31"]'
Response
[
{
"year": 2025,
"month": 1,
"month_name": "January",
"total": 14520,
"suppressed": 12450,
"not_suppressed": 2070
},
{
"year": 2025,
"month": 2,
"month_name": "February",
"total": 13610,
"suppressed": 11720,
"not_suppressed": 1890
}
]