Weekly reports
POST Search time entries
https://api.track.toggl.com/reports/api/v3/workspace/{workspace_id}/weekly/time_entries
Returns time entries for weekly report according to the given filters.
- cURL
 - Go
 - Ruby
 - JavaScript
 - Python
 - Rust
 
curl -X POST https://api.track.toggl.com/reports/api/v3/workspace/{workspace_id}/weekly/time_entries \
  -H "Content-Type: application/json" \
  -d '\{"billable":"boolean","client_ids":[\{\}],"description":"string","endTime":"string","end_date":"string","group_ids":[\{\}],"max_duration_seconds":"integer","min_duration_seconds":"integer","project_ids":[\{\}],"rounding":"integer","rounding_minutes":"integer","startTime":"string","start_date":"string","tag_ids":[\{\}],"task_ids":[\{\}],"time_entry_ids":[\{\}],"user_ids":[\{\}]\}' \
  -u <email>:<password>
bytes, err := json.Marshal('\{"billable":"boolean","client_ids":[\{\}],"description":"string","endTime":"string","end_date":"string","group_ids":[\{\}],"max_duration_seconds":"integer","min_duration_seconds":"integer","project_ids":[\{\}],"rounding":"integer","rounding_minutes":"integer","startTime":"string","start_date":"string","tag_ids":[\{\}],"task_ids":[\{\}],"time_entry_ids":[\{\}],"user_ids":[\{\}]\}')
if err != nil {
    print(err)
}
req, err := http.NewRequest(http.MethodPost, 
  "https://api.track.toggl.com/reports/api/v3/workspace/{workspace_id}/weekly/time_entries", bytes.NewBuffer(bytes))
