Skip to content
PG Pulse
PG Pulse

Try searching for

Local knowledge for your AI tools

Connect Cursor, VS Code, Codex or Claude Code. Free MCP access, no key needed.

Connect your AI assistant
View as MarkdownFree, 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.

Also accepts fields (sparse fieldset) and format (json, md).

Example request

bash
curl "https://princegeorgepulse.ca/api/v1/transit/routes"

Example response (trimmed)

json
{
  "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) and offset; also format=csv
ParameterInTypeDescription
qquerystringStop name or code contains. Example: Pine Centre.
routequerystringRoute id or short name. Example: 15.
nearquerystringSort by distance from "lat,lng" (adds distanceM). Example: 53.9171,-122.7497.
limitqueryintegerItems per page (default 50, max 500 unless noted). Example: 20.
offsetqueryintegerItems to skip. Use links.next to page. Example: 0.

Also accepts fields (sparse fieldset) and format (json, md, csv).

Example request

bash
curl "https://princegeorgepulse.ca/api/v1/transit/stops?near=53.9171,-122.7497&limit=3"

Example response (trimmed)

json
{
  "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.

ParameterInTypeDescription
idpathstringStop id or stop code (see /transit/stops). Required. Example: 180053.

Also accepts fields (sparse fieldset) and format (json, md).

Example request

bash
curl "https://princegeorgepulse.ca/api/v1/transit/stops/180053/departures"

Example response (trimmed)

json
{
  "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).

  • GeoJSON: add format=geojson for a bare FeatureCollection

Also accepts fields (sparse fieldset) and format (json, md, geojson).

Example request

bash
curl "https://princegeorgepulse.ca/api/v1/transit/shapes"

Example response (trimmed)

json
{
  "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.

ParameterInTypeDescription
idpathstringRoute id or short name (see /transit/routes). Required. Example: 15.

Also accepts fields (sparse fieldset) and format (json, md).

Example request

bash
curl "https://princegeorgepulse.ca/api/v1/transit/routes/15"

Example response (trimmed)

json
{
  "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.

Also accepts fields (sparse fieldset) and format (json, md).

Example request

bash
curl "https://princegeorgepulse.ca/api/v1/transit/feed"

Example response (trimmed)

json
{
  "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) and offset; also format=csv
ParameterInTypeDescription
historyquerybooleanInclude alerts that ended in the last days days.
daysqueryintegerHistory window in days (default 90, max 365). Example: 30.
limitqueryintegerItems per page (default 50, max 500 unless noted). Example: 20.
offsetqueryintegerItems to skip. Use links.next to page. Example: 0.

Also accepts fields (sparse fieldset) and format (json, md, csv).

Example request

bash
curl "https://princegeorgepulse.ca/api/v1/transit/alerts"

Example response (trimmed)

json
{
  "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.

Also accepts fields (sparse fieldset) and format (json, md).

Example request

bash
curl "https://princegeorgepulse.ca/api/v1/transit/fares"

Example response (trimmed)

json
{
  "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.

Also accepts fields (sparse fieldset) and format (json, md).

Example request

bash
curl "https://princegeorgepulse.ca/api/v1/transit/handydart"

Example response (trimmed)

json
{
  "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.

Also accepts fields (sparse fieldset) and format (json, md).

Example request

bash
curl "https://princegeorgepulse.ca/api/v1/transit/vehicles"

Example response (trimmed)

json
{
  "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"
  }
}

Add PG Pulse to your home screen

Your browser installs apps from its Share menu.

  1. Tap Share in the browser toolbar (at the bottom of the screen on iPhone, at the top on iPad).
  2. Scroll down and tap Add to Home Screen.
  3. Tap Add. PG Pulse opens from its icon like any other app.