CHI Cargo Business Partner API v1
CHI Cargo Group · Enterprise Integration

CHI-Cargo Business Partner API v1

A message-oriented integration interface for air cargo warehouse processes — Air Export and Air Import — built for enterprise customers that work with large, message-based payloads from TMS, forwarding, customs and EDI systems.

POST /v1 Single endpoint Create-or-update JSON over HTTPS

Overview

The CHI-Cargo Business Partner API connects your systems to the CHI Cargo warehouse platform (the CHICARGO WMS) for Air Export and Air Import handling at Frankfurt and the connected stations. It lets you pre-advise cargo, create master and house air waybills, build consolidations, announce truck arrivals and pickups, request warehouse services, and receive operational status messages back from CHI.

The interface is intentionally message-oriented. Instead of many individual REST resources, a single business message can describe many objects and relationships at once — for example one export MAWB together with all of its HAWBs — and be submitted in a single call.

Air Export

Outbound handling

Pre-advise truck arrivals and shipments, create MAWBs and consolidations, attach HAWBs, request services.

Air Import

Inbound handling

Pre-advise inbound masters and house shipments, plan onward pickups, receive break-down confirmations.

Status

Operational feedback

Receive status messages — cargo received, secured, Breakdown completed, picked up — back to your endpoint.

Why a single endpoint

Many enterprise customers integrate through message-based tooling — classic EDI, or no-code converters such as Lobster _data — where one incoming business message is transformed into one outgoing message. In that world, a classical REST API with many endpoints is hard to consume: pre-advising one export MAWB with 50, 100 or 1000 HAWBs would require a long, ordered sequence of individual calls (create master, create each shipment, attach each shipment, create arrivals, attach again, add services).

This API removes that friction. One message carries everything:

  • a data area describing the business objects to create or update, and
  • an actions area describing relationships and processing requests (attach, detach, work items, …).

Authentication & transport

The API accepts UTF-8 encoded JSON over HTTPS and supports the POST method only. The API version is part of the URL path.

POSThttps://api.production.chi-deutschland.cloud/v1
EnvironmentBase URLPurpose
Staginghttps://api.staging.chi-deutschland.cloud/v1Onboarding & all customer testing
Productionhttps://api.production.chi-deutschland.cloud/v1Live traffic after sign-off

API key

Authentication uses a per-customer API key transmitted in the x-chi-api-token request header. Keys are issued by CHI Cargo during onboarding. A staging key is provided first; a production key follows once testing on staging is complete. The staging key remains valid for future tests.

Request headers
POST /v1 HTTP/1.1
Host: api.production.chi-deutschland.cloud 
Content-Type: application/json
x-chi-api-token: <YOUR_API_KEY>
Missing or invalid key

A missing x-chi-api-token header returns 400. An unknown or invalid key returns 401 Unauthorized. See Errors & validation.

Onboarding checklist

  • Provide a technical contact email (and any addresses for update/action notifications).
  • Receive your staging API key and complete integration testing on staging.
  • (Optional) Provide an HTTPS endpoint to receive status messages.
  • Receive your production key and go live.

Message structure

The request body is a single JSON object with two top-level areas, data and actions. Both are optional, and each contains arrays of objects. Unknown properties are rejected (the schema is strict).

Message skeleton
{
  "data": {
    "inbound_masters": [],
    "outbound_masters": [],
    "inbound_shipments": [],
    "outbound_shipments": [],
    "inbound_pickups": [],
    "outbound_arrivals": [],
    "inbound_arrivals": []
  },
  "actions": {
    "attach_shipment": [],
    "detach_shipment": [],
    "attach_shipment_to_arrival": [],
    "add_work_item": [],
    "cancel": []
  }
}
Order within a message

You may send data and actions together in one message. Objects referenced by an action (for example a HAWB being attached) can be created by the data area of the same message.

Data vs. Actions

The split between data and actions is the core mental model of the API.

dataactions
PurposeDescribe business objects (masters, shipments, arrivals, pickups)Apply relationships & processing requests
BehaviourCreate-or-update (idempotent effect)One-time state changes
Updatable later?Yes — re-send to updateNo — undo by sending another action or re-transmitting data
Examplesoutbound_masters, inbound_shipmentsattach_shipment, add_work_item

Every action must state whether it addresses inbound or outbound data via the process_type field.

