Skip to content

Depot timesheets

Registers the timesheet routes.

This page is generated from the Depot route table. Every operation carries the permission it needs and the anchor an agent can link to.

GETtimesheet:approvemsp facemspIdempotent

Source: [object Object]

listApprovals is the approver’s queue: submitted sheets waiting (all weeks, or one with weekStart), or, with state=unsubmitted, every live operator holding ticket:write whose sheet for weekStart (default last week) is still draft or returned.

NameInTypeRequiredDescription
statequerystringNo
weekStartquerystringNo
StatusBodyDescription
200application/json, TimesheetApprovalsViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsTimesheets require a signed-in operator.
403application/problem+json, ProblemDetailsThe identity does not hold timesheet:approve.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsTimesheets are not available on this server.

200 response body

FieldTypeDescription
itemsrequiredarray of TimesheetApprovalItem
items[].billableMinutesrequiredinteger
items[].leaveMinutesrequiredinteger
items[].staterequiredstring
items[].submittedAtstring (date-time) or null
items[].targetMinutesrequiredinteger
items[].totalMinutesrequiredinteger
items[].userIdrequiredstring
items[].userNamerequiredstring
items[].weekStartrequiredstring
totalClientsrequiredinteger
unavailableClientsrequiredarray of string
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X GET 'https://depot.example.com/api/v1/timesheets/approvals?state=<state>&weekStart=<weekStart>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

GETmsp facemspIdempotent

Source: [object Object]

listCategories lists the time categories, live ones only unless includeArchived is true.

NameInTypeRequiredDescription
includeArchivedquerystringNo
StatusBodyDescription
200application/json, ItemsEnvelopeTimeCategoryViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsTimesheets live in this practice’s own client database, which is not available on this server.

200 response body

FieldTypeDescription
itemsrequiredarray of TimeCategoryView
items[].archivedrequiredboolean
items[].idrequiredstring
items[].kindrequiredstring
items[].namerequiredstring
items[].sortOrderrequiredinteger
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X GET 'https://depot.example.com/api/v1/timesheets/categories?includeArchived=<includeArchived>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

POSTpsa:adminmsp facemsp

Source: [object Object]

createCategory adds a time category.

Required, sent as application/json.

FieldTypeDescription
archivedboolean or null
kindstring or null
namestring or null
sortOrderinteger or null
StatusBodyDescription
201application/json, TimeCategoryViewCreated.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold psa:admin.
404application/problem+json, ProblemDetailsNo resource matches.
409application/problem+json, ProblemDetailsA time category with that name already exists.
500application/problem+json, ProblemDetailsCould not save the time category.
503application/problem+json, ProblemDetailsTimesheets live in this practice’s own client database, which is not available on this server.

201 response body

FieldTypeDescription
archivedrequiredboolean
idrequiredstring
kindrequiredstring
namerequiredstring
sortOrderrequiredinteger
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
curl -X POST 'https://depot.example.com/api/v1/timesheets/categories' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"archived": false,
"kind": "string",
"name": "string",
"sortOrder": 0
}'

PATCH /api/v1/timesheets/categories/{categoryId}

Section titled “PATCH /api/v1/timesheets/categories/{categoryId}”

PATCHpsa:adminmsp facemspIdempotent

Source: [object Object]

patchCategory renames, re-kinds, reorders, archives or restores a category.

NameInTypeRequiredDescription
categoryIdpathstringYesA uuid.

Required, sent as application/json.

FieldTypeDescription
archivedboolean or null
kindstring or null
namestring or null
sortOrderinteger or null
StatusBodyDescription
200application/json, TimeCategoryViewSuccess.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold psa:admin.
404application/problem+json, ProblemDetailsNo resource matches that id.
409application/problem+json, ProblemDetailsA time category with that name already exists.
500application/problem+json, ProblemDetailsCould not save the time category.
503application/problem+json, ProblemDetailsTimesheets live in this practice’s own client database, which is not available on this server.

200 response body

FieldTypeDescription
archivedrequiredboolean
idrequiredstring
kindrequiredstring
namerequiredstring
sortOrderrequiredinteger
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X PATCH 'https://depot.example.com/api/v1/timesheets/categories/<categoryId>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"archived": false,
"kind": "string",
"name": "string",
"sortOrder": 0
}'

POSTmsp facemsp

Source: [object Object]

