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.
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.
Outbound handling
Pre-advise truck arrivals and shipments, create MAWBs and consolidations, attach HAWBs, request services.
Inbound handling
Pre-advise inbound masters and house shipments, plan onward pickups, receive break-down confirmations.
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
dataarea describing the business objects to create or update, and - an
actionsarea 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.
| Environment | Base URL | Purpose |
|---|---|---|
| Staging | https://api.staging.chi-deutschland.cloud/v1 | Onboarding & all customer testing |
| Production | https://api.production.chi-deutschland.cloud/v1 | Live 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.
POST /v1 HTTP/1.1
Host: api.production.chi-deutschland.cloud
Content-Type: application/json
x-chi-api-token: <YOUR_API_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).
{
"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": []
}
}
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.
data | actions | |
|---|---|---|
| Purpose | Describe business objects (masters, shipments, arrivals, pickups) | Apply relationships & processing requests |
| Behaviour | Create-or-update (idempotent effect) | One-time state changes |
| Updatable later? | Yes — re-send to update | No — undo by sending another action or re-transmitting data |
| Examples | outbound_masters, inbound_shipments | attach_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:
{
"data": {
"outbound_masters": [
{ "mawb_number": "02012345675", "origin": "FRA", "destination": "JFK", "pieces": 10 }
]
}
}
A later message updates only destination; origin and pieces stay unchanged:
{
"data": {
"outbound_masters": [
{ "mawb_number": "02012345675", "destination": "ORD" }
]
}
}
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.
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.
| Object | Process | Required key | Notable fields | Used for |
|---|---|---|---|---|
outbound_masters | Air Export | mawb_number | consolidation_type, origin, destination, lat, contour, pieces, weight, alt_refs, additional_data | Export MAWB / consolidation |
outbound_shipments | Air Export | hawb_number or alt_refs | prior_party_secured, origin, destination, pieces, weight, consigner, consignee, content, hazard_class, measurements, ssccs, additional_data | Export HAWB / local record |
inbound_masters | Air Import | mawb_number | consolidation_type, origin, destination, total_amount_of_parts, eta, pieces, weight, additional_data | Import MAWB pre-advice |
inbound_shipments | Air Import | hawb_number | pieces, weight, consigner, consignee, content, hazard_class, measurements, ssccs, additional_data | Import HAWB pre-advice |
inbound_pickups | Air Import | manifest_number | announced_for, station, license_plate, phone, trucker, hauler | Announce onward pickup from the warehouse |
outbound_arrivals | Air Export | manifest_number | (same shape as inbound_pickups) | Announce a truck arrival to the warehouse |
inbound_arrivals | Air Import | manifest_number | (same shape as inbound_pickups) | Inbound truck manifest |
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
| Action | Required | Purpose | Status |
|---|---|---|---|
attach_shipment | hawb_number, process_type, and one of mawb_number / manifest_number | Attach a HAWB to a master or manifest | Active |
attach_shipment_to_arrival | hawb_number, process_type, manifest_number | Attach a HAWB to an arrival manifest | Active |
add_work_item | workable, process_type, and one of mawb_number / hawb_number | Request a warehouse service (secure, label, photograph, …) | Active |
detach_shipment | hawb_number, process_type, mawb_number | Detach a HAWB from a master (MAWB) | Active |
cancel | process_type and one of hawb_number / mawb_number / manifest_number | Cancel a shipment, master or manifest | Not yet implemented |
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
| Field | Type | Constraint / values |
|---|---|---|
mawb_number | string | Exactly 11 digits, no dashes/spaces — ^[\d]{11}$ |
hawb_number | string | Uppercase letters and digits only — ^[A-Z0-9]+$ |
manifest_number | string | Uppercase letters and digits — ^[A-Z0-9]+$ |
origin / destination | string | 3-character IATA code — ^[A-Z0-9]{3}$ |
consolidation_type | string | consol (default), b2b, iata_direct |
pieces | integer | ≥ 1 |
weight | number | ≥ 0.1 kg (one decimal) |
hazard_class | string | nonhazardous (default), explosive, gas, flammable_liquid, flammable_solid, oxidizing_substance, toxic_and_infectious_substance, radioactive_material, corrosive, miscellaneous_dangerous_good, lithium_batteries, unknown |
measurements[] | object | length, width, height (required), optional weight |
additional_data | object | Free customer JSON; stored against the object and echoed back as additional_api_data in status messages (see below) |
process_type | string | inbound 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
{
"data": {
"outbound_masters": [
{ "mawb_number": "02012345675", "additional_data": { "cw1_consol_id": "C00045678" } }
],
"outbound_shipments": [
{ "hawb_number": "FRA10099001", "additional_data": { "cw1_shipment_id": "S00012345" } }
]
}
}
{
"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.
Example — truck arrival pre-advice with two HAWBs
{
"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.
Example — outbound shipment with handling detail
{
"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).
Example — create a consolidation master
{
"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.
Example — create master, shipments and attach in one call
{
"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" }
]
}
}
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.
Example — correct the destination and weight
{
"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.
Example — request photographs of a shipment
{
"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.
Step 1 — create a warehouse record without a HAWB
{
"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
{
"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" }
]
}
]
}
}
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.
Example — inbound master with two house shipments
{
"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".
Example — attach inbound HAWBs
{
"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 message — broken-down confirmation
{
"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"
}
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.
Example — announce a pickup
{
"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.
Example — create pickup and attach shipments
{
"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
{
"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.
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:
| Field | Description |
|---|---|
id | Unique message id (UUID) |
type | Message type, e.g. outbound_shipment_secured |
client_slug | Your customer identifier |
additional_api_data | The additional_data you supplied, echoed back |
*_at | Event timestamp (e.g. brokendown_at, completed_at) |
Export status messages
| Type | Meaning |
|---|---|
outbound_arrival_checkedin | Truck arrival checked in; per-shipment check-in and damage detail |
outbound_shipment_secured | Shipment secured; securing method, agent, RA/RAC number, SPX PDF |
outbound_master_packed | Master packed onto ULD(s); build-up (BUP) detail and PDF |
outbound_master_checkedout | Master checked out of the warehouse |
outbound_tour_completed | Outbound tour completed with the masters loaded |
darc_alert | X-ray screening flagged a shipment as too dense to inspect (or it became unsecurable); secure-supply-chain action required |
Example — outbound_shipment_secured
{
"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
{
"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).
{
"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 }
}
darc_alert is part of the Air Export secure-supply-chain process. It does not occur in Air Import.
Import status messages
| Type | Meaning |
|---|---|
inbound_master_part_received | A part of the master was received at the depot |
inbound_master_load_created | A master load (Auslagerschein) was created — pieces & weight |
inbound_master_awb_brokendown | Break-down confirmation per HAWB, with photos & report |
inbound_arrival_checkedin | Inbound shipments checked in, with damage photos |
inbound_pickup_completed | Onward pickup completed; checked-in/out pieces per HAWB |
Example — inbound_pickup_completed
{
"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
| Type | Meaning |
|---|---|
work_item_done | A requested work item (label, photo, secure, …) was completed |
stocktaking_completed | Stocktaking result — pieces found vs. expected per HAWB |
Example — work_item_done
{
"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
Export — MAWB with HAWB attach flow
Export — local shipment without HAWB, later labeling
Import — MAWB pre-advice and broken-down status
Import — pickup creation and attach flow
Customer request + CHI status lifecycle
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.
| Status | Meaning | Body |
|---|---|---|
| 202 Accepted | Valid; will be processed | { "message": "Accepted", "id": "…" } |
| 400 Bad Request | Invalid JSON, or missing x-chi-api-token header | { "message": "Bad Request", "error": "…", "id": "…" } |
| 401 Unauthorized | Invalid or unknown API token | { "message": "Unauthorized" } |
| 422 Unprocessable Entity | Valid JSON but fails schema validation | { "message": "Unprocessable Entity", "error": "…", "id": "…" } |
{
"message": "Unprocessable Entity",
"error": "JSON validation failed:\n'mawb_number' is a required property",
"id": "9519adbe-cd08-411b-a1b5-754c92aa1cbd"
}
- Send
mawb_numberas 11 digits with no separators. - Use uppercase A–Z and digits for
hawb_number. - Provide
process_typeon every action entry. - Use singular action keys (
attach_shipment, notattach_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.
Interactive API reference ↗
Explore the OpenAPI 3.1 spec with request/response examples in a Scalar viewer.
Support & contact
| Company | CHI Cargo Group · CHI Deutschland Cargo Handling GmbH |
|---|---|
| Team | Enterprise Integration |
| enterprise-integration@chi-cargo.com | |
| Address | Cargo City Süd, Geb. 567 A, D-60549 Frankfurt am Main |
| Website | chi-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.
| Version | Date | Notes |
|---|---|---|
| v1 — docs refresh | 2026 | Rebuilt, use-case-driven documentation; OpenAPI 3.1 artifact; updated branding and Enterprise Integration contact; real-world status-message examples. |
| v1.0.0 | 2019-10-31 | Initial release. |