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

Jobs: API reference

8 endpoints. Base URL https://princegeorgepulse.ca/api/v1. Conventions (envelope, paging, fields, formats, limits) are on the overview. All endpoints.

GET /api/v1/jobs #

Open job postings in Prince George, newest first, with search and filters.

Aggregated from Job Bank and other public sources every 2 hours. Wages are as published; wage.hourlyMin converts other units at 7.5 h a day, 37.5 h a week and 1,950 h a year (2,080 h for WorkBC postings, which WorkBC annualises at 40 h a week) so postings can be compared. There is no full job description: follow url to read and apply at the source.

ParameterInTypeDescription
qquerystringSearch title, employer, category and snippet. Example: nurse.
categoryquerystringCategory name or slug (see /jobs/categories). Example: health-care.
employerquerystringEmployer slug (see /jobs/employers). Example: northern-health.
termquerystringPermanent, Temporary, Casual, Seasonal, Contract or Auxiliary.
hoursquerystringfull-time or part-time. One of: full-time, part-time.
workplacequerystringon-site, hybrid, remote or on-the-road (only when the posting says). One of: on-site, hybrid, remote, on-the-road.
withinqueryintegerPosted within this many days. Example: 7.
minWagequerynumberMinimum hourly-equivalent wage (only postings that publish a wage). Example: 25.
sourcequerystringSource id (see /jobs/sources). Example: jobbank.
sortquerystringnewest (default), closing, wage or title. One of: newest, closing, wage, title.
sincequerystringIncremental sync: only postings added, changed or closed after this ISO date-time, oldest change first, including closed ones (status: closed, closedAt). Store meta.updatedAt and pass it next time. Example: 2026-09-30T00:00:00Z.
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/jobs?limit=3"

Example response (trimmed)

json
{
  "data": [
    {
      "id": "8SJ8oOau9sTN",
      "title": "Facilitator (Temporary) - Prince George - 2026.180",
      "employer": "Community Living BC",
      "location": "Prince George, BC",
      "workplace": null,
      "posted": "2026-10-16",
      "closes": null,
      "term": "Temporary",
      "hours": null,
      "wage": {
        "min": 78114,
        "max": 80425,
        "unit": "year",
        "hourlyMin": 37.55,
        "text": "$78,114 - $80,425 annually"
      },
      "snippet": "",
      "category": "Trades & transport",
      "…": "10 more keys"
    },
    {
      "id": "RhxFTx8Yu3NA",
      "title": "Plumbing & Electrical Sales Associate: Part Time - PRINCE GEORGE",
      "employer": "The Home Depot",
      "location": "Prince George, BC",
      "workplace": null,
      "posted": "2026-10-16",
      "closes": null,
      "term": null,
      "hours": "Part time",
      "wage": {
        "min": 39312,
        "max": 41392,
        "unit": "year",
        "hourlyMin": 18.9,
        "text": "$39,312 - $41,392 annually"
      },
      "snippet": "",
      "category": "Trades & transport",
      "…": "10 more keys"
    },
    "… 1 more"
  ],
  "meta": {
    "source": "PG Pulse jobs, aggregated from public job boards and employer career sites (each posting links its source)",
    "sourceUrl": "https://princegeorgepulse.ca/jobs/",
    "updatedAt": "2026-10-16T08:37:16.644Z",
    "ageSec": 7865,
    "license": "Posting facts from each source (see `source`, `via` and `url` per posting); Job Bank content © Government of Canada, reproduced for non-commercial information with attribution",
    "attribution": "Each posting’s source, via PG Pulse (princegeorgepulse.ca)",
    "total": 780,
    "count": 3,
    "limit": 3,
    "offset": 0
  },
  "links": {
    "self": "/api/v1/jobs?limit=3",
    "next": "/api/v1/jobs?limit=3&offset=3",
    "docs": "/developers/reference/jobs/#get-jobs"
  }
}

GET /api/v1/jobs/categories #

Job categories with open-posting counts.

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

Example request

bash
curl "https://princegeorgepulse.ca/api/v1/jobs/categories"

Example response (trimmed)

