Navigazione Laghi APInavigazionelaghi.it ↗
Query port lists and scheduled boat connections for Lake Maggiore, Lake Garda, and Lake Como via the Navigazione Laghi journey planner API.
What is the Navigazione Laghi API?
The Navigazione Laghi API gives developers access to 2 endpoints covering public boat timetables for the three Italian lakes operated by Navigazione Laghi. The list_ports endpoint returns all landing stages for a given lake with their numeric IDs, while search_connections returns scheduled connections between two ports on a chosen date, including per-leg trip numbers, intermediate stops, duration in minutes, and service notes.
curl -X GET 'https://api.parse.bot/scraper/e61cac40-ab72-458b-87ee-64353b0af233/list_ports?lake=lago-garda' \ -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 navigazionelaghi-it-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.
"""Walkthrough: NavigazioneLaghi SDK — list ports, search connections, inspect legs."""
from parse_apis.navigazionelaghi_it_api import NavigazioneLaghi, Lake, InputFormatInvalid
client = NavigazioneLaghi()
# List all ports on Lake Garda to discover port IDs.
ports = client.ports.list(lake=Lake.GARDA, limit=50).list()
for port in ports[:5]:
print(port.port_id, port.name)
# Pick the first two ports as departure / arrival for a connection search.
departure = ports[0]
arrival = ports[1]
try:
schedule = client.schedules.search(
date="2026-07-15",
from_port_id=departure.port_id,
to_port_id=arrival.port_id,
lake=Lake.GARDA,
)
except InputFormatInvalid as e:
# Raised when a parameter value is malformed (bad date, unknown port id).
print(f"Invalid input: {e.message}")
raise
print(f"{schedule.date} {schedule.from_port_id} → {schedule.to_port_id} "
f"full_day={schedule.full_day} total={schedule.total_connections}")
if schedule.connections:
# Inspect the fastest connection's legs and intermediate stops.
conn = schedule.connections[0]
print(f" depart {conn.departure_time} arrive {conn.arrival_time} "
f"{conn.duration_minutes}min changes={conn.changes}")
for leg in conn.legs:
print(f" trip {leg.trip_number}: {leg.from_port} → {leg.to_port} "
f"bicycles={leg.bicycles} wheelchair={leg.wheelchair_recommended}")
for stop in leg.stops:
print(f" stop {stop.port} arr={stop.arrival_time} dep={stop.departure_time}")
print("exercised: ports.list / schedules.search / Connection / Leg / Stop")
Returns the ports (landing stages) of one lake as shown in the site's journey-search form, each with the numeric port_id that search_connections takes as from_port_id / to_port_id. One round trip; the list is small (about 30 ports per lake) and never empty.
| Param | Type | Description |
|---|---|---|
| lake | string | Which lake's ports to list. |
{
"type": "object",
"fields": {
"lake": "lake code the ports belong to",
"ports": "array of {port_id (string, use as from_port_id/to_port_id), name (display name)}"
},
"sample": {
"data": {
"lake": "lago-garda",
"ports": [
{
"name": "Desenzano",
"port_id": "51"
},
{
"name": "Lazise",
"port_id": "56"
},
{
"name": "Peschiera",
"port_id": "52"
},
{
"name": "Sirmione",
"port_id": "53"
}
]
},
"status": "success"
}
}About the Navigazione Laghi API
What the API covers
Navigazione Laghi operates the public ferry and hydrofoil services on Lake Maggiore, Lake Garda, and Lake Como. This API exposes the same journey-search data available through the site's journey planner. Two endpoints cover the full lookup workflow: retrieve the port list for a lake, then search connections between any two ports on a specific travel date.
list_ports — port directory per lake
Pass a lake string to get an array of port objects, each containing a port_id (numeric string) and a human-readable name. These IDs are the required inputs for search_connections. The list is small — around 30 ports per lake — and reflects the current set of active landing stages.
search_connections — scheduled connections
Required inputs are date (ISO format YYYY-MM-DD), from_port_id, and to_port_id. Optional filters include departure_time (earliest departure as HH:MM, which scopes results to an 8-hour window from that time), no_change (direct connections only), fast_service (includes servizio rapido trips, which carry a surcharge and have been verified to add results on Lake Garda), and vehicles (veicoli al seguito, for vehicle-carrying services). When departure_time is omitted the API assembles three consecutive 8-hour windows into a full-day view, indicated by the full_day: true flag in the response. Each connection in the connections array includes departure_time, arrival_time, duration_minutes, changes, and a legs array. Individual legs carry a trip number, stops, and service notes. The no_solutions_notice flag is set to true when the journey planner found no results for the query.
Coverage and freshness
The API reflects the timetable published for the current operating season. Navigazione Laghi updates schedules seasonally, so results for dates outside the published season may return no solutions. Coverage is limited to the three lakes the operator serves; services on other Italian lakes are not included.
The Navigazione Laghi API is a managed, monitored endpoint for navigazionelaghi.it — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when navigazionelaghi.it 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 navigazionelaghi.it 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?+
- Build a trip-planning widget showing all ferry departures between two Lake Garda ports on a given date.
- Alert travellers when direct (no_change) connections exist between specific Lake Como ports.
- Filter for fast-service (servizio rapido) connections on Lake Garda to surface quicker crossing options.
- Display a port selector for Lake Maggiore by pulling the full port list with
list_ports. - Check whether vehicle-carrying ferry connections exist between two ports on a chosen date.
- Aggregate connection counts and average durations across the day for a lake crossing comparison tool.
- Integrate scheduled departure times into a broader Italian transport itinerary combining trains and boats.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Navigazione Laghi provide an official developer API?+
What does `full_day` mean in the `search_connections` response?+
departure_time, the API queries three consecutive 8-hour windows and merges the results into a single list sorted by departure time. In that case full_day is set to true and departure_time_from is null. If you supply a departure_time, results are scoped to the single 8-hour window starting at that time, full_day is false, and departure_time_from reflects your input.What is the `no_solutions_notice` flag and when does it appear?+
true when the journey planner reports no connections for your query — for example, a route that doesn't operate on the requested date, a port pair with no direct or connecting service, or a date outside the published seasonal timetable. The connections array will be empty in that case.