Create a time entry
Creates a time entry. The client must supply a ULID as id; if an entry with that id already exists,
the server returns the existing entry with a 200 response. The billing rate is snapshotted at create time.
curl --request POST \
--url https://api.superthread.com/v1/{team_id}/time/entries \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"id": "01HQK6Z9YJZ4M9JX8FVB6QXYAB",
"scope_type": "card",
"scope_id": "2700",
"started_at": 1608742037016,
"duration_seconds": 1800,
"description": "Pairing with Alex on the API spec",
"billable": true
}
'import requests
url = "https://api.superthread.com/v1/{team_id}/time/entries"
payload = {
"id": "01HQK6Z9YJZ4M9JX8FVB6QXYAB",
"scope_type": "card",
"scope_id": "2700",
"started_at": 1608742037016,
"duration_seconds": 1800,
"description": "Pairing with Alex on the API spec",
"billable": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
id: '01HQK6Z9YJZ4M9JX8FVB6QXYAB',
scope_type: 'card',
scope_id: '2700',
started_at: 1608742037016,
duration_seconds: 1800,
description: 'Pairing with Alex on the API spec',
billable: true
})
};
fetch('https://api.superthread.com/v1/{team_id}/time/entries', 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",
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([
'id' => '01HQK6Z9YJZ4M9JX8FVB6QXYAB',
'scope_type' => 'card',
'scope_id' => '2700',
'started_at' => 1608742037016,
'duration_seconds' => 1800,
'description' => 'Pairing with Alex on the API spec',
'billable' => true
]),
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"
payload := strings.NewReader("{\n \"id\": \"01HQK6Z9YJZ4M9JX8FVB6QXYAB\",\n \"scope_type\": \"card\",\n \"scope_id\": \"2700\",\n \"started_at\": 1608742037016,\n \"duration_seconds\": 1800,\n \"description\": \"Pairing with Alex on the API spec\",\n \"billable\": true\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.superthread.com/v1/{team_id}/time/entries")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"id\": \"01HQK6Z9YJZ4M9JX8FVB6QXYAB\",\n \"scope_type\": \"card\",\n \"scope_id\": \"2700\",\n \"started_at\": 1608742037016,\n \"duration_seconds\": 1800,\n \"description\": \"Pairing with Alex on the API spec\",\n \"billable\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.superthread.com/v1/{team_id}/time/entries")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"id\": \"01HQK6Z9YJZ4M9JX8FVB6QXYAB\",\n \"scope_type\": \"card\",\n \"scope_id\": \"2700\",\n \"started_at\": 1608742037016,\n \"duration_seconds\": 1800,\n \"description\": \"Pairing with Alex on the API spec\",\n \"billable\": true\n}"
response = http.request(request)
puts response.read_body{
"time_entry": {
"id": "01HQK6Z9YJZ4M9JX8FVB6QXYAB",
"type": "time_entry",
"team_id": "tDsu0j19",
"scope_type": "card",
"scope_id": "2700",
"user_id": "uR2dws11",
"started_at": 1608742037016,
"duration_seconds": 1800,
"description": "Pairing with Alex on the API spec",
"billable": true,
"rate_snapshot_cents": 12500,
"deleted_at": 1608742037016,
"locked_at": 1608742037016,
"time_created": 1608742037016,
"time_updated": 1608742037016
}
}{
"time_entry": {
"id": "01HQK6Z9YJZ4M9JX8FVB6QXYAB",
"type": "time_entry",
"team_id": "tDsu0j19",
"scope_type": "card",
"scope_id": "2700",
"user_id": "uR2dws11",
"started_at": 1608742037016,
"duration_seconds": 1800,
"description": "Pairing with Alex on the API spec",
"billable": true,
"rate_snapshot_cents": 12500,
"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
}
}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".
Body
Time entry to create.
Client-supplied ULID. Repeating the same id makes the call idempotent.
"01HQK6Z9YJZ4M9JX8FVB6QXYAB"
Scope a time entry attaches to. card ties the entry to a specific card (and rolls up to its epic),
while category ties the entry to a workspace-level time category not associated with any card.
card, category "card"
"2700"
unix timestamp in seconds
1608742037016
1800
"Pairing with Alex on the API spec"
Defaults to the category default (or workspace default) when omitted.
Response
Existing time entry returned (idempotent replay)
Show child attributes
Show child attributes
curl --request POST \
--url https://api.superthread.com/v1/{team_id}/time/entries \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"id": "01HQK6Z9YJZ4M9JX8FVB6QXYAB",
"scope_type": "card",
"scope_id": "2700",
"started_at": 1608742037016,
"duration_seconds": 1800,
"description": "Pairing with Alex on the API spec",
"billable": true
}
'import requests
url = "https://api.superthread.com/v1/{team_id}/time/entries"
payload = {
"id": "01HQK6Z9YJZ4M9JX8FVB6QXYAB",
"scope_type": "card",
"scope_id": "2700",
"started_at": 1608742037016,
"duration_seconds": 1800,
"description": "Pairing with Alex on the API spec",
"billable": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
id: '01HQK6Z9YJZ4M9JX8FVB6QXYAB',
scope_type: 'card',
scope_id: '2700',
started_at: 1608742037016,
duration_seconds: 1800,
description: 'Pairing with Alex on the API spec',
billable: true
})
};
fetch('https://api.superthread.com/v1/{team_id}/time/entries', 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",
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([
'id' => '01HQK6Z9YJZ4M9JX8FVB6QXYAB',
'scope_type' => 'card',
'scope_id' => '2700',
'started_at' => 1608742037016,
'duration_seconds' => 1800,
'description' => 'Pairing with Alex on the API spec',
'billable' => true
]),
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"
payload := strings.NewReader("{\n \"id\": \"01HQK6Z9YJZ4M9JX8FVB6QXYAB\",\n \"scope_type\": \"card\",\n \"scope_id\": \"2700\",\n \"started_at\": 1608742037016,\n \"duration_seconds\": 1800,\n \"description\": \"Pairing with Alex on the API spec\",\n \"billable\": true\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.superthread.com/v1/{team_id}/time/entries")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"id\": \"01HQK6Z9YJZ4M9JX8FVB6QXYAB\",\n \"scope_type\": \"card\",\n \"scope_id\": \"2700\",\n \"started_at\": 1608742037016,\n \"duration_seconds\": 1800,\n \"description\": \"Pairing with Alex on the API spec\",\n \"billable\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.superthread.com/v1/{team_id}/time/entries")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"id\": \"01HQK6Z9YJZ4M9JX8FVB6QXYAB\",\n \"scope_type\": \"card\",\n \"scope_id\": \"2700\",\n \"started_at\": 1608742037016,\n \"duration_seconds\": 1800,\n \"description\": \"Pairing with Alex on the API spec\",\n \"billable\": true\n}"
response = http.request(request)
puts response.read_body{
"time_entry": {
"id": "01HQK6Z9YJZ4M9JX8FVB6QXYAB",
"type": "time_entry",
"team_id": "tDsu0j19",
"scope_type": "card",
"scope_id": "2700",
"user_id": "uR2dws11",
"started_at": 1608742037016,
"duration_seconds": 1800,
"description": "Pairing with Alex on the API spec",
"billable": true,
"rate_snapshot_cents": 12500,
"deleted_at": 1608742037016,
"locked_at": 1608742037016,
"time_created": 1608742037016,
"time_updated": 1608742037016
}
}{
"time_entry": {
"id": "01HQK6Z9YJZ4M9JX8FVB6QXYAB",
"type": "time_entry",
"team_id": "tDsu0j19",
"scope_type": "card",
"scope_id": "2700",
"user_id": "uR2dws11",
"started_at": 1608742037016,
"duration_seconds": 1800,
"description": "Pairing with Alex on the API spec",
"billable": true,
"rate_snapshot_cents": 12500,
"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
}
}