if err != nil {
    print(err)
}
req.Header.Set("Content-Type", "application/json; charset=utf-8")
req.SetBasicAuth("<email>", "<password>")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
    print(err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
    print(err)
}
fmt.Print(string(body))
require 'net/http'
require 'uri'
require 'json'
uri = URI('https://api.track.toggl.com/reports/api/v3/workspace/{workspace_id}/weekly/time_entries')
http = Net::HTTP.new(uri.host, uri.port)
req = Net::HTTP::Post.new(uri.path)
req['Content-Type'] = "application/json"
req.body = \{"billable":"boolean","client_ids":[\{\}],"description":"string","endTime":"string","end_date":"string","group_ids":[\{\}],"max_duration_seconds":"integer","min_duration_seconds":"integer","project_ids":[\{\}],"rounding":"integer","rounding_minutes":"integer","startTime":"string","start_date":"string","tag_ids":[\{\}],"task_ids":[\{\}],"time_entry_ids":[\{\}],"user_ids":[\{\}]\}.to_json
request.basic_auth '<email>', '<password>'
res = http.request(req)
puts JSON.parse(res.body)
fetch("https://api.track.toggl.com/reports/api/v3/workspace/{workspace_id}/weekly/time_entries", {
  method: "POST",
  body: \{"billable":"boolean","client_ids":[\{\}],"description":"string","endTime":"string","end_date":"string","group_ids":[\{\}],"max_duration_seconds":"integer","min_duration_seconds":"integer","project_ids":[\{\}],"rounding":"integer","rounding_minutes":"integer","startTime":"string","start_date":"string","tag_ids":[\{\}],"task_ids":[\{\}],"time_entry_ids":[\{\}],"user_ids":[\{\}]\},
  headers: {
	"Content-Type": "application/json",
	"Authorization": `Basic ${base64.encode(<email>:<password>)}`
  },
})
.then((resp) => resp.json())
.then((json) => {
  console.log(json);
})
.catch(err => console.error(err));
import requests
from base64 import b64encode
data = requests.post('https://api.track.toggl.com/reports/api/v3/workspace/{workspace_id}/weekly/time_entries', json=\{"billable":"boolean","client_ids":[\{\}],"description":"string","endTime":"string","end_date":"string","group_ids":[\{\}],"max_duration_seconds":"integer","min_duration_seconds":"integer","project_ids":[\{\}],"rounding":"integer","rounding_minutes":"integer","startTime":"string","start_date":"string","tag_ids":[\{\}],"task_ids":[\{\}],"time_entry_ids":[\{\}],"user_ids":[\{\}]\}, headers={'content-type': 'application/json', 'Authorization' : 'Basic %s' %  b64encode(b"<email>:<password>").decode("ascii")})
print(data.json())
extern crate tokio;
extern crate serde_json;
use reqwest::{Client};
use reqwest::header::{CONTENT_TYPE};
#[tokio::main]
async fn main() -> Result<(), reqwest::Error> {
  let client = Client::new().basic_auth("<email>", "<password>");
  let json = client.request(Method::POST, "https://api.track.toggl.com/reports/api/v3/workspace/{workspace_id}/weekly/time_entries".to_string())
.json(&serde_json::json!(\{"billable":"boolean","client_ids":[\{\}],"description":"string","endTime":"string","end_date":"string","group_ids":[\{\}],"max_duration_seconds":"integer","min_duration_seconds":"integer","project_ids":[\{\}],"rounding":"integer","rounding_minutes":"integer","startTime":"string","start_date":"string","tag_ids":[\{\}],"task_ids":[\{\}],"time_entry_ids":[\{\}],"user_ids":[\{\}]\}))
  .header(CONTENT_TYPE, "application/json")
  .send()
  .await?
  .json()
  .await?;
  
  println!("{:#?}", json);
  Ok(())
}
Parameters
Path
| name | type | required | description | 
|---|---|---|---|
| workspace_id | integer | true | Workspace ID | 
Body
| Name | Type | Description | 
|---|---|---|
| billable | boolean | Whether the time entry is set as billable, optional, premium feature. | 
| client_ids | Array of integer | Client IDs, optional, filtering attribute. To filter records with no clients, use [null]. | 
| description | string | Description, optional, filtering attribute. | 
| endTime | string | - | 
| end_date | string | End date, example time.DateOnly. Should be greater than Start date. | 
| group_ids | Array of integer | Group IDs, optional, filtering attribute. | 
| max_duration_seconds | integer | Max duration seconds, optional, filtering attribute. Time Audit only, should be greater than MinDurationSeconds. | 
| min_duration_seconds | integer | Min duration seconds, optional, filtering attribute. Time Audit only, should be less than MaxDurationSeconds. | 
| project_ids | Array of integer | Project IDs, optional, filtering attribute. To filter records with no projects, use [null]. | 
| rounding | integer | Whether time should be rounded, optional, default from user preferences. | 
| rounding_minutes | integer | Rounding minutes value, optional, default from user preferences. Should be 0, 1, 5, 6, 10, 12, 15, 30, 60 or 240. | 
| startTime | string | - | 
| start_date | string | Start date, example time.DateOnly. Should be less than End date. | 
| tag_ids | Array of integer | Tag IDs, optional, filtering attribute. To filter records with no tags, use [null]. | 
| task_ids | Array of integer | Task IDs, optional, filtering attribute. To filter records with no tasks, use [null]. | 
| time_entry_ids | Array of integer | TimeEntryIDs filters by time entries. This was added to support retro-compatibility with reports v2. | 
| user_ids | Array of integer | User IDs, optional, filtering attribute. | 
Response
200
Returns the weekly report time entries
400
Possible error messages:
- At least one parameter must be set
 - Invalid workspace id
 - The '{parameter}' parameter is not supported
 - Invalid '{parameter}' value, allowed values are: '{valid_values}'
 
402
Workspace needs to have this feature enabled
403
Workspace not found/accessible
500
Internal Server Error
POST Export weekly report
https://api.track.toggl.com/reports/api/v3/workspace/{workspace_id}/weekly/time_entries.csv
Downloads weekly report in csv format.
- cURL
 - Go
 - Ruby
 - JavaScript
 - Python
 - Rust
 
curl -X POST https://api.track.toggl.com/reports/api/v3/workspace/{workspace_id}/weekly/time_entries.csv \
  -H "Content-Type: application/json" \
  -d '\{"billable":"boolean","calculate":"string","client_ids":[\{\}],"description":"string","endTime":"string","end_date":"string","group_by_task":"boolean","group_ids":[\{\}],"grouping":"string","max_duration_seconds":"integer","min_duration_seconds":"integer","project_ids":[\{\}],"rounding":"integer","rounding_minutes":"integer","startTime":"string","start_date":"string","tag_ids":[\{\}],"task_ids":[\{\}],"time_entry_ids":[\{\}],"user_ids":[\{\}]\}' \
  -u <email>:<password>
