---
title: "Demurrage risk across all tracked containers"
method: GET
path: "/v1/containers/demurrage"
---

# Demurrage risk across all tracked containers

`GET /v1/containers/demurrage`

## Request

- Base URL: `https://api.trackingmcp.com`
- URL: `https://api.trackingmcp.com/v1/containers/demurrage`
- Auth: HTTP bearer

## Response `200`

Containers at demurrage/detention risk with free days remaining.

- object
  - `ok` true, required
  - `api_version` string: The response contract this build answers, as a date. Pin it in your client.
  - `data` DemurrageReport, required: The payload. Everything an endpoint returns sits under this key.
    - `total_at_risk_usd` integer: Projected demurrage across the assessable boxes, in USD.
    - `containers_at_risk` integer: How many boxes the projection covers.
    - `items` object[]: The list of results.
      - `container_id` string: The container number this row is about.
      - `port` string: Port UN/LOCODE.
      - `free_days_left` integer: Days before free time runs out. Negative once charges are accruing, null when we hold no last free day.
      - `daily_rate_usd` integer: Daily demurrage rate in USD.
      - `projected_usd` integer: Demurrage accrued so far on this box, in USD.
      - `status` string: Current normalised status of the shipment. Ocean lifecycle order: discharged, available, delivered, returned_empty. Two values end a shipment, delivered and returned_empty, and returned_empty outranks delivered.
      - `discharge_datetime` string: When the box was discharged, which is when free time starts counting. Null when no discharge is on file yet.
      - `free_days` integer: Free days the terms allow at this port. Null when no terms and no published tariff apply.
      - `last_free_day` string: The last day free of charge, computed from the discharge and the free days. Null when either is missing.
      - `days_overdue` integer: Days past the last free day. Zero while still inside free time.
      - `terms_source` string: Which terms priced this box: your_contract_terms when you filed terms, carrier_published_tariff when we used the published tariff for that carrier, port and equipment size.
      - `terms_lane` string: The tariff lane the published rate was read from: us_import, eu_import or asia_import. Absent when your own terms were used.
      - `confidence` string: On a card, whether the slot partners agree with each other. On a prediction, how much to trust the shifted arrival.
      - `costed` boolean: True when the row carries a real money figure. False means the timing is known but no rate applied, so treat the amount as unknown rather than zero.
    - `unassessable_containers` integer: Discharged boxes we cannot assess because no free-time terms are on file. An empty risk list with a number here is not a clean bill of health.
    - `coverage_note` string: Plain-English account of what the report could not measure. Null when nothing was missing.
    - `assessed_containers` integer: How many boxes in your book we could actually assess.
    - `uncosted_containers` integer: Boxes we could time but not price, because no rate applied.
    - `candidates_considered` integer: How many boxes were examined before filtering. Read it with truncated below.
    - `truncated` boolean: True when the book was larger than one report can carry and the list was cut. An untruncated empty list means nothing was at risk; a truncated one does not.

## Other responses

- `401`: Missing or invalid API key.

---

[API](https://skmtc.dev/trackingmcp/apis/trackingmcp-rest-api.md) · [All operations](https://skmtc.dev/trackingmcp/apis/trackingmcp-rest-api/llms.txt) · [OpenAPI document](https://skmtc.dev/trackingmcp/apis/trackingmcp-rest-api/revisions/6bb8d8172ceb?raw)
