Attendance API

Last updated: August 2026

Your bots already know who joined the voice channels during your content. This API lets your own script read that list, so you can hand out DKP (or check who showed up) without copying names by hand.

Before you start

  1. Turn on Attendance for your server: open your server in the dashboard, go to the Activity tab and press Turn on. Nothing is recorded until you do.
  2. In the same place, open API access and create a token. You will see it once — copy it right away. If you lose it, revoke it and make a new one.

A token belongs to one server. You never send the server ID: it comes from the token.

Calling the API

Send the token in the Authorization header:

curl -H "Authorization: Bearer txrc_your_token_here" \
  "https://app.example.com/app/api/v1/attendance?from=2026-08-16T20:00:00Z&to=2026-08-16T23:00:00Z"

Replace app.example.com with the address you use for your dashboard.

Dates (from and to) can be ISO 8601 with a time zone, or milliseconds since the epoch. to defaults to now.

Limits: 60 requests per minute per token. The reply includes RateLimit-* headers, so your script can see how many calls it has left.

Endpoints

GET /api/v1/token

Checks that a token works. Useful while you set up your script.

{ "guild_id": "123456789", "scopes": ["attendance:read"], "expires_at": null }

GET /api/v1/attendance

One row per member, with the time each one spent in voice inside the window.

QueryMeaning
fromStart of the window. Required.
toEnd of the window. Defaults to now.
min_minutesHow long counts as attending. Sets the attended flag; nobody is hidden.
channel_idOnly count one channel.
{
  "guild_id": "123456789",
  "from": "2026-08-16T20:00:00.000Z",
  "to": "2026-08-16T23:00:00.000Z",
  "sample_interval_seconds": 30,
  "min_minutes": 60,
  "totals": { "members": 24, "attended": 21, "total_minutes": 2870 },
  "channels": [
    { "channel_id": "222", "name": "party-1", "members": 6, "total_minutes": 700 }
  ],
  "members": [
    {
      "user_id": "245244453630115840",
      "username": "thexreth",
      "display_name": "TheXReth",
      "minutes": 170,
      "first_seen": "2026-08-16T20:02:00.000Z",
      "last_seen": "2026-08-16T22:52:00.000Z",
      "attended": true,
      "channels": [{ "channel_id": "111", "name": "callers", "minutes": 170 }]
    }
  ]
}

GET /api/v1/attendance/sessions

The raw stretches of time, if you would rather do the maths yourself. One row each time a member joined a channel and left it.

QueryMeaning
from, toSame as above.
limitRows per page (up to 500, 100 by default).
cursorPass the next_cursor from the last reply to get the next page.

next_cursor is null when there is nothing left to read. left is null for someone who is still in the channel.

Errors

StatuserrorWhat happened
401missing_tokenNo Authorization header.
401invalid_tokenThe token is wrong, revoked or expired.
403insufficient_scopeThe token cannot read attendance.
403attendance_disabledAttendance is turned off for that server.
400invalid_rangefrom/to missing or the wrong way round.
429rate_limitedMore than 60 calls in a minute.

Good to know