BYTETOOLS

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.

No API key requiredCORS enabledHTTPSFree tier

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
curl 'https://www.bcferriesapi.ca/api/'
JavaScript (fetch)
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);
Python (requests)
import requests

res = requests.get("https://www.bcferriesapi.ca/api/", timeout=20)
res.raise_for_status()
print(res.json())
Response — HTTP 200 (truncated)
{
  "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

ParameterTypeRequiredDescription
apipathOptionalAll routes and their current sailings. api
api/<departure>/<arrival>pathOptionalOne specific route by terminal codes. api/TSA/SWB
api/capacitypathOptionalCapacity-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

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.