cURL
curl -X POST "$EXSITED_BASE_URL/api/v4/timesheets" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"timesheet": {
"sale_order_item": "soi_4d7e9a2b1c3f4e5d8a6b7c9d0e1f2a3b",
"start_time": "2026-11-09T09:00:00Z",
"end_time": "2026-11-09T10:00:00Z"
}
}'from exsited import build_client
client = build_client()
response = client.timesheets.create_timesheet(
{
"timesheet": {
"sale_order_item": "soi_4d7e9a2b1c3f4e5d8a6b7c9d0e1f2a3b",
"start_time": "2026-11-09T09:00:00Z",
"end_time": "2026-11-09T10:00:00Z",
}
}
)
print(response.data)
import {buildClient} from 'exsited';
const client = await buildClient();
const response = await client.timesheets.createTimesheet({
timesheet: {
sale_order_item: 'soi_4d7e9a2b1c3f4e5d8a6b7c9d0e1f2a3b',
start_time: '2026-11-09T09:00:00Z',
end_time: '2026-11-09T10:00:00Z',
},
});
console.log(response.data);
use Exsited\Client\ClientRegistry;
$client = ClientRegistry::buildClient();
$response = $client->timesheets->createTimesheet([
'timesheet' => [
'sale_order_item' => 'soi_4d7e9a2b1c3f4e5d8a6b7c9d0e1f2a3b',
'start_time' => '2026-11-09T09:00:00Z',
'end_time' => '2026-11-09T10:00:00Z',
],
]);
print_r($response->data);
import com.exsited.client.ApiResponse;
import com.exsited.client.ClientRegistry;
import com.exsited.client.ExsitedClient;
import com.exsited.resources.timesheets.timesheets_dto.TimesheetsDto;
import java.util.Map;
ExsitedClient client = ClientRegistry.buildClient();
ApiResponse<TimesheetsDto.Timesheets> response = client.timesheets().createTimesheet(
Map.of(
"timesheet", Map.of(
"sale_order_item", "soi_4d7e9a2b1c3f4e5d8a6b7c9d0e1f2a3b",
"start_time", "2026-11-09T09:00:00Z",
"end_time", "2026-11-09T10:00:00Z")));
System.out.println(response.getMap());
using Exsited.Client;
await using var client = ExsitedClient.BuildClient();
var response = await client.Timesheets.CreateTimesheetAsync(new Dictionary<string, object?>
{
["timesheet"] = new Dictionary<string, object?>
{
["sale_order_item"] = "soi_4d7e9a2b1c3f4e5d8a6b7c9d0e1f2a3b",
["start_time"] = "2026-11-09T09:00:00Z",
["end_time"] = "2026-11-09T10:00:00Z",
},
});
Console.WriteLine(response.Json);
import 'package:exsited/exsited.dart';
final client = buildClient();
final response = await client.timesheets.createTimesheet({
'timesheet': {
'sale_order_item': 'soi_4d7e9a2b1c3f4e5d8a6b7c9d0e1f2a3b',
'start_time': '2026-11-09T09:00:00Z',
'end_time': '2026-11-09T10:00:00Z',
},
});
print(response.map);
import (
"context"
"fmt"
"log"
exsited "github.com/exsited/exsited-sdk-go/v4"
)
client, err := exsited.BuildClient(nil)
if err != nil {
log.Fatal(err)
}
defer client.Close()
response, err := client.Timesheets().CreateTimesheet(context.Background(), map[string]any{
"timesheet": map[string]any{
"sale_order_item": "soi_4d7e9a2b1c3f4e5d8a6b7c9d0e1f2a3b",
"start_time": "2026-11-09T09:00:00Z",
"end_time": "2026-11-09T10:00:00Z",
},
}, nil)
if err != nil {
log.Fatal(err)
}
fmt.Println(response.Map)
{
"timesheet": {
"activity_logs": [
{
"activity": "<string>"
}
],
"created_by": {
"name": "<string>",
"object": "<string>"
},
"created_on": "<string>",
"end_time": "<string>",
"href": "<string>",
"id": "<string>",
"labour": {
"object": "<string>",
"id": "<string>",
"name": "<string>",
"href": "<string>"
},
"last_updated_by": null,
"last_updated_on": null,
"object": "<string>",
"sale_order": {
"object": "<string>",
"id": "<string>",
"name": "<string>",
"href": "<string>"
},
"sale_order_item": {
"object": "<string>",
"id": "<string>",
"name": "<string>",
"href": "<string>"
},
"start_time": "<string>",
"status": "<string>",
"version": 123
}
}Timesheets
Create a timesheet
Records time worked against a booked order line and returns the timesheet under timesheet.
POST
/
timesheets
cURL
curl -X POST "$EXSITED_BASE_URL/api/v4/timesheets" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"timesheet": {
"sale_order_item": "soi_4d7e9a2b1c3f4e5d8a6b7c9d0e1f2a3b",
"start_time": "2026-11-09T09:00:00Z",
"end_time": "2026-11-09T10:00:00Z"
}
}'from exsited import build_client
client = build_client()
response = client.timesheets.create_timesheet(
{
"timesheet": {
"sale_order_item": "soi_4d7e9a2b1c3f4e5d8a6b7c9d0e1f2a3b",
"start_time": "2026-11-09T09:00:00Z",
"end_time": "2026-11-09T10:00:00Z",
}
}
)
print(response.data)
import {buildClient} from 'exsited';
const client = await buildClient();
const response = await client.timesheets.createTimesheet({
timesheet: {
sale_order_item: 'soi_4d7e9a2b1c3f4e5d8a6b7c9d0e1f2a3b',
start_time: '2026-11-09T09:00:00Z',
end_time: '2026-11-09T10:00:00Z',
},
});
console.log(response.data);
use Exsited\Client\ClientRegistry;
$client = ClientRegistry::buildClient();
$response = $client->timesheets->createTimesheet([
'timesheet' => [
'sale_order_item' => 'soi_4d7e9a2b1c3f4e5d8a6b7c9d0e1f2a3b',
'start_time' => '2026-11-09T09:00:00Z',
'end_time' => '2026-11-09T10:00:00Z',
],
]);
print_r($response->data);
import com.exsited.client.ApiResponse;
import com.exsited.client.ClientRegistry;
import com.exsited.client.ExsitedClient;
import com.exsited.resources.timesheets.timesheets_dto.TimesheetsDto;
import java.util.Map;
ExsitedClient client = ClientRegistry.buildClient();
ApiResponse<TimesheetsDto.Timesheets> response = client.timesheets().createTimesheet(
Map.of(
"timesheet", Map.of(
"sale_order_item", "soi_4d7e9a2b1c3f4e5d8a6b7c9d0e1f2a3b",
"start_time", "2026-11-09T09:00:00Z",
"end_time", "2026-11-09T10:00:00Z")));
System.out.println(response.getMap());
using Exsited.Client;
await using var client = ExsitedClient.BuildClient();
var response = await client.Timesheets.CreateTimesheetAsync(new Dictionary<string, object?>
{
["timesheet"] = new Dictionary<string, object?>
{
["sale_order_item"] = "soi_4d7e9a2b1c3f4e5d8a6b7c9d0e1f2a3b",
["start_time"] = "2026-11-09T09:00:00Z",
["end_time"] = "2026-11-09T10:00:00Z",
},
});
Console.WriteLine(response.Json);
import 'package:exsited/exsited.dart';
final client = buildClient();
final response = await client.timesheets.createTimesheet({
'timesheet': {
'sale_order_item': 'soi_4d7e9a2b1c3f4e5d8a6b7c9d0e1f2a3b',
'start_time': '2026-11-09T09:00:00Z',
'end_time': '2026-11-09T10:00:00Z',
},
});
print(response.map);
import (
"context"
"fmt"
"log"
exsited "github.com/exsited/exsited-sdk-go/v4"
)
client, err := exsited.BuildClient(nil)
if err != nil {
log.Fatal(err)
}
defer client.Close()
response, err := client.Timesheets().CreateTimesheet(context.Background(), map[string]any{
"timesheet": map[string]any{
"sale_order_item": "soi_4d7e9a2b1c3f4e5d8a6b7c9d0e1f2a3b",
"start_time": "2026-11-09T09:00:00Z",
"end_time": "2026-11-09T10:00:00Z",
},
}, nil)
if err != nil {
log.Fatal(err)
}
fmt.Println(response.Map)
{
"timesheet": {
"activity_logs": [
{
"activity": "<string>"
}
],
"created_by": {
"name": "<string>",
"object": "<string>"
},
"created_on": "<string>",
"end_time": "<string>",
"href": "<string>",
"id": "<string>",
"labour": {
"object": "<string>",
"id": "<string>",
"name": "<string>",
"href": "<string>"
},
"last_updated_by": null,
"last_updated_on": null,
"object": "<string>",
"sale_order": {
"object": "<string>",
"id": "<string>",
"name": "<string>",
"href": "<string>"
},
"sale_order_item": {
"object": "<string>",
"id": "<string>",
"name": "<string>",
"href": "<string>"
},
"start_time": "<string>",
"status": "<string>",
"version": 123
}
}Send the timesheet under
timesheet with the sale_order_item it is for and its start_time and end_time. The sale_order_item is the order line’s id with its ln_ prefix replaced by soi_, on an order line that books a labour. The new timesheet comes back under timesheet, with its ts_ id.
The SDK samples get their client from credentials your app registers once when it starts, as shown in Authentication. To try the call here, click Try it, set
host to your Exsited API host name and paste an access token from Get an access token. To send a raw JSON body instead of filling in fields, copy the cURL sample and edit its -d payload.