FreightUtils · Schema

ContainerSpec

CompanyLogisticsFreightData

Properties

Name Type Description
name string Container type name.
slug string URL-friendly identifier.
internal_length_cm number Internal length in cm.
internal_width_cm number Internal width in cm.
internal_height_cm numbernull Internal height in cm. NULL on open decks (flat racks) — no roof, so no bounding height. Read height_basis to learn what a null means. Never 0: a zero here would make a length x width x height calcula
external_length_cm number External length in cm.
external_width_cm number External width in cm.
external_height_cm number External height in cm.
door_width_cm numbernull Door opening width in cm.
door_height_cm numbernull Door opening height in cm.
capacity_cbm numbernull Internal volume in CBM. NULL on open decks (flat racks), which have no roof and no side walls and therefore no cubic capacity — read capacity_basis, and use deck_area_sqm instead. Never 0.
tare_weightKg number Empty container weight in kg.
max_gross_kg number Maximum gross weight in kg.
max_payload_kg number Maximum cargo weight in kg.
euro_pallets string DEPRECATED — use euro_pallets_min / euro_pallets_max. A string, and sometimes an EN-DASH range such as "23–24", so Number() returns NaN and parseInt() silently discards the upper bound. Kept unchanged
gma_pallets string DEPRECATED — use gma_pallets_min / gma_pallets_max. A numeric value stored as a string. Kept unchanged for back-compat and now derived from the numeric pair. Will be removed in a future major version.
euro_pallets_min integer EUR pallets (1200x800mm) that fit — the conservative figure. Always numeric. Replaces euro_pallets.
euro_pallets_max integernull Upper bound when the achievable EUR-pallet count is genuinely a range (depends on overhang tolerance and whether the last row is turned). Null when the figure is exact.
gma_pallets_min integer GMA pallets (48x40in) that fit — the conservative figure. Always numeric. Replaces gma_pallets.
gma_pallets_max integernull Upper bound when the GMA-pallet count is a range; null when exact.
deck_area_sqm numbernull Deck area in m² — the meaningful capacity figure for an open deck (flat racks), where a cubic capacity does not exist. Null on enclosed containers.
pallet_capacity_basis string Which constraint the pallet counts express. Container counts are 'industry-convention' because published figures assume a pinwheel load and exceed an aligned-row tiling of the same floor.
height_basis string What internal_height_cm means, INCLUDING what a null means. 'unbounded-open-top' = no roof, so no height constraint exists (flat racks; height is null). 'constrained-removable-roof' = a real roof-fitt
open_top boolean Affirmative physical fact: the unit has no fixed roof. NOT the discriminator for what a null height means — read height_basis for that.
capacity_basis string What capacity_cbm is. Carrier-published capacities do NOT equal length x width x height, so an agent computing volume from dimensions and an agent reading capacity_cbm will differ; this says which fig
max_gross_basis string Which authority max_gross_kg comes from. 'iso-668-series-1' is a regulatory ceiling and is frequently LOWER than what carriers actually operate — where it applies, max_payload_kg (derived as max gross
description string Container description.
notes string Usage notes.
tare_weight_kg number Tare (empty) weight in kg.
fu_id object
fu_version_id object
View JSON Schema on GitHub

JSON Schema

freightutils-com-container-spec-schema.json Raw ↑
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/freightutils-com/json-schema/freightutils-com-container-spec-schema.json",
  "title": "ContainerSpec",
  "x-generated": "2026-11-09",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/freightutils-com-openapi.json#/components/schemas/ContainerSpec",
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Container type name."
    },
    "slug": {
      "type": "string",
      "description": "URL-friendly identifier."
    },
    "internal_length_cm": {
      "type": "number",
      "description": "Internal length in cm."
    },
    "internal_width_cm": {
      "type": "number",
      "description": "Internal width in cm."
    },
    "internal_height_cm": {
      "type": [
        "number",
        "null"
      ],
      "description": "Internal height in cm. NULL on open decks (flat racks) — no roof, so no bounding height. Read height_basis to learn what a null means. Never 0: a zero here would make a length x width x height calculation return zero volume."
    },
    "external_length_cm": {
      "type": "number",
      "description": "External length in cm."
    },
    "external_width_cm": {
      "type": "number",
      "description": "External width in cm."
    },
    "external_height_cm": {
      "type": "number",
      "description": "External height in cm."
    },
    "door_width_cm": {
      "type": [
        "number",
        "null"
      ],
      "description": "Door opening width in cm."
    },
    "door_height_cm": {
      "type": [
        "number",
        "null"
      ],
      "description": "Door opening height in cm."
    },
    "capacity_cbm": {
      "type": [
        "number",
        "null"
      ],
      "description": "Internal volume in CBM. NULL on open decks (flat racks), which have no roof and no side walls and therefore no cubic capacity — read capacity_basis, and use deck_area_sqm instead. Never 0."
    },
    "tare_weightKg": {
      "type": "number",
      "description": "Empty container weight in kg."
    },
    "max_gross_kg": {
      "type": "number",
      "description": "Maximum gross weight in kg."
    },
    "max_payload_kg": {
      "type": "number",
      "description": "Maximum cargo weight in kg."
    },
    "euro_pallets": {
      "type": "string",
      "deprecated": true,
      "description": "DEPRECATED — use euro_pallets_min / euro_pallets_max. A string, and sometimes an EN-DASH range such as \"23–24\", so Number() returns NaN and parseInt() silently discards the upper bound. Kept unchanged for back-compat and now derived from the numeric pair. Will be removed in a future major version."
    },
    "gma_pallets": {
      "type": "string",
      "deprecated": true,
      "description": "DEPRECATED — use gma_pallets_min / gma_pallets_max. A numeric value stored as a string. Kept unchanged for back-compat and now derived from the numeric pair. Will be removed in a future major version."
    },
    "euro_pallets_min": {
      "type": "integer",
      "description": "EUR pallets (1200x800mm) that fit — the conservative figure. Always numeric. Replaces euro_pallets."
    },
    "euro_pallets_max": {
      "type": [
        "integer",
        "null"
      ],
      "description": "Upper bound when the achievable EUR-pallet count is genuinely a range (depends on overhang tolerance and whether the last row is turned). Null when the figure is exact."
    },
    "gma_pallets_min": {
      "type": "integer",
      "description": "GMA pallets (48x40in) that fit — the conservative figure. Always numeric. Replaces gma_pallets."
    },
    "gma_pallets_max": {
      "type": [
        "integer",
        "null"
      ],
      "description": "Upper bound when the GMA-pallet count is a range; null when exact."
    },
    "deck_area_sqm": {
      "type": [
        "number",
        "null"
      ],
      "description": "Deck area in m² — the meaningful capacity figure for an open deck (flat racks), where a cubic capacity does not exist. Null on enclosed containers."
    },
    "pallet_capacity_basis": {
      "type": "string",
      "enum": [
        "floor-positions",
        "weight-limited",
        "industry-convention",
        "unverified"
      ],
      "description": "Which constraint the pallet counts express. Container counts are 'industry-convention' because published figures assume a pinwheel load and exceed an aligned-row tiling of the same floor."
    },
    "height_basis": {
      "type": "string",
      "enum": [
        "unbounded-open-top",
        "constrained-removable-roof",
        "varies-by-configuration",
        "unverified"
      ],
      "description": "What internal_height_cm means, INCLUDING what a null means. 'unbounded-open-top' = no roof, so no height constraint exists (flat racks; height is null). 'constrained-removable-roof' = a real roof-fitted height on a unit whose roof comes off (open tops). Never infer this from open_top."
    },
    "open_top": {
      "type": "boolean",
      "description": "Affirmative physical fact: the unit has no fixed roof. NOT the discriminator for what a null height means — read height_basis for that."
    },
    "capacity_basis": {
      "type": "string",
      "enum": [
        "carrier-published",
        "computed-from-internal-dimensions",
        "not-applicable-open-deck",
        "unverified"
      ],
      "description": "What capacity_cbm is. Carrier-published capacities do NOT equal length x width x height, so an agent computing volume from dimensions and an agent reading capacity_cbm will differ; this says which figure is held. 'not-applicable-open-deck' means capacity_cbm is null because the unit is unbounded."
    },
    "max_gross_basis": {
      "type": "string",
      "enum": [
        "carrier-published",
        "iso-668-series-1",
        "unverified"
      ],
      "description": "Which authority max_gross_kg comes from. 'iso-668-series-1' is a regulatory ceiling and is frequently LOWER than what carriers actually operate — where it applies, max_payload_kg (derived as max gross minus tare) understates usable payload."
    },
    "description": {
      "type": "string",
      "description": "Container description."
    },
    "notes": {
      "type": "string",
      "description": "Usage notes."
    },
    "tare_weight_kg": {
      "type": "number",
      "description": "Tare (empty) weight in kg."
    },
    "fu_id": {
      "$ref": "#/$defs/FuId"
    },
    "fu_version_id": {
      "$ref": "#/$defs/FuVersionId"
    }
  },
  "required": [
    "name",
    "slug",
    "internal_length_cm",
    "internal_width_cm",
    "internal_height_cm",
    "capacity_cbm",
    "tare_weight_kg",
    "max_gross_kg",
    "max_payload_kg",
    "euro_pallets",
    "gma_pallets",
    "euro_pallets_min",
    "gma_pallets_min",
    "pallet_capacity_basis",
    "height_basis",
    "open_top",
    "capacity_basis",
    "max_gross_basis"
  ],
  "$defs": {
    "FuId": {
      "type": "string",
      "pattern": "^fu:[a-z][a-z0-9-]*(?::(?:[A-Za-z0-9._~()+-]|%[0-9A-F]{2})+)+$",
      "description": "Stable, edition-free identifier of this record: fu:<namespace>:<segment>[:<segment>…]. A join key, the same in every edition, kept in an append-only ledger. Not a regulatory reference, a citation or a promise the content never changes. GET /api/resolve?q=<fu_id> returns it."
    },
    "FuVersionId": {
      "type": "string",
      "pattern": "^(fu:[a-z][a-z0-9-]*(?::(?:[A-Za-z0-9._~()+-]|%[0-9A-F]{2})+)+)@([A-Za-z0-9._-]+)$",
      "description": "The identifier of this edition's record: <fu_id>@<edition token>. Present only where the dataset has editions (ADR, HS, UN/LOCODE, airports, Incoterms, ADR codes, ICS2, emission factors); airlines, ULDs, containers, vehicles and pallets have none."
    }
  }
}

Work with this as data

Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for schemas

4 MCP tools reach this
  • find_json_schemasBrowse and filter every JSON Schema in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/freightutils-com-container-spec"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.