> ## Documentation Index
> Fetch the complete documentation index at: https://terminal49-mintlify-changelog-apr27-1777302521.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Terminal49 API and DataSync Updates

> Release notes and changelog for Terminal49 API and DataSync updates, covering new features, endpoint changes, schema updates, and resolved issues.

<Info>
  This page contains updates to **Terminal49 API** and **DataSync** only (not
  general product updates).
</Info>

<Update label="April 27, 2026" description="Booking number type inference, delivered date filter, document fuzzy search, hold descriptions, and bug fixes" tags={['API', 'Dashboard']} rss="April 27, 2026: Booking number type inference, delivered date filter on the container dashboard, document fuzzy search, hold descriptions, custom field reference number flag, and a wave of carrier and terminal bug fixes.">
  ### Booking number support in Infer Tracking Number

  The [Infer Tracking Number](/api-docs/api-reference/tracking-requests/auto-detect-carrier) endpoint now predicts the carrier and number type for **booking numbers**, in addition to container numbers and bills of lading. Send a booking number you aren't sure how to route, and Terminal49 returns a confidence-scored decision so you can create the tracking request with the correct VOCC SCAC and `request_type`.

  <Card title="Infer Tracking Number guide" icon="wand-magic-sparkles" href="/api-docs/in-depth-guides/auto-detect-carrier">
    How to use Infer Tracking Number in your workflow
  </Card>

  ***

  ### Delivered date filter and column on the container dashboard

  The container dashboard now includes a **Delivered at** column and date-range filter, plus delivered-date sorting. Quickly find recently delivered containers, sort by delivery date, or filter to a specific window for reporting and reconciliation.

  ***

  ### Fuzzy search for documents

  Document search is now fuzzy across shipment, container, and tracking request reference numbers. Minor typos, format differences, or partial reference numbers still return the right document, reducing time spent hunting for paperwork.

  ***

  ### Hold descriptions on container holds

  Each hold returned on a container now includes a plain-language description explaining what the hold means and what's typically required to clear it. The descriptions are surfaced wherever holds appear so your team — and your customers — can act without looking up terminology.

  <Card title="Holds and fees guide" icon="book-open" href="/api-docs/in-depth-guides/holds-and-fees">
    How to work with holds and fees data
  </Card>

  ***

  ### Reference number flag on custom field definitions

  Custom field definitions now support a `reference_number` flag. Mark a custom field as a reference number and Terminal49 will treat its value as a searchable identifier alongside built-in references like PO numbers and BOLs.

  <Card title="Custom Field Definitions" icon="brackets-curly" href="/api-docs/api-reference/custom-fields/list-custom-field-definitions">
    Custom Fields API reference
  </Card>

  ***

  ### PO number normalization for document linking

  Document-to-shipment linking via PO numbers now normalizes common format variants (separators, prefixes, and casing differences), so documents match shipments even when the PO is written slightly differently across systems.

  ***

  ### Bug fixes

  * **Containers requiring attention** — Picked-up, on-rail, empty-returned, and delivered containers no longer appear under the "needs attention" LFD view. Only containers still active at a terminal show up
  * **Tideworks fees** — Containers reported as on a vessel or on rail no longer return stale terminal fees from a previous move
  * **MSC Port of Discharge events** — Improved criteria for selecting the correct POD arrival event on MSC shipments
  * **LBCT inland transfers** — Fixed handling of on-dock-to-inland transfer events at LBCT, so rail moves out of the terminal are tracked correctly
  * **COSCO vessel departure** — Improved logic for determining when a COSCO vessel has departed the port of loading
  * **Vessel event deduplication** — Fixed duplicate vessel events on the shipment timeline coming from carriers and from the CSE invalidation pipeline
  * **Document linking race condition** — Eliminated a race condition that could leave a document briefly unlinked when references arrived from multiple sources at once
  * **Webhook notifications page** — Fixed an exception that could occur when listing webhook notifications containing document processing events
  * **Carrier integrations** — Fixes to MAEU auth handling (now treats 403 correctly), APM Empty In OAuth requests, BNSF rail scraping, NSRR equipment requests, Hapag-Lloyd booking sweeps for shipments with no containers, and Voyager terminal request headers
  * **Terminal data** — Updated headers for SSAMX and Holt agent terminals, and added external location mapping for PCIU
  * **Document email intake** — Tightened sender-email rules so unrelated inbox messages are filtered out, and fixed an edge case where a single email recipient was not handled as an array
