Skip to main content

GraphQL API

Everything the TimeCampus web app, CLI, and extensions can do is available through a GraphQL API on the Burdenoff Workspaces platform. Every operation is authenticated and permission-checked against the calling user's role in the workspace.

Endpoint​

https://graphqlworkspaces.burdenoff.com/workspaces/graphql

For alpha:

https://alphagraphqlworkspaces.burdenoff.com/workspaces/graphql

For local development:

http://127.0.0.1:4003/workspaces/graphql

Auth​

Standard Burdenoff Workspaces auth — see Authentication for full detail. Short version:

Authorization: Bearer <token>
x-workspace-id: <workspace-uuid>

x-workspace-id is REQUIRED. TimeCampus data is workspace-scoped.

Key types (TimeCampus-specific)​

TypeWhat
TimeEntryA recorded time entry (start, end, duration, project, task)
ProjectA project (name, status, budget, billable settings)
TaskA task within a project (status, assignee, estimate)
PomodoroSessionA focus/break session (start, end, type, interrupted)
FocusScoreAggregated focus metric for a period
WorkPatternLearned rhythm data for a user
ExpenseAn expense entry (amount, category, receipt, approval status)
MeetingA meeting (duration, cost, action items)
ApprovalRequestA timesheet or expense approval request
ResourcePlanA team resource allocation plan
GeofenceA location-based auto-tracking boundary
ClientPortalA client-visible project view
ChannelA capture endpoint (calendar, email, editor, etc.)
TimelineEventAn assembled event on the unified timeline

Example queries​

query MyTimeEntries {
myTimeEntries {
id
startTime
endTime
durationSeconds
project { id name }
task { id name }
}
}

query ProjectWithTasks($projectId: ID!) {
project(id: $projectId) {
id
name
status
budgetHours
tasks {
id
name
status
assignee { id displayName }
}
}
}

Example mutations​

mutation CreateTimeEntry {
createTimeEntry(input: {
startTime: "2026-07-27T09:00:00Z"
endTime: "2026-07-27T11:00:00Z"
projectId: "..."
taskId: "..."
description: "Deep work session"
}) { id }
}

mutation StartTimer {
startTimer(input: {
projectId: "..."
taskId: "..."
}) { id startTime }
}

mutation StopTimer($entryId: ID!) {
stopTimer(id: $entryId) { id endTime durationSeconds }
}

Discover the live schema​

Introspection is disabled on the public endpoint. The authoritative schema is published through the Burdenoff Workspaces developer docs; the types above cover the TimeCampus-specific part of it.

Backend service integration​

If you are building a workspace service that extends or integrates with TimeCampus:

  • The backend is wspace-timecampus-svc in the Burdenoff monorepo (~/products/wspace/timecampus/wspace-timecampus-svc/).
  • It uses Elysiajs + GraphQL Yoga + Prisma + Postgres 18 + AGE.
  • Events are published via Redis Streams through @burdenoff/be-sdk.
  • Auth is enforced at the gateway; the service receives actor headers (x-actor-id, x-actor-type, x-workspace-id).

For platform integration guides, see ~/products/dev/platform/context/.

Next steps​