Extract Maersk shipment tracking details

Site maersk.comTask track-shipment-detailsVersion v4Updated Aug 10, 2026Category logistics

Open a Maersk tracking-number URL and extract the complete visible shipment status, milestone, routing, and reference information. This skill was captured from a live agent session on maersk.com and is published here as a reusable recipe for agents.

NoteSelectors and URL schemes drift as sites change. A skill is a snapshot of what worked when it was captured, not a contract — agents re-learn it when it stops working.

Retrieve all available tracking details for a Maersk shipment identified by its tracking number.

Use Cases

Use when the caller provides a Maersk tracking number and wants its current status, events, route, dates, references, or other tracking-page details.

Automation Flow

  1. Construct and navigate directly to https://www.maersk.com/tracking/{tracking-number} with waitUntil: "domcontentloaded".
  2. Wait up to 5 seconds for asynchronous tracking content to render.
  3. If a cookie-consent overlay blocks the page, activate the visible button[aria-label="Essential only"]; otherwise do not interact with consent controls.
  4. In one page evaluation, run this extractor on the loaded tracking page:
(() => {
  const visible = (el) => {
    if (!el) return false;
    const s = getComputedStyle(el),
      r = el.getBoundingClientRect();
    return (
      s.display !== "none" &&
      s.visibility !== "hidden" &&
      r.width > 0 &&
      r.height > 0
    );
  };
  const clean = (s) => (s || "").replace(/\s+/g, " ").trim();
  const root = document.querySelector('main,[role="main"]') || document.body;
  const text = (el) => clean(el.innerText || el.textContent);
  const fields = [...root.querySelectorAll("dl")].filter(visible).flatMap((dl) => {
    const out = [];
    let key = null;
    [...dl.children].forEach((el) => {
      if (!visible(el)) return;
      if (el.matches("dt")) key = text(el);
      else if (el.matches("dd") && key) {
        out.push({ label: key, value: text(el) });
        key = null;
      }
    });
    return out;
  });
  const tables = [...root.querySelectorAll("table")]
    .filter(visible)
    .map((table) => ({
      headers: [...table.querySelectorAll("thead th")].map(text),
      rows: [...table.querySelectorAll("tbody tr")]
        .filter(visible)
        .map((tr) => [...tr.querySelectorAll("th,td")].map(text))
        .filter((row) => row.some(Boolean)),
    }))
    .filter((t) => t.headers.length || t.rows.length);
  const headings = [...root.querySelectorAll("h1,h2,h3,h4,h5,h6")]
    .filter(visible)
    .map(text)
    .filter(Boolean);
  const sections = [...root.querySelectorAll('section,article,[role="region"]')]
    .filter(visible)
    .map((el) => ({
      heading: text(el.querySelector('h1,h2,h3,h4,h5,h6,[role="heading"]')),
      text: text(el),
    }))
    .filter((x) => x.text);
  return {
    url: location.href,
    title: document.title,
    headings,
    fields,
    tables,
    sections,
    pageText: text(root),
  };
})();
  1. If the tracking page fails to expose result content, the page-backed service endpoint observed for Maersk tracking is https://api.maersk.com/synergy/tracking/{tracking-number}?operator=MAEU. Navigate to it only as a fallback and return its parsed JSON response, preserving all nested status, milestone, routing, and reference data.

Possible Friction Points

  • Maersk supports a direct tracking route of the form /tracking/{tracking-number}; use it instead of visiting the homepage and filling the form.
  • Category-specific routes use /tracking/{tracking-type}/{tracking-number}. Observed category paths include /tracking/air, /tracking/parcel, /tracking/lcl, and /tracking/ocean; use a category-specific route only when the tracking type is known. The generic route is preferred because it avoids category selection.
  • The tracking-type control is a custom mc-select-native component with its native <select> inside a shadow root. If category selection is unavoidable, access document.querySelector('mc-select-native').shadowRoot.querySelector('select') and dispatch composed input and change events. Direct tracking-number URLs avoid manipulating this control.
  • The tracking input and search button may likewise be custom mc-input and mc-button elements whose native controls are inside shadow roots. Direct URLs avoid needing to fill or click them.
  • Cookie consent may appear before the result; the useful non-destructive option is the button labelled Essential only.
  • Tracking content may render asynchronously after navigation, so allow a short render wait before extraction.
  • A same-site Maersk API fallback has been observed at /synergy/tracking/{tracking-number}?operator=MAEU; treat the operator parameter as site-specific and preserve the complete JSON rather than flattening it.
  • The DOM extractor preserves structured definition-list fields and tables as well as visible headings, section cards, and complete main-content text, covering mixed status, milestone, routing, and reference layouts.

Call it

GET https://production-sfo.browserless.io/skills?token=TOKEN-HERE&domain=maersk.com&task=track-shipment-details