Create-or-update behaviour

Objects are matched by their natural keys: mawb_number for masters, hawb_number for shipments, and manifest_number for arrivals and pickups. If an object does not yet exist, it is created on first transmission; on subsequent transmissions it is updated.

Only the fields you send are changed. Consider this outbound master:

First message
{
  "data": {
    "outbound_masters": [
      { "mawb_number": "02012345675", "origin": "FRA", "destination": "JFK", "pieces": 10 }
    ]
  }
}

A later message updates only destination; origin and pieces stay unchanged:

Later message (partial update)
{
  "data": {
    "outbound_masters": [
      { "mawb_number": "02012345675", "destination": "ORD" }
    ]
  }
}
Best practice

Only transmit objects that actually changed, and only the fields that changed. Re-sending an identical state is safe (it invokes no change) but creates unnecessary load.

Why this matters for EDI customers

Message-based customers frequently send revised versions of the same business message. The create-or-update model means a corrected pre-advice simply updates the existing master/shipment — no delete-and-recreate choreography required.

Object model

The model has two object families — inbound (import) and outbound (export) — plus process-specific truck-manifest objects (arrivals and pickups). The table below summarises the data objects and their required keys. For full field-level constraints, see the schema and the interactive API reference.

ObjectProcessRequired keyNotable fieldsUsed for
outbound_mastersAir Exportmawb_numberconsolidation_type, origin, destination, lat, contour, pieces, weight, alt_refs, additional_dataExport MAWB / consolidation
outbound_shipmentsAir Exporthawb_number or alt_refsprior_party_secured, origin, destination, pieces, weight, consigner, consignee, content, hazard_class, measurements, ssccs, additional_dataExport HAWB / local record
inbound_mastersAir Importmawb_numberconsolidation_type, origin, destination, total_amount_of_parts, eta, pieces, weight, additional_dataImport MAWB pre-advice
inbound_shipmentsAir Importhawb_numberpieces, weight, consigner, consignee, content, hazard_class, measurements, ssccs, additional_dataImport HAWB pre-advice
inbound_pickupsAir Importmanifest_numberannounced_for, station, license_plate, phone, trucker, haulerAnnounce onward pickup from the warehouse
outbound_arrivalsAir Exportmanifest_number(same shape as inbound_pickups)Announce a truck arrival to the warehouse
inbound_arrivalsAir Importmanifest_number(same shape as inbound_pickups)Inbound truck manifest
Truck manifests are process-specific

inbound_pickups and inbound_arrivals belong to Air Import only — they are used together with inbound_masters and inbound_shipments. outbound_arrivals belongs to Air Export only. There is intentionally no outbound_pickups object.

Actions

ActionRequiredPurposeStatus
attach_shipmenthawb_number, process_type, and one of mawb_number / manifest_numberAttach a HAWB to a master or manifestActive
attach_shipment_to_arrivalhawb_number, process_type, manifest_numberAttach a HAWB to an arrival manifestActive
add_work_itemworkable, process_type, and one of mawb_number / hawb_numberRequest a warehouse service (secure, label, photograph, …)Active
detach_shipmenthawb_number, process_type, mawb_numberDetach a HAWB from a master (MAWB)Active
cancelprocess_type and one of hawb_number / mawb_number / manifest_numberCancel a shipment, master or manifestNot yet implemented
Detaching shipments

detach_shipment is supported for removing a HAWB from its master (MAWB). Provide process_type, the hawb_number and the mawb_number to detach from. The manifest-based variant is not currently available.

Shared field reference

FieldTypeConstraint / values
mawb_numberstringExactly 11 digits, no dashes/spaces — ^[\d]{11}$
hawb_numberstringUppercase letters and digits only — ^[A-Z0-9]+$
manifest_numberstringUppercase letters and digits — ^[A-Z0-9]+$
origin / destinationstring3-character IATA code — ^[A-Z0-9]{3}$
consolidation_typestringconsol (default), b2b, iata_direct
piecesinteger≥ 1
weightnumber≥ 0.1 kg (one decimal)
hazard_classstringnonhazardous (default), explosive, gas, flammable_liquid, flammable_solid, oxidizing_substance, toxic_and_infectious_substance, radioactive_material, corrosive, miscellaneous_dangerous_good, lithium_batteries, unknown
measurements[]objectlength, width, height (required), optional weight
additional_dataobjectFree customer JSON; stored against the object and echoed back as additional_api_data in status messages (see below)
process_typestringinbound or outbound (required on actions)

