# Events: API reference

5 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/events {#get-events}

Upcoming events in Prince George (aggregated calendar), soonest first.

Times carry their UTC offset (Prince George local time).

- Cache: 10 min (live source, cached on our server)
- Source: [PG Pulse events calendar, aggregated from venue, city and community calendars (each event links its source)](https://princegeorgepulse.ca/events/)
- Licence: Event facts from each organiser; see `url`/`source` per event
- Paginated: `limit` (default 100, max 500) and `offset`; also `format=csv`

| Parameter | In | Type | Description |
| --- | --- | --- | --- |
| `from` | query | string | Only events running on or after this date (YYYY-MM-DD). Dates before today search past events (history is kept about two years). Example: `2026-10-01`. |
| `to` | query | string | Only events starting on or before this date. |
| `month` | query | string | Only events in this local month (YYYY-MM), as on the site’s month pages; instead of `from`/`to`. See /events/months. Example: `2026-11`. |
| `category` | query | string | Category name or slug (see /events/categories). Example: `music-nightlife`. |
| `venue` | query | string | Venue name contains. |
| `source` | query | string | Automated calendar source id (see /events/sources). |
| `q` | query | string | Text search in title, summary, venue and source. |
| `past` | query | boolean | Include events that already ended. |
| `since` | query | string | Incremental sync: only events added or changed after this ISO date-time, oldest change first, including ones a source stopped listing (`status: removed`). Store `meta.updatedAt` and pass it next time. Example: `2026-09-30T00:00:00Z`. |
| `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**

```bash
curl "https://princegeorgepulse.ca/api/v1/events?limit=3"
```

**Example response** (trimmed)

```json
{
  "data": [
    {
      "id": "t0QKNBK_aC",
      "title": "Applications are now open for the 2027 UNBC 3MT competition",
      "start": "2026-09-23T00:00:00-07:00",
      "end": "2027-01-22T23:59:00-07:00",
      "allDay": true,
      "venue": "TBA, UNBC",
      "address": "3333 University Way",
      "lat": 53.887584,
      "lng": -122.813943,
      "category": "Learning",
      "summary": "",
      "image": null,
      "…": "9 more keys"
    },
    {
      "id": "Fktjwar8Jg",
      "title": "Line Dancing – Friday",
      "start": "2026-10-16T10:00:00-07:00",
      "end": "2026-10-16T12:00:00-07:00",
      "allDay": false,
      "venue": "Hart Pioneer Centre",
      "address": "6986 Hart Highway, Prince George",
      "lat": 53.99302,
      "lng": -122.792389,
      "category": "Community",
      "summary": "Line Dancing come and have some fun and get some exercise too.",
      "image": "https://princegeorgepulse-media.s3.ca-central-1.amazonaws.com/prince-george/events/line-dancing-friday-aeb868-480.webp",
      "…": "9 more keys"
    },
    "… 1 more"
  ],
  "meta": {
    "source": "PG Pulse events calendar, aggregated from venue, city and community calendars (each event links its source)",
    "sourceUrl": "https://princegeorgepulse.ca/events/",
    "updatedAt": "2026-10-16T13:21:15.012Z",
    "ageSec": 8878,
    "license": "Event facts from each organiser; see `url`/`source` per event",
    "attribution": "Each event’s organiser or listing source, via PG Pulse (princegeorgepulse.ca)",
    "timezone": "America/Vancouver",
    "horizonDays": 90,
    "today": "2026-10-16",
    "calendar": "https://princegeorgepulse.ca/events/calendar.ics",
    "failedSources": [],
    "total": 361,
    "…": "3 more keys"
  },
  "links": {
    "self": "/api/v1/events?limit=3",
    "next": "/api/v1/events?limit=3&offset=3",
    "docs": "/developers/reference/events/#get-events"
  }
}
```

## GET /api/v1/events/months {#get-events-months}

Months with upcoming events, with counts and their month pages.

The current month and every later month that has upcoming events, as on the site’s “Browse by month” links. Read one month with `/events?month=YYYY-MM`.

- Cache: 10 min
- Source: [PG Pulse events calendar, aggregated from venue, city and community calendars (each event links its source)](https://princegeorgepulse.ca/events/)
- Licence: Event facts from each organiser; see `url`/`source` per event

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

**Example request**

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

**Example response** (trimmed)

```json
{
  "data": [
    {
      "month": "2026-10",
      "label": "October 2026",
      "count": 181,
      "url": "https://princegeorgepulse.ca/events/2026-10/",
      "api": "/api/v1/events?month=2026-10"
    },
    {
      "month": "2026-11",
      "label": "November 2026",
      "count": 123,
      "url": "https://princegeorgepulse.ca/events/2026-11/",
      "api": "/api/v1/events?month=2026-11"
    },
    "… 2 more"
  ],
  "meta": {
    "source": "PG Pulse events calendar, aggregated from venue, city and community calendars (each event links its source)",
    "sourceUrl": "https://princegeorgepulse.ca/events/",
    "updatedAt": "2026-10-16T13:21:15.012Z",
    "ageSec": 8878,
    "license": "Event facts from each organiser; see `url`/`source` per event",
    "attribution": "Each event’s organiser or listing source, via PG Pulse (princegeorgepulse.ca)",
    "today": "2026-10-16"
  },
  "links": {
    "self": "/api/v1/events/months",
    "next": null,
    "docs": "/developers/reference/events/#get-events-months"
  }
}
```

## GET /api/v1/events/categories {#get-events-categories}

Event categories with upcoming counts.

- Cache: 10 min
- Source: [PG Pulse events calendar, aggregated from venue, city and community calendars (each event links its source)](https://princegeorgepulse.ca/events/)
- Licence: Event facts from each organiser; see `url`/`source` per event

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

**Example request**

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

**Example response** (trimmed)

```json
{
  "data": [
    {
      "name": "Music & nightlife",
      "slug": "music-nightlife",
      "upcoming": 41
    },
    {
      "name": "Arts & culture",
      "slug": "arts-culture",
      "upcoming": 80
    },
    "… 7 more"
  ],
  "meta": {
    "source": "PG Pulse events calendar, aggregated from venue, city and community calendars (each event links its source)",
    "sourceUrl": "https://princegeorgepulse.ca/events/",
    "updatedAt": null,
    "license": "Event facts from each organiser; see `url`/`source` per event",
    "attribution": "Each event’s organiser or listing source, via PG Pulse (princegeorgepulse.ca)"
  },
  "links": {
    "self": "/api/v1/events/categories",
    "next": null,
    "docs": "/developers/reference/events/#get-events-categories"
  }
}
```

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

Calendars the events feed is built from, with status.

- Cache: 10 min
- Source: [PG Pulse events calendar, aggregated from venue, city and community calendars (each event links its source)](https://princegeorgepulse.ca/events/)
- Licence: Event facts from each organiser; see `url`/`source` per event

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

**Example request**

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

**Example response** (trimmed)

```json
{
  "data": [
    {
      "id": "city-pg",
      "name": "City of Prince George",
      "type": "drupal-fullcalendar",
      "url": "https://www.princegeorge.ca/community-culture/events/events-calendar",
      "ok": true,
      "count": 52,
      "raw": 435,
      "ms": 368,
      "kept": false,
      "checkedAt": "2026-10-16T13:20:05.542Z",
      "lastSuccess": "2026-10-16T13:20:05.542Z"
    },
    {
      "id": "cougars",
      "name": "Prince George Cougars",
      "type": "ical",
      "url": "https://cluster.leaguestat.com/components/calendar/ical_add_games.php?client_code=whl&season_id=295&team_id=210",
      "ok": true,
      "count": 16,
      "raw": 34,
      "ms": 263,
      "kept": false,
      "checkedAt": "2026-10-16T13:20:05.542Z",
      "lastSuccess": "2026-10-16T13:20:05.542Z"
    },
    "… 18 more"
  ],
  "meta": {
    "source": "PG Pulse events calendar, aggregated from venue, city and community calendars (each event links its source)",
    "sourceUrl": "https://princegeorgepulse.ca/events/",
    "updatedAt": "2026-10-16T13:21:15.012Z",
    "ageSec": 8878,
    "license": "Event facts from each organiser; see `url`/`source` per event",
    "attribution": "Each event’s organiser or listing source, via PG Pulse (princegeorgepulse.ca)"
  },
  "links": {
    "self": "/api/v1/events/sources",
    "next": null,
    "docs": "/developers/reference/events/#get-events-sources"
  }
}
```

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

One event.

- Cache: 10 min
- Source: [PG Pulse events calendar, aggregated from venue, city and community calendars (each event links its source)](https://princegeorgepulse.ca/events/)
- Licence: Event facts from each organiser; see `url`/`source` per event

| Parameter | In | Type | Description |
| --- | --- | --- | --- |
| `id` | path | string | Event id (from /events), or the last segment of its page address (`pageUrl`). Required. |

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

**Example request**

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

**Example response** (trimmed)

```json
{
  "data": {
    "id": "t0QKNBK_aC",
    "title": "Applications are now open for the 2027 UNBC 3MT competition",
    "start": "2026-09-23T00:00:00-07:00",
    "end": "2027-01-22T23:59:00-07:00",
    "allDay": true,
    "venue": "TBA, UNBC",
    "address": "3333 University Way",
    "lat": 53.887584,
    "lng": -122.813943,
    "category": "Learning",
    "summary": "",
    "image": null,
    "…": "10 more keys"
  },
  "meta": {
    "source": "PG Pulse events calendar, aggregated from venue, city and community calendars (each event links its source)",
    "sourceUrl": "https://princegeorgepulse.ca/events/",
    "updatedAt": "2026-10-05T16:20:11.325Z",
    "ageSec": 948542,
    "license": "Event facts from each organiser; see `url`/`source` per event",
    "attribution": "Each event’s organiser or listing source, via PG Pulse (princegeorgepulse.ca)",
    "checkedAt": "2026-10-16T13:20:05.542Z"
  },
  "links": {
    "self": "/api/v1/events/t0QKNBK_aC",
    "next": null,
    "docs": "/developers/reference/events/#get-events-id"
  }
}
```
