Specification

.well File Format Specification — Version 2.4: Water Quality

See also: overview.md · format-reference.md · object-schemas.md · interoperability.md

Overview

This document specifies the water_samples block (since v2.3): the sample and result schemas, the recommended values, the unit rules, the welldot parameter vocabulary and how jurisdiction requirements are expressed. Cross-cutting rules that also cover water samples stay in their general sections: datetimes and the _resolution: "day" convention, canonical units and field bindings, cross-references, uniqueness and precision in format-reference.md; attachments, ledger corrections and history_logs links in object-schemas.md. The Complete Example in object-schemas.md includes water samples.

Table of contents


water_samples[]

A ledger: each entry is one collection of water from the well, with the results measured on it in the field and in the laboratory. Entries MAY be edited in place, but editing is NOT RECOMMENDED after the entry has been exported. A revalidation of data already recorded is an edit of Result.validation in place. A corrected laboratory report is best written as a new sample whose corrects holds the id of the retracted sample, following object-schemas.md § hydrodynamic_events[] — Corrections (retracted samples stay in the file and are excluded from every derivation; chains are allowed; a cycle emits a warning).

The block serves drinking-water compliance, environmental and mining monitoring under licence, and hydrochemistry, in any jurisdiction. It follows the rigor of audited monitoring (chain of custody, field QA/QC, filtration, lab flags, data validation) with almost every field optional. It is jurisdiction-neutral: limits, exceedances and national rules are never stored; see § Parameter vocabulary — Limit sets are not part of the file.

Out of scope: limits and exceedances, sampling schedules, high-frequency telemetry (only aggregates enter), interpreted assessment (class, facies), and the laboratory's internal QC (method blanks, matrix spikes).

WaterSample

FieldTypeRequiredUnitDescription
idstringyesUnique within water_samples. UUID v4 recommended.
datetimestring (instant)yesRFC 3339 instant of collection.
sample_typestringyesroutine, field_duplicate, split_sample, field_blank, trip_blank, equipment_blank, x-…. See format-reference.md § water_samples[].sample_type.
parent_sample_idstringconditionalwater_samples[].id of the original sample. Expected for field_duplicate and split_sample (absence emits a warning).
sequenceintegernoTie-breaker among samples at the same instant, lower first. Orders the samples of a vertical profile.
campaignstringnoFree identifier of the sampling campaign.
sampling_methodstringnoHow the well was purged: low_flow, volumetric_purge, no_purge, pump_discharge, x-….
sampling_pointSamplingPointnoWhere the water was taken. See below.
purgePurgenoPurge before collection. See below.
static_level_event_idstringnohydrodynamic_events[].id with the water level measured at collection.
collected_bystringnoPerson or team that collected the sample.
preservationstringnoPreservation and packaging, free text.
chain_of_custodystringnoChain of custody number.
laboratoryLaboratorynoSee below.
correctsstringnowater_samples[].id of the sample this one retracts.
notesstringno
attachmentsAttachment[]noThe laboratory report with document_type: "lab_report". See § Attachment.
resultsResult[]yesAt least one. Field and laboratory results in one list, distinguished by measured_in.

SamplingPoint

FieldTypeRequiredUnitDescription
typestringyespump_discharge, wellhead_tap, in_well, x-…. See format-reference.md § water_samples[].sampling_point.type.
depthnumbernomPoint depth of the sampler intake, from ground level. Mutually exclusive with from/to.
depth_precisionnumbernomOne-sigma precision of depth.
fromnumbernomTop of the isolated interval.
tonumbernomBottom of the isolated interval.
devicestringnoWhat collected the water: bailer, discrete_depth_sampler, passive_diffusion_bag, grab_sleeve, low_flow_pump, packer_pump, x-….
pump_installation_idstringnopump_installations[].id, when the sample is taken at the production pump.

A sample's depth is a point, an interval, derived from the production pump, or unknown. All depths are measured from ground level.

SituationtypeGeometryExample
Production pumppump_dischargepump_installation_id; depth derived from its intake_depthSupply well
Wellhead tapwellhead_tapNoneRoutine potability
Point samplerin_welldepthBailer, HydraSleeve, diffusion bag
Low-flowin_welldepth of the sampling pump intakeASTM D6771, ISO 5667-11
Isolated intervalin_wellfrom and toPacker, multilevel well
Unknownin_wellNoneHistorical record without depth
  • depth together with from or to is malformed.
  • With pump_installation_id, the depth is not repeated on the sampling point.
  • Field measurements taken from the top of casing are converted to ground level by the producer, by the same rule as water levels.
  • A vertical profile or a multilevel well is several samples at different depths, with the same campaign and sequence for ordering.