Carrying your own keys with additional_data

The four core data objects — outbound_masters, outbound_shipments, inbound_masters and inbound_shipments — accept an additional_data object: free-form JSON that CHI stores against the object and echoes back unchanged in every related status message (as additional_api_data). It is never interpreted by the warehouse.

This is the recommended way to carry your own business keys alongside CHI's. CHI identifies cargo by mawb_number (master) and hawb_number (house); many platforms key on something else. For example, CargoWise One (WiseTech Global) identifies consolidations and shipments by its Consol ID and Shipment ID rather than by MAWB/HAWB. By placing those IDs in additional_data on the way in, your system receives them back on every status message and can match CHI's updates to its own records automatically — without maintaining a separate MAWB/HAWB cross-reference.

Example — attach CargoWise One business keys, get them back

POST /v1 — request (your keys go in)
{
  "data": {
    "outbound_masters": [
      { "mawb_number": "02012345675", "additional_data": { "cw1_consol_id": "C00045678" } }
    ],
    "outbound_shipments": [
      { "hawb_number": "FRA10099001", "additional_data": { "cw1_shipment_id": "S00012345" } }
    ]
  }
}
CHI → your endpoint — later status message (your keys come back)
{
  "type": "outbound_shipment_secured",
  "client_slug": "acme-forwarding",
  "shipment": {
    "hawb_number": "FRA10099001",
    "number": "8MY65FN9",
    "additional_api_data": { "cw1_shipment_id": "S00012345" }
  }
}

The field is named additional_data on the way in and is returned as additional_api_data in status messages. CHI's own keys (hawb_number, master number) are always included as well, so you can match on either side.


Air Export · 1 — Transport pre-advice

Announce a truck or delivery arriving at the CHI warehouse, optionally together with the outbound shipments it carries. Use the outbound_arrivals object for the truck manifest and attach shipments with attach_shipment_to_arrival.

data · outbound_arrivals data · outbound_shipments action · attach_shipment_to_arrival

Example — truck arrival pre-advice with two HAWBs

POST /v1 · export_transport_pre_advice.json
{
  "data": {
    "outbound_arrivals": [
      {
        "manifest_number": "FRAT900123",
        "announced_for": "2026-06-14T08:30:00+02:00",
        "station": "FRA",
        "license_plate": "F-CC 4210",
        "trucker": "J. Becker",
        "hauler": "Placeholder Trucking GmbH"
      }
    ],
    "outbound_shipments": [
      { "hawb_number": "FRA10099001", "origin": "FRA", "destination": "JFK", "pieces": 4, "weight": 612.0 },
      { "hawb_number": "FRA10099002", "origin": "FRA", "destination": "ORD", "pieces": 7, "weight": 568.5 }
    ]
  },
  "actions": {
    "attach_shipment_to_arrival": [
      { "process_type": "outbound", "hawb_number": "FRA10099001", "manifest_number": "FRAT900123" },
      { "process_type": "outbound", "hawb_number": "FRA10099002", "manifest_number": "FRAT900123" }
    ]
  }
}

The announced_for timestamp is the planned arrival time. manifest_number is the tour/truck reference used to correlate later status messages.

Air Export · 2 — Shipment pre-advice

Announce outbound shipments expected at the warehouse, independently of a truck manifest. This is the most common building block — send the HAWB-level detail and let later messages add the MAWB and attachments.

data · outbound_shipments

Example — outbound shipment with handling detail

POST /v1
{
  "data": {
    "outbound_shipments": [
      {
        "hawb_number": "FRA10099001",
        "origin": "FRA",
        "destination": "JFK",
        "pieces": 4,
        "weight": 612.0,
        "consigner": "ACME INSTRUMENTS GMBH",
        "consignee": "ACME US INC",
        "content": "Measuring instruments",
        "hazard_class": "nonhazardous",
        "prior_party_secured": false,
        "measurements": [
          { "length": 120, "width": 80, "height": 95, "weight": 153.0 }
        ],
        "additional_data": { "cargowise_shipment_id": "S00012345" }
      }
    ]
  }
}

prior_party_secured indicates whether secure status was established by a prior party. measurements dimensions are in centimetres per the schema.

