Maersk Port Calls & Vessel Schedules Scraper avatar

Maersk Port Calls & Vessel Schedules Scraper

Pricing

from $1.20 / 1,000 port call scrapeds

Go to Apify Store
Maersk Port Calls & Vessel Schedules Scraper

Maersk Port Calls & Vessel Schedules Scraper

Berth-level port calls and full vessel rotations for Maersk and Sealand: ETA/ETD, terminal, voyage number and service code, for any port or vessel.

Pricing

from $1.20 / 1,000 port call scrapeds

Rating

0.0

(0)

Developer

Arman Hossain

Arman Hossain

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

11 days ago

Last modified

Share

Maersk Port Calls: Berth level port calls and full vessel rotations, with terminal, ETA, ETD and service code

Pulls berth-level port calls and full vessel rotations straight from the schedule platform behind maersk.com/schedules. Give it a port (or several) and you get every vessel calling there in a date window, with terminal, ETA/ETD, voyage number and service code. Give it a vessel and you get its full forward rotation: every remaining port of call through the end of your window.

No login, no proxy and no browser are required to use this Actor. It reads structured JSON directly, for both the Maersk (MAEU) and Sealand (MCPU) brands.

Agent skill: SKILL.md

https://api.apify.com/v2/key-value-stores/t7YoTxpZEJOWvw4Ug/records/maersk-port-calls-scraper.md

What you get

One record per port call or per rotation leg. source tells you which flow produced it.

FieldWhat it holds
sourceport-call (from a port lookup) or vessel-rotation (from a vessel lookup)
vesselMaerskCode, vesselName, vesselIMONumber, flagISOCountryCode, callSignVessel identity
marineContainerTerminalName, marineContainerTerminalRKSTCode, marineContainerTerminalGeoCodeThe berth/terminal called
arrivalTime, arrivalTimingClassifierETA or ATA, and whether it is ESTIMATED or ACTUAL
departureTime, departureTimingClassifierETD or ATD, and its own estimated/actual flag
arrivalVoyageNumber, departureVoyageNumberInbound and outbound voyage numbers for this call
arrivalServiceName, arrivalServiceCode, departureServiceName, departureServiceCodeThe named service (trade lane) each leg runs on
isoCountryCode, countryName, unLocationCode, cityName, portName, portCode, regionCodePort geography
carrierCodesQueriedWhich brand(s) (MAEU, MCPU) this call was requested under
queriedPort, queriedVesselThe raw input that produced this record, whichever one applies
scrapedAtRun timestamp

RUN_SUMMARY in the key-value store holds per-run counts, the resolved window, and any port or vessel that could not be matched.

Use cases

  • Berth-window benchmarking. Pull a terminal's port calls over a rolling window to track how estimated ETAs move against actuals.
  • Carrier-of-record ETAs. Feed arrivalTime/departureTime into a supply-chain visibility tool as the carrier's own published schedule.
  • Vessel tracking without AIS. A vessel's full forward rotation, port by port, without a satellite feed.
  • Service-lane mapping. Group by arrivalServiceCode to see which vessels and ports share a named service.
  • Rate/routing tools. Cross-reference portCode/unLocationCode against a rate sheet to see which sailings are actually available in a window.

Quick start

Nothing at all: the next two weeks of port calls at Rotterdam:

{}

One port, a specific window:

{
"ports": ["Singapore"],
"fromDate": "2026-09-01",
"toDate": "2026-09-21"
}

A vessel's full rotation, both brands:

{
"vessels": ["Madrid Maersk"],
"fromDate": "2026-09-01",
"toDate": "2026-11-01",
"carrierCodes": ["MAEU", "MCPU"]
}

Several ports and a vessel in one run:

{
"ports": ["NLRTM", "USNYC", "Tanjung Pelepas"],
"vessels": ["9260914"],
"maxRecords": 300
}

Input

FieldTypeDefaultNotes
portsarray["NLRTM"]UN/LOCODE, Maersk port code, or a city/port name, matched against Maersk's live port list. Leave empty together with vessels to default to Rotterdam.
vesselsarray[]Maersk vessel code, IMO number, or vessel name, matched against Maersk's live vessel list. Leave empty to skip vessel rotations.
fromDatestringtodayYYYY-MM-DD. Start of the schedule window.
toDatestringfromDate + 14 daysYYYY-MM-DD. End of the schedule window. 2-4 week windows answer reliably.
carrierCodesarray["MAEU"]MAEU (Maersk) and/or MCPU (Sealand). Both are queried together in one request.
maxRecordsinteger500Total cap across every port and vessel. 0 means no limit.