Purge

All fields optional.

FieldTypeUnitDescription
durationnumberminPurge duration.
volumenumberm³Purged volume.
flow_ratenumberm³/hPurge flow rate.
stabilizedbooleanField parameters were stabilized before collection.
readingsPurgeReading[]Stabilization readings taken during the purge.

PurgeReading

FieldTypeRequiredUnitDescription
elapsednumberyesminTime since the purge started.
parameterParameteryes{ code, vocabulary }, as in results.
valuenumberyescanonicalValue in the parameter's canonical unit.

purge.readings holds the stabilization series (pH, conductivity, temperature, dissolved oxygen, ORP, turbidity) that audits require. The final values at the time of collection go in results with measured_in: "field".

Laboratory

FieldTypeRequiredUnitDescription
namestringyes
accreditationstringnoISO/IEC 17025 (or equivalent) accreditation identifier.
report_numberstringnoReport number, preserved as issued.
batch_idstringnoLaboratory batch or work order.
sample_idstringnoThe laboratory's own sample identifier.
received_atstring (instant)noWhen the laboratory received the sample.
received_at_resolutionstringnoday when only the date is known. See format-reference.md § Instants known only by date.
received_temperaturenumberno°CSample temperature on receipt.

Result

FieldTypeRequiredUnitDescription
parameterParameteryesWhat was measured. See below.
valuenumberone formcanonicalNumeric result.
presencebooleanone formPresence (true) or absence (false).
textstringone formQualitative result (odor, taste).
qualifierstring (enum)no<, >, not_detected, estimated. Censoring and estimation only.
unitstringx- onlyUCUM unit. Required for x- vocabularies, malformed for welldot and cas.
detection_limitnumbernocanonicalDetection limit (LD / LOD).
quantification_limitnumbernocanonicalQuantification limit (LQ / LOQ).
value_precisionnumbernocanonicalOne-sigma uncertainty. Expanded uncertainty from a report is divided by k.
fractionstring (enum)nototal, dissolved, suspended.
filtrationFiltrationnoFiltration applied before analysis. Expected with fraction: "dissolved".
measured_instring (enum)nofield or lab.
methodstringnoAnalytical method, e.g. ISO 7027, US EPA 200.8, SMEWW 4500-NO3 B.
analyzed_atstring (instant)noWhen the result was analyzed.
analyzed_at_resolutionstringnoday when only the date is known.
lab_flagsstringnoLaboratory flags as issued, uninterpreted.
validationValidationnoData validation by a reviewer. See below.
notesstringno

"Canonical" is the unit of the parameter in the vocabulary, or unit for x- codes. See § Units.

Parameter

FieldTypeRequiredDescription
codestringyesCode in the vocabulary: a welldot code, a CAS Registry Number (71-43-2) or a custom code.
vocabularystringyeswelldot, cas or x-…. Any other value is malformed.

The welldot codes, their units, value forms and CAS equivalences are listed in § Parameter vocabulary.

Filtration

All fields optional.

FieldTypeUnitDescription
pore_sizenumberµmFilter pore size, e.g. 0.45.
locationstring (enum)field or lab.

Validation

FieldTypeRequiredDescription
statusstring (enum)yesunvalidated, validated, qualified, rejected.
qualifierstringnoCode of the validation guideline applied, e.g. J, UJ, R.
guidelinestringnoGuideline used, free text.
validated_bystringno
validated_atstring (instant)no

An absent validation is equivalent to status: "unvalidated".

Result rules

Each result has exactly one value form. Three annotation layers are kept apart: the censoring qualifier, the laboratory flags and the reviewer's validation.

