The Untether Labs API provides endpoints for managing timecard punches, allowing you to create and delete time tracking entries for your workforce.
Terminology
Before working with timecard punches, it’s important to understand the key terms:
- Punch: A single time entry that records when a provider performs an action (clock in, clock out, break start, break end).
Typically timecard punches follow a logical sequence. You’ll have pairs of clock_in/clock_out punches, with optional break_start/break_end punches in between.
- Timecard: A collection of punches that represent a complete work session for a provider
- Action: The type of punch being recorded (
clock_in, clock_out, break_start, break_end)
- State: The admin approval status of a punch (
pending, approved, rejected)
Creating Punches
Use the POST /v1/timekeeping/timecard/punches endpoint to create new timecard punches.
For clock_in actions, do not include a timecard field. The system will
automatically create a new timecard and return the ID.
curl -X POST --location "https://app.untetherlabs.com/api/v1/timekeeping/timecard/punches" \
-H "Authorization: Bearer {ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"provider": "123e4567-e89b-12d3-a456-426614174000",
"action": "clock_in",
"time": "2025-09-10T08:00:00Z",
"state": "pending",
"providerNote": "Starting my shift"
}'
Other Actions (Clock Out, Breaks)
For all other actions, you must specify the timecard ID that was created during clock in:
curl -X POST --location "https://app.untetherlabs.com/api/v1/timekeeping/timecard/punches" \
-H "Authorization: Bearer {ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"timecard": "456e7890-e89b-12d3-a456-426614174001",
"provider": "123e4567-e89b-12d3-a456-426614174000",
"action": "clock_out",
"time": "2025-09-10T17:00:00Z",
"state": "pending",
"providerNote": "Finished my shift"
}'
Response
{
"id": "789e1234-e89b-12d3-a456-426614174002",
"timecard": "456e7890-e89b-12d3-a456-426614174001",
"provider": "123e4567-e89b-12d3-a456-426614174000",
"action": "clock_in",
"state": "pending",
"time": "2025-09-10T08:00:00Z",
"generated": false,
"createdAt": "2025-09-10T08:00:01Z",
"updatedAt": "2025-09-10T08:00:01Z",
"providerNote": "Starting my shift"
}
Deleting Punches
Use the DELETE /v1/timekeeping/timecard/punches/{punchId} endpoint to remove a specific punch.
curl -X DELETE --location "https://app.untetherlabs.com/api/v1/timekeeping/timecard/punches/789e1234-e89b-12d3-a456-426614174002" \
-H "Authorization: Bearer {ACCESS_TOKEN}"
When deleting the last punch in a timecard, the entire timecard will be automatically
deleted. To re-add punches you must start over with a new clock_in.
Response
The delete operation returns the deleted punch object:
{
"id": "789e1234-e89b-12d3-a456-426614174002",
"timecard": "456e7890-e89b-12d3-a456-426614174001",
"provider": "123e4567-e89b-12d3-a456-426614174000",
"action": "clock_in",
"state": "pending",
"time": "2025-09-10T08:00:00Z",
"generated": false,
"createdAt": "2025-09-10T08:00:01Z",
"updatedAt": "2025-09-10T08:00:01Z",
"providerNote": "Starting my shift"
}