Air Export · 3 — MAWB / consolidation creation

When the export MAWB is known, create or update an outbound_master. A master can carry many HAWBs (outbound shipments). Create the master and the shipments in the same message, then attach them (see the next use case).

data · outbound_masters data · outbound_shipments

Example — create a consolidation master

POST /v1
{
  "data": {
    "outbound_masters": [
      {
        "mawb_number": "02012345675",
        "consolidation_type": "consol",
        "origin": "FRA",
        "destination": "JFK",
        "pieces": 11,
        "weight": 1180.5,
        "lat": "2026-06-14T18:00:00+02:00",
        "alt_refs": "CONSOL-JFK-0614"
      }
    ]
  }
}

lat is the Latest Arrival Time. consolidation_type defaults to consol when omitted.

Air Export · 4 — Attach HAWBs to a MAWB

Link outbound shipments to an outbound master with the attach_shipment action. Provide process_type: "outbound", the hawb_number, and the target mawb_number. One message can attach hundreds of HAWBs.

data · outbound_masters data · outbound_shipments action · attach_shipment

Example — create master, shipments and attach in one call

POST /v1 · export_mawb_consolidation.json
{
  "data": {
    "outbound_masters": [
      { "mawb_number": "02012345675", "consolidation_type": "consol", "origin": "FRA", "destination": "JFK", "pieces": 11, "weight": 1180.5 }
    ],
    "outbound_shipments": [
      { "hawb_number": "FRA10099001", "pieces": 4, "weight": 612.0 },
      { "hawb_number": "FRA10099002", "pieces": 7, "weight": 568.5 }
    ]
  },
  "actions": {
    "attach_shipment": [
      { "process_type": "outbound", "hawb_number": "FRA10099001", "mawb_number": "02012345675" },
      { "process_type": "outbound", "hawb_number": "FRA10099002", "mawb_number": "02012345675" }
    ]
  }
}
Use the singular key

The action key is attach_shipment (singular), and each entry requires exactly one of mawb_number or manifest_number. Plural keys are rejected by the strict schema.

Air Export · 5 — Update shipment or master data

Because the API is create-or-update, revised data is sent the same way as the original. Re-transmit the object with its key and only the changed fields. This is ideal for corrected pre-advices.

data · outbound_masters data · outbound_shipments

Example — correct the destination and weight

POST /v1
{
  "data": {
    "outbound_masters": [
      { "mawb_number": "02012345675", "destination": "ORD" }
    ],
    "outbound_shipments": [
      { "hawb_number": "FRA10099002", "weight": 575.0 }
    ]
  }
}

Unsent fields are preserved. See Create-or-update behaviour.

Air Export · 6 — Special service / work item

Request a warehouse service on a shipment or master with add_work_item. For outbound HAWB work items the allowed workable values are secure, palletize, measure, neutralize, label_hawb, shrink, weigh, photograph, other. For masters (and inbound), secure and label_hawb are not available.

action · add_work_item

Example — request photographs of a shipment

POST /v1
{
  "actions": {
    "add_work_item": [
      {
        "process_type": "outbound",
        "hawb_number": "FRA10099001",
        "workable": "photograph",
        "instructions": "Please take photos of all sides and from the top.",
        "client_reference": "JOB-2026-0614-07"
      }
    ]
  }
}

client_reference is echoed back in the work_item_done status message. instructions is shown to warehouse staff.

Air Export · 7 — Local Frankfurt export without HAWB

In local Frankfurt export, outbound records sometimes exist before a HAWB number is known. The API allows creating an outbound_shipment with only alt_refs (no hawb_number). Later, when the HAWB exists, a label_hawb work item links the pre-records to the HAWB using their alt_refs.

data · outbound_shipments (alt_refs) action · add_work_item · label_hawb

Step 1 — create a warehouse record without a HAWB

POST /v1
{
  "data": {
    "outbound_shipments": [
      { "alt_refs": "WH-REF-77001", "origin": "FRA", "destination": "ORD", "pieces": 2, "weight": 95.0 }
    ]
  }
}

Step 2 — once the HAWB exists, label and link

