Skip to main content
There is a single published structure for shipments. You choose how to deliver it — as a data batch (written and answered in the same call, up to 100 shipments) or as a file (bigger runs, queued) — but the fields are the same either way, and the same for every organisation.
  • JSON: each shipment is an object with these field names; its goods lines go in items.
  • File: each column header is the same name, and there is one row per goods line — repeat the shipment columns on each line of a multi-line shipment, and keep the lines of a shipment together. .csv and .xlsx only; re-save .xls before sending.
Column order does not matter and optional columns may be left out entirely. A column we do not publish is rejected rather than ignored, so a typo surfaces immediately instead of silently dropping data.
Starter template. Copy this into a .csv and replace the example row — it is the full column list in canonical order. Optional columns you do not use can be deleted.
template.csv

Identity

string
required
Your connote / consignment number, up to 255 characters. This identifies the shipment permanently: sending it again updates that shipment instead of creating a second one, and replaces its goods lines with the ones in the new push. Matching ignores case.
string
The customer this shipment belongs to, using the customer code configured in Dyspach — the same code you pass in general.customerIds when quoting.This is the link between the shipment and the customer at billing time. A shipment carrying a code nobody recognises still imports, but it will not be billed to anyone, so it is worth getting right.

Origin

originPostCode, originSuburb, originState and originCountryCode are required.
The postcode is what actually decides the zone. If the suburb does not match the postcode it is not rejected — the closest matching suburb at that postcode is used, and failing that, the postcode’s own zone. Only a postcode we do not recognise fails the shipment (Origin Zone not found).So a wrong suburb is silently corrected and the shipment is priced on the postcode. Send accurate postcodes; do not rely on the suburb being checked.

Destination

Same four required fields, resolved the same way — the postcode decides, and an unrecognised one fails the shipment with Destination Zone not found.

Dates and commercials

Goods

Every shipment needs at least one goods line — at most 500, and at most 10,000 across a whole data batch (a file has no line limit beyond its 50 MB size). In JSON they are the items array; in a file, each line is its own row.
string
required
What the line is — Carton, Pallet, Satchel, and so on. A row with no itemType contributes no goods line at all, which is why it is required.

Custom fields

Your customer’s carrier may configure extra fields on shipments or goods. They are addressed by key — the same identifier you use for custom fields when quoting. A key is stable; the field’s display name can be changed in the portal at any time, which is why it is not what you send.
  • JSON — a customFields object on the shipment, and another on each item:
  • File — a column per field, prefixed CF: for shipment-level and ITEM_CF: for goods-level:
A key that is not configured for that organisation is rejected — you will not silently lose the value. Fields marked mandatory must carry a value or the whole shipment is rejected with Missing mandatory custom field(s): ….

Value formats

In JSON, use real booleans (true / false). In a file, write Yes or No — a file cell containing true is read as “not yes”, which is almost never what you meant.
ISO-8601, e.g. 2026-08-14T02:15:00Z. Dates without a time are accepted.
Plain decimals — 412.55. No currency symbols, no thousands separators.
Repeat the shipment columns on every row of the shipment and keep those rows together. Rows are grouped by consecutive matching shipmentId:
A blank shipmentId is not carried down from the row above — it is rejected with No Shipment ID found.