createEntry logs time against a category (PTO, admin, training and the like) on one local date, for the caller or, as an approver, for someone else.

Required, sent as application/json.

FieldTypeDescription
categoryIdstring or null
datestring or null
minutesinteger or null
notestring or null
userIdstring or null
StatusBodyDescription
201application/json, TimesheetEntryResultCreated.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsTimesheets require a signed-in operator.
403application/problem+json, ProblemDetailsYou can only work on your own timesheet.
404application/problem+json, ProblemDetailsTime category not found.
409application/problem+json, ProblemDetailsLogged time is between one minute and 24 hours.
500application/problem+json, ProblemDetailsThe time could not be saved. Nothing was logged; try again in a moment.
503application/problem+json, ProblemDetailsTimesheets live in this practice’s own client database, which is not available on this server.

201 response body

FieldTypeDescription
billablerequiredboolean
categoryIdrequiredstring
daterequiredstring
idrequiredstring
invoicedrequiredboolean
minutesrequiredinteger
noterequiredstring
startedAtstring (date-time) or null
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
curl -X POST 'https://depot.example.com/api/v1/timesheets/entries' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"categoryId": "string",
"date": "string",
"minutes": 0,
"note": "string",
"userId": "string"
}'

PATCH /api/v1/timesheets/entries/{entryId}

Section titled “PATCH /api/v1/timesheets/entries/{entryId}”

PATCHmsp facemspIdempotent

Source: [object Object]

patchEntry corrects category time.

Moving it to another date checks the lock on both weeks.

NameInTypeRequiredDescription
entryIdpathstringYesA uuid.

Required, sent as application/json.

FieldTypeDescription
categoryIdstring or null
datestring or null
minutesinteger or null
notestring or null
userIdstring or null
StatusBodyDescription
200application/json, TimesheetEntryResultSuccess.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsTimesheets require a signed-in operator.
403application/problem+json, ProblemDetailsYou can only work on your own timesheet.
404application/problem+json, ProblemDetailsNo resource matches that id.
409application/problem+json, ProblemDetailsLogged time is between one minute and 24 hours.
500application/problem+json, ProblemDetailsCould not read the time entry.
503application/problem+json, ProblemDetailsTimesheets live in this practice’s own client database, which is not available on this server.

200 response body

FieldTypeDescription
billablerequiredboolean
categoryIdrequiredstring
daterequiredstring
idrequiredstring
invoicedrequiredboolean
minutesrequiredinteger
noterequiredstring
startedAtstring (date-time) or null
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X PATCH 'https://depot.example.com/api/v1/timesheets/entries/<entryId>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"categoryId": "string",
"date": "string",
"minutes": 0,
"note": "string",
"userId": "string"
}'

DELETE /api/v1/timesheets/entries/{entryId}

Section titled “DELETE /api/v1/timesheets/entries/{entryId}”

DELETEmsp facemspIdempotent

Source: [object Object]

deleteEntry removes category time, unless its week is approved.

NameInTypeRequiredDescription
entryIdpathstringYesA uuid.
StatusBodyDescription
204NoneSuccess, with no body.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsTimesheets require a signed-in operator.
403application/problem+json, ProblemDetailsYou can only work on your own timesheet.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsCould not read the time entry.
503application/problem+json, ProblemDetailsTimesheets live in this practice’s own client database, which is not available on this server.
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X DELETE 'https://depot.example.com/api/v1/timesheets/entries/<entryId>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

GETpsa:adminmsp facemspIdempotent

Source: [object Object]

listTargets lists every live operator’s expected minutes per weekday.

StatusBodyDescription
200application/json, ItemsEnvelopeDailyTargetViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold psa:admin.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsTimesheets live in this practice’s own client database, which is not available on this server.

200 response body

FieldTypeDescription
itemsrequiredarray of DailyTargetView
items[].dailyTargetMinutesrequiredinteger
items[].userIdrequiredstring
items[].userNamerequiredstring
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X GET 'https://depot.example.com/api/v1/timesheets/targets' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

PUTpsa:adminmsp facemspIdempotent

Source: [object Object]

putTarget sets one operator’s expected minutes per weekday, Monday to Friday.

Required, sent as application/json.

