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
Entry, timer, day reconstruction, submission, approval, Timely import, and reconciliation routes are implemented through Work-domain services.
MCP now covers the shipped Time Management runtime: entries, timers, day reconstruction, submission/recall, approvals, imports, and reconciliation. Every consequential write requires confirmation.
Typed entry, timer, day, draft/apply, submission, approval, import, and reconciliation operations are implemented with per-field scope authorization.
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 scoperequiredtime:write_selfAPI key scoperequiredtime:submit_selfAPI key scoperequiredtime:read_teamAPI key scoperequiredtime:approve_teamAPI key scoperequiredtime:importAPI key scoperequiredtime:reconcileAPI key scoperequiredExamples
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}'GraphQL examples
time:read_selfFetch 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
}
}
}time:write_selfCreate 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.createdAvailableA canonical time entry was created. Notes, rates, and raw evidence are never included.
Resource: time_entry
time_entry_idwork_dateduration_minutesproject_idstatusoccurred_attime_entry.updatedAvailableGoverned time-entry fields changed.
Resource: time_entry
time_entry_idchanged_fieldsversionoccurred_attime_entry.voidedAvailableA time entry was governedly voided.
Resource: time_entry
time_entry_idprior_statusvoided_attime_submission.submittedAvailableA time submission was submitted.
Resource: time_submission
submission_idperiod_startperiod_endsubmitted_attime_submission.recalledAvailableA time submission was recalled.
Resource: time_submission
submission_idprior_statusrecalled_attime_submission.approvedAvailableA time submission was approved.
Resource: time_submission
submission_idapproval_idapproved_attime_submission.rejectedAvailableA time submission was rejected.
Resource: time_submission
submission_idapproval_idrejected_atAll 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
TimelyGoogle / Microsoft CalendarClaude / ChatGPT / IDE clients