FormFieldUsed forqualifier allowed
NumericvalueAlmost every parameter<, >, estimated
PresencepresencePresence codes (total_coliforms, e_coli)None
TexttextOdor, taste and other qualitative resultsNone
Not detectednoneBelow the detection limit with no reported valuenot_detected, with detection_limit
LayerFieldSet byExample
CensoringqualifierNormalized on import< 0.001
Laboratory flagslab_flagsThe laboratory, preserved as issuedB (blank contamination), H (holding time)
ValidationvalidationThe data reviewerqualified with J
  • < with value records the value the laboratory reported, usually the quantification or detection limit. It is neither zero nor absent.
  • > covers upper bounds, such as counts above the method range.
  • estimated marks values between the detection and quantification limits.
  • not_detected without detection_limit emits a warning, because the result has no scale.
  • value_precision is one sigma. Reports give an expanded uncertainty (usually k = 2); converters divide it by the coverage factor.
  • fraction: "dissolved" is expected with filtration; without it, a warning is emitted. Dissolved metals filtered in the laboratory and in the field are not comparable in an audit.
  • lab_flags has no vocabulary: codes vary by laboratory and country, and interpreting them is the job of validation.
  • A rejected result is excluded from every derivation and from comparisons with limits. qualified results are kept.
  • Revalidating the data of a recorded sample creates a new sample with corrects, like any ledger correction.
  • The same parameter may appear twice in a sample when fraction or measured_in differ (total and dissolved iron; field and laboratory pH). An exact duplicate emits a warning.
  • A welldot code and its CAS equivalent are the same parameter for duplicate detection and derivations.

Malformed (rejected)

  • results empty or absent.
  • A result with more than one value form, or none without qualifier: "not_detected"; not_detected together with a value form; <, > or estimated without value.
  • unit on a welldot or cas parameter; an x- parameter without unit; a vocabulary other than welldot, cas or x-….
  • sampling_point.depth together with from or to.
  • An _resolution field with a value other than day; an instant without an offset.
  • A value outside the closed enums qualifier, fraction, measured_in, filtration.location, validation.status. sample_type, sampling_method, sampling_point.type and device are open vocabularies.

