Transportation — entry 009 of 69
BC Ferries
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.
GreatAPIs Score
Auth quickstart
- 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.
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/
{"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
https://www.bcferriesapi.ca/v2Gotchas & 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.