Back

API Documentation

Base URL

The base URL for all API endpoints is: https://cmpf-tools.de/api

Endpoints

  • Events Export - Return events with check-ins from Campfire
  • Club Events - Return a club's imported events with check-ins from Campfire
  • Club Stats - Return aggregated all-time statistics for a club
  • Events Import - Import events from Campfire

Events

GET /api/events

Query Parameters:

  • events: Comma-separated list of event links/IDs to return

Example:

https://cmpf-tools.de/api/events?events=88213c3f-d5fe-4fc9-acbe-e43671e36edc,event2

Response:

Returns a JSON array with the following structure:

[
  {
    "id": "88213c3f-d5fe-4fc9-acbe-e43671e36edc",
    "name": "Raidstunde: Terrakion",
    "url": "https://campfire.nianticlabs.com/discover/meetup/88213c3f-d5fe-4fc9-acbe-e43671e36edc",
    "time": "2025-07-16T16:00:00Z",
    "club_id": "b632fc8e-0b41-49de-ade2-21b0cd81db69",
    "creator": {
      "id": "E:...",
      "username": "topi314",
      "display_name": "topi"
    },
    "discord_interested": 0,
    "created_by_community_ambassador": true,
    "campfire_live_event_id": "fbb2a356-3b5c-4722-b021-ffdb3591b4a1",
    "campfire_live_event_name": "Terrakion Raid Hour",
    "members": [
      {
        "id": "E:...",
        "username": "",
        "display_name": "",
        "rsvp_status": "DECLINED"
      },
      {
        "id": "E:...",
        "username": "topi314",
        "display_name": "topi",
        "rsvp_status": "CHECKED_IN"
      },
      {
        "id": "E:...",
        "username": "topi314",
        "display_name": "topi",
        "rsvp_status": "ACCEPTED"
      }
    ]
  },
  ...
]

Club Events

GET /api/clubs/{club_id}/events

Path Parameters:

  • club_id: The ID of the club to return events for

Query Parameters:

  • upcoming: When true, return only upcoming and currently running events (end time in the future or now). Defaults to false.
  • timezone: Optional IANA timezone name used to convert event times when upcoming=true. Defaults to UTC. Invalid values return 400.

Example (all club events):

https://cmpf-tools.de/api/clubs/b632fc8e-0b41-49de-ade2-21b0cd81db69/events

Response (default):

Returns a JSON array with the same structure as Events, but filtered to the specified club.

Example (upcoming events):

https://cmpf-tools.de/api/clubs/b632fc8e-0b41-49de-ade2-21b0cd81db69/events?upcoming=true&timezone=Europe/Berlin

Response (upcoming=true):

Returns upcoming and currently running events from the local database. Same structure as Events without the members array, plus accepted and checked_in counts. Times are returned in the requested timezone. An empty list returns [].

[
  {
    "id": "88213c3f-d5fe-4fc9-acbe-e43671e36edc",
    "name": "Raidstunde: Terrakion",
    "address": "Some Address",
    "cover_photo_url": "https://...",
    "details": "Event details",
    "url": "https://campfire.nianticlabs.com/discover/meetup/88213c3f-d5fe-4fc9-acbe-e43671e36edc",
    "time": "2025-07-16T18:00:00+02:00",
    "end_time": "2025-07-16T19:00:00+02:00",
    "club": {
      "id": "b632fc8e-0b41-49de-ade2-21b0cd81db69",
      "name": "Example Club",
      "avatar_url": "https://...",
      "badges": [],
      "created_by_community_ambassador": true,
      "creator": {
        "id": "E:...",
        "username": "topi314",
        "display_name": "topi",
        "avatar_url": "https://...",
        "badges": []
      }
    },
    "creator": {
      "id": "E:...",
      "username": "topi314",
      "display_name": "topi",
      "avatar_url": "",
      "badges": null
    },
    "discord_interested": 0,
    "created_by_community_ambassador": true,
    "badges": [],
    "campfire_live_event": {
      "id": "fbb2a356-3b5c-4722-b021-ffdb3591b4a1",
      "name": "Terrakion Raid Hour"
    },
    "accepted": 12,
    "checked_in": 5
  }
]

Club Stats

GET /api/clubs/{club_id}/stats

Path Parameters:

  • club_id: The ID of the club to return statistics for

Returns all-time aggregated statistics for the club, including totals, monthly trends, top events, event type breakdown, and member loyalty tiers.

Responses are cached for 24 hours (both server-side and via Cache-Control: max-age=86400).

Example:

https://cmpf-tools.de/api/clubs/b632fc8e-0b41-49de-ade2-21b0cd81db69/stats

Response:

{
  "generated_at": "2026-08-23T21:28:09Z",
  "stats": {
    "generated_from": "389 events",
    "data_as_of": "2026-08-23",
    "club": { "name": "Example Club" },
    "totals": {
      "events": 389,
      "unique_participants": 2090,
      "total_rsvps": 14569,
      "total_check_ins": 10599,
      "total_accepted": 3188,
      "total_declined": 782,
      "avg_check_ins_per_event": 27,
      "check_in_rate": 0.728,
      "first_event_date": "2024-03-17T13:00:00Z",
      "last_event_date": "2026-08-26T16:00:00Z",
      "biggest_event": { "id": "...", "name": "...", "date": "...", "address": "...", "rsvps": 311, "check_ins": 248, "accepted": 48, "declined": 15, "type": "go_tour" },
      "first_event": { "id": "...", "name": "...", "date": "...", "address": "...", "rsvps": 39, "check_ins": 6, "accepted": 23, "declined": 10, "type": "raid_day" }
    },
    "monthly": [
      { "month": "2024-03", "events": 4, "check_ins": 16, "rsvps": 87, "new_participants": 58, "cumulative_participants": 58 }
    ],
    "top_events": [ ... ],
    "event_types": [
      { "type": "raid_day", "count": 189, "check_ins": 5014, "avg_check_ins": 27 }
    ],
    "loyalty": {
      "ever_checked_in": 772,
      "active_threshold": 5,
      "active_members": 318,
      "median_active": 13,
      "avg_active": 31,
      "tiers": [
        { "key": "intro", "range": "1", "casual": true, "people": 265 },
        { "key": "champion", "range": "217", "casual": false, "people": 1 }
      ],
      "elite": { "at_least_50": 54, "at_least_100": 23, "at_least_150": 12 }
    }
  }
}

Events Import

POST /api/events

Request:

Send a JSON array of event IDs or links to import from Campfire.

Example:

["event1", "event2", ...]

Response:

204 - No Content