json
{
  "data": [
    {
      "name": "Health care",
      "slug": "health-care",
      "count": 207
    },
    {
      "name": "Education & child care",
      "slug": "education-and-child-care",
      "count": 88
    },
    "… 13 more"
  ],
  "meta": {
    "source": "PG Pulse jobs, aggregated from public job boards and employer career sites (each posting links its source)",
    "sourceUrl": "https://princegeorgepulse.ca/jobs/",
    "updatedAt": "2026-10-16T08:37:16.644Z",
    "ageSec": 7865,
    "license": "Posting facts from each source (see `source`, `via` and `url` per posting); Job Bank content © Government of Canada, reproduced for non-commercial information with attribution",
    "attribution": "Each posting’s source, via PG Pulse (princegeorgepulse.ca)"
  },
  "links": {
    "self": "/api/v1/jobs/categories",
    "next": null,
    "docs": "/developers/reference/jobs/#get-jobs-categories"
  }
}

GET /api/v1/jobs/employers #

Employers with open postings, most first.

ParameterInTypeDescription
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/jobs/employers?limit=5"

Example response (trimmed)

json
{
  "data": [
    {
      "slug": "northern-health",
      "name": "Northern Health",
      "count": 136,
      "top": true
    },
    {
      "slug": "sd57",
      "name": "School District No. 57 (Prince George)",
      "count": 54,
      "top": true
    },
    "… 3 more"
  ],
  "meta": {
    "source": "PG Pulse jobs, aggregated from public job boards and employer career sites (each posting links its source)",
    "sourceUrl": "https://princegeorgepulse.ca/jobs/",
    "updatedAt": "2026-10-16T08:37:16.644Z",
    "ageSec": 7865,
    "license": "Posting facts from each source (see `source`, `via` and `url` per posting); Job Bank content © Government of Canada, reproduced for non-commercial information with attribution",
    "attribution": "Each posting’s source, via PG Pulse (princegeorgepulse.ca)",
    "total": 286,
    "count": 5,
    "limit": 5,
    "offset": 0
  },
  "links": {
    "self": "/api/v1/jobs/employers?limit=5",
    "next": "/api/v1/jobs/employers?limit=5&offset=5",
    "docs": "/developers/reference/jobs/#get-jobs-employers"
  }
}

GET /api/v1/jobs/top-employers #

Top employers in Prince George (City of Prince George list) with their current openings here.

The list is the City’s own; it publishes no headcounts. openings counts postings in this feed right now, not all of an employer’s vacancies.

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

Example request

bash
curl "https://princegeorgepulse.ca/api/v1/jobs/top-employers"

Example response (trimmed)

json
{
  "data": [
    {
      "slug": "northern-health",
      "name": "Northern Health",
      "sector": "Health care",
      "note": "The largest employer in Prince George, per the City",
      "careersUrl": "https://careers.northernhealth.ca/",
      "openings": 136
    },
    {
      "slug": "city-of-prince-george",
      "name": "City of Prince George",
      "sector": "Local government",
      "careersUrl": "https://www.princegeorge.ca/city-hall/careers",
      "openings": 9
    },
    "… 7 more"
  ],
  "meta": {
    "source": "City of Prince George, Move Up Prince George: industries and employers",
    "sourceUrl": "https://www.moveupprincegeorge.ca/working-here/industries-and-employers",
    "updatedAt": "2026-10-16T08:37:16.644Z",
    "ageSec": 7865,
    "license": "Facts from City of Prince George, Move Up Prince George’s published list",
    "attribution": "City of Prince George, Move Up Prince George, via PG Pulse (princegeorgepulse.ca)"
  },
  "links": {
    "self": "/api/v1/jobs/top-employers",
    "next": null,
    "docs": "/developers/reference/jobs/#get-jobs-top-employers"
  }
}

GET /api/v1/jobs/market #

Job market context: latest Labour Force Survey figures for the local economic region and the province (keys cariboo and bc are kept for compatibility).

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

Example request

bash
curl "https://princegeorgepulse.ca/api/v1/jobs/market"

Example response (trimmed)

