---
title: "ADR Limited & Excepted Quantity Checker"
method: POST
path: "/api/adr/lq-check"
tags: ["Reference Data", "ADR"]
---

# ADR Limited & Excepted Quantity Checker

`POST /api/adr/lq-check`

## Request

- Base URL: `https://www.freightutils.com`
- URL: `https://www.freightutils.com/api/adr/lq-check`
- Auth: none declared

Check whether dangerous goods items qualify for ADR Limited Quantity (Chapter 3.4) or Excepted Quantity (Chapter 3.5) concessions. Returns per-item pass/fail against ADR Table A limits.

## Request body

- object
  - `mode` 'lq' | 'eq': Check mode — 'lq' for Limited Quantity (Ch 3.4) or 'eq' for Excepted Quantity (Ch 3.5)
  - `items` object[], required
    - `un_number` string, required: UN number (1-4 digits)
    - `quantity` number, required: Quantity per inner packaging
    - `unit` 'ml' | 'L' | 'g' | 'kg': Unit of measure
    - `inner_packaging_qty` number: Inner packagings in one outer packaging (EQ mode only) — a whole number of 1 or more; omitted means 1. Anything else, such as 0, -20 or 16.5, is refused with 400.
    - `packing_group` 'I' | 'II' | 'III': Packing group — only needed for a UN number with more than one ADR Table A row (e.g. UN 1789); ignored for single-row UNs. Without it that line is withheld while its siblings are answered. Enough alone when the rows it leaves agree on the verdict fields (UN 1790 PG I).
    - `variant_index` integer: ADR Table A variant index (as returned by /api/adr) — pins one row when a UN number has several variants sharing a packing group (concentration bands). Ignored for single-row UN numbers.

## Response `200`

LQ/EQ per-item status. Multi-variant UN without packing_group: all items ambiguous = human_review_required + blocking_errors[AMBIGUOUS_UN_VARIANT] + candidates[], no verdict; a mixed batch withholds that item only and overall_status never reads qualifies. Agreeing rows resolve (equivalent_variants).

- object
  - `blocking_errors` object[]: Present only on the all-ambiguous 200 (no verdict, no items): [{ code: AMBIGUOUS_UN_VARIANT, message, recovery }], one per item, in the plain body too. recovery.params never pick a row (sent unchanged: asked again); pick from candidates[], send packing_group or variant_index on the item.
    - `code` string
    - `message` string
    - `recovery` object
  - `mode` 'lq' | 'eq'
  - `overall_status` 'qualifies' | 'does_not_qualify' | 'partial' | 'not_applicable' | 'inconclusive': not_applicable = every item is NOT SUBJECT TO ADR (Table A scope flag) — LQ/EQ provisions do not apply. inconclusive = every in-scope item could not be compared (see items[].status). A batch holding ANY inconclusive or withheld item never reads qualifies.
  - `items` object[]
    - `un_number` string
    - `variant_index` integer, nullable: The resolved ADR Table A variant index for this row. Null on a withheld item.
    - `substance` string, nullable
    - `class` string
    - `packing_group` string, nullable
    - `lq_limit` string, nullable
    - `lq_limit_value` number, nullable
    - `lq_limit_unit` string, nullable
    - `eq_code` string, nullable
    - `quantity_entered` number
    - `unit_entered` string
    - `status` 'within_limit' | 'exceeds_limit' | 'not_permitted' | 'not_subject' | 'inconclusive' | 'withheld': not_subject = outside ADR scope. inconclusive = column (7a) limit and quantity in different unit families (mass vs volume); ADR states no density — resend in lq_limit_unit. withheld = the UN has several Table A rows and none was pinned; row fields null, its rows under candidates[].
    - `reason` string
    - `withheld` boolean: Present and true on a withheld item.
    - `ambiguity_reason` 'multiple_variants' | 'packing_group_collision' | 'no_matching_variant': Why the withheld item could not be pinned. Present only with withheld.
    - `equivalent_variants` object[]: Present when the supplied packing_group left several Table A rows that agree on class, column (7a), column (7b) and scope: the rows this verdict holds for. The row fields above are the first one's.
      - `variant_index` integer
      - `proper_shipping_name` string
    - `variant_note` string: Plain-language statement of the equivalence. Present only with equivalent_variants.
    - `not_subject_to_adr` boolean: Present and true for a Table A NOT SUBJECT TO ADR row.
    - `carriage_prohibited` boolean: Present and true for a Table A CARRIAGE PROHIBITED row (status not_permitted).
    - `conditions_ref` string: ADR section whose carriage conditions still apply (e.g. 5.5.3).
  - `summary` object
    - `total_items` integer
    - `qualifying` integer
    - `exceeding` integer
    - `not_permitted` integer
    - `not_subject` integer: Count of out-of-scope items. Emitted only when non-zero.
    - `inconclusive` integer: Count of items that could not be compared (unit family mismatch). Emitted only when non-zero.
    - `withheld` integer: Count of items withheld for an unpinned multi-variant UN. Emitted only when non-zero.
  - `references` object
    - `adr_chapter` string
    - `table` string
  - `human_review_required` boolean: Present and true when at least one item is withheld. candidates[] then lists that item's rows.
  - `candidates` object[]: The withheld items' candidate Table A rows, each tagged with the item_index and un_number they belong to. Present only with human_review_required.
    - `item_index` integer
    - `un_number` string
    - `variant_index` integer
    - `packing_group` string, nullable
    - `proper_shipping_name` string
    - `limited_quantity` string, nullable
    - `excepted_quantity` string, nullable

## Other responses

- `400`: Invalid or missing parameters — e.g. a quantity that is not a positive number, an unknown unit, or a field the route does not read (refused by name with the accepted ones listed, never ignored). The error names what arrived.
- `405`: Use POST with a JSON body.

---

[API](https://skmtc.dev/freightutils/apis/freightutils-api.md) · [All operations](https://skmtc.dev/freightutils/apis/freightutils-api/llms.txt) · [OpenAPI document](https://skmtc.dev/freightutils/apis/freightutils-api/revisions/6607bb3cea90?raw)