FieldTypeDescription
dailyTargetMinutesinteger or null
userIdrequiredstring
StatusBodyDescription
200application/json, DailyTargetViewSuccess.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold psa:admin.
404application/problem+json, ProblemDetailsOperator not found.
409application/problem+json, ProblemDetailsA daily target is 0 to 1440 minutes.
500application/problem+json, ProblemDetailsCould not save the daily target.
503application/problem+json, ProblemDetailsTimesheets live in this practice’s own client database, which is not available on this server.

200 response body

FieldTypeDescription
dailyTargetMinutesrequiredinteger
userIdrequiredstring
userNamerequiredstring
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X PUT 'https://depot.example.com/api/v1/timesheets/targets' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"dailyTargetMinutes": 0,
"userId": "string"
}'

GETmsp facemspIdempotent

Source: [object Object]

getTimer answers the caller’s running timer, or null.

StatusBodyDescription
200application/json, TechTimerEnvelopeSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsTimesheets require a signed-in operator.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsTimesheets live in this practice’s own client database, which is not available on this server.

200 response body

FieldTypeDescription
timerTechTimerView
timer.categoryIdstring or null
timer.clientIdstring or null
timer.kindrequiredstring
timer.labelrequiredstring
timer.noterequiredstring
timer.startedAtrequiredstring (date-time)
timer.taskIdstring or null
timer.ticketIdstring or null
timer.warningstring or null
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X GET 'https://depot.example.com/api/v1/timesheets/timer' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

PUTticket:writemsp facemspIdempotent

Source: [object Object]

startTimer starts the caller’s one timer on a ticket, a task or a category.

The server sets the label and the start; a second start answers 409 timer_running with the timer that is already going.

Required, sent as application/json.

FieldTypeDescription
categoryIdrequiredstring
clientIdrequiredstring
kindrequiredstring
noterequiredstring
taskIdrequiredstring
ticketIdrequiredstring
StatusBodyDescription
200application/json, TechTimerEnvelopeSuccess.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsTimesheets require a signed-in operator.
403application/problem+json, ProblemDetailsThe identity does not hold ticket:write.
404application/problem+json, ProblemDetailsClient not found.
500application/problem+json, ProblemDetailsCould not read the ticket.
503application/problem+json, ProblemDetailsTimesheets live in this practice’s own client database, which is not available on this server.

200 response body

FieldTypeDescription
timerTechTimerView
timer.categoryIdstring or null
timer.clientIdstring or null
timer.kindrequiredstring
timer.labelrequiredstring
timer.noterequiredstring
timer.startedAtrequiredstring (date-time)
timer.taskIdstring or null
timer.ticketIdstring or null
timer.warningstring or null
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X PUT 'https://depot.example.com/api/v1/timesheets/timer' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"categoryId": "string",
"clientId": "string",
"kind": "string",
"note": "string",
"taskId": "string",
"ticketId": "string"
}'

DELETEticket:writemsp facemspIdempotent

Source: [object Object]

discardTimer removes the caller’s timer without logging anything.

StatusBodyDescription
200application/json, TechTimerEnvelopeSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsTimesheets require a signed-in operator.
403application/problem+json, ProblemDetailsThe identity does not hold ticket:write.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsTimesheets live in this practice’s own client database, which is not available on this server.

200 response body

FieldTypeDescription
timerTechTimerView
timer.categoryIdstring or null
timer.clientIdstring or null
timer.kindrequiredstring
timer.labelrequiredstring
timer.noterequiredstring
timer.startedAtrequiredstring (date-time)
timer.taskIdstring or null
timer.ticketIdstring or null
timer.warningstring or null
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X DELETE 'https://depot.example.com/api/v1/timesheets/timer' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

POSTticket:writemsp facemspIdempotent

Source: [object Object]

stopTimer logs the running timer as time on its subject, through the same write the ticket, task and category routes use, and only then removes it.

Minutes default to the elapsed time, rounded, at least one.

Required, sent as application/json.

FieldTypeDescription
billableboolean or null
minutesinteger or null
notestring or null
StatusBodyDescription
200application/json, TechTimerEnvelopeSuccess.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsTimesheets require a signed-in operator.
403application/problem+json, ProblemDetailsThe identity does not hold ticket:write.
404application/problem+json, ProblemDetailsNo timer is running.
409application/problem+json, ProblemDetailsLogged time is between one minute and 24 hours.
500application/problem+json, ProblemDetailsCould not read the ticket.
503application/problem+json, ProblemDetailsTimesheets live in this practice’s own client database, which is not available on this server.

200 response body

