Resubmit rejected time registrations
Sends registrations that a manager rejected back for approval after the employee fixed them.
The second half of the rejection loop: a manager rejects (day status Rejected, registrations re-opened), the employee corrects the registrations, and this call submits them again. They are marked 'rejected and resubmitted' (employee-manager or project-manager variant), which the day status reports as HasResubmittedRejectedRegistration = true. Validation, partial success and errors are exactly those of submit-time-registrations; the call does NOT check that the registrations were actually rejected.
Use it to:
- After get-status-by-dates?$expand=RejectedRegistrations shows rejected items and the integration has corrected them, resubmit those IDs.
Not for:
- First-time submission — use
POST /v1/approval/timesheets/submit-time-registrations.
Behaviour:
- Not idempotent.
- Safe to retry only under a condition. As submit-time-registrations: partly failed calls have already resubmitted the valid registrations.
- Side effect: Valid registrations: status Closed; approval status 'rejected and resubmitted' on their approval context items.
- On failure: Valid registrations are resubmitted even when the call returns 500 Code 102 for others.
- Changes are visible to the next read immediately.
- Batch: partial
Call first: GET /v1/approval/timesheets/get-status-by-dates, PUT /v1/time-registration
Next: GET /v1/approval/timesheets/get-status-by-dates
See also: POST /v1/approval/timesheets/submit-time-registrations
Not yet documented: behaviour → side effects; examples (success).
curl -X POST "https://app3.timelog.com/your-account/api/v1/approval/timesheets/resubmit-rejected-time-registrations" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-d '{
"EmployeeUserID": 123,
"TimeRegistrationIds": [
"null"
]
}'
import requests
import json
url = "https://app3.timelog.com/your-account/api/v1/approval/timesheets/resubmit-rejected-time-registrations"
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN"
}
data = {
"EmployeeUserID": 123,
"TimeRegistrationIds": [
"null"
]
}
response = requests.post(url, headers=headers, json=data)
print(response.json())
const response = await fetch("https://app3.timelog.com/your-account/api/v1/approval/timesheets/resubmit-rejected-time-registrations", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN"
},
body: JSON.stringify({
"EmployeeUserID": 123,
"TimeRegistrationIds": [
"null"
]
})
});
const data = await response.json();
console.log(data);
package main
import (
"fmt"
"net/http"
"bytes"
"encoding/json"
)
func main() {
data := []byte(`{
"EmployeeUserID": 123,
"TimeRegistrationIds": [
"null"
]
}`)
req, err := http.NewRequest("POST", "https://app3.timelog.com/your-account/api/v1/approval/timesheets/resubmit-rejected-time-registrations", bytes.NewBuffer(data))
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer YOUR_API_TOKEN")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
fmt.Println("Response Status:", resp.Status)
}
require 'net/http'
require 'json'
uri = URI('https://app3.timelog.com/your-account/api/v1/approval/timesheets/resubmit-rejected-time-registrations')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Post.new(uri)
request['Content-Type'] = 'application/json'
request['Authorization'] = 'Bearer YOUR_API_TOKEN'
request.body = '{
"EmployeeUserID": 123,
"TimeRegistrationIds": [
"null"
]
}'
response = http.request(request)
puts response.body
"null"
{
"Code": 200,
"Details": [
"'Employee User ID' must be greater than '0'."
],
"Message": "Invalid model state error.",
"Parameters": "model: {"TimeRegistrationIds":null,"EmployeeUserID":0}",
"Url": "https://app{server-number}.timelog.com/{account}/api/v1/approval/timesheets/resubmit-rejected-time-registrations"
}
{
"error": "Unauthorized",
"message": "Authentication required. Please provide a valid API token",
"code": 401
}
{
"Code": 100,
"Details": [],
"Message": "Unknown error occur in system, please contact system administrator.",
"Parameters": "model: null",
"Url": "https://app{server-number}.timelog.com/{account}/api/v1/approval/timesheets/resubmit-rejected-time-registrations"
}
/v1/approval/timesheets/resubmit-rejected-time-registrations
Target server for requests. Edit to use your own host.
OAuth 2.0 bearer token, sent as Authorization: Bearer <token>. JWT and reference tokens are both accepted. The token must carry the required scope (default tlp).
The token's sub claim is the acting user. A token WITHOUT sub (client-credentials) acts as the system service user. If the sub user cannot log in (inactive, locked, deleted), the request is rejected with 401 — it is no longer let through without a user.
> Not yet documented: how to obtain a token.
> Not yet documented: token lifetime.
Authorization: Bearer <token>. JWT and reference tokens are both accepted. The token must carry the required scope (default tlp).
The token's sub claim is the acting user. A token WITHOUT sub (client-credentials) acts as the system service user. If the sub user cannot log in (inactive, locked, deleted), the request is rejected with 401 — it is no longer let through without a user.
> Not yet documented: how to obtain a token.
> Not yet documented: token lifetime.The media type of the request body
User ID of the employee who owns the registrations. Every registration must belong to this user.
Refers to UserRead.UserID. Look up valid values with GET /v1/user.
- 0, negative or omitted — 400 "'Employee User ID' must be greater than '0'."
- another user than the caller, without the needed rights — 500 Code 102, ErrorCode 37966; nothing is submitted.
IDs of the registrations to submit. Each is validated on its own; valid ones are submitted even when others fail.
Refers to TimeRegistrationRead.TimeRegistrationID. Look up valid values with GET /v1/time-registration/{timeRegistrationID}.
- ID that does not exist — Not returned by the lookup, so silently skipped.
- registration of another user than EmployeeUserID — ErrorCode 37972 for that registration.
- registration already approved by the employee manager — ErrorCode 37615.
- registration already submitted and not rejected — ErrorCode 37971.
- null or omitted — No validation rule: fails in the lookup → 500.
> Not yet documented: multiple.
> Not yet documented: behaviour.
Request Preview
Response
Response will appear here after sending the request
Authentication
Bearer token. OAuth 2.0 bearer token, sent as Authorization: Bearer <token>. JWT and reference tokens are both accepted. The token must carry the required scope (default tlp).
The token's sub claim is the acting user. A token WITHOUT sub (client-credentials) acts as the system service user. If the sub user cannot log in (inactive, locked, deleted), the request is rejected with 401 — it is no longer let through without a user.
Not yet documented: how to obtain a token.
Not yet documented: token lifetime.
Body
User ID of the employee who owns the registrations. Every registration must belong to this user.
Refers to UserRead.UserID. Look up valid values with GET /v1/user.
-
0, negative or omitted — 400 "'Employee User ID' must be greater than '0'."
-
another user than the caller, without the needed rights — 500 Code 102, ErrorCode 37966; nothing is submitted.
IDs of the registrations to submit. Each is validated on its own; valid ones are submitted even when others fail.
Refers to TimeRegistrationRead.TimeRegistrationID. Look up valid values with GET /v1/time-registration/{timeRegistrationID}.
-
ID that does not exist — Not returned by the lookup, so silently skipped.
-
registration of another user than EmployeeUserID — ErrorCode 37972 for that registration.
-
registration already approved by the employee manager — ErrorCode 37615.
-
registration already submitted and not rejected — ErrorCode 37971.
-
null or omitted — No validation rule: fails in the lookup → 500.
Not yet documented: multiple.
Not yet documented: behaviour.
Responses
Success without content: HTTP 200 with the literal JSON body null. Literal JSON null.