TALQENDocs

Activity

Write and read activity data using scopes activity:write and activity:read.

Availablescope: activity:write

Start shift

POST/v1/activity/shifts/start

Starts or resumes an activity shift for a linked Roblox staff member. Universe must be allowed for the application.

Headers

NameTypeRequiredDescription
AuthorizationstringYesBearer <TALQEN_API_KEY>
Idempotency-KeystringYesUnique key for this start attempt.
Content-Typeapplication/jsonYesJSON request body.

Body

NameTypeRequiredDescription
robloxUserIdstring | numberYesRoblox user ID (coerced to string).
universeIdstring | numberYesRoblox universe ID; must be in allowed_roblox_universe_ids.
placeIdstring | numberYesRoblox place ID.
serverIdstringYesServer identifier (1–128 chars). Typically game.JobId.
startedAtISO datetimeNoOptional start timestamp. Server clock applies when omitted.
Success responsejson
{
  "data": {
    "shift": {
      "id": "...",
      "status": "active",
      "startedAt": "...",
      "lastHeartbeatAt": "..."
    },
    "existing": true
  }
}
  • existing may be true when this application already has an active shift for the staff member.
  • Empty allowed universe list denies all universes.
  • Unknown staff mapping returns 404.
Availablescope: activity:write

Heartbeat shift

POST/v1/activity/shifts/{shiftId}/heartbeat

Records a heartbeat for an active shift owned by this credential.

Headers

NameTypeRequiredDescription
AuthorizationstringYesBearer <TALQEN_API_KEY>
Idempotency-KeystringYesUnique key for this heartbeat attempt.
Content-Typeapplication/jsonNoRequired when sending a JSON body.

Path parameters

NameTypeRequiredDescription
shiftIdstringYesShift ID returned from start.

Body

NameTypeRequiredDescription
recordedAtISO datetimeNoOptional heartbeat timestamp.
serverIdstringNoIf provided, must match the shift server.
Success responsejson
{
  "data": {
    "shift": {
      "id": "...",
      "status": "active",
      "lastHeartbeatAt": "..."
    }
  }
}
Availablescope: activity:write

Stop shift

POST/v1/activity/shifts/{shiftId}/stop

Stops an active shift and returns duration metrics.

Headers

NameTypeRequiredDescription
AuthorizationstringYesBearer <TALQEN_API_KEY>
Idempotency-KeystringYesUnique key for this stop attempt.
Content-Typeapplication/jsonNoRequired when sending a JSON body.

Path parameters

NameTypeRequiredDescription
shiftIdstringYesShift ID returned from start.

Body

NameTypeRequiredDescription
endedAtISO datetimeNoOptional end timestamp.
reasonmanual | player_left | server_shutdownNoDefaults to manual.
Success responsejson
{
  "data": {
    "shift": {
      "id": "...",
      "status": "completed",
      "startedAt": "...",
      "endedAt": "...",
      "durationSeconds": 0,
      "minutes": 0,
      "endReason": "manual"
    }
  }
}
Availablescope: activity:read

List active shifts

GET/v1/activity/shifts/active

Lists active shifts visible to this credential.

Headers

NameTypeRequiredDescription
AuthorizationstringYesBearer <TALQEN_API_KEY>

Query parameters

NameTypeRequiredDescription
limitnumberNoDefault 50; clamped 1–100.
cursorStartedAtstringNoPagination cursor.
cursorIdstringNoPagination cursor.
Success responsejson
{
  "data": {
    "shifts": [
      {
        "id": "...",
        "status": "active",
        "startedAt": "...",
        "lastHeartbeatAt": "...",
        "elapsedSeconds": 0,
        "universeId": "...",
        "placeId": "...",
        "serverId": "...",
        "staff": {
          "id": "...",
          "displayName": "...",
          "robloxUserId": "..."
        }
      }
    ]
  }
}
Availablescope: activity:read

Get acting staff activity summary

GET/v1/activity/me/summary

Returns minute totals and optional active shift for the acting Discord user.

Headers

NameTypeRequiredDescription
AuthorizationstringYesBearer <TALQEN_API_KEY>
X-Discord-Guild-IdstringYesDiscord guild ID for the connected integration.
X-Acting-Discord-User-IdstringYesDiscord user ID of the staff member to resolve.
Success responsejson
{
  "data": {
    "todayMinutes": 0,
    "currentWeekMinutes": 0,
    "previousWeekMinutes": 0,
    "currentMonthMinutes": 0,
    "weeklyRequiredMinutes": 0,
    "progressPercent": 0,
    "activeShift": null,
    "inactivityEffect": null,
    "timezone": "UTC",
    "currentWeekStart": "...",
    "currentWeekEnd": "...",
    "currentMonthStart": "...",
    "currentMonthEnd": "..."
  }
}
  • Active shift elapsed time is not rolled into completed minute totals.
Availablescope: activity:read

Staff activity summary by Roblox user

GET/v1/activity/staff/{robloxUserId}/summary

Returns activity aggregates for a staff member identified by Roblox user ID.

Headers

NameTypeRequiredDescription
AuthorizationstringYesBearer <TALQEN_API_KEY>

Path parameters

NameTypeRequiredDescription
robloxUserIdstringYesRoblox user ID.

Query parameters

NameTypeRequiredDescription
periodweek | monthNoPeriod selector, or use start+end for a custom range.
startISO stringNoCustom range start.
endISO stringNoCustom range end.
Success responsejson
{
  "data": {
    "staff": {
      "id": "...",
      "displayName": "...",
      "robloxUserId": "..."
    },
    "period": {
      "start": "...",
      "end": "...",
      "timezone": "UTC"
    },
    "totalSeconds": 0,
    "totalMinutes": 0,
    "completedShifts": 0,
    "activeShift": null
  }
}
Availablescope: activity:read

Get activity leaderboard

GET/v1/activity/leaderboard

Returns ranked staff activity for a week or month period within the credential workspace.

Headers

NameTypeRequiredDescription
AuthorizationstringYesBearer <TALQEN_API_KEY>

Query parameters

NameTypeRequiredDescription
periodweek | monthNoDefaults to week when omitted or unrecognized.
startISO stringNoOptional custom range start (used with end).
endISO stringNoOptional custom range end (used with start).
limitnumberNoDefault 25; maximum 100.
cursorTotalSecondsnumberNoPagination cursor (total seconds).
cursorStaffIdstringNoPagination cursor (staff id).
departmentIdstringNoFilter by department.
includeInactivetrue | 1NoInclude inactive staff when true or 1.
Success responsejson
{
  "data": {
    "entries": [
      {
        "staffId": "...",
        "displayName": "...",
        "robloxUserId": "...",
        "robloxUsername": "...",
        "totalSeconds": 0,
        "totalMinutes": 0,
        "completedShifts": 0,
        "department": "...",
        "rank": "...",
        "progressPercent": 0,
        "position": 1
      }
    ]
  }
}