BC Ferries API
Free BC Ferries API with no key: sailing schedules, departure times, vehicle and passenger capacity, and cancellations for British Columbia routes. Tested.
Endpoint tested and returned HTTP 200 on 2026-08-20
What is the BC Ferries API?
The BC Ferries API is a free, key-free community API providing sailing schedules for British Columbia ferry routes, including departure and arrival times, current vehicle and passenger capacity, and cancellation status.
Ferry capacity is the genuinely useful part here. BC Ferries routes fill up, and knowing a sailing is already 80% full for vehicles changes whether you leave now or wait — information a plain timetable cannot give you.
Routes are keyed by three-letter terminal codes in a nested structure: departure terminal, then arrival terminal, then the sailings between them. You need the code pair to navigate the response.
Quick facts
- Base URL
https://www.bcferriesapi.ca- Authentication
- No API key required.
- Rate limit
- No published hard limit; it scrapes the operator, so cache rather than polling hard.
- Pricing
- Free and open source.
- CORS
- Enabled — callable directly from browser JavaScript
- Official docs
- Read the docs
How to use the BC Ferries API
Every request below was executed against the live API on 2026-08-20, and the response shown is the real body it returned — not an illustration.
1. Fetch current ferry sailings
GET https://www.bcferriesapi.ca/api/
curl 'https://www.bcferriesapi.ca/api/'const res = await fetch("https://www.bcferriesapi.ca/api/");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);import requests
res = requests.get("https://www.bcferriesapi.ca/api/", timeout=20)
res.raise_for_status()
print(res.json()){
"BOW": {
"HSB": {
"sailingDuration": "0h 20m",
"sailings": [
{
"time": "5:15 am",
"arrivalTime": "5:35 am",
"isCancelled": false,
"fill": 0,
"carFill": 0,
"oversizeFill": 0,
"vesselName": "",
"vesselStatus": ""
},
{
"time": "6:15 am",
"arrivalTime": "6:35 am",
"isCancelled": false,
"fill": 0,
"carFill": 0,
"oversizeFill": 0,
"vesselName": "",
"vesselStatus": ""
},
{
"time": "7:30 am",
"arrivalTime": "7:50 am",
"isCancelled": false,
"fill": 0,
"carFill": 0,
"oversizeFill": 0,
"vesselName": "",
"vesselStatus": ""
},
{
"time": "8:45 am",
"arrivalTime": "9:05 am",
"isCancelled": false,
"fill": 0,
"carFill": 0,
"oversizeFill": 0,
"vesselName": "",
"vesselStatus": ""
},
{
"time": "10:00 am",
"arrivalTime": "10:20 am",
"isCancelled": false,
"fill": 0,
"carFill": 0,
"oversizeFill": 0,
"vesselName": "",
"vesselStatus": ""
},
{
"time": "11:15 am",
"arrivalTime": "11:35 am",
"isCancelled": false,
"fill": 0,
"carFill": 0,
"oversizeFill": 0,
"vesselName": "",
"vesselStatus": ""
},
{
"Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
api | path | Optional | All routes and their current sailings. api |
api/<departure>/<arrival> | path | Optional | One specific route by terminal codes. api/TSA/SWB |
api/capacity | path | Optional | Capacity-focused view of sailings. api/capacity |
Response fields
<departure>.<arrival>object- Sailings keyed by terminal code pair, e.g. BOW.HSB.
...sailingDurationstring- Crossing time, e.g. '0h 20m'.
...sailings[].time / arrivalTimestring- Departure and arrival times.
...sailings[].isCancelledboolean- Whether the sailing is cancelled.
...sailings[].fillinteger- Overall percentage full.
...sailings[].carFill / oversizeFillinteger- Vehicle deck capacity used, by vehicle type.
What you can build with the BC Ferries API
- Show ferry departure times with live capacity
- Warn travellers when a sailing is nearly full
- Alert on cancellations for a regular route
- Build a BC travel planning tool
Common errors and how to fix them
Unknown terminal code
Routes use three-letter codes.
Fix: TSA is Tsawwassen, SWB Swartz Bay, HSB Horseshoe Bay — check the docs for the full list.
Stale data
It scrapes the operator's site.
Fix: Cache and expect occasional lag; do not poll aggressively.
Nested response structure
Sailings are keyed by departure then arrival terminal.
Fix: Navigate response[departure][arrival].sailings rather than expecting a flat array.
BC Ferries API — frequently asked questions
Is the BC Ferries API free?
Yes, free with no API key. It is a community project rather than an official BC Ferries service.
What does the fill percentage mean?
How full a sailing currently is, with separate figures for standard vehicles and oversize. It is the most useful field — a timetable cannot tell you whether you will actually get on.
Is this an official BC Ferries API?
No, it is community-built and scrapes the operator's published information. Treat it as best-effort and verify anything critical with BC Ferries directly.
What are the terminal codes?
Three-letter codes such as TSA for Tsawwassen, SWB for Swartz Bay and HSB for Horseshoe Bay. Routes are keyed by departure and arrival pairs.
Tools that pair with this API
JSON Formatter
Format, beautify and minify JSON online with 2-space, 4-space or tab indentation. Sort keys alphabetically and catch syntax errors instantly — free and private.
Timestamp Converter
Convert timestamps to human-readable dates and dates back to timestamps. Auto-detects seconds vs milliseconds, shows local, UTC and ISO 8601 formats.
BC Ferries is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-20; always check the official documentation before relying on this API in production, as terms and limits can change.