Skip to main content

Time registration

Preview
This feature is in preview. It is being refined with early feedback, so its screens and behavior may change between releases, and it may need to be switched on for your organization before it appears. See experimental features for how preview works in Dime.Scheduler.

Time registration has two entities, and the difference between them is the whole design.

A time sessionTime sessionAn observation that a resource was working, travelling or waiting on a task between two moments. Sessions support a time entry and never reach the back office on their own. is an observation: a resourceResourceAn entity that can carry out work - a person, vehicle, tool, or room - that you schedule on the planning board. worked, travelled or waited on a taskTaskA unit of work that belongs to a job. It appears in the open task list until it is scheduled to a resource. between two moments. Sessions are the capture side. They are what a timer produces, they can be corrected, and they never reach the back office on their own.

A time entryTime entryA claim of a resource's time on one task for one calendar day. This is the record that is submitted to the back office, where it becomes a time sheet line. is a claim: the hours a resource claims on a task for one day. Entries are the costing side, and an entry is what becomes a time sheetTime sheet (Business Central)The Business Central record that registers hours per employee. Dime.Scheduler can fill it from the plan (planned time) or from released time entries (time registration); running both for the same work registers the hours twice. line in the back officeBack officeThe ERP or business system Dime.Scheduler plans for - most often Microsoft Dynamics 365 Business Central. It owns the master data and remains authoritative over what it receives..

Folding finished sessions into an entry is called claimingClaimThe act of turning finished work sessions into a time entry for one task and one day. A claim can also be made directly without a session; only work sessions count, travel and waiting do not.: one resource, one task, one day, several sessions, one entry.

info

If your integration only needs to read or write claimed hours, you only need time entries. Sessions matter when you want to capture raw start and stop events and let Dime.Scheduler assemble them.

Time entry​

Upsert​

Creates or updates a time entry.

NameData TypeDefaultRequired
SourceAppnvarchar(30)✔️
SourceTypenvarchar(10)✔️
TimeEntryIdbigint
BackofficeIDnvarchar(100)
ResourceNonvarchar(50)✔️
JobNonvarchar(50)✔️
TaskNonvarchar(50)✔️
Datedate✔️
DurationInSecondsbigint✔️
Descriptionnvarchar(max)
IsBillablebit
Statusint0
Messagenvarchar(500)

The columns marked as required are required when creating an entry. On an update, send only what changes: omitted values keep what is stored.

Identify an existing entry with either TimeEntryId (the identifier Dime.Scheduler assigned) or BackofficeID (your own reference). Sending neither creates a new entry.

DurationInSeconds is the claimed time. The entries of one resource on one date cannot add up to more than 24 hours, and a request that would cross that is rejected with APP014.

Status​

Status tracks where the claim is in its journey to the back office. The names in the second column are the API values; the third column is what the timesheets page shows for the same state.

ValueStatusShown asMeaning
0DraftDraftEditable, not yet released to the back office.
1SubmittingSubmittingReleased, awaiting the back office acknowledgement.
2AcceptedIn back officeAccepted by the back office as a time sheet line, awaiting submission for approval there.
3FailedNot sentRefused at intake. No line exists, and the reason travels in Message.
4ApprovedApprovedApproved in the back office.
5RejectedRejectedRefused at approval. The line exists, and the reason travels in Message.

Not every transition is legal, because the status is a handshake rather than a free-form field. These are the moves the import accepts; anything else is rejected with APP013.

FromTo
0 Draft1 Submitting
1 Submitting2 Accepted or 3 Failed
2 Accepted4 Approved, 5 Rejected, or 0 Draft to reopen
3 Failed0 Draft or 1 Submitting
4 Approved2 Accepted, to withdraw an approval
5 Rejected0 Draft or 1 Submitting

