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 withevent_time >= from. Mutually exclusive withupcoming. Invalid values return400.to: Optional RFC3339 timestamp (e.g.2025-03-31T23:59:59Z). Filters events withevent_time <= to. Mutually exclusive withupcoming. Invalid values return400.upcoming: Whentrue, return only upcoming and currently running events (end time in the future or now). Defaults tofalse. Mutually exclusive withfrom/to.timezone: Optional IANA timezone name used to convert event times in the response. Defaults toUTC. Invalid values return400.
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