NetFerry APIit.netferry.com ↗
Query Italian ferry routes and real-time departure prices from it.netferry.com. Get port IDs, voyage schedules, and per-class EUR fares for up to 9 passengers.
What is the NetFerry API?
The NetFerry API gives programmatic access to ferry route discovery and departure pricing from it.netferry.com across 2 endpoints. The search_routes endpoint resolves a free-text port, region, or country name into numeric port ID pairs, while search_prices returns dated one-way voyages with per-class EUR fares broken out for deck, seat, bed, and cabin accommodation — adjusted for passenger ages, vehicles, pets, and resident discounts.
curl -X GET 'https://api.parse.bot/scraper/2646a74f-1786-4cf0-b7a5-7fff6ed512ee/search_routes?query=Olbia' \ -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 it-netferry-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.
"""Walkthrough: NetFerry SDK — search ferry routes and compare voyage prices."""
from parse_apis.it_netferry_com_api import NetFerry, VehicleType, InputFormatInvalid
client = NetFerry()
# Find routes departing from or arriving at Olbia.
route = client.routes.search(query="Olbia", limit=5).first()
if route is None:
print("No routes found for Olbia")
else:
print(f"{route.departure_port} → {route.arrival_port} "
f"({route.departure_region} → {route.arrival_region})")
# Search voyages on the first route for 2 passengers.
try:
for voyage in route.search_voyages(
date="2026-10-26", passengers=2, limit=3
):
print(f" {voyage.company} {voyage.ship} "
f"{voyage.departure_time}–{voyage.arrival_time} {voyage.duration}")
# Show per-class prices when available.
if voyage.prices.standard is not None:
std = voyage.prices.standard
print(f" Standard: €{std.price} + €{std.booking_fee} fee "
f"(availability: {std.availability})")
if voyage.prices.cabin is not None:
cab = voyage.prices.cabin
print(f" Cabin: €{cab.price} + €{cab.booking_fee} fee")
except InputFormatInvalid as e:
print(f"Invalid search parameters: {e.message}")
print("exercised: routes.search / route.search_voyages / VoyagePricing / Price")
Finds ferry routes whose departure or arrival port matches a free-text port, region or country name (e.g. a city such as Olbia). Returns one record per directional route with the numeric departure_id and arrival_id that search_prices consumes, plus port, region and country labels. One upstream call; an unknown name returns an empty routes list.
| Param | Type | Description |
|---|---|---|
| queryrequired | string | Port, region or country name to match (Italian spelling as shown on the site, case-insensitive). |
{
"type": "object",
"fields": {
"query": "the query echoed back",
"total": "number of routes returned",
"routes": "array of directional routes: departure_id/arrival_id (string port ids), departure_port/arrival_port names, region, country and ISO3 country code"
},
"sample": {
"data": {
"query": "Olbia",
"total": 1,
"routes": [
{
"arrival_id": "89",
"arrival_port": "CIVITAVECCHIA",
"departure_id": "289",
"arrival_region": "ITALIA",
"departure_port": "OLBIA",
"arrival_country": "ITALIA",
"departure_region": "SARDEGNA",
"departure_country": "ITALIA",
"arrival_country_code": "ITA",
"departure_country_code": "ITA"
}
]
},
"status": "success"
}
}About the NetFerry API
Route Discovery
The search_routes endpoint accepts a query string — a port city, region, or country name in Italian spelling (e.g. "Olbia", "Sardegna") — and returns an array of directional route records. Each record carries departure_id and arrival_id (the numeric port identifiers consumed by search_prices), plus human-readable departure_port and arrival_port names, region, country, and ISO country code. Routes are directional, so Genova→Olbia and Olbia→Genova appear as separate records.
Departure Search and Pricing
The search_prices endpoint takes a departure_id/arrival_id pair from search_routes, a date in ISO YYYY-MM-DD format, and several optional filters. passengers (1–9) and ages (comma-separated integers 0–99, one per passenger) control fare calculation. vehicle_type adds a vehicle to the booking; any value other than NOVEHICLE also requires vehicle_length_cm and vehicle_height_cm. pets (0–2) and residents (boolean) apply where the route supports them.
The response contains a voyages array. Each voyage includes voyage_id, company, ship (may be null if not yet published), departure and arrival port names and IDs, ISO datetime strings for departure and arrival times, and a prices object. The prices object is keyed by accommodation class — standard/deck, seat, bed, cabin — and each key present represents an offered class with its total EUR fare for the full party. Absent keys mean that class is not available on that sailing. The currency field confirms all amounts are in EUR.
Coverage Notes
The source site it.netferry.com covers Italian ferry operators and routes — primarily connections to Sardinia, Sicily, and other Italian islands, as well as some Adriatic and international departures. Route and schedule availability reflects what is published on the source at query time. The alternative_routes field in a search_prices response indicates whether voyages from nearby or connecting routes were included.
The NetFerry API is a managed, monitored endpoint for it.netferry.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when it.netferry.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 it.netferry.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?+
- Display fare calendars for Genova–Olbia or Civitavecchia–Palermo sailings with per-class pricing
- Build a fare-alert service that monitors price changes for a departure_id/arrival_id pair over time
- Filter voyages by vehicle type and dimensions to find car-ferry availability on a given date
- Apply resident discount fares programmatically when booking for Sardinian or Sicilian residents
- Compare cabin vs. seat vs. deck prices across multiple companies on the same sailing date
- Populate a trip-planning tool with port IDs and regional labels from search_routes query results
- Aggregate pet-friendly ferry options by passing pets=1 or pets=2 across multiple routes
| 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 it.netferry.com have an official developer API?+
What does search_prices return when a ship name is not yet confirmed?+
ship field in each voyage object will be null when the operator has not yet published the vessel assignment for that sailing. All other voyage fields — company, departure/arrival times, and prices — are still returned if available.How do I know which accommodation classes are offered on a specific sailing?+
prices object inside each voyage only includes keys for classes the operator actually offers on that sailing. If cabin is absent from prices, cabin accommodation is not available. The possible keys are standard/deck, seat, bed, and cabin.Does the API support round-trip searches or multi-leg itineraries?+
search_prices endpoint covers one-way departures for a single departure_id/arrival_id pair on one date. For a return trip, you would call the endpoint twice with the ports swapped. You can fork this API on Parse and revise it to add a combined round-trip endpoint that bundles both calls.