Time registration
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.
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.
| Name | Data Type | Default | Required |
|---|---|---|---|
| SourceApp | nvarchar(30) | ✔️ | |
| SourceType | nvarchar(10) | ✔️ | |
| TimeEntryId | bigint | ||
| BackofficeID | nvarchar(100) | ||
| ResourceNo | nvarchar(50) | ✔️ | |
| JobNo | nvarchar(50) | ✔️ | |
| TaskNo | nvarchar(50) | ✔️ | |
| Date | date | ✔️ | |
| DurationInSeconds | bigint | ✔️ | |
| Description | nvarchar(max) | ||
| IsBillable | bit | ||
| Status | int | 0 | |
| Message | nvarchar(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.
| Value | Status | Shown as | Meaning |
|---|---|---|---|
0 | Draft | Draft | Editable, not yet released to the back office. |
1 | Submitting | Submitting | Released, awaiting the back office acknowledgement. |
2 | Accepted | In back office | Accepted by the back office as a time sheet line, awaiting submission for approval there. |
3 | Failed | Not sent | Refused at intake. No line exists, and the reason travels in Message. |
4 | Approved | Approved | Approved in the back office. |
5 | Rejected | Rejected | Refused 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.
| From | To |
|---|---|
0 Draft | 1 Submitting |
1 Submitting | 2 Accepted or 3 Failed |
2 Accepted | 4 Approved, 5 Rejected, or 0 Draft to reopen |
3 Failed | 0 Draft or 1 Submitting |
4 Approved | 2 Accepted, to withdraw an approval |
5 Rejected | 0 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.
- Import
- API
- This endpoint is available in the import API endpoint
/importvia the proceduremboc_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"]}]
See POST /timeEntry, PUT /timeEntry in the REST API reference.
Delete
| Name | Data Type | Default | Required |
|---|---|---|---|
| SourceApp | nvarchar(30) | ✔️ | |
| SourceType | nvarchar(10) | ✔️ | |
| TimeEntryId | bigint | ||
| BackofficeID | nvarchar(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.
- Import
- API
- This endpoint is available in the import API endpoint
/importvia the proceduremboc_deleteTimeEntry. - Example body:
[{"StoredProcedureName": "mboc_deleteTimeEntry","ParameterNames": ["SourceApp", "SourceType", "BackofficeID"],"ParameterValues": ["BC1", "JOB", "TS-000512"]}]
See DELETE /timeEntry in the REST API reference.
Time session
Upsert
Creates or updates a time session.
| Name | Data Type | Default | Required |
|---|---|---|---|
| SourceApp | nvarchar(30) | ✔️ | |
| SourceType | nvarchar(10) | ✔️ | |
| TimeSessionId | bigint | ||
| ExternalId | nvarchar(100) | ||
| ResourceNo | nvarchar(50) | ✔️ | |
| JobNo | nvarchar(50) | ✔️ | |
| TaskNo | nvarchar(50) | ✔️ | |
| StartedAt | datetime2 | ✔️ | |
| StoppedAt | datetime2 | ||
| Type | int | 0 | |
| Note | nvarchar(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
| Value | Type | Meaning |
|---|---|---|
0 | Work | Time spent working on the task. |
1 | Travel | Time spent travelling for the task. |
2 | Waiting | Time 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.
- Import
- API
- This endpoint is available in the import API endpoint
/importvia the proceduremboc_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"]}]
See POST /timeSession, PUT /timeSession in the REST API reference.
Delete
| Name | Data Type | Default | Required |
|---|---|---|---|
| SourceApp | nvarchar(30) | ✔️ | |
| SourceType | nvarchar(10) | ✔️ | |
| TimeSessionId | bigint | ||
| ExternalId | nvarchar(100) |
- Import
- API
- This endpoint is available in the import API endpoint
/importvia the proceduremboc_deleteTimeSession. - Example body:
[{"StoredProcedureName": "mboc_deleteTimeSession","ParameterNames": ["SourceApp", "SourceType", "ExternalId"],"ParameterValues": ["BC1", "JOB", "sess-88213"]}]
See DELETE /timeSession in the REST API reference.
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.