Nothing is required. Running with no input returns Rotterdam's next two weeks.

Output example

A berth-level port call:

{
"source": "port-call",
"vesselMaerskCode": "W04",
"vesselName": "MAERSK SARAT",
"vesselIMONumber": "9732591",
"flagISOCountryCode": "LR",
"callSign": "D5JH6",
"marineContainerTerminalName": "Hutchison Ports Delta II",
"marineContainerTerminalRKSTCode": "NLROT01",
"marineContainerTerminalGeoCode": "2LME4YKE32WZJ",
"arrivalTime": "2026-08-22T00:06:00+02:00",
"arrivalTimingClassifier": "ACTUAL",
"departureTime": "2026-08-23T03:45:00+02:00",
"departureTimingClassifier": "ESTIMATED",
"arrivalVoyageNumber": "628N",
"departureVoyageNumber": "628N",
"arrivalServiceName": "SAECS",
"arrivalServiceCode": "278",
"departureServiceName": "SAECS",
"departureServiceCode": "278",
"isoCountryCode": "NL",
"countryName": "Netherlands",
"unLocationCode": "NLRTM",
"cityName": "Rotterdam",
"portName": "Rotterdam",
"portCode": "1JUKNJGWHQBNJ",
"regionCode": "ZH",
"carrierCodesQueried": ["MAEU"],
"queriedPort": "NLRTM",
"queriedVessel": null,
"scrapedAt": "2026-08-21T22:50:54.635Z"
}

A leg from a vessel's forward rotation looks the same shape, with source: "vessel-rotation" and queriedVessel set instead of queriedPort.

Naming a port or vessel

You writeMatched against
NLRTMunLocationCode on Maersk's active-port list
1JUKNJGWHQBNJMaersk's own 13-character portCode
Rotterdam, Tanjung PelepascityName/portName, exact first, then a loose match
T9PvesselMaerskCode on Maersk's active-vessel list
9260914vesselIMONumber
Madrid MaerskvesselName, exact first, then a loose match

A name that matches nothing is recorded in RUN_SUMMARY.failures rather than stopping the run; every other port or vessel in the same call still gets processed.

API example

curl -X POST "https://api.apify.com/v2/acts/arman-bd~maersk-port-calls-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"ports": ["NLRTM"],
"fromDate": "2026-09-01",
"toDate": "2026-09-15"
}'

JavaScript example

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('arman-bd/maersk-port-calls-scraper').call({
vessels: ['Madrid Maersk'],
fromDate: '2026-09-01',
toDate: '2026-11-01',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const leg of items) {
console.log(`${leg.portName}: ETA ${leg.arrivalTime} (${leg.arrivalTimingClassifier})`);
}

Notes

  • arrivalTimingClassifier/departureTimingClassifier flip from ESTIMATED to ACTUAL as a call happens. Re-run the same port or vessel later in the day to see actuals replace estimates.
  • A port lookup returns every vessel calling there in the window; a vessel lookup returns every port that vessel calls in the window. The two are complementary, not duplicates of each other.
  • carrierCodesQueried records which brand(s) you asked for, not which brand operates that specific call. Maersk's schedule API does not expose that split when both brands are queried together.
  • maxRecords bounds the whole run. Once it is reached, later ports or vessels in your list are not even requested, which is why RUN_SUMMARY.requestsMade can be lower than expected on a tightly capped run.
  • A resolved port or vessel with nothing scheduled in your window is a legitimate empty result, not a failure, so it will not appear in RUN_SUMMARY.failures.

FAQ

Do I need a Maersk account or API key? No. You supply no credentials.

Can I get Sealand (MCPU) sailings too? Yes, add MCPU to carrierCodes. Both brands run on the same schedule platform.

How far ahead can I query? Maersk answers 2-4 week windows reliably; the default is 14 days. Wider windows are accepted but risk truncation on busy ports, so a long-range pull is more reliable as several shorter windows.

What if I misspell a port or vessel name? It is recorded in RUN_SUMMARY.failures with the input you gave, and every other target in the same run still completes.

Does this track vessel position (AIS)? No. It returns Maersk's own published schedule (ETAs, ETDs, ports, terminals), not live GPS position.

Can I plug it into something else? Yes. Apify API, the client libraries, webhooks, scheduled runs, dataset exports to JSON, CSV or Excel, or MCP. The output is structured JSON.