POST /v1 · export_local_no_hawb_label.json
{
  "actions": {
    "add_work_item": [
      {
        "process_type": "outbound",
        "hawb_number": "FRA10099050",
        "workable": "label_hawb",
        "instructions": "Label and link the warehouse pre-record(s) to this HAWB.",
        "attach_shipments": [
          { "alt_refs": "WH-REF-77001" }
        ]
      }
    ]
  }
}
Why this is special

attach_shipments (linking records by alt_refs) is only valid when workable is label_hawb on an outbound HAWB work item. This is the one place where shipments are linked by customer reference rather than by HAWB.


Air Import · 1 — MAWB / shipment pre-advice

For import, the expected MAWBs are usually known in advance. Pre-advise an inbound_master and its inbound_shipments. The master can carry total_amount_of_parts (number of ULDs) and an eta.

data · inbound_masters data · inbound_shipments

Example — inbound master with two house shipments

POST /v1 · import_mawb_pre_advice.json
{
  "data": {
    "inbound_masters": [
      {
        "mawb_number": "02012345675",
        "consolidation_type": "consol",
        "origin": "JFK",
        "destination": "FRA",
        "pieces": 11,
        "weight": 1180.5,
        "total_amount_of_parts": 2,
        "eta": "2026-06-14T06:30:00+02:00"
      }
    ],
    "inbound_shipments": [
      { "hawb_number": "FRA10088001", "pieces": 4, "weight": 612.0, "consignee": "ACME EUROPE GMBH" },
      { "hawb_number": "FRA10088002", "pieces": 7, "weight": 568.5, "consignee": "ACME EUROPE GMBH" }
    ]
  }
}

Air Import · 2 — Attach shipments to a master

Attach inbound house shipments to an inbound master with attach_shipment and process_type: "inbound".

action · attach_shipment

Example — attach inbound HAWBs

POST /v1
{
  "actions": {
    "attach_shipment": [
      { "process_type": "inbound", "hawb_number": "FRA10088001", "mawb_number": "02012345675" },
      { "process_type": "inbound", "hawb_number": "FRA10088002", "mawb_number": "02012345675" }
    ]
  }
}

Air Import · 3 — Inbound master AWB broken-down status

When cargo is physically checked and broken down in the warehouse, CHI sends an inbound_master_awb_brokendown status message to your endpoint. It reports what was actually checked in per HAWB, any damage, and links to break-down photos and the report PDF.

status · inbound_master_awb_brokendown

Status message — broken-down confirmation

CHI → your endpoint · status_inbound_master_awb_brokendown.json
{
  "id": "f19bb8a3-d64b-49b0-8df8-76b6cc2fe69b",
  "type": "inbound_master_awb_brokendown",
  "client_slug": "acme-forwarding",
  "brokendown_at": "2026-06-12T18:12:31+02:00",
  "master": { "number": "02012345675", "consolidation_type": "consol" },
  "shipments": [
    {
      "number": "NPPUCEY5",
      "hawb_number": "FRA10088001",
      "pieces": 4,
      "pieces_checkedin": 4,
      "weight": "612.0",
      "damaged_count": 1,
      "damage_types": ["dented"],
      "shipment_image": [
        { "image_url": "https://files.chi-cargo.example/inbound/shipment/NPPUCEY5/01.jpg" }
      ]
    }
  ],
  "breakdown_pdf_url": "https://files.chi-cargo.example/inbound/masters/02012345675/breakdown_report.pdf"
}
Repeated transmissions

This message can be sent multiple times as further parts of the master arrive. Each transmission represents the current status of the entire master — treat it as a record update, not an increment.

Air Import · 4 — Create an inbound pickup

When cargo is planned for onward transport to local stations, create an inbound_pickup. The manifest_number is the primary identifier and should match the value used in later pickup status messages.

data · inbound_pickups

Example — announce a pickup

POST /v1
{
  "data": {
    "inbound_pickups": [
      {
        "manifest_number": "FRAT900777",
        "announced_for": "2026-06-15T14:00:00+02:00",
        "station": "MUC",
        "license_plate": "F-CC 4210",
        "trucker": "J. Becker",
        "hauler": "Placeholder Trucking GmbH"
      }
    ]
  }
}

Air Import · 5 — Attach shipments to a pickup

Attach the inbound shipments to be collected to the pickup manifest with attach_shipment, providing the manifest_number instead of a mawb_number.

data · inbound_pickups action · attach_shipment

Example — create pickup and attach shipments

