Local knowledge for your AI tools
Connect Cursor, VS Code, Codex or Claude Code. Free MCP access, no key needed.
Transit: API reference
10 endpoints. Base URL https://princegeorgepulse.ca/api/v1. Conventions (envelope, paging, fields, formats, limits) are on the overview. All endpoints.
GET /api/v1/transit/routes #
Prince George Transit routes with colours and headsigns.
- Cache: 1 h (live source, cached on our server)
- Source: BC Transit open data (GTFS and GTFS-realtime)
- Licence: BC Transit Open Data Terms of Use (https://www.bctransit.com/open-data/terms-of-use/)
Also accepts fields (sparse fieldset) and format (json, md).
Example request
curl "https://princegeorgepulse.ca/api/v1/transit/routes"Example response (trimmed)
{
"data": [
{
"id": "1-PRG",
"short": "1",
"name": "Heritage",
"color": "#004B8D",
"text": "#FFFFFF",
"headsigns": [
"Heritage"
]
},
{
"id": "5-PRG",
"short": "5",
"name": "Victoria/5th",
"color": "#8CC63F",
"text": "#FFFFFF",
"headsigns": [
"Victoria - To Pine Centre",
"Victoria To Downtown"
]
},
"… 16 more"
],
"meta": {
"source": "BC Transit open data (GTFS and GTFS-realtime)",
"sourceUrl": "https://www.bctransit.com/open-data/",
"updatedAt": "2026-10-12T11:40:09.498Z",
"ageSec": 342494,
"license": "BC Transit Open Data Terms of Use (https://www.bctransit.com/open-data/terms-of-use/)",
"attribution": "BC Transit, via PG Pulse (princegeorgepulse.ca)",
"feedVersion": "202610120/20261011 21:00:00/20261012 04:00:00",
"serviceStart": "20261010",
"serviceEnd": "20270102"
},
"links": {
"self": "/api/v1/transit/routes",
"next": null,
"docs": "/developers/reference/transit/#get-transit-routes"
}
}GET /api/v1/transit/stops #
Bus stops (search by name, route or distance).
- Cache: 1 h (live source, cached on our server)
- Source: BC Transit open data (GTFS and GTFS-realtime)
- Licence: BC Transit Open Data Terms of Use (https://www.bctransit.com/open-data/terms-of-use/)
- Paginated:
limit(default 100, max 1000) andoffset; alsoformat=csv
| Parameter | In | Type | Description |
|---|---|---|---|
q | query | string | Stop name or code contains. Example: Pine Centre. |
route | query | string | Route id or short name. Example: 15. |
near | query | string | Sort by distance from "lat,lng" (adds distanceM). Example: 53.9171,-122.7497. |
limit | query | integer | Items per page (default 50, max 500 unless noted). Example: 20. |
offset | query | integer | Items to skip. Use links.next to page. Example: 0. |
Also accepts fields (sparse fieldset) and format (json, md, csv).
Example request
curl "https://princegeorgepulse.ca/api/v1/transit/stops?near=53.9171,-122.7497&limit=3"Example response (trimmed)
{
"data": [
{
"id": "105098",
"code": "105098",
"name": "Victoria St at 3rd Ave",
"lat": 53.91764,
"lng": -122.74917,
"wc": false,
"routes": [
"15-PRG",
"47-PRG"
],
"routeNames": [
"15",
"47"
],
"departures": "/api/v1/transit/stops/105098/departures",
"distanceM": 69
},
{
"id": "105100",
"code": "105100",
"name": "Victoria St at 5th Ave",
"lat": 53.91647,
"lng": -122.75012,
"wc": false,
"routes": [
"15-PRG",
"47-PRG"
],
"routeNames": [
"15",
"47"
],
"departures": "/api/v1/transit/stops/105100/departures",
"distanceM": 75
},
"… 1 more"
],
"meta": {
"source": "BC Transit open data (GTFS and GTFS-realtime)",
"sourceUrl": "https://www.bctransit.com/open-data/",
"updatedAt": "2026-10-12T11:40:09.498Z",
"ageSec": 342494,
"license": "BC Transit Open Data Terms of Use (https://www.bctransit.com/open-data/terms-of-use/)",
"attribution": "BC Transit, via PG Pulse (princegeorgepulse.ca)",
"total": 563,
"count": 3,
"limit": 3,
"offset": 0
},
"links": {
"self": "/api/v1/transit/stops?near=53.9171,-122.7497&limit=3",
"next": "/api/v1/transit/stops?near=53.9171%2C-122.7497&limit=3&offset=3",
"docs": "/developers/reference/transit/#get-transit-stops"
}
}GET /api/v1/transit/stops/{id}/departures #
Next departures at a stop (real-time where available) plus relevant service alerts.
scheduledAt and expectedAt are ISO 8601 times; scheduled and expected give the same instants in epoch milliseconds. live is true when expected comes from real-time data rather than the timetable.
- Cache: 20 s (live source, cached on our server)
- Source: BC Transit open data (GTFS and GTFS-realtime)
- Licence: BC Transit Open Data Terms of Use (https://www.bctransit.com/open-data/terms-of-use/)
| Parameter | In | Type | Description |
|---|---|---|---|
id | path | string | Stop id or stop code (see /transit/stops). Required. Example: 180053. |
Also accepts fields (sparse fieldset) and format (json, md).
Example request
curl "https://princegeorgepulse.ca/api/v1/transit/stops/180053/departures"Example response (trimmed)
{
"data": {
"stop": {
"id": "180053",
"code": "180053",
"name": "N Nechako Rd at Arend Dr",
"lat": 53.94288,
"lng": -122.79258,
"wc": false,
"routes": [
"91-PRG",
"96-PRG"
]
},
"departures": [
{
"route": "91-PRG",
"headsign": "Hart",
"tripId": "2076557:15393629:15405518",
"scheduled": 1792159800000,
"expected": 1792159800000,
"delaySec": null,
"live": false,
"cancelled": false,
"terminates": false,
"scheduledAt": "2026-10-16T14:10:00.000Z",
"expectedAt": "2026-10-16T14:10:00.000Z"
},
{
"route": "96-PRG",
"headsign": "Shas Ti Kelly Rd via Foothills",
"tripId": "2076937:15386732:15404595",
"scheduled": 1792161960000,
"expected": 1792161960000,
"delaySec": null,
"live": false,
"cancelled": false,
"terminates": false,
"scheduledAt": "2026-10-16T14:46:00.000Z",
"expectedAt": "2026-10-16T14:46:00.000Z"
},
"… 15 more"
],
"alerts": [],
"realtime": {
"ok": true,
"timestamp": 1792147696,
"trips": 0
}
},
"meta": {
"source": "BC Transit open data (GTFS and GTFS-realtime)",
"sourceUrl": "https://www.bctransit.com/open-data/",
"updatedAt": "2026-10-16T10:48:16.000Z",
"ageSec": 7,
"license": "BC Transit Open Data Terms of Use (https://www.bctransit.com/open-data/terms-of-use/)",
"attribution": "BC Transit, via PG Pulse (princegeorgepulse.ca)"
},
"links": {
"self": "/api/v1/transit/stops/180053/departures",
"next": null,
"docs": "/developers/reference/transit/#get-transit-stops-id-departures"
}
}GET /api/v1/transit/shapes #
Route lines as GeoJSON (one MultiLineString per route).
- Cache: 24 h (live source, cached on our server)
- Source: BC Transit open data (GTFS and GTFS-realtime)
- Licence: BC Transit Open Data Terms of Use (https://www.bctransit.com/open-data/terms-of-use/)
- GeoJSON: add
format=geojsonfor a bare FeatureCollection
Also accepts fields (sparse fieldset) and format (json, md, geojson).
Example request
curl "https://princegeorgepulse.ca/api/v1/transit/shapes"Example response (trimmed)
{
"data": {
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "MultiLineString",
"coordinates": [
[
[
-122.78228,
53.91828
],
[
-122.78222,
53.91763
],
"… 133 more"
]
]
},
"properties": {
"route": "1-PRG",
"short": "1",
"name": "Heritage",
"color": "#004B8D"
}
},
{
"type": "Feature",
"geometry": {
"type": "MultiLineString",
"coordinates": [
[
[
-122.74733,
53.91313
],
[
-122.74818,
53.9122
],
"… 53 more"
],
[
[
-122.78229,
53.91791
],
[
-122.78222,
53.91763
],
"… 49 more"
],
"… 1 more"
]
},
"properties": {
"route": "10-PRG",
"short": "10",
"name": "Downtown/Spruceland",
"color": "#F37421"
}
},
"… 16 more"
]
},
"meta": {
"source": "BC Transit open data (GTFS and GTFS-realtime)",
"sourceUrl": "https://www.bctransit.com/open-data/",
"updatedAt": null,
"license": "BC Transit Open Data Terms of Use (https://www.bctransit.com/open-data/terms-of-use/)",
"attribution": "BC Transit, via PG Pulse (princegeorgepulse.ca)"
},
"links": {
"self": "/api/v1/transit/shapes",
"next": null,
"docs": "/developers/reference/transit/#get-transit-shapes"
}
}GET /api/v1/transit/routes/{id} #
One route: colours, headsigns, its stops and its line as GeoJSON.
- Cache: 1 h (live source, cached on our server)
- Source: BC Transit open data (GTFS and GTFS-realtime)
- Licence: BC Transit Open Data Terms of Use (https://www.bctransit.com/open-data/terms-of-use/)
| Parameter | In | Type | Description |
|---|---|---|---|
id | path | string | Route id or short name (see /transit/routes). Required. Example: 15. |
Also accepts fields (sparse fieldset) and format (json, md).
Example request
curl "https://princegeorgepulse.ca/api/v1/transit/routes/15"Example response (trimmed)
{
"data": {
"id": "15-PRG",
"short": "15",
"name": "UNBC/Downtown",
"color": "#00AA47",
"text": "#FFFFFF",
"headsigns": [
"Downtown",
"N Downtown via CNC",
"… 2 more"
],
"stops": [
{
"id": "105017",
"code": "105017",
"name": "UNBC Exch Bay A",
"lat": 53.89128,
"lng": -122.81364,
"wheelchair": false
},
{
"id": "105005",
"code": "105005",
"name": "Nicholson Exch Bay C",
"lat": 53.90983,
"lng": -122.78708,
"wheelchair": false
},
"… 42 more"
],
"line": {
"type": "Feature",
"geometry": {
"type": "MultiLineString",
"coordinates": [
[
[
-122.81364,
53.89128
],
[
-122.81394,
53.89147
],
"… 95 more"
],
[
[
-122.74733,
53.91313
],
[
-122.74818,
53.9122
],
"… 71 more"
],
"… 5 more"
]
},
"properties": {
"route": "15-PRG",
"color": "#00AA47"
}
}
},
"meta": {
"source": "BC Transit open data (GTFS and GTFS-realtime)",
"sourceUrl": "https://www.bctransit.com/open-data/",
"updatedAt": "2026-10-12T11:40:09.498Z",
"ageSec": 342494,
"license": "BC Transit Open Data Terms of Use (https://www.bctransit.com/open-data/terms-of-use/)",
"attribution": "BC Transit, via PG Pulse (princegeorgepulse.ca)"
},
"links": {
"self": "/api/v1/transit/routes/15",
"next": null,
"docs": "/developers/reference/transit/#get-transit-routes-id"
}
}GET /api/v1/transit/feed #
The schedule PG Pulse holds: GTFS feed version, service dates and counts, and when it was loaded.
- Cache: 1 h
- Source: BC Transit open data (GTFS and GTFS-realtime)
- Licence: BC Transit Open Data Terms of Use (https://www.bctransit.com/open-data/terms-of-use/)
Also accepts fields (sparse fieldset) and format (json, md).
Example request
curl "https://princegeorgepulse.ca/api/v1/transit/feed"Example response (trimmed)
{
"data": {
"version": "202610120/20261011 21:00:00/20261012 04:00:00",
"start": "20261010",
"end": "20270102",
"builtAt": "2026-10-12T11:40:09.498Z",
"routes": 18,
"stops": 563,
"trips": 2940,
"source": "BC Transit open data (GTFS and GTFS-realtime)",
"sourceUrl": "https://bct.tmix.se/Tmix.Cap.TdExport.WebApi/gtfs/?operatorIds=22",
"licence": "BC Transit Open Data Terms of Use (https://www.bctransit.com/open-data/terms-of-use/)"
},
"meta": {
"source": "BC Transit open data (GTFS and GTFS-realtime)",
"sourceUrl": "https://www.bctransit.com/open-data/",
"updatedAt": "2026-10-12T11:40:09.498Z",
"ageSec": 342494,
"license": "BC Transit Open Data Terms of Use (https://www.bctransit.com/open-data/terms-of-use/)",
"attribution": "BC Transit, via PG Pulse (princegeorgepulse.ca)"
},
"links": {
"self": "/api/v1/transit/feed",
"next": null,
"docs": "/developers/reference/transit/#get-transit-feed"
}
}GET /api/v1/transit/alerts #
BC Transit service alerts for Prince George (detours, cancellations), current and recent, kept in the PG Pulse database.
- Cache: 1 min (live source, cached on our server)
- Source: BC Transit open data (GTFS and GTFS-realtime)
- Licence: BC Transit Open Data Terms of Use (https://www.bctransit.com/open-data/terms-of-use/)
- Paginated:
limit(default 50, max 500) andoffset; alsoformat=csv
| Parameter | In | Type | Description |
|---|---|---|---|
history | query | boolean | Include alerts that ended in the last days days. |
days | query | integer | History window in days (default 90, max 365). Example: 30. |
limit | query | integer | Items per page (default 50, max 500 unless noted). Example: 20. |
offset | query | integer | Items to skip. Use links.next to page. Example: 0. |
Also accepts fields (sparse fieldset) and format (json, md, csv).
Example request
curl "https://princegeorgepulse.ca/api/v1/transit/alerts"Example response (trimmed)
{
"data": [],
"meta": {
"source": "BC Transit open data (GTFS and GTFS-realtime)",
"sourceUrl": "https://www.bctransit.com/open-data/",
"updatedAt": null,
"license": "BC Transit Open Data Terms of Use (https://www.bctransit.com/open-data/terms-of-use/)",
"attribution": "BC Transit, via PG Pulse (princegeorgepulse.ca)",
"total": 0,
"count": 0,
"limit": 50,
"offset": 0
},
"links": {
"self": "/api/v1/transit/alerts",
"next": null,
"docs": "/developers/reference/transit/#get-transit-alerts"
}
}GET /api/v1/transit/fares #
Prince George Transit fares and passes, copied from BC Transit's fares page.
- Cache: 1 h
- Source: The transit operator’s published fares page
- Licence: Facts copied from the operator's published fares, with attribution
Also accepts fields (sparse fieldset) and format (json, md).
Example request
curl "https://princegeorgepulse.ca/api/v1/transit/fares"Example response (trimmed)
{
"data": {
"source": {
"name": "BC Transit: Prince George fares",
"url": "https://www.bctransit.com/prince-george/fares/"
},
"checked": "2026-09-30",
"effective": "2026-09-06",
"fares": [
{
"id": "adult-single",
"product": "Single ride",
"rider": "Adult (19–64)",
"price": 2.75,
"note": "No transfers included. Cash (exact change), Umo or contactless.",
"source": {
"name": "BC Transit: Prince George fares",
"url": "https://www.bctransit.com/prince-george/fares/"
}
},
{
"id": "adult-daypass",
"product": "DayPASS",
"rider": "Adult (19–64)",
"price": 5.5,
"note": "Applied automatically after the second Umo Cash Balance or contactless payment of the day.",
"source": {
"name": "BC Transit: Prince George fares",
"url": "https://www.bctransit.com/prince-george/fares/"
}
},
"… 12 more"
],
"paymentMethods": [
"Umo app (QR) or Umo reloadable card",
"Contactless Visa, Mastercard, American Express, Interac Debit; Apple Pay, Google Pay, Samsung Pay",
"… 1 more"
],
"notes": "New fares took effect September 6, 2026 (first increase since 2019); 10-ticket sheets discontinued. Children 12 and under ride free (provincial program; no ID needed). Route 161 to Burns Lake has separate fares ($5 on…",
"discontinued": [
{
"product": "10-Tickets",
"previousPrice": 22.5
}
],
"relatedSources": [
{
"name": "BC Transit: Fare and service change for Prince George (24 Aug 2026)",
"url": "https://www.bctransit.com/fare-and-service-change-for-prince-george-2026-08-24/"
},
{
"name": "BC Transit: Free transit for children 12 and under",
"url": "https://www.bctransit.com/prince-george/fares/free-transit-12-under/"
},
"… 1 more"
]
},
"meta": {
"source": "BC Transit: Prince George fares",
"sourceUrl": "https://www.bctransit.com/prince-george/fares/",
"updatedAt": "2026-09-30T12:00:00Z",
"ageSec": 1378103,
"license": "Facts copied from the operator's published fares, with attribution",
"attribution": "The transit operator, via PG Pulse (princegeorgepulse.ca)"
},
"links": {
"self": "/api/v1/transit/fares",
"next": null,
"docs": "/developers/reference/transit/#get-transit-fares"
}
}GET /api/v1/transit/handydart #
handyDART accessible door-to-door service in Prince George: who can use it, how to register and book, fare and contacts.
- Cache: 1 h
- Source: The transit operator’s published handyDART pages
- Licence: Facts copied from the operator's published pages, with attribution
Also accepts fields (sparse fieldset) and format (json, md).
Example request
curl "https://princegeorgepulse.ca/api/v1/transit/handydart"Example response (trimmed)
{
"data": {
"description": "Shared door-to-door accessible transit for people with permanent or temporary disabilities who cannot use fixed-route buses without assistance. Free registration required before booking.",
"phone": "250-562-1394",
"fax": "250-562-1393",
"hours": "Service: Mon–Fri 7:30 am–5:30 pm; Thu evening 5:30 pm–10 pm; Sat–Sun 9:30 am–5:30 pm; no holiday service",
"open": {
"mon": [
[
"07:30",
"17:30"
]
],
"tue": [
[
"07:30",
"17:30"
]
],
"wed": [
[
"07:30",
"17:30"
]
],
"thu": [
[
"07:30",
"22:00"
]
],
"fri": [
[
"07:30",
"17:30"
]
],
"sat": [
[
"09:30",
"17:30"
]
],
"sun": [
[
"09:30",
"17:30"
]
]
},
"officeHours": "Mon–Fri 8:30 am–noon and 1 pm–4 pm",
"officeOpen": {
"mon": [
[
"08:30",
"12:00"
],
[
"13:00",
"16:00"
]
],
"tue": [
[
"08:30",
"12:00"
],
[
"13:00",
"16:00"
]
],
"wed": [
[
"08:30",
"12:00"
],
[
"13:00",
"16:00"
]
],
"thu": [
[
"08:30",
"12:00"
],
[
"13:00",
"16:00"
]
],
"fri": [
[
"08:30",
"12:00"
],
[
"13:00",
"16:00"
]
],
"sat": [],
"sun": []
},
"addr": "Client Registrar, 1041 Great St, Prince George, BC V2N 2K8",
"eligibility": "People with a permanent or temporary disability that prevents them from using fixed-route transit without assistance; complete the handyDART application form (optional medical verification form).",
"booking": "Reservation trips up to 14 days ahead, first to call; subscription trips limited. Cancel at least 2 hours before pick-up. 20–30 minute pick-up window.",
"fare": "$2.75 single ride (ages 13 and up); attendants and children 12 and under free; Umo not accepted.",
"taxiSaver": "https://www.bctransit.com/prince-george/riderinfo/handydart/taxi-saver/",
"…": "6 more keys"
},
"meta": {
"source": "BC Transit: Prince George handyDART",
"sourceUrl": "https://www.bctransit.com/prince-george/riderinfo/handydart/",
"updatedAt": "2026-09-30T12:00:00Z",
"ageSec": 1378103,
"license": "Facts copied from the operator's published pages, with attribution",
"attribution": "The transit operator, via PG Pulse (princegeorgepulse.ca)"
},
"links": {
"self": "/api/v1/transit/handydart",
"next": null,
"docs": "/developers/reference/transit/#get-transit-handydart"
}
}GET /api/v1/transit/vehicles #
Live bus positions and current service alerts.
timestamp fields are GTFS-realtime epoch seconds (kept for existing clients); observedAt gives the same instants in ISO 8601, and meta.updatedAt is the feed time.
- Cache: 20 s (live source, cached on our server)
- Source: BC Transit open data (GTFS and GTFS-realtime)
- Licence: BC Transit Open Data Terms of Use (https://www.bctransit.com/open-data/terms-of-use/)
Also accepts fields (sparse fieldset) and format (json, md).
Example request
curl "https://princegeorgepulse.ca/api/v1/transit/vehicles"Example response (trimmed)
{
"data": {
"ok": true,
"timestamp": 1792147696,
"alerts": [],
"vehicles": [],
"observedAt": "2026-10-16T10:48:16.000Z"
},
"meta": {
"source": "BC Transit open data (GTFS and GTFS-realtime)",
"sourceUrl": "https://www.bctransit.com/open-data/",
"updatedAt": "2026-10-16T10:48:16.000Z",
"ageSec": 7,
"license": "BC Transit Open Data Terms of Use (https://www.bctransit.com/open-data/terms-of-use/)",
"attribution": "BC Transit, via PG Pulse (princegeorgepulse.ca)"
},
"links": {
"self": "/api/v1/transit/vehicles",
"next": null,
"docs": "/developers/reference/transit/#get-transit-vehicles"
}
}