Skip to main content
Glama

ADR 1.1.3.6 Exemption Calculator

adr_exemption_calculator
Read-onlyIdempotent

Calculate ADR 1.1.3.6 "small load" exemption points for a dangerous-goods load and say whether it qualifies. Each substance's transport category (Table A column (15), 0-4) sets a points multiplier (1.1.3.6.4: category 1 x50, 2 x3, 3 x1, 4 x0; the nine ADR 1.1.3.6.3 note-a entries UN 0081/0082/0084/0241/0331/0332/0482/1005/1017 are x20); points = quantity x multiplier. The rule (1.1.3.6.2), for dangerous goods carried in packages: goods of ONE transport category qualify when their TOTAL on the transport unit stays within that category's 1.1.3.6.3 column (3) maximum — category 1: 20, 2: 333, 3: 1,000 (kg or L); note-a entries 50 kg; category 4 unlimited; category 0: 0 — however it is split across lines; goods of DIFFERENT categories qualify when the 1.1.3.6.4 points sum does not exceed 1,000. This calculator also holds every line, and every substance summed across its lines, to its category maximum — on a mixed load that is stricter than 1.1.3.6.4 (the conservative side). Transport category 0 substances can NEVER use this exemption — has_category_zero flags them.

Provide un_number + quantity for a single substance, OR items[] for a load — never both: every field of the single-substance form (un_number, quantity, packing_group, variant_index, unit, basis) sent beside items[] is refused (the API answers 400 naming the field), never dropped — put it on the item it belongs to, a substance as an item of its own. Quantities are in kg or litres per the substance's ADR unit. An item quantity may be 0: the goods are not carried, the line is left out of the load (state EXCLUDED_NIL) and named in a warning — a load of nothing but zeros is refused, never cleared. un_number also takes an ID-prefixed air-only number (e.g. "ID8000") — see Routing.

Multi-variant UNs: a UN number with more than one ADR Table A row (packing group / concentration variant — e.g. UN 1789 PG II vs PG III have different transport categories) needs packing_group (I|II|III) or variant_index (from adr_lookup) to pin one row. A packing_group that still leaves several rows is enough when those rows agree on class, transport category, scope and the 1.1.3.6.3 counted dimension (UN 1790 PG I: two concentration bands, both category 1) — the verdict is returned with items[].equivalent_variants + variant_note naming the rows it holds for; only when the rows DISAGREE (UN 2215 PG III: MOLTEN is category 0, the solid category 3) does it still ask for variant_index, and candidates[] then lists only that packing group's rows. With no disambiguator at all: a single-line call, or a load where EVERY line is ambiguous, returns blocking_errors[AMBIGUOUS_UN_VARIANT] + human_review_required + candidates[] (each candidate's item_index, un_number, variant_index, packing_group, proper_shipping_name, transport_category, multiplier) and NO verdict — blocking_errors is in the text content as well as structuredContent; a MIXED load withholds only the ambiguous line (items[].withheld true, points null, row fields null) while every other line keeps its points; total_points is null (1.1.3.6.4 sums every line, one term is unknown) and exempt is null UNLESS the resolved lines alone already disqualify the load — a CARRIAGE PROHIBITED entry, a category 0 entry, a per-substance maximum exceeded, or a partial sum already over 1,000 — in which case exempt is false with the ladder message (and carriage_prohibited true where that is the reason), because no packing group can undo those. warnings state the resolved lines' partial sum, candidates[] carry expected_unit (the 1.1.3.6.3 counted dimension — the only difference for UN 3375 PG II, liquid in L vs solid in kg), and the envelope carries human_review_required + candidates[] plus one AMBIGUOUS_UN_VARIANT warning per withheld line. Never a silently guessed row. Single-row UNs are unchanged.

Scope verdicts: Table A rows listed "NOT SUBJECT TO ADR" or "CARRIAGE PROHIBITED" never enter the points math. An all-not-subject load (e.g. UN 1845 dry ice) returns not_subject_to_adr true with a dedicated message ("Not subject to ADR (road). Section 5.5.3 applies: ...") and, for dry ice, conditions[] quoting the ADR 2025 section 5.5.3 requirements verbatim (ventilation, package marking, warning mark, documentation, training). A load containing a CARRIAGE PROHIBITED entry returns exempt false with carriage_prohibited true. In a mixed load, not-subject items are excluded from the points and the exclusion is stated in warnings.

