Time tracking
Update a time entry
Updates editable fields of a time entry. Returns 409 if the entry is locked.
PATCH
/
{team_id}
/
time
/
entries
/
{time_entry_id}
Update a time entry
curl --request PATCH \
--url https://api.superthread.com/v1/{team_id}/time/entries/{time_entry_id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"version": 2,
"time_category_id": "<string>",
"category_id": "<string>",
"description": "<string>",
"billable": true,
"confirm_review": true,
"duration_seconds": 2,
"started_at": 1608742037016
}
'import requests
url = "https://api.superthread.com/v1/{team_id}/time/entries/{time_entry_id}"
payload = {
"version": 2,
"time_category_id": "<string>",
"category_id": "<string>",
"description": "<string>",
"billable": True,
"confirm_review": True,
"duration_seconds": 2,
"started_at": 1608742037016
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
version: 2,
time_category_id: '<string>',
category_id: '<string>',
description: '<string>',
billable: true,
confirm_review: true,
duration_seconds: 2,
started_at: 1608742037016
})
};
fetch('https://api.superthread.com/v1/{team_id}/time/entries/{time_entry_id}', 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.superthread.com/v1/{team_id}/time/entries/{time_entry_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'version' => 2,
'time_category_id' => '<string>',
'category_id' => '<string>',
'description' => '<string>',
'billable' => true,
'confirm_review' => true,
'duration_seconds' => 2,
'started_at' => 1608742037016
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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.superthread.com/v1/{team_id}/time/entries/{time_entry_id}"
payload := strings.NewReader("{\n \"version\": 2,\n \"time_category_id\": \"<string>\",\n \"category_id\": \"<string>\",\n \"description\": \"<string>\",\n \"billable\": true,\n \"confirm_review\": true,\n \"duration_seconds\": 2,\n \"started_at\": 1608742037016\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.patch("https://api.superthread.com/v1/{team_id}/time/entries/{time_entry_id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"version\": 2,\n \"time_category_id\": \"<string>\",\n \"category_id\": \"<string>\",\n \"description\": \"<string>\",\n \"billable\": true,\n \"confirm_review\": true,\n \"duration_seconds\": 2,\n \"started_at\": 1608742037016\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.superthread.com/v1/{team_id}/time/entries/{time_entry_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"version\": 2,\n \"time_category_id\": \"<string>\",\n \"category_id\": \"<string>\",\n \"description\": \"<string>\",\n \"billable\": true,\n \"confirm_review\": true,\n \"duration_seconds\": 2,\n \"started_at\": 1608742037016\n}"
response = http.request(request)
puts response.read_body{
"time_entry": {
"id": "01HQK6Z9YJZ4M9JX8FVB6QXYAB",
"team_id": "tDsu0j19",
"card_id": "2700",
"user_id": "uR2dws11",
"started_at": 1608742037016,
"duration_seconds": 1800,
"billable": true,
"rate_snapshot_cents": 12500,
"currency_snapshot": "GBP",
"source": "manual",
"version": 1,
"type": "time_entry",
"scope_type": "card",
"scope_id": "<string>",
"card_title_snapshot": "Prepare September campaign",
"space_id_snapshot": "space_01HQK6Z9YJZ4M9JX8FVB6QXYAB",
"project_id_snapshot": "2701",
"board_id_snapshot": "board_01HQK6Z9YJZ4M9JX8FVB6QXYAB",
"sprint_id_snapshot": "sprint_01HQK6Z9YJZ4M9JX8FVB6QXYAB",
"ancestor_card_ids_snapshot": [
"<string>"
],
"time_category_id": "tc_01HQK6Z9YJZ4M9JX8FVB6QXYAB",
"category_id": "<string>",
"description": "Pairing with Alex on the API spec",
"needs_review": true,
"review_reason": "abandoned_timer",
"reviewed_at": 1608742037016,
"reviewed_by": "<string>",
"deleted_at": 1608742037016,
"locked_at": 1608742037016,
"time_created": 1608742037016,
"time_updated": 1608742037016
}
}{
"error": {
"id": "err5f744ab",
"code": 403,
"sec": "SEC:000-00014",
"message": "You do not have access to this resource",
"date": 1608742037016
}
}{
"error": {
"id": "err5f744ab",
"code": 403,
"sec": "SEC:000-00014",
"message": "You do not have access to this resource",
"date": 1608742037016
}
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
Team ID is an alphanumerical string that identifies a Team. This is externally referred to as a "Workspace".
Time Entry ID (client-supplied ULID).
Body
application/json
Current optimistic-concurrency version.
Required range:
x >= 1Legacy alias for time_category_id.
Set true to confirm an entry that is flagged as needing review; false is rejected.
Required range:
x >= 1unix timestamp in seconds
Example:
1608742037016
Response
Updated time entry
A durable work record. Card ownership metadata is captured when the entry is created, so later card moves or renames do not retroactively change historical reports.
Show child attributes
Show child attributes
⌘I
Update a time entry
curl --request PATCH \
--url https://api.superthread.com/v1/{team_id}/time/entries/{time_entry_id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"version": 2,
"time_category_id": "<string>",
"category_id": "<string>",
"description": "<string>",
"billable": true,
"confirm_review": true,
"duration_seconds": 2,
"started_at": 1608742037016
}
'import requests
url = "https://api.superthread.com/v1/{team_id}/time/entries/{time_entry_id}"
payload = {
"version": 2,
"time_category_id": "<string>",
"category_id": "<string>",
"description": "<string>",
"billable": True,
"confirm_review": True,
"duration_seconds": 2,
"started_at": 1608742037016
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
version: 2,
time_category_id: '<string>',
category_id: '<string>',
description: '<string>',
billable: true,
confirm_review: true,
duration_seconds: 2,
started_at: 1608742037016
})
};
fetch('https://api.superthread.com/v1/{team_id}/time/entries/{time_entry_id}', 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.superthread.com/v1/{team_id}/time/entries/{time_entry_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'version' => 2,
'time_category_id' => '<string>',
'category_id' => '<string>',
'description' => '<string>',
'billable' => true,
'confirm_review' => true,
'duration_seconds' => 2,
'started_at' => 1608742037016
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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.superthread.com/v1/{team_id}/time/entries/{time_entry_id}"
payload := strings.NewReader("{\n \"version\": 2,\n \"time_category_id\": \"<string>\",\n \"category_id\": \"<string>\",\n \"description\": \"<string>\",\n \"billable\": true,\n \"confirm_review\": true,\n \"duration_seconds\": 2,\n \"started_at\": 1608742037016\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.patch("https://api.superthread.com/v1/{team_id}/time/entries/{time_entry_id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"version\": 2,\n \"time_category_id\": \"<string>\",\n \"category_id\": \"<string>\",\n \"description\": \"<string>\",\n \"billable\": true,\n \"confirm_review\": true,\n \"duration_seconds\": 2,\n \"started_at\": 1608742037016\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.superthread.com/v1/{team_id}/time/entries/{time_entry_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"version\": 2,\n \"time_category_id\": \"<string>\",\n \"category_id\": \"<string>\",\n \"description\": \"<string>\",\n \"billable\": true,\n \"confirm_review\": true,\n \"duration_seconds\": 2,\n \"started_at\": 1608742037016\n}"
response = http.request(request)
puts response.read_body{
"time_entry": {
"id": "01HQK6Z9YJZ4M9JX8FVB6QXYAB",
"team_id": "tDsu0j19",
"card_id": "2700",
"user_id": "uR2dws11",
"started_at": 1608742037016,
"duration_seconds": 1800,
"billable": true,
"rate_snapshot_cents": 12500,
"currency_snapshot": "GBP",
"source": "manual",
"version": 1,
"type": "time_entry",
"scope_type": "card",
"scope_id": "<string>",
"card_title_snapshot": "Prepare September campaign",
"space_id_snapshot": "space_01HQK6Z9YJZ4M9JX8FVB6QXYAB",
"project_id_snapshot": "2701",
"board_id_snapshot": "board_01HQK6Z9YJZ4M9JX8FVB6QXYAB",
"sprint_id_snapshot": "sprint_01HQK6Z9YJZ4M9JX8FVB6QXYAB",
"ancestor_card_ids_snapshot": [
"<string>"
],
"time_category_id": "tc_01HQK6Z9YJZ4M9JX8FVB6QXYAB",
"category_id": "<string>",
"description": "Pairing with Alex on the API spec",
"needs_review": true,
"review_reason": "abandoned_timer",
"reviewed_at": 1608742037016,
"reviewed_by": "<string>",
"deleted_at": 1608742037016,
"locked_at": 1608742037016,
"time_created": 1608742037016,
"time_updated": 1608742037016
}
}{
"error": {
"id": "err5f744ab",
"code": 403,
"sec": "SEC:000-00014",
"message": "You do not have access to this resource",
"date": 1608742037016
}
}{
"error": {
"id": "err5f744ab",
"code": 403,
"sec": "SEC:000-00014",
"message": "You do not have access to this resource",
"date": 1608742037016
}
}