# Key services: API reference

6 endpoints. Base URL `https://princegeorgepulse.ca/api/v1`. Conventions (envelope, paging, fields, formats, limits) are on the [overview](https://princegeorgepulse.ca/developers/). [All endpoints](https://princegeorgepulse.ca/developers/reference/).

## GET /api/v1/services/places {#get-services-places}

Public services directory: government offices, health care, courts, social services, recreation, schools, utilities and more, with hours and an open-now state.

Every place carries `source` (the operator page its phone number, address and hours were copied from), `checked` (date verified) and `sourceCheck` (whether that page still loads and whether its text changed since; re-checked weekly). `openNow` is computed from the published regular hours in local time (America/Vancouver); holidays are not modelled. Add `?format=geojson` for a FeatureCollection (places with coordinates only).

- Cache: 10 min
- Source: [PG Pulse public services directory, compiled from each operator's own pages](https://princegeorgepulse.ca/services/)
- Licence: Mixed: see each item’s source. Facts (addresses, phone numbers, hours) copied from each operator's own page, linked per item as source.url
- Paginated: `limit` (default 100, max 500) and `offset`; also `format=csv`
- GeoJSON: add `format=geojson` for a bare FeatureCollection

| Parameter | In | Type | Description |
| --- | --- | --- | --- |
| `q` | query | string | Text search in name, kind, operator, address and services. Example: `passport`. |
| `need` | query | string | Only one need. One of: `emergency`, `health`, `mental-health`, `food-housing`, `family-social`, `indigenous`, `seniors-accessibility`, `government`, `legal`, `vehicles`, `libraries`, `recreation`, `education`, `utilities`, `waste`, `post`, `transport`. Example: `health`. |
| `open` | query | string | Only places open now (from published regular hours). One of: `now`. |
| `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`, `geojson`).

**Example request**

```bash
curl "https://princegeorgepulse.ca/api/v1/services/places?need=government&limit=3"
```

**Example response** (trimmed)

```json
{
  "data": [
    {
      "id": "servicebc-pg",
      "need": "government",
      "layer": "government",
      "name": "Service BC Centre Prince George",
      "kind": "Service BC centre",
      "operator": "Province of British Columbia",
      "addr": "1044 5th Ave, Prince George, BC V2L 5G4",
      "lat": 53.914294,
      "lng": -122.742499,
      "located": "BC Address Geocoder (score 100, CIVIC_NUMBER)",
      "phone": "250-565-4488",
      "phoneAlt": null,
      "…": "14 more keys"
    },
    {
      "id": "icbc-road-tests-pg",
      "need": "government",
      "layer": "government",
      "name": "ICBC Prince George Driver Licensing (road tests only)",
      "kind": "ICBC driver licensing",
      "operator": "ICBC",
      "addr": "4001 15th Ave, Prince George, BC",
      "lat": 53.910071,
      "lng": -122.795067,
      "located": "BC Address Geocoder (score 100, CIVIC_NUMBER)",
      "phone": "1-800-950-1498",
      "phoneAlt": null,
      "…": "14 more keys"
    },
    "… 1 more"
  ],
  "meta": {
    "source": "PG Pulse public services directory, compiled from each operator's own pages",
    "sourceUrl": "https://princegeorgepulse.ca/services/",
    "updatedAt": "2026-09-30T12:00:00-07:00",
    "ageSec": 1352904,
    "license": "Mixed: see each item’s source. Facts (addresses, phone numbers, hours) copied from each operator's own page, linked per item as source.url",
    "attribution": "The operators linked in each item, via PG Pulse (princegeorgepulse.ca)",
    "needs": [
      {
        "id": "emergency",
        "label": "Emergency and safety"
      },
      {
        "id": "health",
        "label": "Health care"
      },
      "… 15 more"
    ],
    "sourceChecks": {
      "checkedAt": "2026-10-13T11:28:25.714Z",
      "total": 388,
      "broken": 0,
      "changed": 29
    },
    "total": 16,
    "count": 3,
    "limit": 3,
    "offset": 0
  },
  "links": {
    "self": "/api/v1/services/places?need=government&limit=3",
    "next": "/api/v1/services/places?need=government&limit=3&offset=3",
    "docs": "/developers/reference/key-services/#get-services-places"
  }
}
```

## GET /api/v1/services/places/{id} {#get-services-places-id}

One public service place.

- Cache: 10 min
- Source: [PG Pulse public services directory, compiled from each operator's own pages](https://princegeorgepulse.ca/services/)
- Licence: Mixed: see each item’s source. Facts (addresses, phone numbers, hours) copied from each operator's own page, linked per item as source.url

| Parameter | In | Type | Description |
| --- | --- | --- | --- |
| `id` | path | string | Place id (see /services/places). Required. |

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

**Example request**

```bash
curl "https://princegeorgepulse.ca/api/v1/services/places/pgnfc-house-of-friendship"
```

**Example response** (trimmed)

```json
{
  "data": {
    "id": "pgnfc-house-of-friendship",
    "need": "food-housing",
    "layer": "social",
    "name": "House of Friendship shelter and drop-in",
    "kind": "Emergency shelter (adults)",
    "operator": "Prince George Native Friendship Centre",
    "addr": null,
    "lat": null,
    "lng": null,
    "located": null,
    "phone": "250-563-0849",
    "phoneAlt": null,
    "…": "14 more keys"
  },
  "meta": {
    "source": "PG Pulse public services directory, compiled from each operator's own pages",
    "sourceUrl": "https://princegeorgepulse.ca/services/",
    "updatedAt": "2026-10-01T12:00:00-07:00",
    "ageSec": 1266504,
    "license": "Mixed: see each item’s source. Facts (addresses, phone numbers, hours) copied from each operator's own page, linked per item as source.url",
    "attribution": "The operators linked in each item, via PG Pulse (princegeorgepulse.ca)"
  },
  "links": {
    "self": "/api/v1/services/places/pgnfc-house-of-friendship",
    "next": null,
    "docs": "/developers/reference/key-services/#get-services-places-id"
  }
}
```

## GET /api/v1/services/needs {#get-services-needs}

Needs used to group the public services directory, with place counts.

- Cache: 1 h
- Source: [PG Pulse public services directory, compiled from each operator's own pages](https://princegeorgepulse.ca/services/)
- Licence: Mixed: see each item’s source. Facts (addresses, phone numbers, hours) copied from each operator's own page, linked per item as source.url

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

**Example request**

```bash
curl "https://princegeorgepulse.ca/api/v1/services/needs"
```

**Example response** (trimmed)

```json
{
  "data": [
    {
      "id": "emergency",
      "label": "Emergency and safety",
      "places": 3,
      "api": "/api/v1/services/places?need=emergency",
      "page": "/services/?need=emergency"
    },
    {
      "id": "health",
      "label": "Health care",
      "places": 31,
      "api": "/api/v1/services/places?need=health",
      "page": "/services/?need=health"
    },
    "… 15 more"
  ],
  "meta": {
    "source": "PG Pulse public services directory, compiled from each operator's own pages",
    "sourceUrl": "https://princegeorgepulse.ca/services/",
    "updatedAt": null,
    "license": "Mixed: see each item’s source. Facts (addresses, phone numbers, hours) copied from each operator's own page, linked per item as source.url",
    "attribution": "The operators linked in each item, via PG Pulse (princegeorgepulse.ca)"
  },
  "links": {
    "self": "/api/v1/services/needs",
    "next": null,
    "docs": "/developers/reference/key-services/#get-services-needs"
  }
}
```

## GET /api/v1/services/sources {#get-services-sources}

Every source page the services, emergency and getting-around data cite, with the result of the latest automated re-check.

`changed` means the page text differs from when the facts were last verified (a person re-checks those rows); `ok: false` means it did not load. Pages that refuse automated requests are marked to be verified by hand.

- Cache: 1 h
- Source: [PG Pulse public services directory, compiled from each operator's own pages](https://princegeorgepulse.ca/services/)
- Licence: Mixed: see each item’s source. Facts (addresses, phone numbers, hours) copied from each operator's own page, linked per item as source.url
- Paginated: `limit` (default 200, max 500) and `offset`; also `format=csv`

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

**Example request**

```bash
curl "https://princegeorgepulse.ca/api/v1/services/sources"
```

**Example response** (trimmed)

```json
{
  "data": [
    {
      "url": "http://imss.ca/settlement-language-training/",
      "status": 200,
      "ok": true,
      "changed": false,
      "checkedAt": "2026-10-02T11:25:09.768Z",
      "changedAt": null,
      "note": null
    },
    {
      "url": "http://www.bcehs.ca/health-info/when-to-call-9-1-1",
      "status": 200,
      "ok": true,
      "changed": false,
      "checkedAt": "2026-10-13T11:25:11.576Z",
      "changedAt": null,
      "note": null
    },
    "… 198 more"
  ],
  "meta": {
    "source": "PG Pulse public services directory, compiled from each operator's own pages",
    "sourceUrl": "https://princegeorgepulse.ca/services/",
    "updatedAt": "2026-10-13T11:28:25.714Z",
    "ageSec": 256798,
    "license": "Mixed: see each item’s source. Facts (addresses, phone numbers, hours) copied from each operator's own page, linked per item as source.url",
    "attribution": "The operators linked in each item, via PG Pulse (princegeorgepulse.ca)",
    "summary": {
      "checkedAt": "2026-10-13T11:28:25.714Z",
      "total": 388,
      "broken": 0,
      "changed": 29
    },
    "datasets": [
      {
        "id": "community",
        "asOf": "2026-10-01",
        "importedAt": "2026-10-02T03:43:18.393Z",
        "items": 80,
        "unverified": [
          "{…}",
          "{…}",
          "… 16 more"
        ]
      },
      {
        "id": "emergency",
        "asOf": "2026-09-30",
        "importedAt": "2026-10-01T05:40:12.352Z",
        "items": 49,
        "unverified": [
          "{…}",
          "{…}",
          "… 7 more"
        ]
      },
      "… 3 more"
    ],
    "total": 388,
    "count": 200,
    "limit": 200,
    "offset": 0
  },
  "links": {
    "self": "/api/v1/services/sources",
    "next": "/api/v1/services/sources?offset=200",
    "docs": "/developers/reference/key-services/#get-services-sources"
  }
}
```

## GET /api/v1/services {#get-services}

Key services datasets: waste and recycling sites, health care, pharmacies, libraries, government and post offices, police and ambulance.

- Cache: 24 h
- Source: [Operator websites (Regional District of Fraser-Fort George, Recycle BC, Return-It, Northern Health, Province of BC, ICBC, Service Canada, Canada Post, RCMP and others), compiled by PG Pulse](https://princegeorgepulse.ca/maps/services/)
- Licence: Mixed: see each item’s source. Facts (addresses, hours, fees) copied from each operator's own page, linked per item

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

**Example request**

```bash
curl "https://princegeorgepulse.ca/api/v1/services"
```

**Example response** (trimmed)

```json
{
  "data": [
    {
      "id": "waste-sites",
      "label": "Landfill, transfer stations and drop-offs",
      "count": 9,
      "asOf": "2026-09-30",
      "sources": [
        {
          "name": "Regional District of Fraser-Fort George: Foothills Boulevard Regional Landfill and Tipping fees",
          "url": "https://www.rdffg.ca/TippingFees"
        },
        {
          "name": "Regional District of Fraser-Fort George: Vanway Regional Transfer Station",
          "url": "https://www.rdffg.ca/VanwayRegionalTransferStation"
        },
        "… 7 more"
      ],
      "map": "/maps/?layer=waste-sites",
      "page": "/maps/waste-and-recycling/",
      "api": "/api/v1/services/waste-sites",
      "geojson": "/api/v1/services/waste-sites?format=geojson"
    },
    {
      "id": "recycling",
      "label": "Recycling depots, bottle depots and donation drop-offs",
      "count": 12,
      "asOf": "2026-09-30",
      "sources": [
        {
          "name": "Regional District of Fraser-Fort George: Quinn Street Regional Recycling Depot",
          "url": "https://www.rdffg.ca/QuinnStreetRegionalRecyclingDepot"
        },
        {
          "name": "Return-It: P.G. Recycling & Return-It Centre",
          "url": "https://www.return-it.ca/locations/bbk-bottle-depot/"
        },
        "… 9 more"
      ],
      "map": "/maps/?layer=recycling",
      "page": "/maps/waste-and-recycling/",
      "api": "/api/v1/services/recycling",
      "geojson": "/api/v1/services/recycling?format=geojson"
    },
    "… 6 more"
  ],
  "meta": {
    "source": "Operator websites (Regional District of Fraser-Fort George, Recycle BC, Return-It, Northern Health, Province of BC, ICBC, Service Canada, Canada Post, RCMP and others), compiled by PG Pulse",
    "sourceUrl": "https://princegeorgepulse.ca/maps/services/",
    "updatedAt": null,
    "license": "Mixed: see each item’s source. Facts (addresses, hours, fees) copied from each operator's own page, linked per item",
    "attribution": "PG Pulse, via PG Pulse (princegeorgepulse.ca)"
  },
  "links": {
    "self": "/api/v1/services",
    "next": null,
    "docs": "/developers/reference/key-services/#get-services"
  }
}
```

## GET /api/v1/services/{id} {#get-services-id}

One key-services dataset: places with address, hours, fees, accepted materials and a source link per place.

Every place carries `source` (the operator page its hours and fees were copied from) and `checked` (date verified). Add `?format=geojson` for a FeatureCollection.

- Cache: 24 h
- Source: [Operator websites (Regional District of Fraser-Fort George, Recycle BC, Return-It, Northern Health, Province of BC, ICBC, Service Canada, Canada Post, RCMP and others), compiled by PG Pulse](https://princegeorgepulse.ca/maps/services/)
- Licence: Mixed: see each item’s source. Facts (addresses, hours, fees) copied from each operator's own page, linked per item
- Paginated: `limit` (default 200, max 500) and `offset`; also `format=csv`
- GeoJSON: add `format=geojson` for a bare FeatureCollection

| Parameter | In | Type | Description |
| --- | --- | --- | --- |
| `id` | path | string | Dataset id. Required. One of: `waste-sites`, `recycling`, `health-care`, `libraries`, `government-offices`, `post-offices`, `police-ambulance`, `pharmacies`. Example: `recycling`. |
| `q` | query | string | Text search in name, kind, address and accepted materials. Example: `paint`. |
| `kind` | query | string | Only places whose kind contains this. Example: `Bottle depot`. |
| `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`, `geojson`).

**Example request**

```bash
curl "https://princegeorgepulse.ca/api/v1/services/recycling?q=paint&limit=3"
```

**Example response** (trimmed)

```json
{
  "data": [
    {
      "id": "pg-recycling-return-it",
      "dataset": "waste",
      "need": "waste",
      "layer": "recycling",
      "name": "P.G. Recycling & Return-It Centre",
      "kind": "Bottle depot",
      "operator": "P.G. Recycling & Return-It Centre (Return-It depot)",
      "addr": "2614 Petersen Road, Prince George",
      "lat": 53.880322,
      "lng": -122.772344,
      "located": "BC Address Geocoder, CIVIC_NUMBER match score 100 (2614 Petersen Rd, Prince George, BC)",
      "phone": "250-561-7475",
      "…": "14 more keys"
    },
    {
      "id": "hart-return-it",
      "dataset": "waste",
      "need": "waste",
      "layer": "recycling",
      "name": "Hart Return-It Depot",
      "kind": "Bottle depot",
      "operator": "Hart Return-It Depot (Return-It depot)",
      "addr": "6665 Hart Highway, Prince George",
      "lat": 53.989898,
      "lng": -122.78833,
      "located": "BC Address Geocoder, CIVIC_NUMBER match score 100 (6665 Hart Hwy, Prince George, BC)",
      "phone": "250-962-9300",
      "…": "14 more keys"
    }
  ],
  "meta": {
    "source": "Operator websites (Regional District of Fraser-Fort George, Recycle BC, Return-It, Northern Health, Province of BC, ICBC, Service Canada, Canada Post, RCMP and others), compiled by PG Pulse",
    "sourceUrl": "https://princegeorgepulse.ca/maps/services/",
    "updatedAt": "2026-09-30T12:00:00-07:00",
    "ageSec": 1352904,
    "license": "Mixed: see each item’s source. Facts (addresses, hours, fees) copied from each operator's own page, linked per item",
    "attribution": "PG Pulse, via PG Pulse (princegeorgepulse.ca)",
    "dataset": {
      "id": "recycling",
      "label": "Recycling depots, bottle depots and donation drop-offs",
      "count": 12,
      "asOf": "2026-09-30",
      "sources": [
        {
          "name": "Regional District of Fraser-Fort George: Quinn Street Regional Recycling Depot",
          "url": "https://www.rdffg.ca/QuinnStreetRegionalRecyclingDepot"
        },
        {
          "name": "Return-It: P.G. Recycling & Return-It Centre",
          "url": "https://www.return-it.ca/locations/bbk-bottle-depot/"
        },
        "… 9 more"
      ],
      "map": "/maps/?layer=recycling",
      "page": "/maps/waste-and-recycling/",
      "api": "/api/v1/services/recycling",
      "geojson": "/api/v1/services/recycling?format=geojson"
    },
    "total": 2,
    "count": 2,
    "limit": 3,
    "offset": 0
  },
  "links": {
    "self": "/api/v1/services/recycling?q=paint&limit=3",
    "next": null,
    "docs": "/developers/reference/key-services/#get-services-id"
  }
}
```
