Capabilities

Time Management

Log, reconstruct, submit, approve, import, and reconcile canonical time through self-scoped APIs, governed team decisions, and confirmation-bound AI tools.

Interfaces

RESTAvailable

Entry, timer, day reconstruction, submission, approval, Timely import, and reconciliation routes are implemented through Work-domain services.

MCPAvailable

MCP now covers the shipped Time Management runtime: entries, timers, day reconstruction, submission/recall, approvals, imports, and reconciliation. Every consequential write requires confirmation.

GraphQLAvailable

Typed entry, timer, day, draft/apply, submission, approval, import, and reconciliation operations are implemented with per-field scope authorization.

WebhooksAvailable

Seven transactional outbox events cover time-entry and submission lifecycle facts with minimal v1 payloads and the standard signed delivery path.

Required scopes

time:read_selfAPI key scoperequired
Read the authenticated user's time entries and time-management state.
time:write_selfAPI key scoperequired
Create and change explicit time entries for the authenticated user. Inferred time remains proposal-only.
time:submit_selfAPI key scoperequired
Submit or recall the authenticated user's reviewed work day. Never grants approval authority.
time:read_teamAPI key scoperequired
Read only time submissions the authenticated user is eligible to review in the active workspace.
time:approve_teamAPI key scoperequired
Approve or reject time submissions where the authenticated user is an eligible approver.
time:importAPI key scoperequired
Start provider-backed time import runs for the authenticated user with immutable source identity.
time:reconcileAPI key scoperequired
Read and resolve authorized provider reconciliation findings without changing provider authority.

Examples

List my time entries view in REST API reference

curl -X GET "https://www.digitalstack360.com/api/v1/time-entries" \
  -H "Authorization: Bearer $DS_API_KEY"

Create my time entry view in REST API reference

curl -X POST "https://www.digitalstack360.com/api/v1/time-entries" \
  -H "Authorization: Bearer $DS_API_KEY" \
  -H "Idempotency-Key: time-2026-07-14-client-sync" \
  -H "Content-Type: application/json" \
  -d '{"work_date":"2026-07-14","duration_minutes":90,"project_id":"proj_abc123","category_key":"client_delivery","billable_status":"billable","notes":"Implemented retry handling"}'

Retrieve my time entry view in REST API reference

curl -X GET "https://www.digitalstack360.com/api/v1/time-entries/time_01k2..." \
  -H "Authorization: Bearer $DS_API_KEY"

Update my time entry view in REST API reference

curl -X PATCH "https://www.digitalstack360.com/api/v1/time-entries/time_01k2..." \
  -H "Authorization: Bearer $DS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"expected_version":1,"duration_minutes":105,"notes":"Completed implementation and tests"}'

Void my time entry view in REST API reference

curl -X DELETE "https://www.digitalstack360.com/api/v1/time-entries/time_01k2..." \
  -H "Authorization: Bearer $DS_API_KEY" \
  -H "If-Match: 1"

Get my active timer view in REST API reference

curl -X GET "https://www.digitalstack360.com/api/v1/time-timer" \
  -H "Authorization: Bearer $DS_API_KEY"

Control my timer view in REST API reference

curl -X POST "https://www.digitalstack360.com/api/v1/time-timer/stop" \
  -H "Authorization: Bearer $DS_API_KEY" \
  -H "Idempotency-Key: timer-stop-2026-07-14" \
  -H "Content-Type: application/json" \
  -d '{"expected_version":1,"work_date":"2026-07-14","notes":"Finished timer work"}'

Retrieve my time day view in REST API reference

curl -X GET "https://www.digitalstack360.com/api/v1/time-days/today" \
  -H "Authorization: Bearer $DS_API_KEY"

Draft my time day view in REST API reference

curl -X POST "https://www.digitalstack360.com/api/v1/time-days/today/draft" \
  -H "Authorization: Bearer $DS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'

Apply a reviewed time draft view in REST API reference

curl -X POST "https://www.digitalstack360.com/api/v1/time-drafts/draft_01k2.../apply" \
  -H "Authorization: Bearer $DS_API_KEY" \
  -H "Idempotency-Key: apply-draft-01k2" \
  -H "Content-Type: application/json" \
  -d '{"expected_version":1,"confirm":true}'

Submit or recall my time day view in REST API reference

curl -X POST "https://www.digitalstack360.com/api/v1/time-days/today/submit" \
  -H "Authorization: Bearer $DS_API_KEY" \
  -H "Idempotency-Key: submit-2026-07-14" \
  -H "Content-Type: application/json" \
  -d '{"confirm":true}'

List my eligible time approvals view in REST API reference

curl -X GET "https://www.digitalstack360.com/api/v1/time-approvals" \
  -H "Authorization: Bearer $DS_API_KEY"

Decide a time approval view in REST API reference

curl -X POST "https://www.digitalstack360.com/api/v1/time-approvals/approval_01k2.../approve" \
  -H "Authorization: Bearer $DS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"confirm":true}'

List time import runs view in REST API reference

curl -X GET "https://www.digitalstack360.com/api/v1/time-imports" \
  -H "Authorization: Bearer $DS_API_KEY"

Start a Timely import view in REST API reference

