Timesheets
Create or Update Entry
Creates a new timesheet entry for a specific date, or updates the existing entry.
POST
/
api
/
public
/
v1
/
timesheets
Create or Update Entry
curl --request POST \
--url https://api.example.com/api/public/v1/timesheets \
--header 'Content-Type: application/json' \
--data '
{
"userId": "<string>",
"date": "<string>",
"hoursWorked": 123,
"expectedHours": 123,
"notes": "<string>",
"taskId": "<string>"
}
'import requests
url = "https://api.example.com/api/public/v1/timesheets"
payload = {
"userId": "<string>",
"date": "<string>",
"hoursWorked": 123,
"expectedHours": 123,
"notes": "<string>",
"taskId": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
userId: '<string>',
date: '<string>',
hoursWorked: 123,
expectedHours: 123,
notes: '<string>',
taskId: '<string>'
})
};
fetch('https://api.example.com/api/public/v1/timesheets', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/api/public/v1/timesheets",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'userId' => '<string>',
'date' => '<string>',
'hoursWorked' => 123,
'expectedHours' => 123,
'notes' => '<string>',
'taskId' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/api/public/v1/timesheets"
payload := strings.NewReader("{\n \"userId\": \"<string>\",\n \"date\": \"<string>\",\n \"hoursWorked\": 123,\n \"expectedHours\": 123,\n \"notes\": \"<string>\",\n \"taskId\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.example.com/api/public/v1/timesheets")
.header("Content-Type", "application/json")
.body("{\n \"userId\": \"<string>\",\n \"date\": \"<string>\",\n \"hoursWorked\": 123,\n \"expectedHours\": 123,\n \"notes\": \"<string>\",\n \"taskId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/public/v1/timesheets")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"userId\": \"<string>\",\n \"date\": \"<string>\",\n \"hoursWorked\": 123,\n \"expectedHours\": 123,\n \"notes\": \"<string>\",\n \"taskId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "ent_111...",
"timesheetId": "ts_222...",
"date": "2026-05-18T00:00:00.000Z",
"hoursWorked": 8.5,
"expectedHours": 8,
"notes": "Stayed late to finish the report",
"createdAt": "2026-05-18T17:30:00.000Z",
"updatedAt": "2026-05-18T17:30:00.000Z"
}
}
The API will automatically create a draft Timesheet wrapper (usually a weekly period) if one does not already exist for the given date.
Body Parameters
string
required
The unique identifier of the employee logging the time.
string
required
The date the work was performed (ISO 8601 format).
number
required
The total number of hours worked on this date.
number
The expected number of hours for this shift. Defaults to 8 if not provided.
string
Optional notes or comments about the shift.
string
Optional ID of a specific project or task this time should be allocated to.
Response
{
"data": {
"id": "ent_111...",
"timesheetId": "ts_222...",
"date": "2026-05-18T00:00:00.000Z",
"hoursWorked": 8.5,
"expectedHours": 8,
"notes": "Stayed late to finish the report",
"createdAt": "2026-05-18T17:30:00.000Z",
"updatedAt": "2026-05-18T17:30:00.000Z"
}
}
⌘I
Create or Update Entry
curl --request POST \
--url https://api.example.com/api/public/v1/timesheets \
--header 'Content-Type: application/json' \
--data '
{
"userId": "<string>",
"date": "<string>",
"hoursWorked": 123,
"expectedHours": 123,
"notes": "<string>",
"taskId": "<string>"
}
'import requests
url = "https://api.example.com/api/public/v1/timesheets"
payload = {
"userId": "<string>",
"date": "<string>",
"hoursWorked": 123,
"expectedHours": 123,
"notes": "<string>",
"taskId": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
userId: '<string>',
date: '<string>',
hoursWorked: 123,
expectedHours: 123,
notes: '<string>',
taskId: '<string>'
})
};
fetch('https://api.example.com/api/public/v1/timesheets', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/api/public/v1/timesheets",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'userId' => '<string>',
'date' => '<string>',
'hoursWorked' => 123,
'expectedHours' => 123,
'notes' => '<string>',
'taskId' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/api/public/v1/timesheets"
payload := strings.NewReader("{\n \"userId\": \"<string>\",\n \"date\": \"<string>\",\n \"hoursWorked\": 123,\n \"expectedHours\": 123,\n \"notes\": \"<string>\",\n \"taskId\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.example.com/api/public/v1/timesheets")
.header("Content-Type", "application/json")
.body("{\n \"userId\": \"<string>\",\n \"date\": \"<string>\",\n \"hoursWorked\": 123,\n \"expectedHours\": 123,\n \"notes\": \"<string>\",\n \"taskId\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/public/v1/timesheets")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"userId\": \"<string>\",\n \"date\": \"<string>\",\n \"hoursWorked\": 123,\n \"expectedHours\": 123,\n \"notes\": \"<string>\",\n \"taskId\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "ent_111...",
"timesheetId": "ts_222...",
"date": "2026-05-18T00:00:00.000Z",
"hoursWorked": 8.5,
"expectedHours": 8,
"notes": "Stayed late to finish the report",
"createdAt": "2026-05-18T17:30:00.000Z",
"updatedAt": "2026-05-18T17:30:00.000Z"
}
}