The CMI Logistics API
Quote shipments, track consignments and request customs clearance straight from your app. REST, JSON, predictable errors and webhooks built in.
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"
}Lane-priced rates across every service in milliseconds.
Milestone events from collection to proof of delivery.
Standalone import & export entries with HMRC.
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"Request a quote
Return a priced offer for any of the four CMI services. Pass the service identifier and a normalised consignment payload.
ireland_trailereuropean_trailerocean_air_freightcustoms_clearancecurl 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"
}'{
"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"
}Track a consignment
Fetch the latest status, milestone history and proof of delivery for any consignment you've booked.
curl https://api.cmilogistics.co.uk/v1/consignments/cns_8h2KdQ \
-H "Authorization: Bearer cmi_live_•••" \
-H "CMI-Account-Id: acc_8F3kPq"{
"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
}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.
?service=?status=?from= / ?to=?pickup_postcode= / ?dropoff_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"{
"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.
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.
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 }
]
}'{
"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"
}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