POST /v1 · import_pickup.json
{
  "data": {
    "inbound_pickups": [
      { "manifest_number": "FRAT900777", "announced_for": "2026-06-15T14:00:00+02:00", "station": "MUC", "hauler": "Placeholder Trucking GmbH" }
    ]
  },
  "actions": {
    "attach_shipment": [
      { "process_type": "inbound", "hawb_number": "FRA10088001", "manifest_number": "FRAT900777" },
      { "process_type": "inbound", "hawb_number": "FRA10088002", "manifest_number": "FRAT900777" }
    ]
  }
}

Air Import · 6 — Update pickup or shipment data

As with export, send revised pickup or shipment data using the same objects and keys. Only changed fields are applied.

Example — push the pickup time and add a trucker

POST /v1
{
  "data": {
    "inbound_pickups": [
      { "manifest_number": "FRAT900777", "announced_for": "2026-06-15T16:30:00+02:00", "trucker": "M. Schulz" }
    ]
  }
}

Status messages

Beyond accepting requests, CHI can push status messages to a customer HTTPS endpoint as cargo moves through the warehouse. If you want to receive them, provide your endpoint during onboarding.

Availability

Status message delivery is enabled per customer. Confirm scope and your receiving endpoint with Enterprise Integration during onboarding.

Common envelope

Every status message shares a common envelope:

FieldDescription
idUnique message id (UUID)
typeMessage type, e.g. outbound_shipment_secured
client_slugYour customer identifier
additional_api_dataThe additional_data you supplied, echoed back
*_atEvent timestamp (e.g. brokendown_at, completed_at)

Export status messages

TypeMeaning
outbound_arrival_checkedinTruck arrival checked in; per-shipment check-in and damage detail
outbound_shipment_securedShipment secured; securing method, agent, RA/RAC number, SPX PDF
outbound_master_packedMaster packed onto ULD(s); build-up (BUP) detail and PDF
outbound_master_checkedoutMaster checked out of the warehouse
outbound_tour_completedOutbound tour completed with the masters loaded
darc_alertX-ray screening flagged a shipment as too dense to inspect (or it became unsecurable); secure-supply-chain action required

Example — outbound_shipment_secured

CHI → your endpoint · status_outbound_shipment_secured.json
{
  "id": "8c4f0b02-aaa2-4324-88c1-1416c241f88a",
  "type": "outbound_shipment_secured",
  "client_slug": "acme-forwarding",
  "shipment": { "number": "8MY65FN9", "hawb_number": "FRA10099001", "origin": "FRA", "pieces": 4, "pieces_secured": 4 },
  "secured": [
    { "secured_at": "2026-06-12T17:32:59+02:00", "secured_by": "Placeholder Agent", "securing_method": "SPX by EDD", "amount": 4, "rac_number": "DE/RA/00000-01" }
  ],
  "spx_pdf_url": "https://files.chi-cargo.example/outbound/shipments/8MY65FN9/spx_report.pdf"
}

Example — outbound_arrival_checkedin

CHI → your endpoint · status_outbound_arrival_checkedin.json
{
  "id": "99cf8cbb-4a19-4baa-b046-88e19ace4c75",
  "type": "outbound_arrival_checkedin",
  "client_slug": "acme-forwarding",
  "arrival": {
    "number": "33530099",
    "manifest_number": "FRAT900123",
    "warehouse": "557",
    "arrival_time": "2026-06-12 15:41:15 +0200",
    "license_plate": "F-CC 4210",
    "securing_status": "SECURE (RegB (RA))",
    "pieces_total": 4,
    "pieces_checkedin_total": 4
  },
  "shipments": [
    {
      "number": "JK3QXHE2", "hawb_number": "FRA10099001", "destination": "JFK",
      "pieces": 4, "pieces_checkedin": 4, "pieces_damaged": 0, "weight": "612.0",
      "damage_severity": "undamaged", "checkedin_at": "2026-06-12 16:06:20 +0200", "images_of_damages": []
    }
  ],
  "arrival_confirmation_pdf": "https://files.chi-cargo.example/outbound/arrivals/33530099/arrival_confirmation_report.pdf"
}

Example — darc_alert