Validation (warnings, never rejection)

  • field_duplicate or split_sample without parent_sample_id.
  • fraction: "dissolved" without filtration.
  • A sample depth outside every well_screen interval (stagnant casing water).
  • A sample depth below well_depth.
  • A sample depth above the static level of static_level_event_id.
  • presence on a numeric code, or value on a presence code (value form different from the vocabulary's).
  • not_detected without detection_limit.
  • The same parameter, fraction and measured_in repeated in one sample.
  • A welldot code unknown to the vocabulary version.
  • analyzed_at or laboratory.received_at earlier than the collection datetime.
  • A reference that does not resolve: corrects, parent_sample_id, static_level_event_id, sampling_point.pump_installation_id.
  • A corrects cycle.

Derived values

Derived values are computed by @welldot/utils and never stored. Retracted samples and rejected results are excluded from all of them.

  • Exceedances against a selectable limit set (WHO, EU 2020/2184, Brazil, …) or the user's own limits. < and not_detected results never exceed; for presence limits, presence exceeds. turbidity, turbidity_ntu and turbidity_fnu compare with nephelometric limits, and turbidity_fau is never compared.
  • Ion balance, converting mg/L to meq/L with the molar mass and charge of each code.
  • Relative percent difference (RPD) between a duplicate or split and its original sample, per parameter.
  • Blank contamination: parameters detected in field_blank, trip_blank or equipment_blank samples of the same campaign.
  • Holding time, from datetime to analyzed_at, at the available resolution.
  • Receipt temperature compliance.
  • Purge stabilization from purge.readings.
  • Acid drainage indicators (net alkalinity, sulfate/chloride ratio).
  • Piper and Stiff coordinates and the hydrochemical facies.
  • Effective sample depth (from sampling_point, or the pump's intake_depth) and whether the sample represents formation water (inside a screen interval and below the static level).

A history_logs entry (typically maintenance with maintenance_type: "water_sampling", or an inspection) records the task and points to the samples it collected with sample_ids. A water-quality monitoring permit condition is fulfilled by a condition fulfillment pointing to the sample the same way. See object-schemas.md § history_logs[] — Data links and § permits[] — Condition fulfillment.


Non-canonical values of these open vocabularies SHOULD use the x- prefix.

ValuePortuguese (BR)Description
routineAmostra de rotinaRegular sample of the well water.
field_duplicateDuplicata de campoSecond sample collected at the same time and point. Requires parent_sample_id.
split_sampleAmostra dividida (split)One sample split between laboratories (interlaboratory). Requires parent_sample_id.
field_blankBranco de campoAnalyte-free water exposed to field conditions.
trip_blankBranco de transporteAnalyte-free water that travels with the samples, unopened.
equipment_blankBranco de equipamentoAnalyte-free water passed through the sampling equipment after decontamination.

Non-canonical values SHOULD use the x- prefix. Laboratory internal QC (method blanks, matrix spikes) is out of scope.

sampling_method describes the purge; sampling_point.device describes what collected the water. Portuguese terms follow ABNT NBR 15847 (métodos de purga).

ValuePortuguese (BR)Description
low_flowPurga de baixa vazão (micropurga)Low-flow purging with stabilization of field parameters (e.g. ASTM D6771, ISO 5667-11).
volumetric_purgePurga de volume determinadoRemoval of a set number of well volumes before sampling.
no_purgeAmostragem sem purgaPassive or no-purge sampling.
pump_dischargeBomba de produção em operaçãoCollected from the running production pump.

Non-canonical values SHOULD use the x- prefix.

ValuePortuguese (BR)Description
pump_dischargeSaída da bomba de produçãoProduction pump discharge; depth derived from pump_installation_id.
wellhead_tapTorneira do cavaleteTap at the wellhead; no depth.
in_wellDentro do poçoSampler inside the well, at depth, over from/to, or at unknown depth.

Non-canonical values SHOULD use the x- prefix.

ValuePortuguese (BR)
bailerBailer (amostrador de retenção)
discrete_depth_samplerAmostrador pontual de profundidade
passive_diffusion_bagBolsa de difusão passiva
grab_sleeveAmostrador passivo tipo luva (HydraSleeve)
low_flow_pumpBomba de baixa vazão
packer_pumpBomba com obturador (packer)

Non-canonical values SHOULD use the x- prefix.


Units

A water quality result never declares a unit for a known parameter: the unit comes from the parameter code.

  1. Substances (vocabulary welldot or cas) are always in mg/L. µg/L, ng/L and g/L are converted on import.
  2. Parameters that are not concentrations (pH, conductivity, temperature, redox potential, turbidity, color, microbiology, radioactivity) have the unit fixed by their welldot code; see § Parameter vocabulary. pH is dimensionless.
  3. x- vocabulary codes require unit, in UCUM. This is the only exception to the rule that the file never declares units. unit on a welldot or cas parameter is malformed, and an x- code without unit is malformed.
  4. Turbidity and microbiological counts are separated by code, not by unit: turbidity_ntu, turbidity_fnu, turbidity_fau and the generic turbidity (FTU, formazin with no identified method); _mpn and _cfu count codes beside the presence codes.

Regional unit names are normalized on import:

Reported unitNormalized to
µg/L, ng/L, g/Lmg/L
mS/mµS/cm (×10)
mS/cmµS/cm (×1000)
uT, FTUgeneric turbidity code
NTU, FNU, FAUturbidity_ntu, turbidity_fnu, turbidity_fau
mg Pt-Co/L, PCU, TCUuH (numerically equal)

The basis of expression lives in the code, never in the unit: nitrate reported "as N" and "as NO₃⁻" are different parameters (nitrate_as_n, nitrate_as_no3). @welldot/core provides concentrationToCanonical, milliSiemensPerMeterToMicroSiemensPerCm, milliSiemensPerCmToMicroSiemensPerCm, turbidityCodeForUnit, normalizeColorUnit and expandedToStandardUncertainty for these conversions.


Parameter vocabulary

A parameter is identified by an object { code, vocabulary }, like texture:

{ "code": "nitrate_as_n", "vocabulary": "welldot" }
{ "code": "71-43-2", "vocabulary": "cas" }
{ "code": "glyphosate_ampa", "vocabulary": "x-lab-codes" }

vocabulary is welldot, cas or an x-… vocabulary; any other value is malformed.

Vocabulary rules

  1. Substances (welldot or cas) are always in mg/L. Conversions such as µg/L → mg/L happen on import.
  2. Parameters that are not concentrations have their unit fixed by the welldot vocabulary (pH, conductivity, temperature, redox potential, turbidity, color, microbiology, radioactivity).
  3. x- codes require unit, in UCUM. This is the only exception to the spec's unit rule.
  4. The basis of expression is part of the code. nitrate_as_n and nitrate_as_no3 are different parameters. A CAS code always means the substance itself. There is no basis field.
  5. Preference. When a welldot code exists it is used instead of the CAS number. The vocabulary publishes the equivalences, and parsers treat a welldot code and its equivalent CAS number as the same parameter.
  6. Labels and translations. The canonical label is English. Translations, regional synonyms and descriptions live in the published vocabulary, which is versioned (WATER_QUALITY_VOCABULARY_VERSION in @welldot/core).
  7. Regional unit names are normalized on import: uT and FTU → turbidity; mg Pt-Co/L, PCU and TCU → uH; mS/m → µS/cm (×10). See § Units.

A welldot code unknown to the vocabulary version emits a warning, never a rejection. Any other substance is recorded by its CAS number, in mg/L.

Core vocabulary

The core list has 98 welldot codes. The Mining and redox group and the additional metals cover acid drainage, gold leaching (cyanide) and explosives (nitrogen species). The Form column gives the value form a result of that code uses (value, presence or text); see § water_samples[] — Result rules.

GroupCodeLabel (EN)Portuguese (BR)UnitFormCAS
Physical / fieldtemperatureTemperatureTemperatura°Cvalue
Physical / fieldphpHpH—value
Physical / fieldspecific_conductanceSpecific conductance at 25 °CCondutividade elétrica a 25 °CµS/cmvalue
Physical / fieldconductivity_uncompensatedElectrical conductivity, uncompensatedCondutividade sem compensaçãoµS/cmvalue
Physical / fielddissolved_oxygenDissolved oxygenOxigênio dissolvidomg/Lvalue
Physical / fieldorpOxidation-reduction potential vs. reference electrodePotencial redox vs. eletrodo de referênciamVvalue
Physical / fieldehRedox potential vs. SHEPotencial redox corrigido vs. EPHmVvalue
Physical / fieldturbidityTurbidity, formazin, method unspecifiedTurbidez, formazina sem método identificadoFTUvalue
Physical / fieldturbidity_ntuTurbidity, nephelometric white lightTurbidez nefelométrica, luz brancaNTUvalue
Physical / fieldturbidity_fnuTurbidity, nephelometric infrared (ISO 7027)Turbidez nefelométrica, infravermelhoFNUvalue
Physical / fieldturbidity_fauTurbidity, attenuation (ISO 7027)Turbidez por atenuaçãoFAUvalue
Physical / fieldapparent_colorApparent colorCor aparenteuHvalue
Physical / fieldtrue_colorTrue colorCor verdadeirauHvalue
Physical / fieldodorOdorOdor—text
Physical / fieldtasteTasteGosto—text
Physical / fieldtotal_dissolved_solidsTotal dissolved solidsSólidos totais dissolvidosmg/Lvalue
Physical / fieldtotal_suspended_solidsTotal suspended solidsSólidos suspensos totaismg/Lvalue
Physical / fieldtotal_solidsTotal solidsSólidos totaismg/Lvalue
Physical / fieldfree_co2Free carbon dioxideGás carbônico livremg/Lvalue
Aggregatealkalinity_total_as_caco3Total alkalinity as CaCO₃Alcalinidade total como CaCO₃mg/Lvalue
Aggregatealkalinity_bicarbonate_as_caco3Bicarbonate alkalinity as CaCO₃Alcalinidade de bicarbonatos como CaCO₃mg/Lvalue
Aggregatealkalinity_carbonate_as_caco3Carbonate alkalinity as CaCO₃Alcalinidade de carbonatos como CaCO₃mg/Lvalue
Aggregatealkalinity_hydroxide_as_caco3Hydroxide alkalinity as CaCO₃Alcalinidade de hidróxidos como CaCO₃mg/Lvalue
Aggregateacidity_total_as_caco3Total acidity as CaCO₃Acidez total como CaCO₃mg/Lvalue
Aggregatehardness_total_as_caco3Total hardness as CaCO₃Dureza total como CaCO₃mg/Lvalue
Aggregatehardness_calcium_as_caco3Calcium hardness as CaCO₃Dureza de cálcio como CaCO₃mg/Lvalue
Major ioncalciumCalciumCálciomg/Lvalue7440-70-2
Major ionmagnesiumMagnesiumMagnésiomg/Lvalue7439-95-4
Major ionsodiumSodiumSódiomg/Lvalue7440-23-5
Major ionpotassiumPotassiumPotássiomg/Lvalue7440-09-7
Major ionbicarbonateBicarbonate as HCO₃⁻Bicarbonato como HCO₃⁻mg/Lvalue71-52-3
Major ioncarbonateCarbonate as CO₃²⁻Carbonato como CO₃²⁻mg/Lvalue3812-32-6
Major ionchlorideChlorideCloretomg/Lvalue16887-00-6
Major ionsulfateSulfateSulfatomg/Lvalue14808-79-8
Major ionfluorideFluorideFluoretomg/Lvalue16984-48-8
Major ionsilica_as_sio2Silica as SiO₂Sílica como SiO₂mg/Lvalue7631-86-9
Nutrientnitrate_as_nNitrate as NNitrato como Nmg/Lvalue
Nutrientnitrate_as_no3Nitrate as NO₃⁻Nitrato como NO₃⁻mg/Lvalue14797-55-8
Nutrientnitrite_as_nNitrite as NNitrito como Nmg/Lvalue
Nutrientnitrite_as_no2Nitrite as NO₂⁻Nitrito como NO₂⁻mg/Lvalue14797-65-0
Nutrientammonia_as_nAmmonia nitrogen as NNitrogênio amoniacal como Nmg/Lvalue
Nutrientammonia_as_nh3Ammonia as NH₃Amônia como NH₃mg/Lvalue7664-41-7
Nutrientkjeldahl_nitrogen_as_nTotal Kjeldahl nitrogen as NNitrogênio Kjeldahl total como Nmg/Lvalue
Nutrientphosphorus_total_as_pTotal phosphorus as PFósforo total como Pmg/Lvalue
Nutrientorthophosphate_as_po4Orthophosphate as PO₄³⁻Ortofosfato como PO₄³⁻mg/Lvalue
Organictotal_organic_carbonTotal organic carbonCarbono orgânico totalmg/Lvalue
OrganiccodChemical oxygen demandDemanda química de oxigênio (DQO)mg/Lvalue
Organicbod5Biochemical oxygen demand, 5-dayDemanda bioquímica de oxigênio (DBO₅)mg/Lvalue
Organictotal_petroleum_hydrocarbonsTotal petroleum hydrocarbons (range per method)Hidrocarbonetos totais de petróleomg/Lvalue
Organicoil_and_greaseOil and greaseÓleos e graxasmg/Lvalue
Disinfectionfree_chlorineFree chlorine residualCloro residual livremg/Lvalue
Disinfectiontotal_chlorineTotal chlorine residualCloro residual totalmg/Lvalue
Mining and redoxferrous_ironFerrous iron (Fe²⁺)Ferro ferroso (Fe²⁺)mg/Lvalue
Mining and redoxchromium_hexavalentHexavalent chromiumCromo hexavalentemg/Lvalue18540-29-9
Mining and redoxcyanide_total_as_cnTotal cyanide as CN⁻Cianeto total como CN⁻mg/Lvalue
Mining and redoxcyanide_wad_as_cnWeak acid dissociable cyanide as CN⁻Cianeto WAD como CN⁻mg/Lvalue
Mining and redoxcyanide_free_as_cnFree cyanide as CN⁻Cianeto livre como CN⁻mg/Lvalue
Mining and redoxthiocyanateThiocyanateTiocianatomg/Lvalue302-04-5
Mining and redoxsulfide_total_as_sTotal sulfide as SSulfeto total como Smg/Lvalue
Metal / traceironIronFerromg/Lvalue7439-89-6
Metal / tracemanganeseManganeseManganêsmg/Lvalue7439-96-5
Metal / tracealuminumAluminiumAlumíniomg/Lvalue7429-90-5
Metal / traceantimonyAntimonyAntimôniomg/Lvalue7440-36-0
Metal / tracearsenicArsenicArsêniomg/Lvalue7440-38-2
Metal / tracebariumBariumBáriomg/Lvalue7440-39-3
Metal / traceberylliumBerylliumBeríliomg/Lvalue7440-41-7
Metal / traceboronBoronBoromg/Lvalue7440-42-8
Metal / tracecadmiumCadmiumCádmiomg/Lvalue7440-43-9
Metal / tracechromiumChromium, totalCromo totalmg/Lvalue7440-47-3
Metal / tracecobaltCobaltCobaltomg/Lvalue7440-48-4
Metal / tracecopperCopperCobremg/Lvalue7440-50-8
Metal / traceleadLeadChumbomg/Lvalue7439-92-1
Metal / tracelithiumLithiumLítiomg/Lvalue7439-93-2
Metal / tracemercuryMercuryMercúriomg/Lvalue7439-97-6
Metal / tracemolybdenumMolybdenumMolibdêniomg/Lvalue7439-98-7
Metal / tracenickelNickelNíquelmg/Lvalue7440-02-0
Metal / traceseleniumSeleniumSelêniomg/Lvalue7782-49-2
Metal / tracesilverSilverPratamg/Lvalue7440-22-4
Metal / tracestrontiumStrontiumEstrônciomg/Lvalue7440-24-6
Metal / tracethalliumThalliumTáliomg/Lvalue7440-28-0
Metal / traceuraniumUraniumUrâniomg/Lvalue7440-61-1
Metal / tracevanadiumVanadiumVanádiomg/Lvalue7440-62-2
Metal / tracezincZincZincomg/Lvalue7440-66-6
Microbiologytotal_coliformsTotal coliforms in 100 mLColiformes totais em 100 mL—presence
Microbiologytotal_coliforms_mpnTotal coliforms, countColiformes totais, contagemMPN/100 mLvalue
Microbiologytotal_coliforms_cfuTotal coliforms, countColiformes totais, contagemCFU/100 mLvalue
Microbiologye_coliE. coli in 100 mLE. coli em 100 mL—presence
Microbiologye_coli_mpnE. coli, countE. coli, contagemMPN/100 mLvalue
Microbiologye_coli_cfuE. coli, countE. coli, contagemCFU/100 mLvalue
Microbiologythermotolerant_coliformsThermotolerant coliforms in 100 mLColiformes termotolerantes em 100 mL—presence
Microbiologythermotolerant_coliforms_mpnThermotolerant coliforms, countColiformes termotolerantes, contagemMPN/100 mLvalue
Microbiologythermotolerant_coliforms_cfuThermotolerant coliforms, countColiformes termotolerantes, contagemCFU/100 mLvalue
Microbiologyheterotrophic_plate_countHeterotrophic plate countBactérias heterotróficasCFU/mLvalue
Radioactivitygross_alphaGross alpha activityAtividade alfa totalBq/Lvalue
Radioactivitygross_betaGross beta activityAtividade beta totalBq/Lvalue
Radioactivityradium_226Radium-226Rádio-226Bq/Lvalue13982-63-3
Radioactivityradium_228Radium-228Rádio-228Bq/Lvalue15262-20-1
Radioactivityradon_222Radon-222Radônio-222Bq/Lvalue14859-67-7

The CAS numbers listed are the published equivalences: a result coded by that CAS number is treated as the corresponding welldot code. Codes whose basis differs from the substance (such as nitrate_as_n) or that measure an analytical fraction (such as cyanide_wad_as_cn) have no CAS equivalent. Radionuclides are in Bq/L even though they have CAS numbers, an exception to the mg/L rule; uranium by mass stays under uranium (mg/L).

Limit sets are not part of the file

Limits, guideline values and exceedances are never written to a .well file, and no field names a national standard. @welldot/core bundles selectable limit sets as separate data (WHO Guidelines for Drinking-water Quality, EU Directive 2020/2184, Brazil GM/MS 888/2021), and consumers compare results against the set the user picks, or against their own limits. In turbidity comparisons, turbidity, turbidity_ntu and turbidity_fnu compare with nephelometric limits; turbidity_fau is never compared. Local obligations (which parameters, how often) are expressed by profiles; see § Regulatory profiles.


Regulatory profiles

Jurisdiction-specific water quality requirements live in profiles, not in the core format. A drinking-water profile for one jurisdiction might require, for wells with well_purpose production:

  • at least one water_samples entry per calendar year with results for a fixed parameter list (e.g. e_coli, total_coliforms, turbidity_ntu, free_chlorine, nitrate_as_n, fluoride);
  • monthly e_coli and total_coliforms results (presence form) and half-yearly results for the full list;
  • laboratory.accreditation on every sample and an attachment with document_type: "lab_report".
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://example.org/profiles/drinking-water/v1/schema.json",
  "allOf": [{ "$ref": "https://welldot.org/schema/v2/well.schema.json" }],
  "required": ["water_samples"],
  "properties": {
    "water_samples": {
      "items": {
        "required": ["laboratory", "attachments"],
        "properties": {
          "laboratory": { "required": ["name", "accreditation"] }
        }
      }
    }
  }
}

Frequency rules that JSON Schema cannot express (one sample per month, one per year) are checked by profile-aware tools and surfaced as warnings, like any profile failure. The limits that results are compared against still come from a limit set, never from the file.