For AI agents: markdown of this page — /docs-content-en/workday/close.md documentation index — /llms.txt
Close workday
POST /v1/workday/close
Finishes the current workday and records its duration. The call accepts a report for the day and a finish point.
Request fields (body)
All parameters are optional. The body may be empty: {}.
| Field | Type | Req. | Description |
|---|---|---|---|
userId |
number | no | Employee identifier. Defaults to the user who owns the key's tokens. Another employee's userId is available only to Bitrix24 account administrators and the employee's direct managers. Without those rights Bitrix24 does not return the employee's data |
time |
string | no | Finish date and time in ISO 8601 format (for example 2026-05-05T18:00:00+02:00). The date must match the day's start date — the timeStart value from GET /v1/workday/status. When this field is set, report becomes required |
report |
string | no | Final report for the day. Required when time is set and for employees on a fixed work schedule |
lat |
number | no | Geographic latitude of the finish point |
lon |
number | no | Geographic longitude of the finish point |
Examples
curl — personal key
curl -X POST https://vibecode.bitrix24.com/v1/workday/close \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "report": "Closed 5 deals, processed 12 leads" }'
curl — OAuth application
curl -X POST https://vibecode.bitrix24.com/v1/workday/close \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "report": "Closed 5 deals, processed 12 leads" }'
JavaScript — personal key
const res = await fetch('https://vibecode.bitrix24.com/v1/workday/close', {
method: 'POST',
headers: {
'X-Api-Key': 'YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
report: 'Closed 5 deals, processed 12 leads',
}),
})
const { data } = await res.json()
console.log('Day duration:', data.duration)
console.log('Breaks:', data.timeLeaks)
JavaScript — OAuth application
const res = await fetch('https://vibecode.bitrix24.com/v1/workday/close', {
method: 'POST',
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
'Content-Type': 'application/json',
},
body: JSON.stringify({
report: 'Closed 5 deals, processed 12 leads',
}),
})
const { data } = await res.json()
Response fields
| Field | Type | Description |
|---|---|---|
success |
boolean | true on a successful close |
data.status |
string | Status after closing — CLOSED |
data.id |
number | Workday record identifier. The same values appear in the workday history |
data.timeStart |
string | Day start date and time (ISO 8601) |
data.timeFinish |
string | Day finish date and time (ISO 8601) |
data.duration |
string | Day duration in HH:MM:SS format, excluding pauses |
data.timeLeaks |
string | Total duration of pauses for the day in HH:MM:SS format |
data.active |
boolean | Whether the workday record is active |
data.ipOpen |
string | IP address of the day start |
data.ipClose |
string | IP address of the day finish |
data.latOpen |
number | Geographic latitude of the start point. 0 — coordinates were not passed |
data.lonOpen |
number | Geographic longitude of the start point |
data.latClose |
number | Geographic latitude of the finish point |
data.lonClose |
number | Geographic longitude of the finish point |
data.tzOffset |
number | Employee's time zone offset in seconds. Depends on the employee's settings in the Bitrix24 account. The value 7200 corresponds to UTC+2 |
Response example
{
"success": true,
"data": {
"status": "CLOSED",
"id": 1,
"timeStart": "2026-05-05T09:00:00+02:00",
"timeFinish": "2026-05-05T18:00:00+02:00",
"duration": "08:30:00",
"timeLeaks": "00:30:00",
"active": true,
"ipOpen": "203.0.113.10",
"ipClose": "203.0.113.10",
"latOpen": 0,
"lonOpen": 0,
"latClose": 0,
"lonClose": 0,
"tzOffset": 7200
}
}
Error response example
422 — an attempt to close an already closed day:
{
"success": false,
"error": {
"code": "BITRIX_ERROR",
"message": "Cannot perform this action"
}
}
Errors
| HTTP | Code | Description |
|---|---|---|
| 400 | INVALID_PARAMS |
The userId field is not a positive integer, or Bitrix24 rejected a request field as invalid |
| 401 | MISSING_API_KEY |
The X-Api-Key header was not passed |
| 401 | INVALID_API_KEY |
Invalid API key |
| 401 | KEY_EXPIRED |
The API key has expired |
| 401 | TOKEN_MISSING |
The key has no OAuth tokens configured for the portal |
| 402 | ACCOUNT_FROZEN |
The portal balance is frozen |
| 403 | SCOPE_DENIED |
The key lacks the timeman scope |
| 422 | BITRIX_ERROR |
Bitrix24 rejected the request — the text is in message. Possible causes: the day is already closed, the time date does not match the day's start date, report is missing when time is set |
| 429 | RATE_LIMITED |
The rate limit for requests to Bitrix24 was exceeded |
| 502 | BITRIX_UNAVAILABLE |
The Bitrix24 portal is unavailable |
The full list of common API errors — Errors.
Known specifics
- Closing while paused. If the day is in the
PAUSEDstatus, the call closes the day, recordingtimeFinishat the moment of closing. The duration of pauses is included intimeLeaks. - The sum of
durationandtimeLeaksequals the difference betweentimeFinishandtimeStart— that is, the total time since the day was opened is split into worked time and breaks with no time unaccounted for.