Developer Platform · v1

The CMI Logistics API

Quote shipments, track consignments and request customs clearance straight from your app. REST, JSON, predictable errors and webhooks built in.

99.95%
API uptime
< 120ms
P50 latency
Free
Sandbox tier
api.cmilogistics.co.uk
POST /v1/quotes
Authorization: Bearer cmi_live_••••••••
CMI-Account-Id: acc_8F3kPq

{
  "service": "ireland_trailer",
  "pickup":  { "postcode": "BD4 6SE", "country": "GB" },
  "dropoff": { "postcode": "D02 X285", "country": "IE" },
  "consignment": {
    "type": "pallet",
    "quantity": 2,
    "cube_m3": 2.4,
    "weight_kg": 540
  },
  "ready_at": "2026-06-12T08:00:00Z"
}
Real-time quotes

Lane-priced rates across every service in milliseconds.

Live tracking

Milestone events from collection to proof of delivery.

Customs clearance

Standalone import & export entries with HMRC.

Webhooks

Signed callbacks for every status change on your jobs.

Quickstart

Authenticate every request with your API key.

All endpoints live at https://api.cmilogistics.co.uk/v1. Send your secret key in the Authorization header. Use a cmi_test_ key against the sandbox and cmi_live_ in production.

Every request must also include your CMI-Account-Id header (e.g. acc_8F3kPq) so consignments are filed against the correct trading account. Multi-account users can switch accounts per request without rotating keys.

  • JSON request & response bodies
  • CMI-Account-Id scoping on every call
  • Idempotency-Key supported on POST
  • Cursor pagination on list endpoints
  • RFC 7807 problem+json error format
curl https://api.cmilogistics.co.uk/v1/ping \
  -H "Authorization: Bearer cmi_live_5fK2x9aH7nQpL0wTjY4vR8b1" \
  -H "CMI-Account-Id: acc_8F3kPq"
Quotes

Request a quote

Return a priced offer for any of the four CMI services. Pass the service identifier and a normalised consignment payload.

POST/v1/quotes
ireland_trailer
GB ↔ IE trailer & groupage
european_trailer
FTL & part-loads across the EU
ocean_air_freight
FCL / LCL ocean and air consolidation
customs_clearance
Standalone import or export entry
curl https://api.cmilogistics.co.uk/v1/quotes \
  -H "Authorization: Bearer cmi_live_•••" \
  -H "CMI-Account-Id: acc_8F3kPq" \
  -H "Content-Type: application/json" \
  -d '{
    "service": "ireland_trailer",
    "pickup":  { "postcode": "BD4 6SE", "country": "GB" },
    "dropoff": { "postcode": "D02 X285", "country": "IE" },
    "consignment": {
      "type": "pallet",
      "quantity": 2,
      "cube_m3": 2.4,
      "weight_kg": 540
    },
    "ready_at": "2026-06-12T08:00:00Z"
  }'
200 OK · Response
{
  "id": "qte_R7tK2p",
  "account_id": "acc_8F3kPq",
  "service": "ireland_trailer",
  "price_gbp": 272.43,
  "transit_days": 2,
  "next_departure": "2026-06-12T19:00:00Z",
  "expires_at": "2026-06-12T08:00:00Z",
  "includes": ["customs_entry", "ferry"],
  "book_url": "https://api.cmilogistics.co.uk/v1/quotes/qte_R7tK2p/book"
}
Tracking

Track a consignment

Fetch the latest status, milestone history and proof of delivery for any consignment you've booked.

GET/v1/consignments/{id}
curl https://api.cmilogistics.co.uk/v1/consignments/cns_8h2KdQ \
  -H "Authorization: Bearer cmi_live_•••" \
  -H "CMI-Account-Id: acc_8F3kPq"
