Port of Rotterdam APIportofrotterdam.com ↗
Access vessel movements, container throughput statistics, anchorage performance, and nautical notices for the Port of Rotterdam via a single REST API.
What is the Port of Rotterdam API?
This API provides 5 endpoints covering live and scheduled vessel movements, port performance metrics, and official nautical notices for the Port of Rotterdam. The get_vessel_movements endpoint returns vessels grouped into Present, Expected, and Departed arrays — each record including IMO number, berth, operator, and datetime. Container throughput, anchorage statistics, and active port notices round out the coverage.
curl -X GET 'https://api.parse.bot/scraper/5828d945-9313-405f-8026-3a26e1d63dfb/get_vessel_movements?query=NORDIC' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace portofrotterdam-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Port of Rotterdam: vessel movements, statistics, and notices."""
from parse_apis.port_of_rotterdam_api import (
PortOfRotterdam, VesselStatus, VesselNotFound,
)
client = PortOfRotterdam()
# Get vessel movements overview — typed field access on the grouped result.
overview = client.movements.get(query="NORDIC")
print(f"Expected vessels matching 'NORDIC': {len(overview.expected)}")
for vessel in overview.expected[:3]:
print(f" {vessel.name} (IMO: {vessel.imo}) — operator: {vessel.operator}")
# Drill-down: fetch full details for a single vessel by IMO.
try:
detail = client.vessels.get(imo=overview.expected[0].imo)
print(f"\nVessel detail: {detail.name}, flag: {detail.flag_code}, "
f"built: {detail.year_of_build}, status: {detail.current_status}")
except VesselNotFound as exc:
print(f"Vessel not found: {exc}")
# Port performance — anchorage statistics for a given year.
anchorage = client.statistics.anchorage(year=2025)
print(f"\nAnchorage periods: {len(anchorage.anchorage_years_months)}")
print(f" Latest deep-sea avg time: {anchorage.ds_avg_anchorage_time_in_days[-1]} days")
print(f" Latest direct-to-berth: {anchorage.percent_direct_to_berth[-1]}%")
# Container throughput — current year totals.
throughput = client.statistics.throughput()
print(f"\nTotal TEU: {throughput.total_teu}")
for cat in throughput.throughput_by_type:
print(f" {cat.name}: {cat.y} TEU")
# Active nautical notices — bounded iteration.
for notice in client.notices.list(limit=3):
print(f"\nNotice: {notice.content[:80]}...")
print("\nExercised: movements.get / vessels.get / statistics.anchorage / "
"statistics.throughput / notices.list")
Get current (Present), expected, and departed vessel movements at the Port of Rotterdam. Returns a grouped object with three arrays of vessels by their movement status. Supports optional case-insensitive partial name filtering across all three groups. Each vessel record includes IMO, name, berth, operator, flag, tonnage, and timestamps.
| Param | Type | Description |
|---|---|---|
| query | string | Optional vessel name filter (case-insensitive partial match). Filters across Present, Expected, and Departed lists. |
{
"type": "object",
"fields": {
"Present": "array of vessels currently at port",
"Departed": "array of vessels that have departed",
"Expected": "array of vessels expected to arrive"
}
}About the Port of Rotterdam API
Vessel Movements and Details
get_vessel_movements returns three arrays — Present, Expected, and Departed — each containing vessel records with fields like imo, name, berth, operator, and datetime. An optional query parameter filters results by vessel name using a case-insensitive partial match, making it straightforward to track vessels operated by a specific carrier such as 'MAERSK'. For deeper lookup, get_vessel_details accepts an imo number, a UCRN, or an exact vessel name and returns fields including flag_code, port_of_registry, and current_status. The endpoint returns a stale_input indicator if the vessel is not found in current movements.
Port Performance Statistics
get_port_performance_anchorage exposes time-series data for anchorage area activity. Response fields include anchorage_years_months (period labels in YYYY-M format), ds_avg_anchorage_time_in_days and ss_avg_anchorage_time_in_days for deep-sea and short-sea vessels respectively, percent_direct_to_berth, and port_visits. Filtering is available by date_from, date_to, year, month, and vessel_type. get_container_throughput_statistics returns quarterly TEU figures (teu_q), year-over-year change percentages (teu_q_diff_percentage), import/export splits, empty/full container ratios, and throughput broken down by service type — deep sea, short sea, and no liner.
Nautical Notices
get_port_notices returns the current set of active PIN and BAS nautical notices. Each notice object contains a content string with the full notice text, including start date, duration, and description. Typical notices cover navigation warnings, bridge disruptions, and capacity arrangements. This endpoint takes no input parameters and always reflects the currently active notice set.
The Port of Rotterdam API is a managed, monitored endpoint for portofrotterdam.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when portofrotterdam.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official portofrotterdam.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Monitor which vessels are currently berthed at Rotterdam and which are expected to arrive, using
PresentandExpectedarrays fromget_vessel_movements. - Look up a specific container ship's berth assignment and flag state by querying
get_vessel_detailswith its IMO number. - Track quarterly TEU throughput trends and year-over-year changes with
teu_q_diff_percentagefromget_container_throughput_statistics. - Analyze the percentage of vessels arriving direct-to-berth versus anchoring first, using
percent_direct_to_berthfromget_port_performance_anchorage. - Alert logistics teams to active navigation warnings or bridge disruptions by polling
get_port_noticesfor current BAS and PIN notices. - Compare average anchorage wait times for deep-sea versus short-sea vessels across custom date ranges using
ds_avg_anchorage_time_in_daysandss_avg_anchorage_time_in_days. - Filter vessel arrivals by carrier name to track fleet presence at Rotterdam in near-real time.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does the Port of Rotterdam offer an official developer API?+
What does `get_vessel_details` return, and how do I search for a vessel?+
imo, name, berth, operator, flag_code, port_of_registry, and current_status (one of 'Present', 'Expected', or 'Departed'). You can pass an imo number, a UCRN, or an exact vessel name via the vessel_id parameter. If the vessel is not found in current movements, the response includes a stale_input indicator rather than an error.Does the API cover cargo tonnage or commodity-level breakdowns beyond container TEU?+
How current is the vessel movement data, and does it cover historical arrivals?+
get_port_performance_anchorage and get_container_throughput_statistics both accept date_from/date_to or year/quarter filters for historical statistical data, but individual historical vessel calls are not retrievable through this API. You can fork it on Parse and revise to add a historical vessel calls endpoint if that data becomes accessible.Can I filter nautical notices by type, such as only navigation warnings or only bridge disruptions?+
get_port_notices takes no input parameters and returns all currently active notices in a single array. Filtering by notice type (PIN vs BAS, or by category like bridge disruption) is not available — each notice is returned as a full content string. You can fork this API on Parse and revise it to add type-based filtering on top of the returned notice set.