</Update>

<Update label="April 20, 2026" description="Improved document linking, mark-as-delivered fix, LFD accuracy improvements, and terminal data fixes" tags={['API', 'Dashboard']} rss="April 20, 2026: Smarter document-to-shipment linking via PO numbers, mark-as-delivered fix in the dashboard, LFD accuracy improvements, and multiple terminal data collection fixes.">
  ### Smarter document-to-shipment linking

  Documents are now matched to shipments using **indirect references** such as purchase order (PO) numbers. Previously, a document had to contain a direct identifier like a bill of lading or container number. Now, if a document references a PO number that appears on another already-linked document, Terminal49 can connect the two — reducing unlinked documents and manual work.

  <Card title="Document processing guide" icon="file" href="/api-docs/in-depth-guides/document-processing-workflows">
    How document linking works
  </Card>

  ***

  ### Improved document extraction accuracy

  Document data extraction now uses the original filename as additional context, improving field-level accuracy when the filename contains shipment identifiers or document type hints.

  ***

  ### Bug fixes

  * **Mark as delivered** — Fixed an issue where marking a container as delivered from the dashboard event viewer could fail. User-submitted delivery events are now accepted correctly
  * **Stale terminal LFD dates** — Fixed a bug where outdated Last Free Day dates from a previous cycle could appear on containers still in transit. Terminal LFD events are now rejected until the container arrives at the port
  * **MSC departure events** — Corrected incorrect departure-from-POD events being reported for certain MSC containers
  * **Hapag-Lloyd tracking** — Fixed an error that could occur when Hapag-Lloyd returns an empty shipment overview, preventing container data from loading
  * **Norfolk Southern rail LFD timezone** — Fixed incorrect timezone parsing for Norfolk Southern rail Last Free Day dates, which could shift the date by a day
  * **Dashboard event viewer** — Fixed display issues in the unified event viewer for user-submitted events
  * **Terminal data collection** — Resolved connectivity and data retrieval issues at Goport, Maher, and Packer Avenue terminals, restoring terminal-sourced hold, fee, and availability data for containers at those facilities
</Update>

<Update label="April 14, 2026" description="Dashboard deep linking, calculated LFD, Smart LFD dashboard columns, and bug fixes" tags={['API', 'Dashboard']} rss="April 14, 2026: Dashboard deep linking via URL, calculated Last Free Day from carrier tariffs, Smart LFD dashboard columns, and Hapag-Lloyd booking bug fix.">
  ### Dashboard deep linking

  You can now link directly to any shipment or container in the Terminal49 dashboard using a container number, bill of lading, booking number, or reference number — no internal IDs needed.

  Use the URL pattern:

  ```
  https://app.terminal49.com/shipments/find?q={identifier}
  ```

  The link automatically resolves to the correct tracking page, making it easy to link from a TMS, ERP, spreadsheet, or automated notification.

  <Card title="Deep linking guide" icon="link" href="/api-docs/in-depth-guides/dashboard-deep-linking">
    How to build direct links to shipments and containers
  </Card>

  ***

  ### Calculated Last Free Day

  The Smart LFD system now includes a **calculated Last Free Day** derived from carrier demurrage tariff rules. When a shipping line or terminal hasn't reported an LFD, Terminal49 computes one using the applicable tariff — including free days, start events, holidays, and business-day rules.

  Calculated values appear as a fallback in the `import_deadlines` field on the container API. If a reported LFD is available from the carrier or terminal, it takes priority.

  <Card title="Container API reference" icon="warehouse" href="/api-docs/api-reference/containers/get-a-container">
    View the container resource
  </Card>

  ***

  ### Smart LFD dashboard columns

  The container dashboard now includes two new columns for accounts with Smart LFD enabled:

  * **Calc. Line LFD** — the calculated Last Free Day derived from carrier tariff rules
  * **Smart LFD** — the best available LFD with its source displayed, so you can see at a glance whether the date comes from the shipping line, terminal, or a tariff calculation

  Click the Smart LFD value to open a detail modal showing the full calculation breakdown, including tariff inputs, free days, and the day-by-day calendar.

  ***

  ### Bug fixes

  * **Hapag-Lloyd booking tracking** — Fixed an issue where certain Hapag-Lloyd bookings could return an invalid number error, preventing container data from loading