bytes, err := json.Marshal('\{"billable":"boolean","calculate":"string","client_ids":[\{\}],"description":"string","endTime":"string","end_date":"string","group_by_task":"boolean","group_ids":[\{\}],"grouping":"string","max_duration_seconds":"integer","min_duration_seconds":"integer","project_ids":[\{\}],"rounding":"integer","rounding_minutes":"integer","startTime":"string","start_date":"string","tag_ids":[\{\}],"task_ids":[\{\}],"time_entry_ids":[\{\}],"user_ids":[\{\}]\}')
if err != nil {
    print(err)
}
req, err := http.NewRequest(http.MethodPost, 
  "https://api.track.toggl.com/reports/api/v3/workspace/{workspace_id}/weekly/time_entries.csv", bytes.NewBuffer(bytes))
if err != nil {
    print(err)
}
req.Header.Set("Content-Type", "application/json; charset=utf-8")
req.SetBasicAuth("<email>", "<password>")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
    print(err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
    print(err)
}
fmt.Print(string(body))
require 'net/http'
require 'uri'
require 'json'
uri = URI('https://api.track.toggl.com/reports/api/v3/workspace/{workspace_id}/weekly/time_entries.csv')
http = Net::HTTP.new(uri.host, uri.port)
req = Net::HTTP::Post.new(uri.path)
req['Content-Type'] = "application/json"
req.body = \{"billable":"boolean","calculate":"string","client_ids":[\{\}],"description":"string","endTime":"string","end_date":"string","group_by_task":"boolean","group_ids":[\{\}],"grouping":"string","max_duration_seconds":"integer","min_duration_seconds":"integer","project_ids":[\{\}],"rounding":"integer","rounding_minutes":"integer","startTime":"string","start_date":"string","tag_ids":[\{\}],"task_ids":[\{\}],"time_entry_ids":[\{\}],"user_ids":[\{\}]\}.to_json
request.basic_auth '<email>', '<password>'
res = http.request(req)
puts JSON.parse(res.body)
fetch("https://api.track.toggl.com/reports/api/v3/workspace/{workspace_id}/weekly/time_entries.csv", {
  method: "POST",
  body: \{"billable":"boolean","calculate":"string","client_ids":[\{\}],"description":"string","endTime":"string","end_date":"string","group_by_task":"boolean","group_ids":[\{\}],"grouping":"string","max_duration_seconds":"integer","min_duration_seconds":"integer","project_ids":[\{\}],"rounding":"integer","rounding_minutes":"integer","startTime":"string","start_date":"string","tag_ids":[\{\}],"task_ids":[\{\}],"time_entry_ids":[\{\}],"user_ids":[\{\}]\},
  headers: {
	"Content-Type": "application/json",
	"Authorization": `Basic ${base64.encode(<email>:<password>)}`
  },
})
.then((resp) => resp.json())
.then((json) => {
  console.log(json);
})
.catch(err => console.error(err));
import requests
from base64 import b64encode
data = requests.post('https://api.track.toggl.com/reports/api/v3/workspace/{workspace_id}/weekly/time_entries.csv', json=\{"billable":"boolean","calculate":"string","client_ids":[\{\}],"description":"string","endTime":"string","end_date":"string","group_by_task":"boolean","group_ids":[\{\}],"grouping":"string","max_duration_seconds":"integer","min_duration_seconds":"integer","project_ids":[\{\}],"rounding":"integer","rounding_minutes":"integer","startTime":"string","start_date":"string","tag_ids":[\{\}],"task_ids":[\{\}],"time_entry_ids":[\{\}],"user_ids":[\{\}]\}, headers={'content-type': 'application/json', 'Authorization' : 'Basic %s' %  b64encode(b"<email>:<password>").decode("ascii")})
print(data.json())
extern crate tokio;
extern crate serde_json;
use reqwest::{Client};
use reqwest::header::{CONTENT_TYPE};
#[tokio::main]
async fn main() -> Result<(), reqwest::Error> {
  let client = Client::new().basic_auth("<email>", "<password>");
  let json = client.request(Method::POST, "https://api.track.toggl.com/reports/api/v3/workspace/{workspace_id}/weekly/time_entries.csv".to_string())
.json(&serde_json::json!(\{"billable":"boolean","calculate":"string","client_ids":[\{\}],"description":"string","endTime":"string","end_date":"string","group_by_task":"boolean","group_ids":[\{\}],"grouping":"string","max_duration_seconds":"integer","min_duration_seconds":"integer","project_ids":[\{\}],"rounding":"integer","rounding_minutes":"integer","startTime":"string","start_date":"string","tag_ids":[\{\}],"task_ids":[\{\}],"time_entry_ids":[\{\}],"user_ids":[\{\}]\}))
  .header(CONTENT_TYPE, "application/json")
  .send()
  .await?
  .json()
  .await?;
  
  println!("{:#?}", json);
  Ok(())
}
Parameters
Path
| name | type | required | description | 
|---|---|---|---|
| workspace_id | integer | true | Workspace ID | 
Body
| Name | Type | Description | 
|---|---|---|
| billable | boolean | Whether the time entry is set as billable, optional, premium feature. | 
| calculate | string | Calculate option, optional. Can be by time or amounts. | 
| client_ids | Array of integer | Client IDs, optional, filtering attribute. To filter records with no clients, use [null]. | 
| description | string | Description, optional, filtering attribute. | 
| endTime | string | - | 
| end_date | string | End date, example time.DateOnly. Should be greater than Start date. | 
| group_by_task | boolean | GroupByTask tells the weekly report to return the data grouped by all the usual groups plus planned task. | 
| group_ids | Array of integer | Group IDs, optional, filtering attribute. | 
| grouping | string | Grouping option, optional. | 
| max_duration_seconds | integer | Max duration seconds, optional, filtering attribute. Time Audit only, should be greater than MinDurationSeconds. | 
| min_duration_seconds | integer | Min duration seconds, optional, filtering attribute. Time Audit only, should be less than MaxDurationSeconds. | 
| project_ids | Array of integer | Project IDs, optional, filtering attribute. To filter records with no projects, use [null]. | 
| rounding | integer | Whether time should be rounded, optional, default from user preferences. | 
| rounding_minutes | integer | Rounding minutes value, optional, default from user preferences. Should be 0, 1, 5, 6, 10, 12, 15, 30, 60 or 240. | 
| startTime | string | - | 
| start_date | string | Start date, example time.DateOnly. Should be less than End date. | 
| tag_ids | Array of integer | Tag IDs, optional, filtering attribute. To filter records with no tags, use [null]. | 
| task_ids | Array of integer | Task IDs, optional, filtering attribute. To filter records with no tasks, use [null]. | 
| time_entry_ids | Array of integer | TimeEntryIDs filters by time entries. This was added to support retro-compatibility with reports v2. | 
| user_ids | Array of integer | User IDs, optional, filtering attribute. | 
Response
200
Returns the weekly report in csv format
400
Possible error messages:
- At least one parameter must be set
 - Invalid workspace id
 - The '{parameter}' parameter is not supported
 - Invalid '{parameter}' value, allowed values are: '{valid_values}'
 