200 OK · Response
{
  "id": "cns_8h2KdQ",
  "account_id": "acc_8F3kPq",
  "service": "european_trailer",
  "status": "in_transit",
  "pickup":  { "postcode": "BD4 6SE", "country": "GB" },
  "dropoff": { "postcode": "75008",   "country": "FR" },
  "eta": "2026-06-14T11:30:00Z",
  "events": [
    { "code": "booked",     "at": "2026-06-11T09:14:02Z" },
    { "code": "collected",  "at": "2026-06-11T17:42:18Z", "location": "Bradford, GB" },
    { "code": "in_transit", "at": "2026-06-12T03:05:00Z", "location": "Dover, GB" }
  ],
  "pod_url": null
}
booked
collected
in_transit
customs_hold
out_for_delivery
delivered
Consignments

List consignments on an account

Return every consignment booked under the account in the CMI-Account-Id header. Combine query parameters to filter by date window, service, status, or pickup / dropoff address.

GET/v1/consignments
?service=
ireland_trailer · european_trailer · ocean_air_freight · customs_clearance
?status=
booked · in_transit · customs_hold · delivered · cancelled
?from= / ?to=
ISO-8601 date window on created_at
?pickup_postcode= / ?dropoff_country=
Address filters — postcode, city or ISO country
curl -G https://api.cmilogistics.co.uk/v1/consignments \
  -H "Authorization: Bearer cmi_live_•••" \
  -H "CMI-Account-Id: acc_8F3kPq" \
  --data-urlencode "service=ireland_trailer" \
  --data-urlencode "status=in_transit" \
  --data-urlencode "from=2026-06-01" \
  --data-urlencode "to=2026-06-30" \
  --data-urlencode "pickup_postcode=BD4" \
  --data-urlencode "dropoff_country=IE" \
  --data-urlencode "limit=50"
200 OK · Response
{
  "account_id": "acc_8F3kPq",
  "object": "list",
  "has_more": true,
  "next_cursor": "cur_2026_06_14_cns_8h2KdQ",
  "data": [
    {
      "id": "cns_8h2KdQ",
      "service": "ireland_trailer",
      "status": "in_transit",
      "pickup":  { "postcode": "BD4 6SE", "country": "GB" },
      "dropoff": { "postcode": "D02 X285", "country": "IE" },
      "created_at": "2026-06-11T09:14:02Z",
      "eta": "2026-06-13T11:30:00Z"
    },
    {
      "id": "cns_7gQ1mF",
      "service": "ireland_trailer",
      "status": "in_transit",
      "pickup":  { "postcode": "BD4 8AA", "country": "GB" },
      "dropoff": { "postcode": "T12 R6CC", "country": "IE" },
      "created_at": "2026-06-10T14:22:50Z",
      "eta": "2026-06-12T16:00:00Z"
    }
  ]
}

Paginate with ?cursor= using thenext_cursor from the previous response. All filters can be combined; omit a parameter to skip that filter.

Customs

Request customs clearance only

Submit a standalone HMRC entry when CMI isn't moving the freight. Returns an entry ID and the documents we need from you.

POST/v1/customs/entries
curl https://api.cmilogistics.co.uk/v1/customs/entries \
  -H "Authorization: Bearer cmi_live_•••" \
  -H "CMI-Account-Id: acc_8F3kPq" \
  -H "Content-Type: application/json" \
  -d '{
    "direction": "import",
    "eori": "GB123456789000",
    "incoterm": "DAP",
    "arrival_port": "GB000DVR",
    "lines": [
      { "commodity_code": "8471300000",
        "description": "Laptop computers",
        "origin": "CN",
        "quantity": 24,
        "value_gbp": 14400.00,
        "weight_kg": 38.5 }
    ]
  }'
200 OK · Response
{
  "id": "ent_3pNw7Z",
  "direction": "import",
  "status": "awaiting_documents",
  "duty_gbp": 0.00,
  "vat_gbp": 2880.00,
  "documents_required": [
    "commercial_invoice",
    "packing_list",
    "bill_of_lading"
  ],
  "fee_gbp": 45.00,
  "submit_by": "2026-06-13T12:00:00Z"
}
Developer account

Sign up for a free developer account.

Get sandbox keys instantly. Test against simulated lanes and consignments — go live once you've signed your CMI trading agreement.

  • Instant sandbox API keys
  • Webhook signing secret
  • Postman collection & OpenAPI spec
  • Slack channel with our integrations team
Create account

By signing up you agree to the developer terms.