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.scopely.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:

  • from: Optional RFC3339 timestamp (e.g. 2025-01-01T00:00:00Z). Filters events with event_time >= from. Mutually exclusive with upcoming. Invalid values return 400.
  • to: Optional RFC3339 timestamp (e.g. 2025-03-31T23:59:59Z). Filters events with event_time <= to. Mutually exclusive with upcoming. Invalid values return 400.
  • upcoming: When true, return only upcoming and currently running events (end time in the future or now). Defaults to false. Mutually exclusive with from/to.
  • timezone: Optional IANA timezone name used to convert event times in the response. Defaults to UTC. Invalid values return 400.

from/to and upcoming are mutually exclusive modes. If upcoming=true is set, from and to are ignored. timezone can be combined with either mode.

Example (all club events):

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

Example (time range):

https://cmpf-tools.de/api/clubs/b632fc8e-0b41-49de-ade2-21b0cd81db69/events?from=2025-01-01T00:00:00Z&to=2025-03-31T23:59:59Z

Response (default):

Returns a JSON array with the same structure as Events, but filtered to the specified club. Times are returned in the requested timezone. lat and long are null when the event has no coordinates.

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. lat and long are null when the event has no coordinates. An empty list returns [].

[
  {
    "id": "88213c3f-d5fe-4fc9-acbe-e43671e36edc",
    "name": "Raidstunde: Terrakion",
    "address": "Some Address",
    "lat": 52.520008,
    "long": 13.404954,
    "cover_photo_url": "https://...",
    "details": "Event details",
    "url": "https://campfire.scopely.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