</Update>

<Update label="April 2026" description="Smart Last Free Day, inland destination ETA source transparency, and bug fixes" tags={['API', 'Dashboard']} rss="April 2026: Smart Last Free Day with per-source LFD breakdown, inland destination ETA source transparency, expanded SSL LFD coverage, and bug fixes.">
  ### Smart Last Free Day

  The container API now returns a detailed breakdown of **Last Free Day (LFD)** data within the `import_deadlines` field. Instead of a single date, you get separate LFD values from the shipping line and the terminal facility — at both the port of discharge and the inland destination.

  Each source includes:

  * **Original** — the first LFD reported
  * **Current** — the latest LFD reported
  * **Calculated** — a derived value when the raw date needs adjustment

  A **unified** selection shows which source Terminal49 considers the best current LFD and why.

  <Card title="Container API reference" icon="warehouse" href="/api-docs/api-reference/containers/get-a-container">
    View the container resource
  </Card>

  ***

  ### Inland destination ETA source transparency

  Containers now include an `inland_destination_eta_source_summary` field that tells you exactly where the displayed inland destination ETA comes from. Possible sources are:

  * **Shipping line** — ETA provided by the carrier
  * **Rail** — ETA from the rail carrier
  * **T49 operations team** — manually verified ETA
  * **T49 prediction engine** — machine-learning-based estimate

  The Terminal49 dashboard also shows the active ETA source, and hovering over it displays all available estimates so you can compare.

  ***

  ### Expanded shipping line LFD coverage

  Shipping line Last Free Day data is now collected from additional SSA terminals, improving LFD accuracy for containers moving through those facilities.

  <Card title="Container table properties" icon="table" href="/datasync/table-properties/containers">
    DataSync containers reference
  </Card>

  ***

  ### Bug fixes

  * **Hapag-Lloyd booking tracking** — Fixed an error that could prevent booking equipment data from being returned for Hapag-Lloyd shipments
  * **Dashboard copy/paste** — Copy and paste keyboard shortcuts in the container dashboard no longer interfere with text input fields
  * **Webhook notification links** — The dashboard webhook notifications page now correctly displays reference links for events with multiple related resources
</Update>

<Update label="March 2026" description="TypeScript SDK, MCP server, Custom Fields API, webhook trigger endpoint, and DataSync improvements" tags={['API', 'SDK', 'MCP', 'DataSync']} rss="March 2026: TypeScript SDK, MCP server for AI-powered tracking, Custom Fields API, webhook trigger endpoint, and DataSync improvements including shipping line LFD columns and pending hold status.">
  ### TypeScript SDK

  Released the **Terminal49 TypeScript SDK** (`@terminal49/sdk`), a typed client for Node.js 18+ with built-in retry logic, error handling, and JSON:API deserialization.

  * Track containers, retrieve shipments, and manage tracking requests with type-safe methods
  * Automatic retry with exponential backoff for rate limits and server errors
  * Flexible response formats: raw JSON:API, mapped objects, or both

  ```bash theme={null}
  npm install @terminal49/sdk
  ```

  <Card title="SDK docs" icon="code" href="/sdk/introduction">
    Get started with the TypeScript SDK
  </Card>

  ***

  ### MCP server

  Launched the **Terminal49 MCP server**, letting you query live container and shipment data from Claude Desktop, Cursor, or any MCP-compatible AI client.

  * **10 tools** — search, track, get container details, shipment routing, transport events, and more
  * **3 prompts** — pre-built workflows for tracking, demurrage analysis, and delay root cause analysis
  * Connect with a single config block — no custom code required

  <Card title="MCP setup guide" icon="robot" href="/mcp/home">
    Connect your AI client to Terminal49
  </Card>

  ***

  ### Custom Fields API

  You can now create and manage **custom fields** on shipments and containers via the API. Define your own field schemas (text, number, date, single-select, multi-select), create option lists, and attach values to individual shipments or containers.

  * **Custom Field Definitions** — create, update, list, and delete field schemas scoped to shipments or containers
  * **Custom Field Options** — manage allowed values for select-type fields
  * **Custom Fields** — assign values to specific shipments or containers

  <Card title="Custom Field Definitions" icon="brackets-curly" href="/api-docs/api-reference/custom-fields/list-custom-field-definitions">
    View the Custom Fields API reference
  </Card>

  ***

  ### Webhook trigger endpoint

  Added `POST /webhooks/trigger` to send a one-time test webhook delivery to any HTTPS URL — without creating a webhook endpoint first. Use it to validate your webhook handler before going live.

  <Card title="Trigger a webhook" icon="webhook" href="/api-docs/api-reference/webhooks/trigger-a-webhook">
    API reference for the trigger endpoint
  </Card>

  ***

  ### DataSync improvements

  * **Shipping line Last Free Day** — new `ssl_last_free_day_on` and `ssl_last_free_day_on_local` columns on both the `containers` and `containers_rail` tables, so you can distinguish the shipping line's LFD from the terminal's LFD
  * **Pending hold status** — individual hold columns (`freight_hold`, `customs_hold`, `usda_hold`, `tmf_hold`, `other_hold`) now support a `"Pending"` value in addition to `"Hold"` and blank, giving you earlier visibility into holds before they become active

  <CardGroup cols={2}>
    <Card title="Container table properties" icon="table" href="/datasync/table-properties/containers">
      DataSync containers reference
    </Card>

    <Card title="Holds and fees guide" icon="book-open" href="/api-docs/in-depth-guides/holds-and-fees">
      How to work with holds and fees data
    </Card>
  </CardGroup>
