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: Whentrue, return only upcoming and currently running events (end time in the future or now). Defaults tofalse.timezone: Optional IANA timezone name used to convert event times whenupcoming=true. Defaults toUTC. Invalid values return400.
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