{
  "info": {
    "name": "FreightUtils API",
    "description": "Free freight calculation and reference data APIs. No authentication required.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://www.freightutils.com",
      "type": "string"
    }
  ],
  "item": [
    {
      "name": "Calculators",
      "item": [
        {
          "name": "LDM Calculator",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/api/ldm?pallet=euro&qty=12&vehicle=artic",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "ldm"
              ],
              "query": [
                {
                  "key": "pallet",
                  "value": "euro",
                  "description": "Pallet preset: euro, uk, half, quarter"
                },
                {
                  "key": "qty",
                  "value": "12",
                  "description": "Number of pallets — a whole number (2.5 or 1e+21 is refused with 400, never rounded)"
                },
                {
                  "key": "vehicle",
                  "value": "artic",
                  "description": "Vehicle type: artic, rigid10 (DEPRECATED — removal in 3.0.0; still answers, returns a DEPRECATED advisory in warnings[]; use custom or artic), rigid75, luton, us53, us48, custom Any other value is refused with 400."
                }
              ]
            },
            "description": "For vehicle=custom, add vehicle_length (the load length in metres, greater than 0): fits and utilisation are measured against it."
          }
        },
        {
          "name": "CBM Calculator",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/api/cbm?l=120&w=80&h=100&pcs=5",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "cbm"
              ],
              "query": [
                {
                  "key": "l",
                  "value": "120",
                  "description": "Length in cm"
                },
                {
                  "key": "w",
                  "value": "80",
                  "description": "Width in cm"
                },
                {
                  "key": "h",
                  "value": "100",
                  "description": "Height in cm"
                },
                {
                  "key": "pcs",
                  "value": "5",
                  "description": "Number of pieces — a whole number (2.5 or 1e+21 is refused with 400, never rounded)"
                }
              ]
            }
          }
        },
        {
          "name": "Chargeable Weight",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/api/chargeable-weight?l=120&w=80&h=100&gw=500&pcs=2&factor=6000",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "chargeable-weight"
              ],
              "query": [
                {
                  "key": "l",
                  "value": "120",
                  "description": "Length in cm"
                },
                {
                  "key": "w",
                  "value": "80",
                  "description": "Width in cm"
                },
                {
                  "key": "h",
                  "value": "100",
                  "description": "Height in cm"
                },
                {
                  "key": "gw",
                  "value": "500",
                  "description": "Gross weight in kg of ALL pieces together (the total, not one piece); l/w/h are per piece"
                },
                {
                  "key": "pcs",
                  "value": "2",
                  "description": "Number of pieces — a whole number (2.5 or 1e+21 is refused with 400, never rounded)"
                },
                {
                  "key": "factor",
                  "value": "6000",
                  "description": "Volumetric divisor, a whole number (6000 IATA; 5000 express)"
                }
              ]
            }
          }
        },
        {
          "name": "Consignment Calculator",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/consignment",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "consignment"
              ]
            },
            "body": {
              "mode": "raw",
              "options": {
                "raw": {
                  "language": "json"
                }
              },
              "raw": "{\n  \"mode\": \"air\",\n  \"lines\": [\n    { \"quantity\": 4, \"dims\": { \"l\": 120, \"w\": 80, \"h\": 100, \"unit\": \"cm\" }, \"weight\": { \"value\": 300, \"unit\": \"kg\" } },\n    { \"quantity\": 10, \"dims\": { \"l\": 60, \"w\": 40, \"h\": 50, \"unit\": \"cm\" }, \"weight\": { \"value\": 15, \"unit\": \"kg\" } }\n  ]\n}"
            },
            "description": "Multi-item consignment — total CBM, loading metres, volumetric and mode-specific chargeable weight, plus advisory flags. Send canonical 'lines' (dims {l,w,h,unit}, weight {value,unit}) or the legacy flat 'items' array. Canonical schema: /schema/consignment.v1.json"
          }
        },
        {
          "name": "Pallet Fitting",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/api/pallet?pl=120&pw=80&pmh=220&bl=40&bw=30&bh=25",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "pallet"
              ],
              "query": [
                {
                  "key": "pl",
                  "value": "120",
                  "description": "Pallet length in cm"
                },
                {
                  "key": "pw",
                  "value": "80",
                  "description": "Pallet width in cm"
                },
                {
                  "key": "pmh",
                  "value": "220",
                  "description": "Max stack height in cm"
                },
                {
                  "key": "bl",
                  "value": "40",
                  "description": "Box length in cm"
                },
                {
                  "key": "bw",
                  "value": "30",
                  "description": "Box width in cm"
                },
                {
                  "key": "bh",
                  "value": "25",
                  "description": "Box height in cm"
                }
              ]
            }
          }
        },
        {
          "name": "Unit Converter",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/api/convert?value=100&from=kg&to=lbs",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "convert"
              ],
              "query": [
                {
                  "key": "value",
                  "value": "100",
                  "description": "Value to convert"
                },
                {
                  "key": "from",
                  "value": "kg",
                  "description": "Source unit"
                },
                {
                  "key": "to",
                  "value": "lbs",
                  "description": "Target unit"
                }
              ]
            }
          }
        },
        {
          "name": "Emissions Calculator",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/api/emissions?mass=10&mass_unit=tonnes&distance_km=500&mode=road&region=uk&basis=wtw",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "emissions"
              ],
              "query": [
                {
                  "key": "mass",
                  "value": "10",
                  "description": "Shipment mass (in mass_unit)"
                },
                {
                  "key": "mass_unit",
                  "value": "tonnes",
                  "description": "kg | tonnes (default kg)"
                },
                {
                  "key": "distance_km",
                  "value": "500",
                  "description": "Distance in km (caller-provided)"
                },
                {
                  "key": "mode",
                  "value": "road",
                  "description": "road | rail | sea | air | inland_waterway"
                },
                {
                  "key": "region",
                  "value": "uk",
                  "description": "uk=DEFRA | us=EPA | fr=ADEME (default per-mode)"
                },
                {
                  "key": "basis",
                  "value": "wtw",
                  "description": "wtw (default) | ttw"
                }
              ]
            },
            "description": "Estimate freight CO2e (kgCO2e) using the ISO 14083 / GLEC distance-based method — mass × distance × open factor (DEFRA/EPA/ADEME). Provide actual gross mass, not chargeable/volumetric weight. Returns WTW + TTW, the factor used, mass_basis, empty_running (fleet-average factor already includes empty running), representativeness (sea/air = low), a human-readable summary, and _source (incl. factor.last_verified)."
          }
        }
      ]
    },
    {
      "name": "Reference Data",
      "item": [
        {
          "name": "ADR Lookup — by UN number",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/api/adr?un=1203",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "adr"
              ],
              "query": [
                {
                  "key": "un",
                  "value": "1203",
                  "description": "UN number — 1203, UN1203 or UN 1203"
                }
              ]
            }
          }
        },
        {
          "name": "ADR Lookup — by name",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/api/adr?search=acetone",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "adr"
              ],
              "query": [
                {
                  "key": "search",
                  "value": "acetone",
                  "description": "Search term"
                }
              ]
            }
          }
        },
        {
          "name": "ADR 1.1.3.6 Calculator",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/api/adr-calculator?un=1203&qty=200",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "adr-calculator"
              ],
              "query": [
                {
                  "key": "un",
                  "value": "1203",
                  "description": "UN number — or an ID-prefixed air-only number (e.g. ID8000), routed AIR_ONLY_ID with nothing counted under 1.1.3.6"
                },
                {
                  "key": "qty",
                  "value": "200",
                  "description": "Quantity in kg or litres"
                },
                {
                  "key": "packing_group",
                  "value": "III",
                  "description": "Optional — I/II/III. Only needed to disambiguate a UN with more than one ADR Table A row (e.g. 1789). Without it, a multi-variant UN returns blocking_errors[AMBIGUOUS_UN_VARIANT] + human_review_required + candidates[] (no verdict).",
                  "disabled": true
                },
                {
                  "key": "variant_index",
                  "value": "0",
                  "description": "Optional — ADR Table A variant index (from /api/adr). Pins one row when variants share a packing group.",
                  "disabled": true
                }
              ]
            },
            "description": "ADR 1.1.3.6 small-load check for one line of dangerous goods carried in packages: quantity × transport-category multiplier within 1,000 points (1.1.3.6.4) and within that category's 1.1.3.6.3 maximum; category 0 never qualifies. Every line carries state — COUNTED, AIR_ONLY_ID, NOT_SUBJECT_TO_ADR or BLOCKED. A multi-variant UN without packing_group returns blocking_errors[AMBIGUOUS_UN_VARIANT] + human_review_required + candidates[] (no verdict). A parameter the calculator does not read (e.g. quantity_basis, Unit, un_number) is refused with HTTP 400 naming it and listing the accepted ones — never ignored. Send the API key in the X-API-Key header."
          }
        },
        {
          "name": "ADR 1.1.3.6 Calculator (load)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/api/adr-calculator",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "adr-calculator"
              ]
            },
            "body": {
              "mode": "raw",
              "options": {
                "raw": {
                  "language": "json"
                }
              },
              "raw": "{\n  \"items\": [\n    { \"un_number\": \"1203\", \"quantity\": 200 },\n    { \"un_number\": \"1263\", \"quantity\": 100, \"packing_group\": \"III\" },\n    { \"un_number\": \"ID 8000\", \"quantity\": 10 }\n  ]\n}"
            },
            "description": "A mixed load: 200 L petrol (category 2, 600 points), 100 L paint packing group III (category 3, 100 points) and an ID 8000 line (air-only: no ADR Table A entry, state AIR_ONLY_ID, nothing counted — the line carries the limited-quantity condition that rests on). Every field of a line goes on that line: un_number, quantity, packing_group, variant_index, unit or basis sent beside items[] is refused with HTTP 400 naming the field. Any other key — on an item (quantity_basis, quantity_unit, Unit) or beside items[] (UN_NUMBER, unNumber) — is refused with HTTP 400 naming it, never ignored."
          }
        },
        {
          "name": "Airlines — by AWB prefix",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/api/airlines?prefix=176",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "airlines"
              ],
              "query": [
                {
                  "key": "prefix",
                  "value": "176",
                  "description": "AWB prefix number"
                }
              ]
            }
          }
        },
        {
          "name": "Airlines — by name",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/api/airlines?q=emirates",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "airlines"
              ],
              "query": [
                {
                  "key": "q",
                  "value": "emirates",
                  "description": "Airline name search"
                }
              ]
            }
          }
        },
        {
          "name": "HS Code Lookup",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/api/hs?q=coffee",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "hs"
              ],
              "query": [
                {
                  "key": "q",
                  "value": "coffee",
                  "description": "Search term or HS code"
                }
              ]
            }
          }
        },
        {
          "name": "INCOTERMS — single term",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/api/incoterms?code=FOB",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "incoterms"
              ],
              "query": [
                {
                  "key": "code",
                  "value": "FOB",
                  "description": "INCOTERM code"
                }
              ]
            }
          }
        },
        {
          "name": "Container Specs",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/api/containers",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "containers"
              ]
            }
          }
        },
        {
          "name": "Identifier Validator",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/api/validate?value=020-58717481&type=awb",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "validate"
              ],
              "query": [
                {
                  "key": "value",
                  "value": "020-58717481",
                  "description": "A single identifier to validate (typed mode); requires type"
                },
                {
                  "key": "type",
                  "value": "awb",
                  "description": "container | awb | imo"
                },
                {
                  "key": "text",
                  "value": "CSQU3054383 on IMO9074729",
                  "description": "OR pass an arbitrary string to find + validate all identifiers (parse mode)",
                  "disabled": true
                }
              ]
            },
            "description": "Validate freight-identifier check digits (container ISO 6346, AWB IATA mod-7, IMO ship number) or parse a string to find them. Structural validation only — well-formed, not proof the entity exists."
          }
        },
        {
          "name": "ICS2 Stop-Words Checker",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/api/ics2-check?description=general cargo",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "ics2-check"
              ],
              "query": [
                {
                  "key": "description",
                  "value": "general cargo",
                  "description": "Goods description to check against the EU ICS2 stop-words list"
                }
              ]
            },
            "description": "Flag EU ICS2 unacceptable goods-description terms (stop-words) in a description. Reference check only — not an ENS filing; the list is non-exhaustive and clean does not guarantee acceptance."
          }
        },
        {
          "name": "Airport Lookup — by IATA code",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/api/airports?iata=LHR",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "airports"
              ],
              "query": [
                {
                  "key": "iata",
                  "value": "LHR",
                  "description": "3-letter IATA code (or use icao / q)"
                }
              ]
            }
          }
        },
        {
          "name": "Nearest Airport — by coordinate",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/api/nearest-airport?lat=51.47&lon=-0.46&max_results=5",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "nearest-airport"
              ],
              "query": [
                {
                  "key": "lat",
                  "value": "51.47",
                  "description": "Latitude (-90..90)"
                },
                {
                  "key": "lon",
                  "value": "-0.46",
                  "description": "Longitude (-180..180)"
                },
                {
                  "key": "max_results",
                  "value": "5",
                  "description": "Max results (1-50, default 10)"
                }
              ]
            }
          }
        },
        {
          "name": "Resolve Reference — UN1845 (dry ice)",
          "request": {
            "method": "GET",
            "url": {
              "raw": "{{baseUrl}}/api/resolve?q=UN1845",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "api",
                "resolve"
              ],
              "query": [
                {
                  "key": "q",
                  "value": "UN1845",
                  "description": "One freight identifier — UN number, AWB prefix, IATA/ICAO, UN/LOCODE, container number, HS code, Incoterm, tunnel code, ULD serial, or ISO container type"
                }
              ]
            }
          }
        }
      ]
    },
    {
      "name": "ADR LQ/EQ Check — UN 1203, 0.5 L (LQ)",
      "request": {
        "method": "POST",
        "header": [
          {
            "key": "Content-Type",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{baseUrl}}/api/adr/lq-check",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "api",
            "adr",
            "lq-check"
          ]
        },
        "description": "Limited Quantity / Excepted Quantity eligibility for mixed DG consignments (ADR 3.4 / 3.5). Reference comparison against published limits — not a compliance certification. A UN number with more than one ADR Table A row (e.g. 1789) needs an optional per-item packing_group (I/II/III) or variant_index (from /api/adr) to pin one row — otherwise the response is human_review_required + candidates[] with no verdict. The example below shows a single-row UN plus a disambiguated multi-variant UN. A field the check does not read (e.g. inner_packagings, units, Mode) is refused with HTTP 400 naming it and suggesting the accepted name — never ignored. In EQ mode, inner_packaging_qty is the number of inner packagings in one outer packaging — a whole number of 1 or more (omitted = 1); 0, -20 or 16.5 is refused with 400.",
        "body": {
          "mode": "raw",
          "raw": "{\n  \"mode\": \"lq\",\n  \"items\": [\n    {\n      \"un_number\": \"1203\",\n      \"quantity\": 0.5,\n      \"unit\": \"L\"\n    },\n    {\n      \"un_number\": \"1789\",\n      \"quantity\": 3,\n      \"unit\": \"L\",\n      \"variant_index\": 1\n    }\n  ]\n}",
          "options": {
            "raw": {
              "language": "json"
            }
          }
        }
      },
      "response": []
    },
    {
      "name": "UK Duty & VAT — coffee from BR",
      "request": {
        "method": "POST",
        "header": [
          {
            "key": "Content-Type",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{baseUrl}}/api/duty",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "api",
            "duty"
          ]
        },
        "description": "UK import duty + VAT estimate from the live GOV.UK Trade Tariff API. Estimate only, not a customs ruling. commodity_code is a declarable 10-digit code (spaces allowed); a 6- or 8-digit code is refused with 400 and declarable_codes, the 10-digit codes beneath it — never padded with zeros. origin_country must be ISO 3166-1 alpha-2. customs_value must be above 0; freight_cost and insurance_cost are 0 or more — a negative or non-numeric value is refused with 400.",
        "body": {
          "mode": "raw",
          "raw": "{\n  \"commodity_code\": \"0901110000\",\n  \"origin_country\": \"BR\",\n  \"customs_value\": 1000,\n  \"freight_cost\": 150,\n  \"insurance_cost\": 20\n}",
          "options": {
            "raw": {
              "language": "json"
            }
          }
        }
      },
      "response": []
    },
    {
      "name": "ULD Types — AKE (LD3)",
      "request": {
        "method": "GET",
        "header": [],
        "url": {
          "raw": "{{baseUrl}}/api/uld?type=AKE",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "api",
            "uld"
          ],
          "query": [
            {
              "key": "type",
              "value": "AKE"
            }
          ]
        },
        "description": "Air-cargo unit load device specs by ULD code."
      },
      "response": []
    },
    {
      "name": "UN/LOCODE — NLRTM (Rotterdam)",
      "request": {
        "method": "GET",
        "header": [],
        "url": {
          "raw": "{{baseUrl}}/api/unlocode?code=NLRTM",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "api",
            "unlocode"
          ],
          "query": [
            {
              "key": "code",
              "value": "NLRTM"
            }
          ]
        },
        "description": "Transport location lookup by 5-character UN/LOCODE."
      },
      "response": []
    },
    {
      "name": "Vehicle Types — standard curtainsider",
      "request": {
        "method": "GET",
        "header": [],
        "url": {
          "raw": "{{baseUrl}}/api/vehicles?slug=standard-curtainsider",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "api",
            "vehicles"
          ],
          "query": [
            {
              "key": "slug",
              "value": "standard-curtainsider"
            }
          ]
        },
        "description": "Road-freight vehicle/trailer specifications (dimensions, payload, pallet capacity)."
      },
      "response": []
    },
    {
      "name": "Shipment Summary — composite, one call",
      "request": {
        "method": "POST",
        "header": [
          {
            "key": "Content-Type",
            "value": "application/json"
          }
        ],
        "url": {
          "raw": "{{baseUrl}}/api/shipment/summary",
          "host": [
            "{{baseUrl}}"
          ],
          "path": [
            "api",
            "shipment",
            "summary"
          ]
        },
        "description": "Composite: chains CBM, LDM, chargeable weight and (when UN numbers/HS codes are supplied) ADR + duty context in one response. A field the summary does not read — in the body, on an item, in origin / destination or options — is refused with HTTP 400 naming it, and so is one field sent under two names (un_number and unNumber).",
        "body": {
          "mode": "raw",
          "raw": "{\n  \"mode\": \"road\",\n  \"items\": [\n    {\n      \"length\": 120,\n      \"width\": 80,\n      \"height\": 100,\n      \"weight\": 250,\n      \"quantity\": 10,\n      \"stackable\": false\n    }\n  ]\n}",
          "options": {
            "raw": {
              "language": "json"
            }
          }
        }
      },
      "response": []
    }
  ]
}