402
Workspace needs to have this feature enabled
403
Workspace not found/accessible
500
Internal Server Error
POST Export weekly report
https://api.track.toggl.com/reports/api/v3/workspace/{workspace_id}/weekly/time_entries.pdf
Downloads weekly report in pdf format.
- cURL
 - Go
 - Ruby
 - JavaScript
 - Python
 - Rust
 
curl -X POST https://api.track.toggl.com/reports/api/v3/workspace/{workspace_id}/weekly/time_entries.pdf \
  -H "Content-Type: application/json" \
  -d '\{"billable":"boolean","calculate":"string","cents_separator":"string","client_ids":[\{\}],"date_format":"string","description":"string","duration_format":"string","endTime":"string","end_date":"string","group_by_task":"boolean","group_ids":[\{\}],"grouping":"string","logo_url":"string","max_duration_seconds":"integer","min_duration_seconds":"integer","project_ids":[\{\}],"rounding":"integer","rounding_minutes":"integer","startTime":"string","start_date":"string","tag_ids":[\{\}],"task_ids":[\{\}],"time_entry_ids":[\{\}],"user_ids":[\{\}]\}' \
  -u <email>:<password>
bytes, err := json.Marshal('\{"billable":"boolean","calculate":"string","cents_separator":"string","client_ids":[\{\}],"date_format":"string","description":"string","duration_format":"string","endTime":"string","end_date":"string","group_by_task":"boolean","group_ids":[\{\}],"grouping":"string","logo_url":"string","max_duration_seconds":"integer","min_duration_seconds":"integer","project_ids":[\{\}],"rounding":"integer","rounding_minutes":"integer","startTime":"string","start_date":"string","tag_ids":[\{\}],"task_ids":[\{\}],"time_entry_ids":[\{\}],"user_ids":[\{\}]\}')
if err != nil {
    print(err)
}
req, err := http.NewRequest(http.MethodPost, 
  "https://api.track.toggl.com/reports/api/v3/workspace/{workspace_id}/weekly/time_entries.pdf", bytes.NewBuffer(bytes))