</Update>

<Update label="February 2026" description="Container Holds, Fees, and Release Readiness guide" tags={['API', 'DataSync']} rss="New guide: Container Holds, Fees, and Release Readiness — decision logic, enum references, webhook examples, and FAQ for determining when a container is ready for pickup.">
  ### Container Holds, Fees, and Release Readiness

  Published a comprehensive guide for working with holds and fees data in the Terminal49 API. The guide covers:

  * **Pickup readiness logic** — a decision flowchart and code example showing how to combine `available_for_pickup` with `holds_at_pod_terminal` to determine if a container can be picked up
  * **Hold and fee enum references** — quick-reference tables for all hold names and fee types, with expandable details for each value
  * **Webhook changeset examples** — how to subscribe to `container.updated` and react to hold/fee changes in real time
  * **Rail and inland destinations** — clarification that the same fields apply at inland rail terminals, not just the port of discharge
  * **FAQ** — answers to common integration questions like double-counting fees, sync lag between holds and availability, and case-sensitive hold names

  <Card title="Read the guide" icon="book-open" href="/api-docs/in-depth-guides/holds-and-fees">
    Container Holds, Fees, and Release Readiness
  </Card>
</Update>

<Update label="December 2025" description="Infer Tracking Number (Beta)" tags={['API']} rss="Added Infer Tracking Number (beta) to predict VOCC SCAC + number type prior to creating tracking requests.">
  ### Infer Tracking Number (Beta)

  Added the **Infer Tracking Number** endpoint to help you predict:

  * The **VOCC SCAC** to use for tracking
  * The **number type** (container, bill of lading, booking)
  * A confidence-driven **decision** (`auto_select`, `needs_confirmation`, `no_prediction`)

  <CardGroup cols={2}>
    <Card title="API Reference" icon="code" href="/api-docs/api-reference/tracking-requests/auto-detect-carrier">
      Infer Tracking Number endpoint details
    </Card>

    <Card title="Guide" icon="book" href="/api-docs/in-depth-guides/auto-detect-carrier">
      How to use Infer Tracking Number in your workflow
    </Card>
  </CardGroup>

  <Tip>
    Use Infer Tracking Number when you have a valid tracking number but don’t know the correct **VOCC SCAC**.
  </Tip>
</Update>

<Update label="December 2025" description="Documentation improvements" tags={['API', 'DataSync']} rss="Improved docs navigation and added an Updates tab for API/DataSync release notes.">
  ### Documentation improvements

  Added an **Updates** section to publish API/DataSync changes.

  Added cross-links from relevant docs to Infer Tracking Number.
</Update>
