TALQENDocs

Activity tracking

Shift lifecycle tracking uses three verified write endpoints. Your game owns timing; Talqen owns duration accounting after validated heartbeats and stops.

Status: Available for start, heartbeat, and stop under /v1/activity/shifts.

Lifecycle

  1. POST /v1/activity/shifts/start with Roblox identifiers
  2. Periodically POST /v1/activity/shifts/{shiftId}/heartbeat
  3. POST /v1/activity/shifts/{shiftId}/stop with a reason

Quick curl

Start shiftbash
curl -X POST "https://api-staging.talqen.net/v1/activity/shifts/start" \
  -H "Authorization: Bearer <TALQEN_TEST_API_KEY>" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: start-<ROBLOX_USER_ID>-001" \
  -d '{
    "robloxUserId": "<ROBLOX_USER_ID>",
    "universeId": "<UNIVERSE_ID>",
    "placeId": "<PLACE_ID>",
    "serverId": "<SERVER_ID>"
  }'
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"
    }
  }
}

Related reads live in the activity reference.