A DARC alert (Dense Automatic Reject Capability) is an automated algorithm used in air-cargo X-ray screening that flags packages containing high-density, impenetrable material. It warns operators when an item is too dense to be fully inspected, so a potential threat cannot be missed. The same lock can also be raised when freight or its packaging is damaged in the warehouse — for example by a forklift — because the original secure status can no longer be guaranteed.

Once a darc_alert is raised, the shipment can no longer move under its existing secure status. Re-establishing a secure supply chain then requires two different successful securing methods to re-confirm air-cargo security. The message reports the new lock state (darc_alert) and the previous one (previous_darc_alert).

CHI → your endpoint · status_darc_alert.json
{
  "id": "6f079c53-5553-4481-8683-26d727c1f04d",
  "type": "darc_alert",
  "client_slug": "acme-forwarding",
  "darc_alert": "dark",
  "previous_darc_alert": "no_lock",
  "shipment": { "hawb_number": "FRA10099001", "pieces": 3 }
}
Air Export only

darc_alert is part of the Air Export secure-supply-chain process. It does not occur in Air Import.

Import status messages

TypeMeaning
inbound_master_part_receivedA part of the master was received at the depot
inbound_master_load_createdA master load (Auslagerschein) was created — pieces & weight
inbound_master_awb_brokendownBreak-down confirmation per HAWB, with photos & report
inbound_arrival_checkedinInbound shipments checked in, with damage photos
inbound_pickup_completedOnward pickup completed; checked-in/out pieces per HAWB

Example — inbound_pickup_completed

CHI → your endpoint · status_inbound_pickup_completed.json
{
  "id": "5e699bc0-9d24-4d42-8a43-d2a9b9a0b08e",
  "type": "inbound_pickup_completed",
  "client_slug": "acme-forwarding",
  "completed_at": "2026-06-12T18:20:30+02:00",
  "pickup": { "number": "58924209", "manifest_number": "FRAT900777" },
  "shipments": [
    {
      "number": "1W4YDYT2", "hawb_number": "FRA10088001",
      "pieces": 4, "pieces_checkedin": 4, "pieces_checkedout": 4, "weight": "612.0",
      "master": { "number": "02012345675", "consolidation_type": "consol" }
    }
  ]
}

Universal status messages

TypeMeaning
work_item_doneA requested work item (label, photo, secure, …) was completed
stocktaking_completedStocktaking result — pieces found vs. expected per HAWB

Example — work_item_done

CHI → your endpoint · status_work_item_done.json
{
  "id": "0a0014dd-9205-4fe9-ba28-05be3f325231",
  "type": "work_item_done",
  "client_slug": "acme-forwarding",
  "completed_at": "2026-06-12T02:15:00+02:00",
  "work_item": {
    "number": "60240047",
    "parent_type": "Outbound::Shipment",
    "workable": "label_hawb",
    "client_reference": "JOB-2026-0614-01"
  },
  "outbound_shipment": { "hawb_number": "FRA10099050" }
}

Sequence diagrams

The diagrams below show the main end-to-end flows. Actors: Customer System, EDI / Converter, Business Partner API v1, CHICARGO WMS, CHI Operations, and the Customer Notification Endpoint.

Export — transport pre-advice

sequenceDiagram autonumber participant C as Customer System participant E as EDI / Converter participant API as Business Partner API v1 participant WMS as CHICARGO WMS participant OPS as CHI Operations C->>E: Truck pre-advice message (XML) E->>API: POST /v1 (outbound_arrivals + outbound_shipments + attach_shipment_to_arrival) API-->>E: 202 Accepted { id } API->>WMS: Create arrival, shipments, attachments Note over WMS,OPS: Truck arrives, cargo checked in WMS-->>API: outbound_arrival_checkedin API-->>C: Status: outbound_arrival_checkedin

Export — MAWB with HAWB attach flow

sequenceDiagram autonumber participant C as Customer System participant API as Business Partner API v1 participant WMS as CHICARGO WMS C->>API: POST /v1 (outbound_masters + outbound_shipments + attach_shipment[]) API-->>C: 202 Accepted { id } API->>WMS: Create/Update master & shipments API->>WMS: Attach each HAWB to MAWB Note over WMS: Securing / packing WMS-->>C: outbound_shipment_secured WMS-->>C: outbound_master_packed

Export — local shipment without HAWB, later labeling