if err != nil {
    print(err)
}
req.Header.Set("Content-Type", "application/json; charset=utf-8")
req.SetBasicAuth("<email>", "<password>")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
    print(err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
    print(err)
}
fmt.Print(string(body))
require 'net/http'
require 'uri'
require 'json'
uri = URI('https://api.track.toggl.com/reports/api/v3/workspace/{workspace_id}/weekly/time_entries.pdf')
http = Net::HTTP.new(uri.host, uri.port)
req = Net::HTTP::Post.new(uri.path)
req['Content-Type'] = "application/json"
req.body = \{"billable":"boolean","calculate":"string","cents_separator":"string","client_ids":[\{\}],"date_format":"string","description":"string","duration_format":"string","endTime":"string","end_date":"string","group_by_task":"boolean","group_ids":[\{\}],"grouping":"string","logo_url":"string","max_duration_seconds":"integer","min_duration_seconds":"integer","project_ids":[\{\}],"rounding":"integer","rounding_minutes":"integer","startTime":"string","start_date":"string","tag_ids":[\{\}],"task_ids":[\{\}],"time_entry_ids":[\{\}],"user_ids":[\{\}]\}.to_json
request.basic_auth '<email>', '<password>'
res = http.request(req)
puts JSON.parse(res.body)
fetch("https://api.track.toggl.com/reports/api/v3/workspace/{workspace_id}/weekly/time_entries.pdf", {
  method: "POST",
  body: \{"billable":"boolean","calculate":"string","cents_separator":"string","client_ids":[\{\}],"date_format":"string","description":"string","duration_format":"string","endTime":"string","end_date":"string","group_by_task":"boolean","group_ids":[\{\}],"grouping":"string","logo_url":"string","max_duration_seconds":"integer","min_duration_seconds":"integer","project_ids":[\{\}],"rounding":"integer","rounding_minutes":"integer","startTime":"string","start_date":"string","tag_ids":[\{\}],"task_ids":[\{\}],"time_entry_ids":[\{\}],"user_ids":[\{\}]\},
  headers: {
	"Content-Type": "application/json",
	"Authorization": `Basic ${base64.encode(<email>:<password>)}`
  },
})
.then((resp) => resp.json())
.then((json) => {
  console.log(json);
})
.catch(err => console.error(err));
import requests
from base64 import b64encode
data = requests.post('https://api.track.toggl.com/reports/api/v3/workspace/{workspace_id}/weekly/time_entries.pdf', json=\{"billable":"boolean","calculate":"string","cents_separator":"string","client_ids":[\{\}],"date_format":"string","description":"string","duration_format":"string","endTime":"string","end_date":"string","group_by_task":"boolean","group_ids":[\{\}],"grouping":"string","logo_url":"string","max_duration_seconds":"integer","min_duration_seconds":"integer","project_ids":[\{\}],"rounding":"integer","rounding_minutes":"integer","startTime":"string","start_date":"string","tag_ids":[\{\}],"task_ids":[\{\}],"time_entry_ids":[\{\}],"user_ids":[\{\}]\}, headers={'content-type': 'application/json', 'Authorization' : 'Basic %s' %  b64encode(b"<email>:<password>").decode("ascii")})
print(data.json())
extern crate tokio;
extern crate serde_json;
use reqwest::{Client};
use reqwest::header::{CONTENT_TYPE};
#[tokio::main]
async fn main() -> Result<(), reqwest::Error> {
  let client = Client::new().basic_auth("<email>", "<password>");
  let json = client.request(Method::POST, "https://api.track.toggl.com/reports/api/v3/workspace/{workspace_id}/weekly/time_entries.pdf".to_string())
.json(&serde_json::json!(\{"billable":"boolean","calculate":"string","cents_separator":"string","client_ids":[\{\}],"date_format":"string","description":"string","duration_format":"string","endTime":"string","end_date":"string","group_by_task":"boolean","group_ids":[\{\}],"grouping":"string","logo_url":"string","max_duration_seconds":"integer","min_duration_seconds":"integer","project_ids":[\{\}],"rounding":"integer","rounding_minutes":"integer","startTime":"string","start_date":"string","tag_ids":[\{\}],"task_ids":[\{\}],"time_entry_ids":[\{\}],"user_ids":[\{\}]\}))
  .header(CONTENT_TYPE, "application/json")
  .send()
  .await?
  .json()
  .await?;
  
  println!("{:#?}", json);
  Ok(())
}
Parameters
Path
| name | type | required | description | 
|---|---|---|---|
| workspace_id | integer | true | Workspace ID | 
Body
| Name | Type | Description | 
|---|---|---|
| billable | boolean | Whether the time entry is set as billable, optional, premium feature. | 
| calculate | string | Calculate option, optional. Can be by time or amounts. | 
| cents_separator | string | - | 
| client_ids | Array of integer | Client IDs, optional, filtering attribute. To filter records with no clients, use [null]. | 
| date_format | string | Date format, optional, default "MM/DD/YYYY". Can be "MM/DD/YYYY", "DD-MM-YYYY", "MM-DD-YYYY", "YYYY-MM-DD", "DD/MM/YYYY" or "DD.MM.YYYY". | 
| description | string | Description, optional, filtering attribute. | 
| duration_format | string | Duration format, optional, default "classic". Can be "classic", "decimal" or "improved". | 
| endTime | string | - | 
| end_date | string | End date, example time.DateOnly. Should be greater than Start date. | 
| group_by_task | boolean | GroupByTask tells the weekly report to return the data grouped by all the usual groups plus planned task. | 
| group_ids | Array of integer | Group IDs, optional, filtering attribute. | 
| grouping | string | Grouping option, optional. | 
| logo_url | string | - | 
| max_duration_seconds | integer | Max duration seconds, optional, filtering attribute. Time Audit only, should be greater than MinDurationSeconds. | 
| min_duration_seconds | integer | Min duration seconds, optional, filtering attribute. Time Audit only, should be less than MaxDurationSeconds. | 
| project_ids | Array of integer | Project IDs, optional, filtering attribute. To filter records with no projects, use [null]. | 
| rounding | integer | Whether time should be rounded, optional, default from user preferences. | 
| rounding_minutes | integer | Rounding minutes value, optional, default from user preferences. Should be 0, 1, 5, 6, 10, 12, 15, 30, 60 or 240. | 
| startTime | string | - | 
| start_date | string | Start date, example time.DateOnly. Should be less than End date. | 
| tag_ids | Array of integer | Tag IDs, optional, filtering attribute. To filter records with no tags, use [null]. | 
| task_ids | Array of integer | Task IDs, optional, filtering attribute. To filter records with no tasks, use [null]. | 
| time_entry_ids | Array of integer | TimeEntryIDs filters by time entries. This was added to support retro-compatibility with reports v2. | 
| user_ids | Array of integer | User IDs, optional, filtering attribute. | 
Response
200
Returns the weekly report in pdf format
400
Possible error messages:
- At least one parameter must be set
 - Invalid workspace id
 - The '{parameter}' parameter is not supported
 - Invalid '{parameter}' value, allowed values are: '{valid_values}'
 
402
Workspace needs to have this feature enabled
403
Workspace not found/accessible
500
Internal Server Error