ADR Consignment Check
adr_consignment_checkOne call on the consignment object for the ADR picture of a road load: the 1.1.3.6 small-load verdict, the limited / excepted quantity check of each line, the tunnel restriction code of the whole load against the tunnels on the route, each line's transport-document entry, mixed loading (7.5.2, with the foodstuffs precautions of 7.5.4), and the vehicle side — orange-coloured plates and placards (5.3), the documents, fire extinguishers and equipment on the transport unit (8.1), and driver training (8.2); and the UN packaging mark of each line (6.1.3.1). The rules are page-cited to the free UNECE ADR 2025 publication.
Provide lines[] — each dangerous-goods line with un_number, quantity {value, unit, basis} and, where it applies, packing_group / variant_index, packages {count, type, gross_kg, un_mark (the UN packaging mark as printed, 6.1.3.1)}, inner_packaging {quantity, unit, per_outer?, regime?} and (ID lines only) icao_limited_quantity — and optionally journey {date, tunnels_on_route (A–E), mode}, vehicle {max_mass_t (the transport unit's maximum permissible mass — the 8.1.4.1 band, 3.4.13), foodstuffs_carried (ADR 7.5.4), fire_extinguishers_kg[], orange_plates_displayed, placards_displayed, equipment_8_1_5[] (the 8.1.5 items by name), instructions_in_writing}, crew {adr_training_certificate, specialisations[] (class_1, class_7, tanks), photo_identification, awareness_training_1_3}, edition and as_of. journey.date is the default as_of; an as_of that contradicts it is refused.
Behavior: deterministic. The 1.1.3.6 check is the adr_exemption_calculator's answer, whole (basis, basis_until, strict_adr_2027, items[].state incl. EXCLUDED_NIL / BLOCKED / AIR_ONLY_ID). The LQ / EQ checks are the adr_lq_eq_check answer per line with inner_packaging. The tunnel check assigns the whole load the most restrictive code (8.6.3.2, ranked by the categories the 8.6.4 table forbids for the carriage), gives which tunnels on the route the load may use without and with the 1.1.3.6 relief (8.6.3.3: goods carried under 1.1.3 are not subject to tunnel restrictions unless the unit must bear the 3.4.13 mark), and computes the net explosive mass for B1000C / C5000D. The document entries follow 5.4.1.1.1 (a), (b), (c), (d), (k) in that order, from Table A columns (1)–(5) and (15) — e.g. "UN 1098 ALLYL ALCOHOL, 6.1 (3), I, (C/D)"; a row whose name joins names by "or" gives one entry per name (3.1.2.2); for a load within 1.1.3.6 the total quantity and calculated value per transport category (NOTE 1 to 5.4.1.1.1 (f)). A generic or N.O.S. row assigned special provision 274 or 318 is conditional on the document until its technical name is added in brackets (3.1.2.8.1 — the object carries none); a CARRIAGE PROHIBITED line and an ID line get no entry (entry null, the reason given) and leave the document insufficient_data — an ID line stated as an ICAO limited quantity carries no entry (3.4.1) and is not counted against it. Mixed loading reads the lines as one load in one transport unit: every pair of lines against the 7.5.2.1 table by the labels of Table A column (5) (subsidiary labels included; "4.1 + 1" / "5.2 + 1" as printed), Class 1 pairs against the 7.5.2.2 table by compatibility group; a lettered note the rows settle is settled (1.4S; UN 2990 / 3072 / 3268; UN 0503 with 3268), one that turns on a fact the object does not carry answers conditional with the note quoted; a line whose LQ / EQ check passes is still read as a package of its row, with the 3.4.1 / 3.5.1.1 relief and 7.5.2.4 stated as conditions; a load within 1.1.3.6 is checked all the same (1.1.3.6.2 does not lift 7.5.2); goods with CV28 engage 7.5.4 (ADR 2027: as amended). The vehicle side lists, per check, the requirements the load puts on the vehicle — read from the Table A rows (class, classification code, column (5) labels, column (19) S-provisions) and the 1.1.3.6 verdict — and checks each against its input: met → pass, not met → fail with the rule quoted, not sent → conditional (the input named, optional, in missing_inputs). Plates: two plain orange-coloured plates (5.3.2.1.1); placards on a vehicle carrying packages only for Class 1 other than 1.4S and Class 7 other than excepted packages (5.3.1.5), the model by 5.3.1.1.2; the 5.3.6 mark with placards; the 3.4.13 LQ mark as a condition on a unit over 12 t. Equipment: the 8.1.2.1 documents, the 8.1.4.1 extinguisher table by mass, the 8.1.5 items by danger label. Training: the 8.2.1 certificate and the Class 1 / Class 7 specialisation (8.2.1.4). Under 1.1.3.6 they read 1.1.3.6.2: no Chapter 5.3, one 2 kg extinguisher (8.1.4.2), the transport document, training per Chapter 1.3 (8.2.3) for a driver without the certificate. Where the text does not settle a case (a code that splits tank and other carriage on a line with no packages; a Class 1 line not in net kg) the check asks instead of assuming. fail means a check the load does not meet; a relief that does not apply is not_applicable, not fail, and does not change the status — a load outside 1.1.3.6 (the full requirements apply, and the other checks answer for a fully regulated load) or a line with no stated regime that fits neither LQ nor EQ; a stated regime that is missed, and a CARRIAGE PROHIBITED entry, still fail. The packaging check reads each line's packages.un_mark by the grammar of 6.1.3.1 — (a) the symbol, (b) the code of the 6.1.2.7 table (T / V / W may follow), (c) the packing-group letter and the relative density or gross mass, (d) S or the test pressure (rounded down to 10 kPa), (e) year, (f) State, (g) maker — and holds the letter against the line's packing group (X: I, II, III; Y: II, III; Z: III): malformed, or a letter that does not cover it → fail with the field named; no mark → conditional (optional, in missing_inputs); a line within its stated LQ / EQ regime and sent without a mark → not_applicable (3.4.1 / 3.5.1.1); a Class 7 package or a Class 2 gas in pressure receptacles (column (8) P200 / P203) → not_applicable (marked under 6.4 / 6.2), any other Class 2 line → not_assessed; an ID line, or a line that matches more than one Table A row → insufficient_data; a row without a packing group → conditional (the letter is held against the level its packing instruction sets, not read); an IBC or large-packaging mark → conditional (6.5.2.1.1 / 6.6.3.1 not read). A limited / excepted quantity line whose stated regime is met is left out of the 1.1.3.6 total (1.1.3.6.5; exemption_1_1_3_6.engine.excluded_lines names it); a line that states no regime is counted. regime names the rules the checks answered under: "1.1.3.6" (the load is within it — the vehicle side reads 1.1.3.6.2), "full_adr" (it is not — a fully regulated load), "undetermined" (the 1.1.3.6 check gave no verdict). Rate-limited: a limit error carries reset_at, the UTC time the allowance resets.
Returns: status (pass | fail | conditional | insufficient_data), regime ("1.1.3.6" | "full_adr" | "undetermined" — the rules the checks answered under; null without dangerous goods), missing_inputs[] ({name, check, what}), checks_performed[] ({name, verdict, required, edition, as_of, basis, citations[] — section, volume, PDF page, a short quotation}), edition, as_of, edition_basis, lines[], exemption_1_1_3_6 {verdict, basis, conditions, engine}, limited_quantities and excepted_quantities {verdict, lines[] {line_index, verdict, reason, answer}}, tunnel_restriction {verdict, lines[], whole_load {codes, forbidden_categories, complete}, route {tunnels_on_route, without_1_1_3_6_relief, with_1_1_3_6_relief}, needs_info[]}, transport_document {verdict, lines[] (elements a–k, strings; entry null and a reason where no entry is written), exemption_1_1_3_6_statement, conditions[]}, mixed_loading_7_5_2 {verdict, basis, lines[] {line_index, un_number, labels[], classification_code, compatibility_group}, pairs[] {a, b, labels_a, labels_b, permitted (true | false | "conditional"), cell, note, source_ref}, class_1 {assessed, pairs[]}, foodstuffs {engaged, lines[], input, verdict}, conditions[], needs_info[], notes[]}, placards_and_plates_5_3 {verdict, basis, requirements[] {id, applies (true | false | "under_relief_only" | "conditional"), basis, quantity, specification, lines[], source_ref}, orange_plates {required, numbered}, placards {required, lines[] {line_index, placards[]}}, marks[], lq_mark {applies, condition}, conditions[], needs_info[], notes[]}, equipment_8_1 {verdict, basis, requirements[], fire_extinguishers {band, minimum_total_kg, minimum_largest_kg, small_load_rule, on_board, verdict}, general_equipment[] and label_specific_equipment[] {item, applies, lines[], on_board, outcome}, documents[], conditions[], needs_info[], notes[]}, driver_training_8_2 {verdict, basis, requirements[], certificate {required, under_relief, specialisations[], outcome}, awareness_training_1_3 {applies, outcome}, conditions[], needs_info[], notes[]}, packaging_code_validity {verdict, basis, lines[] {line_index, un_number, verdict, mark, field (on fail: the 6.1.3.1 sub-paragraph), parsed {symbol, code, code_suffix, letter, covers, relative_density, max_gross_mass_kg, solids_or_inner, test_pressure_kpa, year, state, manufacturer}, reason}, notes[]} — all under result — plus confidence, _source and citation (the FreightUtils v1 response envelope). A call made with an API key stores a check receipt (_meta.check_id); without one the answer carries the receipt hash (_meta.receipt) and nothing is stored.
Editions: edition ("2025" | "2027") and as_of (YYYY-MM-DD) choose the ADR edition — edition wins, else the date picks it (ADR 2025 before 2027-01-01, ADR 2027 from then; ADR 2025 may still be applied until 2027-06-30). An answer on a named edition carries adr_edition; neither sent, the answer is ADR 2025 until 2027-01-01.
Limitations: the packaging check reads the mark, not the packaging kind — whether the packaging is one the line's packing instruction (Table A column (8)) allows is not checked (6.1.3 NOTE 1), IBC / large-packaging marks are named, not read, and on a row without a packing group (articles, most of Class 1) the letter is not held against anything; without packages.un_mark a dangerous-goods line is conditional on the packaging check; the vehicle-side checks read the load, so without the vehicle.* / crew.* inputs a dangerous-goods load is conditional (the requirements listed); the vehicle side does not assess the vehicle approval of Part 9, the elevated temperature mark (5.3.3 — the object carries no temperature), handling and stowage (7.5.7) or national equivalent training; a limited / excepted quantity relief is applied only where the line states it (inner_packaging.regime) and meets it — in the 1.1.3.6 total — and is otherwise stated as a condition, never assumed; the foodstuffs part of mixed loading needs vehicle.foodstuffs_carried (without it, a condition); column (6) special provisions that change the labels are not applied; limited / excepted quantities are not taken out of the tunnel code (the object does not say a line is carried so); not legal advice, verify against the current UNECE ADR text.
Related: adr_exemption_calculator (the 1.1.3.6 check alone), adr_lq_eq_check (LQ / EQ alone), adr_lookup (a row's columns).
Identifiers: Each record carries fu_id, a stable FreightUtils identifier (and fu_version_id where the dataset has editions); resolve_reference resolves one to exactly its record.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| crew | No | The vehicle crew, for the driver-training and document checks (ADR 8.2, 8.1.2). Facts only — no name. | |
| as_of | No | YYYY-MM-DD the answer is for (default today, UTC); picks the ADR edition when edition is omitted, and is echoed in the answer and its check receipt. | |
| lines | Yes | The lines of the load (1–50). Required. | |
| edition | No | ADR edition: "2025" or "2027". Wins over as_of. Omit it and as_of picks the edition by the legal timeline: before 2027-01-01 ADR 2025; from 2027-01-01 ADR 2027 (ADR 2025 may still be applied until 2027-06-30 under 1.6.1.1 — edition "2025" answers on it until then); from 2027-07-01 ADR 2027 only. An ADR 2027 answer for a date before 2027-01-01 carries an EDITION_NOT_YET_APPLICABLE warning. | |
| journey | No | ||
| options | No | The consignment object's options; not read by this check. | |
| vehicle | No | Read: max_mass_t (8.1.4.1, 3.4.13), foodstuffs_carried (7.5.4) and the vehicle-side inputs (5.3, 8.1). |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| ok | Yes | ||
| _meta | No | ||
| as_of | No | ||
| result | Yes | ||
| status | No | ||
| _source | Yes | ||
| edition | No | ||
| citation | Yes | ||
| validity | No | ||
| warnings | No | ||
| confidence | Yes | ||
| missing_inputs | No | ||
| blocking_errors | No | ||
| envelope_version | Yes | ||
| normalized_input | No |