curl -X POST "https://www.digitalstack360.com/api/v1/time-imports" \
  -H "Authorization: Bearer $DS_API_KEY" \
  -H "Idempotency-Key: timely-import-2026-07-01-14" \
  -H "Content-Type: application/json" \
  -d '{"provider":"timely","date_from":"2026-07-01","date_to":"2026-07-14","confirm":true}'

List reconciliation findings view in REST API reference

curl -X GET "https://www.digitalstack360.com/api/v1/time-reconciliation-findings" \
  -H "Authorization: Bearer $DS_API_KEY"

Scan for reconciliation findings view in REST API reference

curl -X POST "https://www.digitalstack360.com/api/v1/time-reconciliation-scans" \
  -H "Authorization: Bearer $DS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"date_from":"2026-07-01","date_to":"2026-07-14","confirm":true}'

Resolve a reconciliation finding view in REST API reference

curl -X POST "https://www.digitalstack360.com/api/v1/time-reconciliation-findings/finding_01k2.../resolve" \
  -H "Authorization: Bearer $DS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"resolution_action":"prefer_ds_native","confirm":true}'
List my draft time entries for this week.
Show me this time entry.
Adjust this draft time entry after I confirm the fields.
Void this draft entry after I confirm.
Show me my current timer.
Show me my time day and any gaps that still need review.
Draft today's time from my DigitalStack work evidence and show me what remains unresolved.
After I review the proposal, apply this time draft with my explicit confirmation.
Log 90 minutes to the selected project after I confirm the fields.
Start my timer for the selected project after I confirm the attribution.
Pause my active timer after I confirm.
Resume my paused timer after I confirm.
Stop my active timer and record the result after I confirm.
Discard my current timer after I confirm.
Submit my reviewed time day after I explicitly confirm.
Recall this submitted time day after I confirm.
List my pending time approvals.
Approve this eligible time submission after I inspect it and confirm the decision.
List recent time import runs.
Import Timely time for this date range after I confirm.
List open time reconciliation findings.
Scan this date range for time reconciliation issues after I confirm.
Resolve this reconciliation finding after I confirm the action.

GraphQL examples

Read my work dayAvailabletime:read_self

Fetch the caller’s workspace-local day: canonical entries, captured sessions, conflicts, gaps, running timer, submission, draft, and totals.

query MyTimeDay($date: String!) {
  myTimeDay(date: $date) {
    workDate
    timezone
    totals {
      entryMinutes
      capturedMinutes
      proposedMinutes
    }
    entries {
      id
      workDate
      durationMinutes
      categoryKey
      billableStatus
      projectId
      targetType
      targetId
      status
      version
    }
    runningTimer {
      id
      state
      elapsedSeconds
      categoryKey
      projectId
      version
    }
    conflicts {
      id
      kind
      severity
      requiresReview
    }
  }
}
Create an explicit time entryAvailabletime:write_self

Create one self-owned entry. GraphQL uses the same Work-domain service and scope boundary as REST.

mutation CreateTimeEntry($input: CreateTimeEntryInput!) {
  createTimeEntry(input: $input) {
    entry {
      id
      workDate
      durationMinutes
      categoryKey
      billableStatus
      projectId
      status
      version
      createdAt
    }
    idempotencyReplayed
  }
}

Webhook emits

time_entry.createdAvailable

A canonical time entry was created. Notes, rates, and raw evidence are never included.

Resource: time_entry

time_entry_idwork_dateduration_minutesproject_idstatusoccurred_at
time_entry.updatedAvailable

Governed time-entry fields changed.

Resource: time_entry

time_entry_idchanged_fieldsversionoccurred_at
time_entry.voidedAvailable

A time entry was governedly voided.

Resource: time_entry

time_entry_idprior_statusvoided_at
time_submission.submittedAvailable

A time submission was submitted.

Resource: time_submission

submission_idperiod_startperiod_endsubmitted_at
time_submission.recalledAvailable

A time submission was recalled.

Resource: time_submission

submission_idprior_statusrecalled_at
time_submission.approvedAvailable

A time submission was approved.

Resource: time_submission

submission_idapproval_idapproved_at
time_submission.rejectedAvailable

A time submission was rejected.

Resource: time_submission

submission_idapproval_idrejected_at

All webhook events use the shared v1 envelope, signed delivery, and minimal payload rule. Fetch by resource id for expanded data.

System boundaries

Systems commonly integrated with this capability. Each row states the boundary and its native status; it does not transfer canonical authority to the connected system.

DigitalStack owns

  • Canonical time entries, active timer state, account-local work days, and audit history
  • Persisted reconstruction proposals, submission state, and approval eligibility
  • Provider mapping, import provenance, and reconciliation decisions

Source systems own

  • Timely provider records before governed import
  • Calendar meeting records used only as evidence
  • AI-client conversation and presentation of requested commands

Typical integration patterns

Timely
Import provider time into DigitalStack with immutable source identity; current authority direction is Timely → DigitalStack.
Google / Microsoft Calendar
Contribute bounded meeting evidence to reconstruction without becoming automatic time truth.DigitalStack has a native connection and ingestion foundation for this system already — public developer-platform exposure for this capability is still limited or planned.
Claude / ChatGPT / IDE clients
Use MCP to read, propose, and execute explicitly confirmed time commands; agents never become approval authority.

Related guides