Transportation — entry 009 of 69

BC Ferries

Verified Jul 2026

An independent, keyless JSON API built by developer Sam Pratt that scrapes and republishes BC Ferries' current sailing schedules, capacity and fill percentages, and vessel names for both major and minor routes via simple GET endpoints like /v2/capacity and /v2/noncapacity. It's a hobbyist project sustained through GitHub Sponsors donations rather than an official BC Ferries product, and it also backs a companion iOS app.

BC Ferries API is an independent, keyless JSON API built by developer Sam Pratt that scrapes and republishes BC Ferries' own sailing schedules — departure times, vessel names, and (for major routes) live capacity fill percentages — rather than being an official BC Ferries product. It backs a couple of published iOS apps and is sustained through GitHub Sponsors donations.

ferriesbc-ferriesmarinetransitbritish-columbia
AuthenticationNone requiredCall it straight away — no key, no signup.
HTTPSSupportedTraffic is encrypted in transit.
CORSEnabledCallable directly from browser JavaScript.
PricingFreeNo paid tier — free for the documented use case.
FormatsJSONResponses can be requested as JSON.

GreatAPIs Score

Score88out of 100
Authentication25/25No authentication required
Pricing20/20Free to use
Docs14/20Documentation URL provided
Formats9/15Single response format
Freshness20/20Verified within 6 months

Embed this badge

Scored 88 on greatapis.com
<a href="https://greatapis.com/api/bc-ferries/"><img src="https://greatapis.com/badge/bc-ferries.svg" alt="Scored 88 on greatapis.com"></a>

Auth quickstart

  1. No API key required — requests are public and keyless. There's no published usage policy or rate limit; as a donation-sustained hobby project, be a considerate caller (cache results, poll no more often than sailing schedules actually change) rather than assuming an enforced ceiling exists.
Stored keyNo key stored

Your key is stored only in this browser (localStorage) and sent directly to the API — never to greatapis.

Get live capacity for major routes

GEThttps://www.bcferriesapi.ca/v2/capacity/

200 application/json

{"routes":[{"routeCode":"SWBFUL","fromTerminalCode":"SWB","toTerminalCode":"FUL","sailingDuration":"0h 35m","sailings":[{"time":"8:35 am","arrivalTime":"","sailingStatus":"future","fill":0,"carFill":0,"oversizeFill":0,"vesselName":"Skeena Queen","vesselStatus":""}]}]}

Response abridged to 1 route and its first sailing — a real response returns all 12 capacity-tracked routes, each with a full day's sailings.

Developer reference

Base URLhttps://www.bcferriesapi.ca/v2

Gotchas & limits

  • `/v2/capacity` only covers the 12 major routes BC Ferries itself reports vessel fill data for (per the project's README: TSA, SWB, HSB, DUK, LNG, NAN cross-connections) — confirmed live returning exactly those 12 `routeCode`s in this run. For the other ~100 minor/inter-island routes (Southern Gulf Islands, etc.), use `/v2/noncapacity` instead, which has no fill data but covers all 116 routes (confirmed live).
  • `sailingDuration` is formatted differently between the two endpoints: `/v2/capacity` uses a human string like `"0h 35m"`, while `/v2/noncapacity` uses `"HH:MM"` like `"02:00"` — confirmed live on the same run. Don't reuse one parser for both endpoints.
  • `fill`, `carFill`, and `oversizeFill` are plain numbers (0–100-ish percentages), but a `0` doesn't necessarily mean empty — it's also what a not-yet-open-for-booking future sailing reports, per a live probe in this run where every upcoming sailing on one route showed `0` across all three fields. Cross-check `sailingStatus` before treating `0` as "boat is empty".
  • `vesselName` and `vesselStatus` can come back as empty strings `""` rather than being omitted, particularly on `/v2/noncapacity` and for sailings far enough in the future that a vessel hasn't been assigned yet — confirmed live.
  • This is an unofficial, independently-run project scraping BC Ferries' own site, not an API BC Ferries operates or guarantees — treat it as a convenience layer that could break if BC Ferries changes their site, and don't build anything safety-critical (e.g. "can I make this sailing") on it alone.