FieldTypeDescription
timerTechTimerView
timer.categoryIdstring or null
timer.clientIdstring or null
timer.kindrequiredstring
timer.labelrequiredstring
timer.noterequiredstring
timer.startedAtrequiredstring (date-time)
timer.taskIdstring or null
timer.ticketIdstring or null
timer.warningstring or null
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X POST 'https://depot.example.com/api/v1/timesheets/timer/stop' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"billable": false,
"minutes": 0,
"note": "string"
}'

GETmsp facemspIdempotent

Source: [object Object]

getWeek is one technician’s week across every client: ticket, task and category time by day, the sheet’s state and the week’s totals.

NameInTypeRequiredDescription
userIdquerystringNo
weekStartquerystringNo
StatusBodyDescription
200application/json, TimesheetWeekViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsTimesheets require a signed-in operator.
403application/problem+json, ProblemDetailsYou can only work on your own timesheet.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsTimesheets are not available on this server.

200 response body

FieldTypeDescription
daysrequiredarray of TimesheetDayView
days[].daterequiredstring
days[].leaveMinutesrequiredinteger
days[].targetMinutesrequiredinteger
days[].timeOffstring or null
days[].totalMinutesrequiredinteger
days[].workMinutesrequiredinteger
returnNoterequiredstring
reviewedAtstring (date-time) or null
reviewedByNamestring or null
rowsrequiredarray of TimesheetRowView
rows[].billableMinutesrequiredinteger
rows[].categoryIdstring or null
rows[].categoryKindstring or null
rows[].clientIdstring or null
rows[].clientNamestring or null
rows[].entriesrequiredarray of TimesheetEntryView
rows[].entries[].billablerequiredboolean
rows[].entries[].daterequiredstring
rows[].entries[].idrequiredstring
rows[].entries[].invoicedrequiredboolean
rows[].entries[].minutesrequiredinteger
rows[].entries[].noterequiredstring
rows[].entries[].startedAtstring (date-time) or null
rows[].keyrequiredstring
rows[].kindrequiredstring
rows[].labelrequiredstring
rows[].minutesByDayrequiredarray of integer
rows[].projectIdstring or null
rows[].taskIdstring or null
rows[].ticketIdstring or null
rows[].totalMinutesrequiredinteger
staterequiredstring
submittedAtstring (date-time) or null
timeZonerequiredstring
totalClientsrequiredinteger
totalsrequiredTimesheetTotalsView
totals.billableMinutesrequiredinteger
totals.leaveMinutesrequiredinteger
totals.targetMinutesrequiredinteger
totals.totalMinutesrequiredinteger
unavailableClientsrequiredarray of string
userIdrequiredstring
userNamerequiredstring
userStartedOnrequiredstring
weekStartrequiredstring
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X GET 'https://depot.example.com/api/v1/timesheets/week?userId=<userId>&weekStart=<weekStart>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

POSTtimesheet:approvemsp facemsp

Source: [object Object]

approveWeeks approves submitted weeks, each on its own.

An item whose live total is not the totalMinutes the approver saw fails with timesheet_changed, so nobody signs off on hours they did not look at.

Required, sent as application/json.

FieldTypeDescription
itemsrequiredarray of TimesheetWeekRequest
items[].reasonrequiredstring
items[].totalMinutesinteger or null
items[].userIdrequiredstring
items[].weekStartrequiredstring
noterequiredstring
StatusBodyDescription
200application/json, TimesheetBulkResponseSuccess.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsTimesheets require a signed-in operator.
403application/problem+json, ProblemDetailsThe identity does not hold timesheet:approve.
503application/problem+json, ProblemDetailsTimesheets are not available on this server.

200 response body

FieldTypeDescription
resultsrequiredarray of TimesheetBulkResult
results[].errorstring
results[].okrequiredboolean
results[].userIdrequiredstring
results[].weekStartrequiredstring
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
curl -X POST 'https://depot.example.com/api/v1/timesheets/week/approve' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"items": [
{
"reason": "string",
"totalMinutes": 0,
"userId": "string",
"weekStart": "string"
}
],
"note": "string"
}'

POSTticket:writemsp facemsp

Source: [object Object]

recallWeek takes the caller’s submitted week back to draft.

Required, sent as application/json.