sequenceDiagram autonumber participant C as Customer System participant API as Business Partner API v1 participant WMS as CHICARGO WMS C->>API: POST /v1 (outbound_shipments with alt_refs, no HAWB) API->>WMS: Create warehouse pre-record(s) Note over C: HAWB number becomes known C->>API: POST /v1 (add_work_item: label_hawb + attach_shipments[alt_refs]) API->>WMS: Label HAWB and link pre-records WMS-->>C: work_item_done (label_hawb)

Import — MAWB pre-advice and broken-down status

sequenceDiagram autonumber participant C as Customer System participant API as Business Partner API v1 participant WMS as CHICARGO WMS participant OPS as CHI Operations C->>API: POST /v1 (inbound_masters + inbound_shipments + attach_shipment[]) API-->>C: 202 Accepted { id } API->>WMS: Create master, shipments, attachments Note over OPS,WMS: Cargo arrives & is broken down OPS->>WMS: Record break-down & check-in WMS-->>C: inbound_master_awb_brokendown (repeatable)

Import — pickup creation and attach flow

sequenceDiagram autonumber participant C as Customer System participant API as Business Partner API v1 participant WMS as CHICARGO WMS C->>API: POST /v1 (inbound_pickups + attach_shipment[ manifest_number ]) API-->>C: 202 Accepted { id } API->>WMS: Create pickup & attach shipments Note over WMS: Trucker collects cargo WMS-->>C: inbound_pickup_completed

Customer request + CHI status lifecycle

sequenceDiagram autonumber participant C as Customer System participant API as Business Partner API v1 participant WMS as CHICARGO WMS participant N as Customer Notification Endpoint C->>API: POST /v1 (data + actions) API-->>C: 202 Accepted { id } API->>WMS: Apply create-or-update & actions loop As cargo is handled WMS-->>N: Status message ( id correlates ) end

Errors & validation

A syntactically valid, schema-conformant message is accepted with 202 and a process id. The id can be used to correlate the request with later status messages.

StatusMeaningBody
202 AcceptedValid; will be processed{ "message": "Accepted", "id": "…" }
400 Bad RequestInvalid JSON, or missing x-chi-api-token header{ "message": "Bad Request", "error": "…", "id": "…" }
401 UnauthorizedInvalid or unknown API token{ "message": "Unauthorized" }
422 Unprocessable EntityValid JSON but fails schema validation{ "message": "Unprocessable Entity", "error": "…", "id": "…" }
422 — example validation error
{
  "message": "Unprocessable Entity",
  "error": "JSON validation failed:\n'mawb_number' is a required property",
  "id": "9519adbe-cd08-411b-a1b5-754c92aa1cbd"
}
Validation tips
  • Send mawb_number as 11 digits with no separators.
  • Use uppercase A–Z and digits for hawb_number.
  • Provide process_type on every action entry.
  • Use singular action keys (attach_shipment, not attach_shipments); unknown keys are rejected.

Schema & OpenAPI 3.1

The API is defined canonically as a JSON Schema (draft-07). An OpenAPI 3.1 document is also provided as an additional artifact — OpenAPI 3.1 aligns with modern JSON Schema, so the full model (including anyOf/oneOf/allOf composition) is represented faithfully while keeping the single POST /v1 endpoint.

Browse

Interactive API reference ↗

Explore the OpenAPI 3.1 spec with request/response examples in a Scalar viewer.

Download

openapi.yaml

OpenAPI 3.1 document for tooling and client generation.

Download

generic_json_schema.json

The canonical JSON Schema used for request validation.


Support & contact

CompanyCHI Cargo Group · CHI Deutschland Cargo Handling GmbH
TeamEnterprise Integration
Emailenterprise-integration@chi-cargo.com
AddressCargo City Süd, Geb. 567 A, D-60549 Frankfurt am Main
Websitechi-cargo.com

For onboarding, API keys, status-message endpoints, or integration questions, contact Enterprise Integration. Please include your client_slug and, where relevant, the process id from the API response.

Changelog & versioning

The API version is part of the URL path (/v1). Backwards-compatible additions (new optional fields, new status types) are made within v1. Breaking changes would be introduced under a new path version.

VersionDateNotes
v1 — docs refresh2026Rebuilt, use-case-driven documentation; OpenAPI 3.1 artifact; updated branding and Enterprise Integration contact; real-world status-message examples.
v1.0.02019-10-31Initial release.