Routing: every returned line carries state, in the words the FreightUtils document check uses — COUNTED (evaluated on one Table A row: its points, or a category 0 / CARRIAGE PROHIBITED row that settles the load), AIR_ONLY_ID, NOT_SUBJECT_TO_ADR, BLOCKED (no points from the line as sent — withheld, basis_mismatch, category_unresolved or entry_required; the line's own flag says which) or EXCLUDED_NIL (a stated quantity of 0, read as not carried: left out of every sum and test, items[].nil_quantity true, and named in a warning). An ID-prefixed number such as ID 8000 (consumer commodity) is an air-only identifier with no ADR Table A entry. It is counted out of 1.1.3.6 — AIR_ONLY_ID, nothing counted, items[].air_only_id true, row fields null — only when the request states, with icao_limited_quantity: true on that line, that the packages are limited quantities to the ICAO Technical Instructions (the 3.4.8 mark, or 3.4.10): 3.4.9 and 3.4.10 deem them to meet 3.4.1-3.4.4, and goods exempted under 1.1.3.4.2 are not taken into account by 1.1.3.6.5; goods not in such packages must be entered under their own UN numbers. Without that statement the ID line is BLOCKED (items[].entry_required true) and the load has no verdict unless the other lines settle it. icao_limited_quantity on a UN-numbered line is refused (the API answers 400). Only the ID prefix makes a line air-only — an ID number is never read as the UN number with the same digits — and a load whose every line is a stated air-only line returns total_points 0, exempt true with its own message, never "1.1.3.6 exemption applies" and never not_subject_to_adr.

Gross figures: ADR 1.1.3.6.3 counts the dangerous goods themselves, never the packaging. A gross mass (basis "gross") on an entry counted by mass is read as an upper bound of the net mass: the load is answered exempt on it only when it clears even on the gross figure — then figure_basis is "upper_bound_gross" and the line carries upper_bound_gross true (its true points are lower). Otherwise, and always for an entry counted in litres, the line gets no points (basis_mismatch): send the net quantity.

ADR 2027 basis: an ADR 2027 answer carries basis — what the verdict rests on: "adr_2027", or, on a stated as_of from 1 January 2027, a transitional measure open on that date that clears a load ADR 2027 itself does not: "1.6.1.61" (the ADR 2025 note-a rule, ×20 with a 50 kg maximum, until 31 December 2030) before "1.6.1.1" (the whole of ADR 2025, until 30 June 2027). Such an answer headlines the transitional basis that clears the load, names it, gives basis_until (the last day it may be applied) and puts the strict ADR 2027 figure beside it (strict_adr_2027: basis, total_points, exempt, has_category_zero, has_quantity_exceedance). A line whose entry is deleted in ADR 2027 (e.g. UN 2941) has no ADR 2027 figure at all: on a stated as_of from 2027-01-01 to 2027-06-30 the whole load is answered on ADR 2025 under 1.6.1.1 (basis "1.6.1.1", every line edition_basis "2025") and strict_adr_2027 carries entry_deleted true, deleted_un_numbers and message, its four figures null; outside that window, or without a stated as_of, the call is refused naming the deleted entry. Without a stated as_of, the strict ADR 2027 reading stays the headline. transitional_1_6_1_61 (a load with one of the nine note-a UN numbers) and transitional_1_6_1_1 (inside the 1.6.1.1 window, where ADR 2027 itself is not exempt) state the load on each basis: measure, basis, points_on_this_basis, exempt_on_this_basis, until, note.

Behavior: deterministic points arithmetic over ADR 2025 reference data; a UN that cannot be found returns blocking_errors (NOT_FOUND); exempt is the overall verdict. Fields are checked by name: a field the tool does not read is refused with a tool error naming it and listing the accepted ones, never ignored. Rate-limited: a limit error carries reset_at, the UTC time the allowance resets.

Returns: items[] (each with state, packing_group, variant_index, transport_category, multiplier, points, air_only_id + icao_limited_quantity or entry_required on an ID-prefixed line, nil_quantity on a 0 line, upper_bound_gross on a gross mass counted as an upper bound, edition_basis on an answer resting on 1.6.1.1 for an entry deleted in ADR 2027, quantity_unit/quantity_basis/expected_unit when a unit or basis was declared, scope flags where applicable, withheld + ambiguity_reason on an unpinned multi-variant line, and equivalent_variants + variant_note when a packing group resolved by equivalence), total_points (NULL when no verdict was reached), threshold (1000), exempt (NULL when no verdict was reached — never false as a stand-in), has_category_zero, has_quantity_exceedance, warnings, message, figure_basis, and on ADR 2027 answers basis, basis_until, strict_adr_2027 (with entry_deleted, deleted_un_numbers and message when an entry is deleted in ADR 2027), transitional_1_6_1_61, transitional_1_6_1_1, human_review_required + candidates[] when any line is withheld, and — on scope verdicts — not_subject_to_adr/conditions_ref/conditions[]/carriage_prohibited under result — or, when every line is ambiguous, human_review_required + candidates[] with blocking_errors, plus confidence, _source and citation (the FreightUtils v1 response envelope).

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: a deterministic calculation over reference data, not legal advice — 1.1.3.6 relieves goods carried in packages only (not in bulk or in tanks), and this calculator takes no packaging input; even exempt loads keep core duties (packaging, marking, documentation), and mixed-packing rules still apply; verify against the current UNECE ADR text.

Related: adr_lookup (per-substance data incl. transport category + variant_index), adr_lq_eq_check (the LQ/EQ relief routes instead of 1.1.3.6).

Input Schema

NameRequiredDescriptionDefault
unitNoOPTIONAL. The dimension `quantity` is stated in — 'L' or 'kg'. Omit it and the number is taken as already on the ADR 1.1.3.6.3 basis (the historical contract). Supply it and it is CHECKED against the dimension 1.1.3.6.3 counts for the row: litres for liquids and for compressed or adsorbed gases, kilograms for solids, liquefied/refrigerated/dissolved gases and articles. A mismatch returns no points and says which dimension the entry is counted in.
as_ofNoYYYY-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.
basisNoOPTIONAL. 'net' or 'gross'. ADR 1.1.3.6.3 counts the dangerous goods themselves, never the packaging. A 'gross' mass on an entry counted by mass is used only as an upper bound of the net mass: the load is answered exempt on it only when it clears even on the gross figure (figure_basis upper_bound_gross); otherwise, and always for an entry counted in litres, no points — send the net quantity.
itemsNoItems for a mixed load. An item quantity may be 0: the goods are not carried, the line is left out of the load and named in a warning (a load of nothing but zeros is refused). With items[], the single-substance fields (un_number, quantity, packing_group, variant_index, unit, basis) are refused beside it (INVALID_INPUT) — each goes on its item.
editionNoADR 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.
quantityNoQuantity on the ADR 1.1.3.6.3 basis: net kg for solids and liquefied, refrigerated or dissolved gases; litres for liquids; receptacle water capacity in litres for compressed or adsorbed gases and chemicals under pressure; articles as the mass of the articles without their packagings, in kg.
un_numberNoUN number for single check (4 digits, optionally "UN"-prefixed) — or an ID-prefixed air-only number such as "ID8000", which has no ADR Table A entry: counted out of 1.1.3.6 (AIR_ONLY_ID) only with icao_limited_quantity: true — the ADR answer for limited-quantity packages to the ICAO Technical Instructions, 3.4.9 / 3.4.10 / 1.1.3.6.5; without it the line is BLOCKED and the load has no verdict unless the other lines settle it.
consignmentNoAlternative to the other arguments: the consignment object (https://www.freightutils.com/schema/consignment-object.v1.json) — lines[] (description, un_number, packing_group, variant_index, quantity {value, unit, basis}, packages {count, type, gross_kg, un_mark}, hs_code, value {amount, currency}, dims, stackable, icao_limited_quantity, inner_packaging), journey {origin, destination, date, tunnels_on_route, mode}, vehicle, crew, options. Send it alone; an input the tool needs and the object lacks comes back in missing_inputs.
packing_groupNoPacking group (I, II or III) — only needed to disambiguate a UN that has more than one ADR Table A row (e.g. UN 1789). Ignored for single-row UNs.
variant_indexNoADR Table A variant index (as returned by adr_lookup) — pins one row when a UN has several variants that share a packing group (e.g. concentration bands). Ignored for single-row UNs.
icao_limited_quantityNoOPTIONAL, only with an ID-prefixed un_number (e.g. ID8000): true states that the packages are limited quantities conforming to the ICAO Technical Instructions (the 3.4.8 mark, or 3.4.10). Only then is the line counted out of 1.1.3.6; without it the ID line is BLOCKED and the load has no verdict unless the other lines settle it.

Output Schema

NameRequiredDescriptionDefault
okYes
_metaNo
as_ofNo
resultYes
statusNo
_sourceYes
editionNo
citationYes
validityNo
warningsNo
confidenceYes
missing_inputsNo
blocking_errorsNo
envelope_versionYes
normalized_inputNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedOutput schema / properties / _meta / properties / upstream
      Added value: +{
      +  "additionalProperties": {},
      +  "properties": {
      +    "datasets": {
      +      "additionalProperties": {
      +        "additionalProperties": {},
      +        "properties": {
      +          "kind": {
      +            "anyOf": [
      +              {
      +                "enum": [
      +                  "watched",
      +                  "checksum-only",
      +                  "manual"
      +                ],
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          "last_success": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "reason": {
      +            "type": "string"
      +          },
      +          "stale": {
      +            "type": "boolean"
      +          },
      +          "state": {
      +            "enum": [
      +              "in_step",
      +              "changed_upstream",
      +              "schema_drift",
      +              "unreachable",
      +              "window_missed",
      +              "unknown"
      +            ],
      +            "type": "string"
      +          },
      +          "window_days": {
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          }
      +        },
      +        "required": [
      +          "state",
      +          "kind",
      +          "last_success",
      +          "window_days",
      +          "stale"
      +        ],
      +        "type": "object"
      +      },
      +      "propertyNames": {
      +        "type": "string"
      +      },
      +      "type": "object"
      +    },
      +    "stale": {
      +      "type": "boolean"
      +    },
      +    "state": {
      +      "enum": [
      +        "in_step",
      +        "changed_upstream",
      +        "schema_drift",
      +        "unreachable",
      +        "window_missed",
      +        "unknown"
      +      ],
      +      "type": "string"
      +    },
      +    "state_read_at": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    }
      +  },
      +  "required": [
      +    "state",
      +    "stale",
      +    "state_read_at",
      +    "datasets"
      +  ],
      +  "type": "object"
      +}
  2. Changed1 schema field changed
    • addedOutput schema / properties / _meta / properties / ids
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "pattern": {
      +      "type": "string"
      +    },
      +    "scheme": {
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    }
      +  },
      +  "required": [
      +    "scheme",
      +    "pattern"
      +  ],
      +  "type": "object"
      +}
  3. Changed2 schema fields changed
    • changedInput schema / properties / consignment / description
      Previous value: -"Alternative to the other arguments: the consignment object (https://www.freightutils.com/schema/consignment-object.v1.json) — lines[] (description, un_number, packing_group, variant_index, quantity {value, unit, basis}, packages {count, type, gross_kg}, hs_code, value {amount, currency}, dims, stackable, icao_limited_quantity, inner_packaging), journey {origin, destination, date, tunnels_on_route, mode}, vehicle, crew, options. Send it alone; an input the tool needs and the object lacks comes back in missing_inputs."New value: +"Alternative to the other arguments: the consignment object (https://www.freightutils.com/schema/consignment-object.v1.json) — lines[] (description, un_number, packing_group, variant_index, quantity {value, unit, basis}, packages {count, type, gross_kg, un_mark}, hs_code, value {amount, currency}, dims, stackable, icao_limited_quantity, inner_packaging), journey {origin, destination, date, tunnels_on_route, mode}, vehicle, crew, options. Send it alone; an input the tool needs and the object lacks comes back in missing_inputs."
    • addedInput schema / properties / consignment / properties / lines / items / properties / packages / properties / un_mark
      Added value: +{
      +  "maxLength": 80,
      +  "minLength": 1,
      +  "type": "string"
      +}
  4. Changed7 schema fields changed
    • changedInput schema / properties / consignment / description
      Previous value: -"Alternative to the other arguments: the consignment object (https://www.freightutils.com/schema/consignment-object.v1.json) — lines[] (description, un_number, packing_group, variant_index, quantity {value, unit, basis}, packages {count, type, gross_kg}, hs_code, value {amount, currency}, dims, stackable, icao_limited_quantity, inner_packaging), journey {origin, destination, date, tunnels_on_route, mode}, vehicle, options. Send it alone; an input the tool needs and the object lacks comes back in missing_inputs."New value: +"Alternative to the other arguments: the consignment object (https://www.freightutils.com/schema/consignment-object.v1.json) — lines[] (description, un_number, packing_group, variant_index, quantity {value, unit, basis}, packages {count, type, gross_kg}, hs_code, value {amount, currency}, dims, stackable, icao_limited_quantity, inner_packaging), journey {origin, destination, date, tunnels_on_route, mode}, vehicle, crew, options. Send it alone; an input the tool needs and the object lacks comes back in missing_inputs."
    • addedInput schema / properties / consignment / properties / crew
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "adr_training_certificate": {
      +      "type": "boolean"
      +    },
      +    "awareness_training_1_3": {
      +      "type": "boolean"
      +    },
      +    "photo_identification": {
      +      "type": "boolean"
      +    },
      +    "specialisations": {
      +      "items": {
      +        "enum": [
      +          "class_1",
      +          "class_7",
      +          "tanks"
      +        ],
      +        "type": "string"
      +      },
      +      "maxItems": 3,
      +      "type": "array"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / consignment / properties / vehicle / properties / equipment_8_1_5
      Added value: +{
      +  "items": {
      +    "enum": [
      +      "wheel_chock",
      +      "warning_signs",
      +      "eye_rinsing_liquid",
      +      "warning_vest",
      +      "portable_lighting",
      +      "protective_gloves",
      +      "eye_protection",
      +      "emergency_escape_mask",
      +      "shovel",
      +      "drain_seal",
      +      "collecting_container"
      +    ],
      +    "type": "string"
      +  },
      +  "maxItems": 11,
      +  "type": "array"
      +}
    • addedInput schema / properties / consignment / properties / vehicle / properties / fire_extinguishers_kg
      Added value: +{
      +  "items": {
      +    "exclusiveMinimum": 0,
      +    "maximum": 100,
      +    "type": "number"
      +  },
      +  "maxItems": 20,
      +  "type": "array"
      +}
    • addedInput schema / properties / consignment / properties / vehicle / properties / instructions_in_writing
      Added value: +{
      +  "type": "boolean"
      +}
    • addedInput schema / properties / consignment / properties / vehicle / properties / orange_plates_displayed
      Added value: +{
      +  "type": "boolean"
      +}
    • addedInput schema / properties / consignment / properties / vehicle / properties / placards_displayed
      Added value: +{
      +  "type": "boolean"
      +}
  5. Changed1 schema field changed
    • addedInput schema / properties / consignment / properties / vehicle / properties / foodstuffs_carried
      Added value: +{
      +  "type": "boolean"
      +}
  6. Changed6 schema fields changed
    • changedInput schema / properties / consignment / description
      Previous value: -"Alternative to the other arguments: the consignment object (https://www.freightutils.com/schema/consignment-object.v1.json) — lines[] (description, un_number, packing_group, variant_index, quantity {value, unit, basis}, packages {count, type, gross_kg}, hs_code, value {amount, currency}, dims, stackable), journey {origin, destination, date, tunnels_on_route, mode}, vehicle, options. Send it alone; an input the tool needs and the object lacks comes back in missing_inputs."New value: +"Alternative to the other arguments: the consignment object (https://www.freightutils.com/schema/consignment-object.v1.json) — lines[] (description, un_number, packing_group, variant_index, quantity {value, unit, basis}, packages {count, type, gross_kg}, hs_code, value {amount, currency}, dims, stackable, icao_limited_quantity, inner_packaging), journey {origin, destination, date, tunnels_on_route, mode}, vehicle, options. Send it alone; an input the tool needs and the object lacks comes back in missing_inputs."
    • addedInput schema / properties / consignment / properties / lines / items / properties / icao_limited_quantity
      Added value: +{
      +  "type": "boolean"
      +}
    • addedInput schema / properties / consignment / properties / lines / items / properties / inner_packaging
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "per_outer": {
      +      "maximum": 100000,
      +      "minimum": 1,
      +      "type": "integer"
      +    },
      +    "quantity": {
      +      "exclusiveMinimum": 0,
      +      "maximum": 1000000,
      +      "type": "number"
      +    },
      +    "regime": {
      +      "enum": [
      +        "lq",
      +        "eq"
      +      ],
      +      "type": "string"
      +    },
      +    "unit": {
      +      "enum": [
      +        "ml",
      +        "L",
      +        "g",
      +        "kg"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "quantity",
      +    "unit"
      +  ],
      +  "type": "object"
      +}
    • removedInput schema / properties / consignment / properties / lines / items / properties / quantity / properties / value / exclusiveMinimum
      Removed value: -0
    • addedInput schema / properties / consignment / properties / lines / items / properties / quantity / properties / value / minimum
      Added value: +0
    • changedInput schema / properties / consignment / properties / lines / items / properties / un_number / pattern
      Previous value: -"^(?:UN\\s?)?\\d{4}$"New value: +"^(?:(?:UN\\s?)?\\d{4}|ID\\s?\\d{4})$"
  7. Changed2 schema fields changed
    • removedOutput schema / properties / _meta / properties / receipt / properties / reason / const
      Removed value: -"key_required"
    • addedOutput schema / properties / _meta / properties / receipt / properties / reason / enum
      Added value: +[
      +  "key_required",
      +  "quota"
      +]
  8. Changed9 schema fields changed
    • changedInput schema / properties / basis / description
      Previous value: -"OPTIONAL. 'net' or 'gross'. ADR 1.1.3.6.3 counts the dangerous goods themselves, never the packaging, so a figure declared 'gross' returns no points in ANY unit — send the net quantity instead."New value: +"OPTIONAL. 'net' or 'gross'. ADR 1.1.3.6.3 counts the dangerous goods themselves, never the packaging. A 'gross' mass on an entry counted by mass is used only as an upper bound of the net mass: the load is answered exempt on it only when it clears even on the gross figure (figure_basis upper_bound_gross); otherwise, and always for an entry counted in litres, no points — send the net quantity."
    • addedInput schema / properties / icao_limited_quantity
      Added value: +{
      +  "description": "OPTIONAL, only with an ID-prefixed un_number (e.g. ID8000): true states that the packages are limited quantities conforming to the ICAO Technical Instructions (the 3.4.8 mark, or 3.4.10). Only then is the line counted out of 1.1.3.6; without it the ID line is BLOCKED and the load has no verdict unless the other lines settle it.",
      +  "type": "boolean"
      +}
    • changedInput schema / properties / items / description
      Previous value: -"Items for a mixed load. With items[], the single-substance fields (un_number, quantity, packing_group, variant_index, unit, basis) are refused beside it (INVALID_INPUT) — each goes on its item."New value: +"Items for a mixed load. An item quantity may be 0: the goods are not carried, the line is left out of the load and named in a warning (a load of nothing but zeros is refused). With items[], the single-substance fields (un_number, quantity, packing_group, variant_index, unit, basis) are refused beside it (INVALID_INPUT) — each goes on its item."
    • changedInput schema / properties / items / items / properties / basis / description
      Previous value: -"OPTIONAL. As the top-level basis: 'gross' returns no points — send the net quantity."New value: +"OPTIONAL. As the top-level basis: a 'gross' mass is used only as an upper bound on an entry counted by mass, and only when the load clears on it."
    • addedInput schema / properties / items / items / properties / icao_limited_quantity
      Added value: +{
      +  "description": "OPTIONAL, ID-prefixed lines only: as the top-level icao_limited_quantity.",
      +  "type": "boolean"
      +}
    • removedInput schema / properties / items / items / properties / quantity / exclusiveMinimum
      Removed value: -0
    • addedInput schema / properties / items / items / properties / quantity / minimum
      Added value: +0
    • changedInput schema / properties / items / items / properties / un_number / description
      Previous value: -"As the top-level un_number (4 digits, or an ID-prefixed air-only number, routed AIR_ONLY_ID)."New value: +"As the top-level un_number (4 digits, or an ID-prefixed air-only number: AIR_ONLY_ID with icao_limited_quantity: true, else BLOCKED)."
    • changedInput schema / properties / un_number / description
      Previous value: -"UN number for single check (4 digits, optionally \"UN\"-prefixed) — or an ID-prefixed air-only number such as \"ID8000\", which has no ADR Table A entry and is routed AIR_ONLY_ID (nothing counted under 1.1.3.6 — the ADR answer for limited-quantity packages to the ICAO Technical Instructions, 3.4.9 / 3.4.10 / 1.1.3.6.5, as the warning on that line states)."New value: +"UN number for single check (4 digits, optionally \"UN\"-prefixed) — or an ID-prefixed air-only number such as \"ID8000\", which has no ADR Table A entry: counted out of 1.1.3.6 (AIR_ONLY_ID) only with icao_limited_quantity: true — the ADR answer for limited-quantity packages to the ICAO Technical Instructions, 3.4.9 / 3.4.10 / 1.1.3.6.5; without it the line is BLOCKED and the load has no verdict unless the other lines settle it."
  9. Changed1 schema field changed
    • addedOutput schema / properties / _meta / properties / receipt
      Added value: +{
      +  "additionalProperties": {},
      +  "properties": {
      +    "created_at": {
      +      "type": "string"
      +    },
      +    "dataset_version": {
      +      "additionalProperties": {
      +        "type": "string"
      +      },
      +      "propertyNames": {
      +        "type": "string"
      +      },
      +      "type": "object"
      +    },
      +    "engine_version": {
      +      "type": "string"
      +    },
      +    "inputs": {},
      +    "reason": {
      +      "const": "key_required",
      +      "type": "string"
      +    },
      +    "receipt_hash": {
      +      "type": "string"
      +    },
      +    "result": {
      +      "additionalProperties": {},
      +      "propertyNames": {
      +        "type": "string"
      +      },
      +      "type": "object"
      +    },
      +    "schema_version": {
      +      "type": "string"
      +    },
      +    "stored": {
      +      "const": false,
      +      "type": "boolean"
      +    },
      +    "tool": {
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "stored",
      +    "reason",
      +    "schema_version",
      +    "receipt_hash",
      +    "created_at",
      +    "tool",
      +    "inputs",
      +    "dataset_version",
      +    "engine_version",
      +    "result"
      +  ],
      +  "type": "object"
      +}
  10. Changed2 schema fields changed
    • addedInput schema / properties / as_of
      Added value: +{
      +  "description": "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.",
      +  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +  "type": "string"
      +}
    • addedInput schema / properties / edition
      Added value: +{
      +  "description": "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.",
      +  "enum": [
      +    "2025",
      +    "2027"
      +  ],
      +  "type": "string"
      +}
  11. Changed1 schema field changed
    • addedOutput schema / properties / _meta / properties / edition_basis
      Added value: +{
      +  "type": "string"
      +}
  12. Changed45 schema fields changed
    • changedInput schema / properties / basis / description
      Previous value: -"OPTIONAL. 'net' or 'gross'. ADR 1.1.3.6.3 counts the dangerous goods themselves, never the packaging, so a figure declared 'gross' returns no points in ANY unit — send the net quantity instead. Single-substance form only: sent beside items[] it is refused (INVALID_INPUT) — set it on each item."New value: +"OPTIONAL. 'net' or 'gross'. ADR 1.1.3.6.3 counts the dangerous goods themselves, never the packaging, so a figure declared 'gross' returns no points in ANY unit — send the net quantity instead."
    • removedInput schema / properties / consignment / properties / journey / properties / date / description
      Removed value: -"Date of carriage, YYYY-MM-DD."
    • removedInput schema / properties / consignment / properties / journey / properties / destination / description
      Removed value: -"UN/LOCODE or ISO country code of the destination."
    • removedInput schema / properties / consignment / properties / journey / properties / mode / description
      Removed value: -"road | air | sea | multimodal."
    • removedInput schema / properties / consignment / properties / journey / properties / origin / description
      Removed value: -"UN/LOCODE or ISO country code of the origin."
    • removedInput schema / properties / consignment / properties / journey / properties / tunnels_on_route / description
      Removed value: -"ADR tunnel categories on the route (A–E)."
    • removedInput schema / properties / consignment / properties / lines / description
      Removed value: -"The lines of the load. Required."
    • removedInput schema / properties / consignment / properties / lines / items / properties / description / description
      Removed value: -"What the line is, at most 200 characters."
    • removedInput schema / properties / consignment / properties / lines / items / properties / dims / description
      Removed value: -"Dimensions of ONE package: { l, w, h, unit: mm | cm | m | in }."
    • removedInput schema / properties / consignment / properties / lines / items / properties / hs_code / description
      Removed value: -"HS / tariff commodity code, 6–10 digits."
    • removedInput schema / properties / consignment / properties / lines / items / properties / packages / description
      Removed value: -"The pieces: how many, of what type, and their total gross mass."
    • removedInput schema / properties / consignment / properties / lines / items / properties / packages / properties / count / description
      Removed value: -"Number of identical packages (pieces) on the line."
    • removedInput schema / properties / consignment / properties / lines / items / properties / packages / properties / gross_kg / description
      Removed value: -"Gross mass of ALL the line's packages together, in kg."
    • removedInput schema / properties / consignment / properties / lines / items / properties / packages / properties / type / description
      Removed value: -"Package type, e.g. \"pallet\", \"drum\", \"carton\"."
    • removedInput schema / properties / consignment / properties / lines / items / properties / packing_group / description
      Removed value: -"Packing group, to pin one ADR Table A row of a multi-row UN."
    • removedInput schema / properties / consignment / properties / lines / items / properties / quantity / description
      Removed value: -"The dangerous-goods quantity (ADR 1.1.3.6.3), separate from the gross mass of the packages."
    • removedInput schema / properties / consignment / properties / lines / items / properties / quantity / properties / basis / description
      Removed value: -"\"net\" (the goods) or \"gross\" (with packaging). 1.1.3.6.3 counts net; a gross figure scores no points."
    • removedInput schema / properties / consignment / properties / lines / items / properties / quantity / properties / unit / description
      Removed value: -"\"L\" or \"kg\" — checked against the dimension ADR 1.1.3.6.3 counts for the row."
    • removedInput schema / properties / consignment / properties / lines / items / properties / quantity / properties / value / description
      Removed value: -"The dangerous-goods quantity for the whole line, all packages together."
    • removedInput schema / properties / consignment / properties / lines / items / properties / stackable / description
      Removed value: -"Whether the packages may be stacked."
    • removedInput schema / properties / consignment / properties / lines / items / properties / un_number / description
      Removed value: -"UN number of a dangerous-goods line."
    • removedInput schema / properties / consignment / properties / lines / items / properties / value / description
      Removed value: -"Customs value of the whole line (all packages together)."
    • removedInput schema / properties / consignment / properties / lines / items / properties / value / properties / amount / description
      Removed value: -"The amount, 0 or more."
    • removedInput schema / properties / consignment / properties / lines / items / properties / value / properties / currency / description
      Removed value: -"ISO 4217 currency code, e.g. \"GBP\"."
    • removedInput schema / properties / consignment / properties / lines / items / properties / variant_index / description
      Removed value: -"ADR Table A variant index (as adr_lookup returns it), to pin one row."
    • removedInput schema / properties / consignment / properties / options / properties / air_volumetric_divisor / description
      Removed value: -"IATA volumetric divisor, cm³/kg (default 6000)."
    • removedInput schema / properties / consignment / properties / options / properties / awb_number / description
      Removed value: -"IATA air waybill number (check digit validated, advisory)."
    • removedInput schema / properties / consignment / properties / options / properties / container_number / description
      Removed value: -"ISO 6346 container number (check digit validated, advisory)."
    • removedInput schema / properties / consignment / properties / options / properties / freight_cost / description
      Removed value: -"Freight cost for the customs value."
    • removedInput schema / properties / consignment / properties / options / properties / freight_cost / properties / amount / description
      Removed value: -"The amount, 0 or more."
    • removedInput schema / properties / consignment / properties / options / properties / freight_cost / properties / currency / description
      Removed value: -"ISO 4217 currency code, e.g. \"GBP\"."
    • removedInput schema / properties / consignment / properties / options / properties / incoterm / description
      Removed value: -"Incoterms 2020 rule."
    • removedInput schema / properties / consignment / properties / options / properties / insurance_cost / description
      Removed value: -"Insurance cost for the customs value."
    • removedInput schema / properties / consignment / properties / options / properties / insurance_cost / properties / amount / description
      Removed value: -"The amount, 0 or more."
    • removedInput schema / properties / consignment / properties / options / properties / insurance_cost / properties / currency / description
      Removed value: -"ISO 4217 currency code, e.g. \"GBP\"."
    • removedInput schema / properties / consignment / properties / vehicle / properties / max_mass_t / description
      Removed value: -"Maximum permissible mass, tonnes."
    • removedInput schema / properties / consignment / properties / vehicle / properties / type / description
      Removed value: -"Vehicle type, e.g. \"artic\", \"rigid 7.5 t\"."
    • changedInput schema / properties / items / description
      Previous value: -"Array of items for mixed-load check"New value: +"Items for a mixed load. With items[], the single-substance fields (un_number, quantity, packing_group, variant_index, unit, basis) are refused beside it (INVALID_INPUT) — each goes on its item."
    • changedInput schema / properties / items / items / properties / basis / description
      Previous value: -"OPTIONAL. 'net' or 'gross'. ADR 1.1.3.6.3 counts the dangerous goods themselves, never the packaging, so a figure declared 'gross' returns no points in ANY unit — send the net quantity instead."New value: +"OPTIONAL. As the top-level basis: 'gross' returns no points — send the net quantity."
    • changedInput schema / properties / items / items / properties / un_number / description
      Previous value: -"UN number (4 digits, optionally \"UN\"-prefixed) — or an ID-prefixed air-only number such as \"ID8000\" (routed AIR_ONLY_ID; the warning on that line states the limited-quantity condition the 0 rests on)"New value: +"As the top-level un_number (4 digits, or an ID-prefixed air-only number, routed AIR_ONLY_ID)."
    • changedInput schema / properties / items / items / properties / unit / description
      Previous value: -"OPTIONAL. The dimension `quantity` is stated in — 'L' or 'kg'. Omit it and the number is taken as already on the ADR 1.1.3.6.3 basis (the historical contract). Supply it and it is CHECKED against the dimension 1.1.3.6.3 counts for the row: litres for liquids and for compressed or adsorbed gases, kilograms for solids, liquefied/refrigerated/dissolved gases and articles. A mismatch returns no points and says which dimension the entry is counted in."New value: +"OPTIONAL. As the top-level unit: checked against the dimension 1.1.3.6.3 counts for the row; a mismatch returns no points."
    • changedInput schema / properties / packing_group / description
      Previous value: -"Packing group (I, II or III) — only needed to disambiguate a UN that has more than one ADR Table A row (e.g. UN 1789). Ignored for single-row UNs. Single-substance form only: sent beside items[] it is refused (INVALID_INPUT) — set it on each item."New value: +"Packing group (I, II or III) — only needed to disambiguate a UN that has more than one ADR Table A row (e.g. UN 1789). Ignored for single-row UNs."
    • changedInput schema / properties / un_number / description
      Previous value: -"UN number for single check (4 digits, optionally \"UN\"-prefixed) — or an ID-prefixed air-only number such as \"ID8000\", which has no ADR Table A entry and is routed AIR_ONLY_ID (nothing counted under 1.1.3.6 — the ADR answer for limited-quantity packages to the ICAO Technical Instructions, 3.4.9 / 3.4.10 / 1.1.3.6.5, as the warning on that line states). Single-substance form only: sent beside items[] it is refused (INVALID_INPUT) — send the substance as an item."New value: +"UN number for single check (4 digits, optionally \"UN\"-prefixed) — or an ID-prefixed air-only number such as \"ID8000\", which has no ADR Table A entry and is routed AIR_ONLY_ID (nothing counted under 1.1.3.6 — the ADR answer for limited-quantity packages to the ICAO Technical Instructions, 3.4.9 / 3.4.10 / 1.1.3.6.5, as the warning on that line states)."
    • changedInput schema / properties / unit / description
      Previous value: -"OPTIONAL. The dimension `quantity` is stated in — 'L' or 'kg'. Omit it and the number is taken as already on the ADR 1.1.3.6.3 basis (the historical contract). Supply it and it is CHECKED against the dimension 1.1.3.6.3 counts for the row: litres for liquids and for compressed or adsorbed gases, kilograms for solids, liquefied/refrigerated/dissolved gases and articles. A mismatch returns no points and says which dimension the entry is counted in. Single-substance form only: sent beside items[] it is refused (INVALID_INPUT) — set it on each item."New value: +"OPTIONAL. The dimension `quantity` is stated in — 'L' or 'kg'. Omit it and the number is taken as already on the ADR 1.1.3.6.3 basis (the historical contract). Supply it and it is CHECKED against the dimension 1.1.3.6.3 counts for the row: litres for liquids and for compressed or adsorbed gases, kilograms for solids, liquefied/refrigerated/dissolved gases and articles. A mismatch returns no points and says which dimension the entry is counted in."
    • changedInput schema / properties / variant_index / description
      Previous value: -"ADR Table A variant index (as returned by adr_lookup) — pins one row when a UN has several variants that share a packing group (e.g. concentration bands). Ignored for single-row UNs. Single-substance form only: sent beside items[] it is refused (INVALID_INPUT) — set it on each item."New value: +"ADR Table A variant index (as returned by adr_lookup) — pins one row when a UN has several variants that share a packing group (e.g. concentration bands). Ignored for single-row UNs."
  13. Changed1 schema field changed
    • addedOutput schema / properties / _meta
      Added value: +{
      +  "additionalProperties": {},
      +  "properties": {
      +    "check_id": {
      +      "type": "string"
      +    },
      +    "receipt_url": {
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
  14. Changed1 schema field changed
    • addedInput schema / properties / consignment
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Alternative to the other arguments: the consignment object (https://www.freightutils.com/schema/consignment-object.v1.json) — lines[] (description, un_number, packing_group, variant_index, quantity {value, unit, basis}, packages {count, type, gross_kg}, hs_code, value {amount, currency}, dims, stackable), journey {origin, destination, date, tunnels_on_route, mode}, vehicle, options. Send it alone; an input the tool needs and the object lacks comes back in missing_inputs.",
      +  "properties": {
      +    "journey": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "date": {
      +          "description": "Date of carriage, YYYY-MM-DD.",
      +          "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +          "type": "string"
      +        },
      +        "destination": {
      +          "description": "UN/LOCODE or ISO country code of the destination.",
      +          "pattern": "^[A-Za-z]{2}(?:\\s?[A-Za-z2-9]{3})?$",
      +          "type": "string"
      +        },
      +        "mode": {
      +          "description": "road | air | sea | multimodal.",
      +          "enum": [
      +            "road",
      +            "air",
      +            "sea",
      +            "multimodal"
      +          ],
      +          "type": "string"
      +        },
      +        "origin": {
      +          "description": "UN/LOCODE or ISO country code of the origin.",
      +          "pattern": "^[A-Za-z]{2}(?:\\s?[A-Za-z2-9]{3})?$",
      +          "type": "string"
      +        },
      +        "tunnels_on_route": {
      +          "description": "ADR tunnel categories on the route (A–E).",
      +          "items": {
      +            "enum": [
      +              "A",
      +              "B",
      +              "C",
      +              "D",
      +              "E"
      +            ],
      +            "type": "string"
      +          },
      +          "maxItems": 20,
      +          "type": "array"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "lines": {
      +      "description": "The lines of the load. Required.",
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "description": {
      +            "description": "What the line is, at most 200 characters.",
      +            "maxLength": 200,
      +            "type": "string"
      +          },
      +          "dims": {
      +            "additionalProperties": false,
      +            "description": "Dimensions of ONE package: { l, w, h, unit: mm | cm | m | in }.",
      +            "properties": {
      +              "h": {
      +                "exclusiveMinimum": 0,
      +                "maximum": 100000,
      +                "type": "number"
      +              },
      +              "l": {
      +                "exclusiveMinimum": 0,
      +                "maximum": 100000,
      +                "type": "number"
      +              },
      +              "unit": {
      +                "enum": [
      +                  "mm",
      +                  "cm",
      +                  "m",
      +                  "in"
      +                ],
      +                "type": "string"
      +              },
      +              "w": {
      +                "exclusiveMinimum": 0,
      +                "maximum": 100000,
      +                "type": "number"
      +              }
      +            },
      +            "required": [
      +              "l",
      +              "w",
      +              "h",
      +              "unit"
      +            ],
      +            "type": "object"
      +          },
      +          "hs_code": {
      +            "description": "HS / tariff commodity code, 6–10 digits.",
      +            "pattern": "^\\d{6,10}$",
      +            "type": "string"
      +          },
      +          "packages": {
      +            "additionalProperties": false,
      +            "description": "The pieces: how many, of what type, and their total gross mass.",
      +            "properties": {
      +              "count": {
      +                "description": "Number of identical packages (pieces) on the line.",
      +                "exclusiveMinimum": 0,
      +                "maximum": 100000,
      +                "type": "integer"
      +              },
      +              "gross_kg": {
      +                "description": "Gross mass of ALL the line's packages together, in kg.",
      +                "exclusiveMinimum": 0,
      +                "maximum": 1000000,
      +                "type": "number"
      +              },
      +              "type": {
      +                "description": "Package type, e.g. \"pallet\", \"drum\", \"carton\".",
      +                "maxLength": 40,
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "count"
      +            ],
      +            "type": "object"
      +          },
      +          "packing_group": {
      +            "description": "Packing group, to pin one ADR Table A row of a multi-row UN.",
      +            "enum": [
      +              "I",
      +              "II",
      +              "III"
      +            ],
      +            "type": "string"
      +          },
      +          "quantity": {
      +            "additionalProperties": false,
      +            "description": "The dangerous-goods quantity (ADR 1.1.3.6.3), separate from the gross mass of the packages.",
      +            "properties": {
      +              "basis": {
      +                "description": "\"net\" (the goods) or \"gross\" (with packaging). 1.1.3.6.3 counts net; a gross figure scores no points.",
      +                "enum": [
      +                  "net",
      +                  "gross"
      +                ],
      +                "type": "string"
      +              },
      +              "unit": {
      +                "description": "\"L\" or \"kg\" — checked against the dimension ADR 1.1.3.6.3 counts for the row.",
      +                "enum": [
      +                  "L",
      +                  "kg"
      +                ],
      +                "type": "string"
      +              },
      +              "value": {
      +                "description": "The dangerous-goods quantity for the whole line, all packages together.",
      +                "exclusiveMinimum": 0,
      +                "maximum": 1000000000,
      +                "type": "number"
      +              }
      +            },
      +            "required": [
      +              "value"
      +            ],
      +            "type": "object"
      +          },
      +          "stackable": {
      +            "description": "Whether the packages may be stacked.",
      +            "type": "boolean"
      +          },
      +          "un_number": {
      +            "description": "UN number of a dangerous-goods line.",
      +            "pattern": "^(?:UN\\s?)?\\d{4}$",
      +            "type": "string"
      +          },
      +          "value": {
      +            "additionalProperties": false,
      +            "description": "Customs value of the whole line (all packages together).",
      +            "properties": {
      +              "amount": {
      +                "description": "The amount, 0 or more.",
      +                "maximum": 1000000000000,
      +                "minimum": 0,
      +                "type": "number"
      +              },
      +              "currency": {
      +                "description": "ISO 4217 currency code, e.g. \"GBP\".",
      +                "pattern": "^[A-Z]{3}$",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "amount",
      +              "currency"
      +            ],
      +            "type": "object"
      +          },
      +          "variant_index": {
      +            "description": "ADR Table A variant index (as adr_lookup returns it), to pin one row.",
      +            "maximum": 1000,
      +            "minimum": 0,
      +            "type": "integer"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "maxItems": 50,
      +      "minItems": 1,
      +      "type": "array"
      +    },
      +    "options": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "air_volumetric_divisor": {
      +          "description": "IATA volumetric divisor, cm³/kg (default 6000).",
      +          "exclusiveMinimum": 0,
      +          "maximum": 10000,
      +          "type": "number"
      +        },
      +        "awb_number": {
      +          "description": "IATA air waybill number (check digit validated, advisory).",
      +          "maxLength": 20,
      +          "type": "string"
      +        },
      +        "container_number": {
      +          "description": "ISO 6346 container number (check digit validated, advisory).",
      +          "maxLength": 20,
      +          "type": "string"
      +        },
      +        "freight_cost": {
      +          "additionalProperties": false,
      +          "description": "Freight cost for the customs value.",
      +          "properties": {
      +            "amount": {
      +              "description": "The amount, 0 or more.",
      +              "maximum": 1000000000000,
      +              "minimum": 0,
      +              "type": "number"
      +            },
      +            "currency": {
      +              "description": "ISO 4217 currency code, e.g. \"GBP\".",
      +              "pattern": "^[A-Z]{3}$",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "amount",
      +            "currency"
      +          ],
      +          "type": "object"
      +        },
      +        "incoterm": {
      +          "description": "Incoterms 2020 rule.",
      +          "enum": [
      +            "EXW",
      +            "FCA",
      +            "FAS",
      +            "FOB",
      +            "CFR",
      +            "CIF",
      +            "CPT",
      +            "CIP",
      +            "DAP",
      +            "DPU",
      +            "DDP"
      +          ],
      +          "type": "string"
      +        },
      +        "insurance_cost": {
      +          "additionalProperties": false,
      +          "description": "Insurance cost for the customs value.",
      +          "properties": {
      +            "amount": {
      +              "description": "The amount, 0 or more.",
      +              "maximum": 1000000000000,
      +              "minimum": 0,
      +              "type": "number"
      +            },
      +            "currency": {
      +              "description": "ISO 4217 currency code, e.g. \"GBP\".",
      +              "pattern": "^[A-Z]{3}$",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "amount",
      +            "currency"
      +          ],
      +          "type": "object"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "vehicle": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "axles": {
      +          "maximum": 12,
      +          "minimum": 1,
      +          "type": "integer"
      +        },
      +        "max_mass_t": {
      +          "description": "Maximum permissible mass, tonnes.",
      +          "exclusiveMinimum": 0,
      +          "maximum": 100,
      +          "type": "number"
      +        },
      +        "type": {
      +          "description": "Vehicle type, e.g. \"artic\", \"rigid 7.5 t\".",
      +          "maxLength": 60,
      +          "type": "string"
      +        }
      +      },
      +      "type": "object"
      +    }
      +  },
      +  "required": [
      +    "lines"
      +  ],
      +  "type": "object"
      +}
  15. Changed5 schema fields changed
    • addedOutput schema / properties / as_of
      Added value: +{
      +  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +  "type": "string"
      +}
    • addedOutput schema / properties / edition
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "applies_from": {
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "may_apply_until": {
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "name": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "name",
      +        "applies_from",
      +        "may_apply_until"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • changedOutput schema / properties / envelope_version / enum
      Previous value: -[
      -  "1",
      -  "1.1"
      -]New value: +[
      +  "1",
      +  "1.1",
      +  "1.2"
      +]
    • addedOutput schema / properties / missing_inputs
      Added value: +{
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / status
      Added value: +{
      +  "enum": [
      +    "ok",
      +    "partial",
      +    "not_found",
      +    "unsupported",
      +    "ambiguous"
      +  ],
      +  "type": "string"
      +}
  16. Changed2 schema fields changed
    • removedOutput schema / properties / validity / properties / effective_to / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / validity / properties / effective_to / type
      Added value: +[
      +  "string",
      +  "null"
      +]
  17. Changed2 schema fields changed
    • changedInput schema / properties / items / items / properties / un_number / pattern
      Previous value: -"^(?:(?:UN)?\\d{4}|\\s*ID\\s*[-:.]?\\s*\\d{4}\\s*)$"New value: +"^(?:\\s*(?:UN\\s*)?\\d{4}\\s*|\\s*ID\\s*[-:.]?\\s*\\d{4}\\s*)$"
    • changedInput schema / properties / un_number / pattern
      Previous value: -"^(?:(?:UN)?\\d{4}|\\s*ID\\s*[-:.]?\\s*\\d{4}\\s*)$"New value: +"^(?:\\s*(?:UN\\s*)?\\d{4}\\s*|\\s*ID\\s*[-:.]?\\s*\\d{4}\\s*)$"
  18. Changed3 schema fields changed
    • addedInput schema / properties / items / items / properties / quantity / maximum
      Added value: +1000000000
    • addedInput schema / properties / items / minItems
      Added value: +1
    • addedInput schema / properties / quantity / maximum
      Added value: +1000000000
  19. Changed2 schema fields changed
    • addedInput schema / additionalProperties
      Added value: +false
    • addedInput schema / properties / items / items / additionalProperties
      Added value: +false
  20. Changed8 schema fields changed
    • changedInput schema / properties / basis / description
      Previous value: -"OPTIONAL. 'net' or 'gross'. ADR 1.1.3.6.3 counts the dangerous goods themselves, never the packaging, so a figure declared 'gross' returns no points in ANY unit — send the net quantity instead."New value: +"OPTIONAL. 'net' or 'gross'. ADR 1.1.3.6.3 counts the dangerous goods themselves, never the packaging, so a figure declared 'gross' returns no points in ANY unit — send the net quantity instead. Single-substance form only: sent beside items[] it is refused (INVALID_INPUT) — set it on each item."
    • changedInput schema / properties / items / items / properties / un_number / description
      Previous value: -"UN number (4 digits, optionally \"UN\"-prefixed)"New value: +"UN number (4 digits, optionally \"UN\"-prefixed) — or an ID-prefixed air-only number such as \"ID8000\" (routed AIR_ONLY_ID; the warning on that line states the limited-quantity condition the 0 rests on)"
    • changedInput schema / properties / items / items / properties / un_number / pattern
      Previous value: -"^(UN)?\\d{4}$"New value: +"^(?:(?:UN)?\\d{4}|\\s*ID\\s*[-:.]?\\s*\\d{4}\\s*)$"
    • changedInput schema / properties / packing_group / description
      Previous value: -"Packing group (I, II or III) — only needed to disambiguate a UN that has more than one ADR Table A row (e.g. UN 1789). Ignored for single-row UNs."New value: +"Packing group (I, II or III) — only needed to disambiguate a UN that has more than one ADR Table A row (e.g. UN 1789). Ignored for single-row UNs. Single-substance form only: sent beside items[] it is refused (INVALID_INPUT) — set it on each item."
    • changedInput schema / properties / un_number / description
      Previous value: -"UN number for single check (4 digits, optionally \"UN\"-prefixed)"New value: +"UN number for single check (4 digits, optionally \"UN\"-prefixed) — or an ID-prefixed air-only number such as \"ID8000\", which has no ADR Table A entry and is routed AIR_ONLY_ID (nothing counted under 1.1.3.6 — the ADR answer for limited-quantity packages to the ICAO Technical Instructions, 3.4.9 / 3.4.10 / 1.1.3.6.5, as the warning on that line states). Single-substance form only: sent beside items[] it is refused (INVALID_INPUT) — send the substance as an item."
    • changedInput schema / properties / un_number / pattern
      Previous value: -"^(UN)?\\d{4}$"New value: +"^(?:(?:UN)?\\d{4}|\\s*ID\\s*[-:.]?\\s*\\d{4}\\s*)$"
    • changedInput schema / properties / unit / description
      Previous value: -"OPTIONAL. The dimension `quantity` is stated in — 'L' or 'kg'. Omit it and the number is taken as already on the ADR 1.1.3.6.3 basis (the historical contract). Supply it and it is CHECKED against the dimension 1.1.3.6.3 counts for the row: litres for liquids and for compressed or adsorbed gases, kilograms for solids, liquefied/refrigerated/dissolved gases and articles. A mismatch returns no points and says which dimension the entry is counted in."New value: +"OPTIONAL. The dimension `quantity` is stated in — 'L' or 'kg'. Omit it and the number is taken as already on the ADR 1.1.3.6.3 basis (the historical contract). Supply it and it is CHECKED against the dimension 1.1.3.6.3 counts for the row: litres for liquids and for compressed or adsorbed gases, kilograms for solids, liquefied/refrigerated/dissolved gases and articles. A mismatch returns no points and says which dimension the entry is counted in. Single-substance form only: sent beside items[] it is refused (INVALID_INPUT) — set it on each item."
    • changedInput schema / properties / variant_index / description
      Previous value: -"ADR Table A variant index (as returned by adr_lookup) — pins one row when a UN has several variants that share a packing group (e.g. concentration bands). Ignored for single-row UNs."New value: +"ADR Table A variant index (as returned by adr_lookup) — pins one row when a UN has several variants that share a packing group (e.g. concentration bands). Ignored for single-row UNs. Single-substance form only: sent beside items[] it is refused (INVALID_INPUT) — set it on each item."
  21. Changed4 schema fields changed
    • addedInput schema / properties / basis
      Added value: +{
      +  "description": "OPTIONAL. 'net' or 'gross'. ADR 1.1.3.6.3 counts the dangerous goods themselves, never the packaging, so a figure declared 'gross' returns no points in ANY unit — send the net quantity instead.",
      +  "enum": [
      +    "net",
      +    "gross"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / items / items / properties / basis
      Added value: +{
      +  "description": "OPTIONAL. 'net' or 'gross'. ADR 1.1.3.6.3 counts the dangerous goods themselves, never the packaging, so a figure declared 'gross' returns no points in ANY unit — send the net quantity instead.",
      +  "enum": [
      +    "net",
      +    "gross"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / items / items / properties / unit
      Added value: +{
      +  "description": "OPTIONAL. The dimension `quantity` is stated in — 'L' or 'kg'. Omit it and the number is taken as already on the ADR 1.1.3.6.3 basis (the historical contract). Supply it and it is CHECKED against the dimension 1.1.3.6.3 counts for the row: litres for liquids and for compressed or adsorbed gases, kilograms for solids, liquefied/refrigerated/dissolved gases and articles. A mismatch returns no points and says which dimension the entry is counted in.",
      +  "enum": [
      +    "L",
      +    "kg"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / unit
      Added value: +{
      +  "description": "OPTIONAL. The dimension `quantity` is stated in — 'L' or 'kg'. Omit it and the number is taken as already on the ADR 1.1.3.6.3 basis (the historical contract). Supply it and it is CHECKED against the dimension 1.1.3.6.3 counts for the row: litres for liquids and for compressed or adsorbed gases, kilograms for solids, liquefied/refrigerated/dissolved gases and articles. A mismatch returns no points and says which dimension the entry is counted in.",
      +  "enum": [
      +    "L",
      +    "kg"
      +  ],
      +  "type": "string"
      +}
  22. Changed2 schema fields changed
    • addedInput schema / properties / items / items / properties / quantity / description
      Added value: +"Quantity on the ADR 1.1.3.6.3 basis: net kg for solids and liquefied, refrigerated or dissolved gases; litres for liquids; receptacle water capacity in litres for compressed or adsorbed gases and chemicals under pressure; articles as the mass of the articles without their packagings, in kg."
    • changedInput schema / properties / quantity / description
      Previous value: -"Quantity in kg/L"New value: +"Quantity on the ADR 1.1.3.6.3 basis: net kg for solids and liquefied, refrigerated or dissolved gases; litres for liquids; receptacle water capacity in litres for compressed or adsorbed gases and chemicals under pressure; articles as the mass of the articles without their packagings, in kg."
  23. Changed5 schema fields changed
    • addedOutput schema / properties / _source / properties / authority_current_edition
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / _source / properties / checked_at
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / _source / properties / dataset_edition
      Added value: +{
      +  "type": "string"
      +}
    • removedOutput schema / properties / envelope_version / const
      Removed value: -"1"
    • addedOutput schema / properties / envelope_version / enum
      Added value: +[
      +  "1",
      +  "1.1"
      +]
  24. Changed4 schema fields changed
    • addedInput schema / properties / items / items / properties / packing_group
      Added value: +{
      +  "description": "Packing group for a multi-variant UN.",
      +  "enum": [
      +    "I",
      +    "II",
      +    "III"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / items / items / properties / variant_index
      Added value: +{
      +  "description": "ADR Table A variant index for a multi-variant UN.",
      +  "maximum": 9007199254740991,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedInput schema / properties / packing_group
      Added value: +{
      +  "description": "Packing group (I, II or III) — only needed to disambiguate a UN that has more than one ADR Table A row (e.g. UN 1789). Ignored for single-row UNs.",
      +  "enum": [
      +    "I",
      +    "II",
      +    "III"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / variant_index
      Added value: +{
      +  "description": "ADR Table A variant index (as returned by adr_lookup) — pins one row when a UN has several variants that share a packing group (e.g. concentration bands). Ignored for single-row UNs.",
      +  "maximum": 9007199254740991,
      +  "minimum": 0,
      +  "type": "integer"
      +}
  25. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": false,
      +  "properties": {
      +    "_source": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "checked": {
      +          "type": "string"
      +        },
      +        "name": {
      +          "type": "string"
      +        },
      +        "provenance_status": {
      +          "enum": [
      +            "verified",
      +            "pending-verification",
      +            "computed",
      +            "live"
      +          ],
      +          "type": "string"
      +        },
      +        "source_url": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "name",
      +        "checked",
      +        "provenance_status"
      +      ],
      +      "type": "object"
      +    },
      +    "blocking_errors": {
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "code": {
      +            "type": "string"
      +          },
      +          "message": {
      +            "type": "string"
      +          },
      +          "recovery": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "action": {
      +                "type": "string"
      +              },
      +              "params": {
      +                "additionalProperties": {},
      +                "propertyNames": {
      +                  "type": "string"
      +                },
      +                "type": "object"
      +              },
      +              "tool": {
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "action"
      +            ],
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "code",
      +          "message",
      +          "recovery"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "citation": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "qualifier": {
      +          "type": "string"
      +        },
      +        "text": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "text"
      +      ],
      +      "type": "object"
      +    },
      +    "confidence": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "basis": {
      +          "enum": [
      +            "deterministic",
      +            "provenance",
      +            "match_quality",
      +            "freshness"
      +          ],
      +          "type": "string"
      +        },
      +        "level": {
      +          "enum": [
      +            "high",
      +            "medium",
      +            "low"
      +          ],
      +          "type": "string"
      +        },
      +        "score": {
      +          "maximum": 1,
      +          "minimum": 0,
      +          "type": "number"
      +        }
      +      },
      +      "required": [
      +        "level",
      +        "basis"
      +      ],
      +      "type": "object"
      +    },
      +    "envelope_version": {
      +      "const": "1",
      +      "type": "string"
      +    },
      +    "normalized_input": {
      +      "additionalProperties": {},
      +      "propertyNames": {
      +        "type": "string"
      +      },
      +      "type": "object"
      +    },
      +    "ok": {
      +      "type": "boolean"
      +    },
      +    "result": {
      +      "additionalProperties": {},
      +      "propertyNames": {
      +        "type": "string"
      +      },
      +      "type": "object"
      +    },
      +    "validity": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "as_of": {
      +          "type": "string"
      +        },
      +        "effective_from": {
      +          "type": "string"
      +        },
      +        "effective_to": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        }
      +      },
      +      "required": [
      +        "as_of"
      +      ],
      +      "type": "object"
      +    },
      +    "warnings": {
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "code": {
      +            "type": "string"
      +          },
      +          "details": {
      +            "additionalProperties": {},
      +            "propertyNames": {
      +              "type": "string"
      +            },
      +            "type": "object"
      +          },
      +          "message": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "code",
      +          "message"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "required": [
      +    "envelope_version",
      +    "ok",
      +    "result",
      +    "confidence",
      +    "_source",
      +    "citation"
      +  ],
      +  "type": "object"
      +}
  26. Changed4 schema fields changed
    • addedInput schema / properties / items / items / properties / un_number / description
      Added value: +"UN number (4 digits, optionally \"UN\"-prefixed)"
    • addedInput schema / properties / items / items / properties / un_number / pattern
      Added value: +"^(UN)?\\d{4}$"
    • changedInput schema / properties / un_number / description
      Previous value: -"UN number for single check"New value: +"UN number for single check (4 digits, optionally \"UN\"-prefixed)"
    • addedInput schema / properties / un_number / pattern
      Added value: +"^(UN)?\\d{4}$"
  27. First observed

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, but the description adds substantial behavior: a deterministic calculation over reference data, rate limiting with reset_at, NOT_FOUND blocking errors, refusal of unknown fields by name with 400s, exempt/total_points staying null rather than defaulting to false, and the deliberate conservative treatment of mixed loads. This is well beyond what the annotations supply.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

There is a strong front-loaded opening sentence, but the body sprawls across many long paragraphs and the "Returns:" section enumerates output fields that the existing output schema already defines, so those sentences do not earn their place. The ADR 2027 / transitional-measure material is relevant but repeated in several places (basis, Editions, transitional_1_6_1_61/1_1_1), making the text far larger than an agent needs to select and call the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex, deeply nested 11-parameter calculator with an output schema, the description covers every ambiguity an agent would hit: multi-variant UN resolution, withheld lines and null verdicts, ID-prefixed air-only lines, gross-vs-net basis, edition/as_of selection and transitional measures, plus limitations. Nothing material to a correct call is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds cross-parameter meaning the schema cannot: un_number/quantity and items[] are mutually exclusive and every single-substance field sent beside items[] is refused by name, un_number also accepts an ID-prefixed air-only number, quantity 0 means not carried, and packing_group can resolve by equivalence when rows agree. Dense enough to raise it above baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource: "Calculate ADR 1.1.3.6 'small load' exemption points for a dangerous-goods load and say whether it qualifies." It is clearly distinguishable from siblings, naming adr_lookup for per-substance data and adr_lq_eq_check for the LQ/EQ relief routes instead of 1.1.3.6.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use and when-not: 1.1.3.6 relieves goods carried in packages only, not bulk or tanks; category 0 substances can never use the exemption; LQ/EQ loads belong to adr_lq_eq_check; ambiguous UNs require adr_lookup for variant_index. Alternative routes and exclusions are stated outright rather than inferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.