FieldTypeDescription
reasonrequiredstring
totalMinutesinteger or null
userIdrequiredstring
weekStartrequiredstring
StatusBodyDescription
200application/json, TimesheetWeekViewSuccess.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsTimesheets require a signed-in operator.
403application/problem+json, ProblemDetailsThe identity does not hold ticket:write.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsTimesheets are not available on this server.

200 response body

FieldTypeDescription
daysrequiredarray of TimesheetDayView
days[].daterequiredstring
days[].leaveMinutesrequiredinteger
days[].targetMinutesrequiredinteger
days[].timeOffstring or null
days[].totalMinutesrequiredinteger
days[].workMinutesrequiredinteger
returnNoterequiredstring
reviewedAtstring (date-time) or null
reviewedByNamestring or null
rowsrequiredarray of TimesheetRowView
rows[].billableMinutesrequiredinteger
rows[].categoryIdstring or null
rows[].categoryKindstring or null
rows[].clientIdstring or null
rows[].clientNamestring or null
rows[].entriesrequiredarray of TimesheetEntryView
rows[].entries[].billablerequiredboolean
rows[].entries[].daterequiredstring
rows[].entries[].idrequiredstring
rows[].entries[].invoicedrequiredboolean
rows[].entries[].minutesrequiredinteger
rows[].entries[].noterequiredstring
rows[].entries[].startedAtstring (date-time) or null
rows[].keyrequiredstring
rows[].kindrequiredstring
rows[].labelrequiredstring
rows[].minutesByDayrequiredarray of integer
rows[].projectIdstring or null
rows[].taskIdstring or null
rows[].ticketIdstring or null
rows[].totalMinutesrequiredinteger
staterequiredstring
submittedAtstring (date-time) or null
timeZonerequiredstring
totalClientsrequiredinteger
totalsrequiredTimesheetTotalsView
totals.billableMinutesrequiredinteger
totals.leaveMinutesrequiredinteger
totals.targetMinutesrequiredinteger
totals.totalMinutesrequiredinteger
unavailableClientsrequiredarray of string
userIdrequiredstring
userNamerequiredstring
userStartedOnrequiredstring
weekStartrequiredstring
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
curl -X POST 'https://depot.example.com/api/v1/timesheets/week/recall' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"reason": "string",
"totalMinutes": 0,
"userId": "string",
"weekStart": "string"
}'

POSTtimesheet:approvemsp facemsp

Source: [object Object]

reopenWeek takes an approved week back to returned, with the reason, which unlocks its time.

Required, sent as application/json.

FieldTypeDescription
reasonrequiredstring
totalMinutesinteger or null
userIdrequiredstring
weekStartrequiredstring
StatusBodyDescription
200application/json, TimesheetWeekViewSuccess.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsTimesheets require a signed-in operator.
403application/problem+json, ProblemDetailsThe identity does not hold timesheet:approve.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsTimesheets are not available on this server.

200 response body

FieldTypeDescription
daysrequiredarray of TimesheetDayView
days[].daterequiredstring
days[].leaveMinutesrequiredinteger
days[].targetMinutesrequiredinteger
days[].timeOffstring or null
days[].totalMinutesrequiredinteger
days[].workMinutesrequiredinteger
returnNoterequiredstring
reviewedAtstring (date-time) or null
reviewedByNamestring or null
rowsrequiredarray of TimesheetRowView
rows[].billableMinutesrequiredinteger
rows[].categoryIdstring or null
rows[].categoryKindstring or null
rows[].clientIdstring or null
rows[].clientNamestring or null
rows[].entriesrequiredarray of TimesheetEntryView
rows[].entries[].billablerequiredboolean
rows[].entries[].daterequiredstring
rows[].entries[].idrequiredstring
rows[].entries[].invoicedrequiredboolean
rows[].entries[].minutesrequiredinteger
rows[].entries[].noterequiredstring
rows[].entries[].startedAtstring (date-time) or null
rows[].keyrequiredstring
rows[].kindrequiredstring
rows[].labelrequiredstring
rows[].minutesByDayrequiredarray of integer
rows[].projectIdstring or null
rows[].taskIdstring or null
rows[].ticketIdstring or null
rows[].totalMinutesrequiredinteger
staterequiredstring
submittedAtstring (date-time) or null
timeZonerequiredstring
totalClientsrequiredinteger
totalsrequiredTimesheetTotalsView
totals.billableMinutesrequiredinteger
totals.leaveMinutesrequiredinteger
totals.targetMinutesrequiredinteger
totals.totalMinutesrequiredinteger
unavailableClientsrequiredarray of string
userIdrequiredstring
userNamerequiredstring
userStartedOnrequiredstring
weekStartrequiredstring
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
curl -X POST 'https://depot.example.com/api/v1/timesheets/week/reopen' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"reason": "string",
"totalMinutes": 0,
"userId": "string",
"weekStart": "string"
}'