This is the field a connectorConnectorAn integration that links Dime.Scheduler to a back-office system, routing data in and scheduling decisions back out. writes back, in two rounds. At intake, acknowledge a claim by moving it to 2, or refuse it by moving it to 3 with the reason in Message. Later, when somebody in the back office decides on the line, report that outcome by moving the entry to 4 or 5, again with a Message on a rejection; the planner sees it on the entry either way. A status change carries its own message, so a change without one clears the previous reason.

  • This endpoint is available in the import API endpoint /import via the procedure mboc_upsertTimeEntry.
  • Example body:
    [
    {
    "StoredProcedureName": "mboc_upsertTimeEntry",
    "ParameterNames": ["SourceApp", "SourceType", "ResourceNo", "JobNo", "TaskNo", "Date", "DurationInSeconds", "IsBillable"],
    "ParameterValues": ["BC1", "JOB", "ENG01", "JOB001", "1000", "2026-03-16", "14400", "1"]
    }
    ]

Delete​

NameData TypeDefaultRequired
SourceAppnvarchar(30)✔️
SourceTypenvarchar(10)✔️
TimeEntryIdbigint
BackofficeIDnvarchar(100)

Pass either TimeEntryId or BackofficeID. Any sessions that were claimed into the entry are released first, so they become available to claim again rather than disappearing with it.

  • This endpoint is available in the import API endpoint /import via the procedure mboc_deleteTimeEntry.
  • Example body:
    [
    {
    "StoredProcedureName": "mboc_deleteTimeEntry",
    "ParameterNames": ["SourceApp", "SourceType", "BackofficeID"],
    "ParameterValues": ["BC1", "JOB", "TS-000512"]
    }
    ]

Time session​

Upsert​

Creates or updates a time session.

NameData TypeDefaultRequired
SourceAppnvarchar(30)✔️
SourceTypenvarchar(10)✔️
TimeSessionIdbigint
ExternalIdnvarchar(100)
ResourceNonvarchar(50)✔️
JobNonvarchar(50)✔️
TaskNonvarchar(50)✔️
StartedAtdatetime2✔️
StoppedAtdatetime2
Typeint0
Notenvarchar(250)

As with entries, the required columns apply to creating a session. Identify an existing one with TimeSessionId or with ExternalId, which is your own key and the one to use when the sending system needs its requests to be safe to repeat.

Leave StoppedAt empty for a session that is still running. A resource can only have one running session at a time, so starting a second one stops the first. An update never clears a stop that is already recorded, which keeps a finished session from being silently reopened.

Sessions that cross midnight are split at the day boundary, because a claim belongs to a single date.

Type​

ValueTypeMeaning
0WorkTime spent working on the task.
1TravelTime spent travelling for the task.
2WaitingTime spent waiting on the task.

Only Work sessions are folded into a claim. Travel and waiting time is captured and reportable, but it does not become claimed hours by itself.

Once a session has been claimed into an entry it is locked against changes from the import, and an attempt to change it is rejected with APP015.

  • This endpoint is available in the import API endpoint /import via the procedure mboc_upsertTimeSession.
  • Example body:
    [
    {
    "StoredProcedureName": "mboc_upsertTimeSession",
    "ParameterNames": ["SourceApp", "SourceType", "ExternalId", "ResourceNo", "JobNo", "TaskNo", "StartedAt", "StoppedAt", "Type"],
    "ParameterValues": ["BC1", "JOB", "sess-88213", "ENG01", "JOB001", "1000", "2026-03-16T08:05:00", "2026-03-16T12:00:00", "0"]
    }
    ]

Delete​

NameData TypeDefaultRequired
SourceAppnvarchar(30)✔️
SourceTypenvarchar(10)✔️
TimeSessionIdbigint
ExternalIdnvarchar(100)
  • This endpoint is available in the import API endpoint /import via the procedure mboc_deleteTimeSession.
  • Example body:
    [
    {
    "StoredProcedureName": "mboc_deleteTimeSession",
    "ParameterNames": ["SourceApp", "SourceType", "ExternalId"],
    "ParameterValues": ["BC1", "JOB", "sess-88213"]
    }
    ]

Read​

GET /timeEntry?start&end returns every resource's time entries in the window from start (inclusive) to end (exclusive), and GET /timeSession?start&end returns the sessions that started in that window. Both windows are capped at a quarter. There is no import procedure for reading. See the REST API reference.

Reading time with AI​

Registered time is also exposed to AI clients through the MCP serverMCP serverThe Model Context Protocol endpoint that exposes scheduling operations as tools to AI assistants. It is authenticated with API keys and translates tool calls into Dime.Scheduler API calls.. See time registration tools.