json
{
  "data": {
    "region": "Cariboo economic region (includes Prince George, Quesnel, Williams Lake and 100 Mile House)",
    "notes": "The Labour Force Survey does not publish city-level estimates for Prince George; the cariboo economic region is the smallest geography available. Monthly values are three-month moving averages, not seasonally adjusted.",
    "asOf": "2026-09",
    "monthly": {
      "cariboo": {
        "unemploymentRate": {
          "month": "2026-09",
          "value": 6.2
        },
        "employmentThousands": {
          "month": "2026-09",
          "value": 84.8
        }
      },
      "bc": {
        "unemploymentRate": {
          "month": "2026-09",
          "value": 6.7
        },
        "employmentThousands": {
          "month": "2026-09",
          "value": 2949
        }
      }
    },
    "annual": {
      "cariboo": {
        "unemploymentRate": {
          "year": 2025,
          "value": 7.5
        },
        "participationRate": {
          "year": 2025,
          "value": 60.2
        },
        "employmentRate": {
          "year": 2025,
          "value": 55.7
        }
      },
      "bc": {
        "unemploymentRate": {
          "year": 2025,
          "value": 6.2
        },
        "participationRate": {
          "year": 2025,
          "value": 65
        },
        "employmentRate": {
          "year": 2025,
          "value": 60.9
        }
      }
    },
    "postings": {
      "open": 780,
      "updatedAt": "2026-10-16T08:37:16.644Z"
    }
  },
  "meta": {
    "source": "Statistics Canada, Labour Force Survey",
    "sourceUrl": "https://www150.statcan.gc.ca/t1/tbl1/en/tv.action?pid=1410046401",
    "updatedAt": "2026-10-12T13:20:13.809Z",
    "ageSec": 336488,
    "license": "Statistics Canada Open Licence (https://www.statcan.gc.ca/en/terms-conditions/open-licence)",
    "attribution": "Statistics Canada, via PG Pulse (princegeorgepulse.ca)"
  },
  "links": {
    "self": "/api/v1/jobs/market",
    "next": null,
    "docs": "/developers/reference/jobs/#get-jobs-market"
  }
}

GET /api/v1/jobs/stats #

Job-market stats from the posting history: open, new and closed postings per week, by category and top employers.

Weekly series (weeks ending Sunday, oldest first) computed from every posting this feed has tracked since trackedSince. open = postings listed at the end of the week, added = first seen that week, closed = no longer listed. medianHourly is the median hourly-equivalent wage of open postings that publish one. Counts reflect the sources this feed covers, not the whole labour market.

ParameterInTypeDescription
weeksqueryintegerWeeks of history (4 to 104, default 26). Example: 12.

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

Example request

bash
curl "https://princegeorgepulse.ca/api/v1/jobs/stats?weeks=12"

Example response (trimmed)

json
{
  "data": {
    "weeks": [
      "2026-10-04",
      "2026-10-11",
      "… 1 more"
    ],
    "trackedSince": "2026-09-30T23:03:55.829Z",
    "open": [
      793,
      778,
      "… 1 more"
    ],
    "added": [
      866,
      160,
      "… 1 more"
    ],
    "closed": [
      73,
      175,
      "… 1 more"
    ],
    "byCategory": [
      {
        "name": "Health care",
        "slug": "health-care",
        "open": [
          200,
          204,
          "… 1 more"
        ],
        "added": [
          228,
          32,
          "… 1 more"
        ]
      },
      {
        "name": "Education & child care",
        "slug": "education-and-child-care",
        "open": [
          90,
          90,
          "… 1 more"
        ],
        "added": [
          92,
          15,
          "… 1 more"
        ]
      },
      "… 13 more"
    ],
    "topEmployers": [
      {
        "slug": "northern-health",
        "name": "Northern Health",
        "openNow": 136,
        "open": [
          131,
          131,
          "… 1 more"
        ],
        "added": [
          155,
          29,
          "… 1 more"
        ]
      },
      {
        "slug": "sd57",
        "name": "School District No. 57 (Prince George)",
        "openNow": 54,
        "open": [
          57,
          55,
          "… 1 more"
        ],
        "added": [
          58,
          10,
          "… 1 more"
        ]
      },
      "… 8 more"
    ],
    "medianHourly": [
      27.52,
      27.5,
      "… 1 more"
    ]
  },
  "meta": {
    "source": "PG Pulse jobs, aggregated from public job boards and employer career sites (each posting links its source)",
    "sourceUrl": "https://princegeorgepulse.ca/jobs/",
    "updatedAt": "2026-10-16T08:37:16.644Z",
    "ageSec": 7865,
    "license": "Posting facts from each source (see `source`, `via` and `url` per posting); Job Bank content © Government of Canada, reproduced for non-commercial information with attribution",
    "attribution": "Each posting’s source, via PG Pulse (princegeorgepulse.ca)"
  },
  "links": {
    "self": "/api/v1/jobs/stats?weeks=12",
    "next": null,
    "docs": "/developers/reference/jobs/#get-jobs-stats"
  }
}