POSTtimesheet:approvemsp facemsp

Source: [object Object]

returnWeeks sends submitted weeks back to their technicians with a note, each on its own.

Required, sent as application/json.

FieldTypeDescription
itemsrequiredarray of TimesheetWeekRequest
items[].reasonrequiredstring
items[].totalMinutesinteger or null
items[].userIdrequiredstring
items[].weekStartrequiredstring
noterequiredstring
StatusBodyDescription
200application/json, TimesheetBulkResponseSuccess.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsTimesheets require a signed-in operator.
403application/problem+json, ProblemDetailsThe identity does not hold timesheet:approve.
503application/problem+json, ProblemDetailsTimesheets are not available on this server.

200 response body

FieldTypeDescription
resultsrequiredarray of TimesheetBulkResult
results[].errorstring
results[].okrequiredboolean
results[].userIdrequiredstring
results[].weekStartrequiredstring
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
curl -X POST 'https://depot.example.com/api/v1/timesheets/week/return' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"items": [
{
"reason": "string",
"totalMinutes": 0,
"userId": "string",
"weekStart": "string"
}
],
"note": "string"
}'

POSTticket:writemsp facemsp

Source: [object Object]

submitWeek sends the caller’s week for approval (draft or returned to submitted).

A week that has not started cannot be submitted.

Required, sent as application/json.

FieldTypeDescription
reasonrequiredstring
totalMinutesinteger or null
userIdrequiredstring
weekStartrequiredstring
StatusBodyDescription
200application/json, TimesheetWeekViewSuccess.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsTimesheets require a signed-in operator.
403application/problem+json, ProblemDetailsThe identity does not hold ticket:write.
500application/problem+json, ProblemDetailsThe request failed.
503application/problem+json, ProblemDetailsTimesheets are not available on this server.

200 response body

FieldTypeDescription
daysrequiredarray of TimesheetDayView
days[].daterequiredstring
days[].leaveMinutesrequiredinteger
days[].targetMinutesrequiredinteger
days[].timeOffstring or null
days[].totalMinutesrequiredinteger
days[].workMinutesrequiredinteger
returnNoterequiredstring
reviewedAtstring (date-time) or null
reviewedByNamestring or null
rowsrequiredarray of TimesheetRowView
rows[].billableMinutesrequiredinteger
rows[].categoryIdstring or null
rows[].categoryKindstring or null
rows[].clientIdstring or null
rows[].clientNamestring or null
rows[].entriesrequiredarray of TimesheetEntryView
rows[].entries[].billablerequiredboolean
rows[].entries[].daterequiredstring
rows[].entries[].idrequiredstring
rows[].entries[].invoicedrequiredboolean
rows[].entries[].minutesrequiredinteger
rows[].entries[].noterequiredstring
rows[].entries[].startedAtstring (date-time) or null
rows[].keyrequiredstring
rows[].kindrequiredstring
rows[].labelrequiredstring
rows[].minutesByDayrequiredarray of integer
rows[].projectIdstring or null
rows[].taskIdstring or null
rows[].ticketIdstring or null
rows[].totalMinutesrequiredinteger
staterequiredstring
submittedAtstring (date-time) or null
timeZonerequiredstring
totalClientsrequiredinteger
totalsrequiredTimesheetTotalsView
totals.billableMinutesrequiredinteger
totals.leaveMinutesrequiredinteger
totals.targetMinutesrequiredinteger
totals.totalMinutesrequiredinteger
unavailableClientsrequiredarray of string
userIdrequiredstring
userNamerequiredstring
userStartedOnrequiredstring
weekStartrequiredstring
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
curl -X POST 'https://depot.example.com/api/v1/timesheets/week/submit' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"reason": "string",
"totalMinutes": 0,
"userId": "string",
"weekStart": "string"
}'

Content is licensed CC BY 4.0. Code samples are MIT. Outpost and the Outpost mark are trademarks of Outpost Business Solutions, PBC and are not covered by either license.