GET /api/v1/jobs/sources #

Sources the jobs feed is built from, with status and counts.

  • Cache: 10 min
  • Source: PG Pulse jobs
  • Licence: CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/)

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

Example request

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

Example response (trimmed)

json
{
  "data": [
    {
      "id": "city-pg",
      "name": "City of Prince George careers",
      "url": "https://princegeorgejobs.prevueaps.ca/jobs/",
      "ok": true,
      "count": 6,
      "listed": 6,
      "raw": 6,
      "ms": 2496,
      "kept": true,
      "checkedAt": "2026-10-16T07:35:09.218Z",
      "lastSuccess": "2026-10-16T07:35:09.218Z"
    },
    {
      "id": "rdffg",
      "name": "Regional District of Fraser-Fort George careers",
      "url": "https://rdffg.prevueaps.ca/jobs/",
      "ok": true,
      "count": 1,
      "listed": 1,
      "raw": 1,
      "ms": 2397,
      "kept": true,
      "checkedAt": "2026-10-16T07:35:09.218Z",
      "lastSuccess": "2026-10-16T07:35:09.218Z"
    },
    "… 6 more"
  ],
  "meta": {
    "source": "PG Pulse jobs",
    "sourceUrl": "https://princegeorgepulse.ca/jobs/",
    "updatedAt": "2026-10-16T08:37:16.644Z",
    "ageSec": 7865,
    "license": "CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/)",
    "attribution": "PG Pulse (princegeorgepulse.ca)"
  },
  "links": {
    "self": "/api/v1/jobs/sources",
    "next": null,
    "docs": "/developers/reference/jobs/#get-jobs-sources"
  }
}

GET /api/v1/jobs/{id} #

One job posting.

ParameterInTypeDescription
idpathstringPosting id (from /jobs). Required.

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

Example request

bash
curl "https://princegeorgepulse.ca/api/v1/jobs/8SJ8oOau9sTN"

Example response (trimmed)

json
{
  "data": {
    "id": "8SJ8oOau9sTN",
    "title": "Facilitator (Temporary) - Prince George - 2026.180",
    "employer": "Community Living BC",
    "location": "Prince George, BC",
    "workplace": null,
    "posted": "2026-10-16",
    "closes": null,
    "term": "Temporary",
    "hours": null,
    "wage": {
      "min": 78114,
      "max": 80425,
      "unit": "year",
      "hourlyMin": 37.55,
      "text": "$78,114 - $80,425 annually"
    },
    "snippet": "",
    "category": "Trades & transport",
    "…": "10 more keys"
  },
  "meta": {
    "source": "PG Pulse jobs, aggregated from public job boards and employer career sites (each posting links its source)",
    "sourceUrl": "https://princegeorgepulse.ca/jobs/",
    "updatedAt": "2026-10-16T08:37:16.644Z",
    "ageSec": 7865,
    "license": "Posting facts from each source (see `source`, `via` and `url` per posting); Job Bank content © Government of Canada, reproduced for non-commercial information with attribution",
    "attribution": "Each posting’s source, via PG Pulse (princegeorgepulse.ca)"
  },
  "links": {
    "self": "/api/v1/jobs/8SJ8oOau9sTN",
    "next": null,
    "docs": "/developers/reference/jobs/#get-jobs-id"
  }
}

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.