Reports
POST Generate flexible query report
https://focus.toggl.com/api/reports/workspaces/{workspace_id}/query
Executes a flexible query against the analytics database and returns formatted results.
- cURL
- Go
- Ruby
- JavaScript
- Python
- Rust
curl -X POST https://focus.toggl.com/api/reports/workspaces/{workspace_id}/query \
-H "Content-Type: application/json" \
-d '\{"aggregation_filters":[\{"aggregation":\{"function":"string","property":"string"\},"conditions":[\{"aggregation":\{"function":"string","property":"string"\},"conditions":[\{"aggregation":\{"function":"string","property":"string"\},"conditions":[\{"aggregation":\{\},"conditions":[\{\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"aggregations":[\{"function":"string","property":"string"\}],"attributes":[\{"property":"string"\}],"conversion_date":\{\},"currency":"string","filters":[\{"conditions":[\{"conditions":[\{"conditions":[\{"conditions":[\{\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"groupings":[\{"property":"string","show_empty":"boolean"\}],"limit":"integer","modifiers":\{\},"ordinations":[\{"direction":"string","nulls":"string","property":"string"\}],"pagination":\{"page":"integer","per_page":"integer"\},"period":\{"from":"string","preset":"string","to":"string"\},"transformations":[\{"name":"string","parameters":[\{\}]\}]\}' \
-u <email>:<password>
bytes, err := json.Marshal('\{"aggregation_filters":[\{"aggregation":\{"function":"string","property":"string"\},"conditions":[\{"aggregation":\{"function":"string","property":"string"\},"conditions":[\{"aggregation":\{"function":"string","property":"string"\},"conditions":[\{"aggregation":\{\},"conditions":[\{\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"aggregations":[\{"function":"string","property":"string"\}],"attributes":[\{"property":"string"\}],"conversion_date":\{\},"currency":"string","filters":[\{"conditions":[\{"conditions":[\{"conditions":[\{"conditions":[\{\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"groupings":[\{"property":"string","show_empty":"boolean"\}],"limit":"integer","modifiers":\{\},"ordinations":[\{"direction":"string","nulls":"string","property":"string"\}],"pagination":\{"page":"integer","per_page":"integer"\},"period":\{"from":"string","preset":"string","to":"string"\},"transformations":[\{"name":"string","parameters":[\{\}]\}]\}')
if err != nil {
print(err)
}
req, err := http.NewRequest(http.MethodPost,
"https://focus.toggl.com/api/reports/workspaces/{workspace_id}/query", 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://focus.toggl.com/api/reports/workspaces/{workspace_id}/query')
req = Net::HTTP::Post.new(uri)
req['Content-Type'] = "application/json"
req.body = \{"aggregation_filters":[\{"aggregation":\{"function":"string","property":"string"\},"conditions":[\{"aggregation":\{"function":"string","property":"string"\},"conditions":[\{"aggregation":\{"function":"string","property":"string"\},"conditions":[\{"aggregation":\{\},"conditions":[\{\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"aggregations":[\{"function":"string","property":"string"\}],"attributes":[\{"property":"string"\}],"conversion_date":\{\},"currency":"string","filters":[\{"conditions":[\{"conditions":[\{"conditions":[\{"conditions":[\{\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"groupings":[\{"property":"string","show_empty":"boolean"\}],"limit":"integer","modifiers":\{\},"ordinations":[\{"direction":"string","nulls":"string","property":"string"\}],"pagination":\{"page":"integer","per_page":"integer"\},"period":\{"from":"string","preset":"string","to":"string"\},"transformations":[\{"name":"string","parameters":[\{\}]\}]\}.to_json
req.basic_auth '<email>', '<password>'
res = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') do |http|
http.request(req)
end
puts JSON.parse(res.body)
fetch("https://focus.toggl.com/api/reports/workspaces/{workspace_id}/query", {
method: "POST",
body: \{"aggregation_filters":[\{"aggregation":\{"function":"string","property":"string"\},"conditions":[\{"aggregation":\{"function":"string","property":"string"\},"conditions":[\{"aggregation":\{"function":"string","property":"string"\},"conditions":[\{"aggregation":\{\},"conditions":[\{\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"aggregations":[\{"function":"string","property":"string"\}],"attributes":[\{"property":"string"\}],"conversion_date":\{\},"currency":"string","filters":[\{"conditions":[\{"conditions":[\{"conditions":[\{"conditions":[\{\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"groupings":[\{"property":"string","show_empty":"boolean"\}],"limit":"integer","modifiers":\{\},"ordinations":[\{"direction":"string","nulls":"string","property":"string"\}],"pagination":\{"page":"integer","per_page":"integer"\},"period":\{"from":"string","preset":"string","to":"string"\},"transformations":[\{"name":"string","parameters":[\{\}]\}]\},
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://focus.toggl.com/api/reports/workspaces/{workspace_id}/query', json=\{"aggregation_filters":[\{"aggregation":\{"function":"string","property":"string"\},"conditions":[\{"aggregation":\{"function":"string","property":"string"\},"conditions":[\{"aggregation":\{"function":"string","property":"string"\},"conditions":[\{"aggregation":\{\},"conditions":[\{\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"aggregations":[\{"function":"string","property":"string"\}],"attributes":[\{"property":"string"\}],"conversion_date":\{\},"currency":"string","filters":[\{"conditions":[\{"conditions":[\{"conditions":[\{"conditions":[\{\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"groupings":[\{"property":"string","show_empty":"boolean"\}],"limit":"integer","modifiers":\{\},"ordinations":[\{"direction":"string","nulls":"string","property":"string"\}],"pagination":\{"page":"integer","per_page":"integer"\},"period":\{"from":"string","preset":"string","to":"string"\},"transformations":[\{"name":"string","parameters":[\{\}]\}]\}, 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://focus.toggl.com/api/reports/workspaces/{workspace_id}/query".to_string())
.json(&serde_json::json!(\{"aggregation_filters":[\{"aggregation":\{"function":"string","property":"string"\},"conditions":[\{"aggregation":\{"function":"string","property":"string"\},"conditions":[\{"aggregation":\{"function":"string","property":"string"\},"conditions":[\{"aggregation":\{\},"conditions":[\{\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"aggregations":[\{"function":"string","property":"string"\}],"attributes":[\{"property":"string"\}],"conversion_date":\{\},"currency":"string","filters":[\{"conditions":[\{"conditions":[\{"conditions":[\{"conditions":[\{\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"groupings":[\{"property":"string","show_empty":"boolean"\}],"limit":"integer","modifiers":\{\},"ordinations":[\{"direction":"string","nulls":"string","property":"string"\}],"pagination":\{"page":"integer","per_page":"integer"\},"period":\{"from":"string","preset":"string","to":"string"\},"transformations":[\{"name":"string","parameters":[\{\}]\}]\}))
.header(CONTENT_TYPE, "application/json")
.send()
.await?
.json()
.await?;
println!("{:#?}", json);
Ok(())
}
Parameters
Path
| name | type | required | description |
|---|---|---|---|
| workspace_id | integer | true | workspace ID |
Query
| name | type | required | description |
|---|---|---|---|
| response_format | string | false | response data format |
| include_dicts | boolean | false | include dictionary data in response |
Body
| Name | Type | Description |
|---|---|---|
| aggregation_filters | Array of object | - |
| aggregations | Array of object | - |
| attributes | Array of object | - |
| conversion_date | object | ConversionDate is the profitability report's optional "as of" date: every converted value is looked up at this one date instead of each row's own business/fee date. Optional — omitted means each row uses its own date. Applies to actuals and fixed fees; the forecast always converts at today. A date past our latest published rate falls back to that latest rate (no error). Has no effect unless the request selects a converted property (converted_revenue / converted_labor_cost). |
| currency | string | Currency is the profitability report's FX-conversion target (ISO 4217). Optional: when omitted, the converted properties target the workspace's configured currency. Malformed input is a 400. Has no effect unless the request selects a converted property (converted_revenue / converted_labor_cost). |
| filters | Array of object | - |
| groupings | Array of object | - |
| limit | integer | - |
| modifiers | object | - |
| ordinations | Array of object | - |
| pagination | object | - |
| period | object | - |
| transformations | Array of object | - |
aggregation_filters
| Name | Type | Description |
|---|---|---|
| aggregation | object | - |
| conditions | Array of object | - |
| operator | string | - |
| property | string | - |
| value | object | - |
aggregation
| Name | Type | Description |
|---|---|---|
| function | string | - |
| property | string | - |
conditions
| Name | Type | Description |
|---|---|---|
| aggregation | object | - |
| conditions | Array of object | - |
| operator | string | - |
| property | string | - |
| value | object | - |
aggregation
| Name | Type | Description |
|---|---|---|
| function | string | - |
| property | string | - |
conditions
| Name | Type | Description |
|---|---|---|
| aggregation | object | - |
| conditions | Array of object | - |
| operator | string | - |
| property | string | - |
| value | object | - |
aggregation
| Name | Type | Description |
|---|---|---|
| function | string | - |
| property | string | - |
conditions
| Name | Type | Description |
|---|---|---|
| aggregation | object | - |
| conditions | Array of object | - |
| operator | string | - |
| property | string | - |
| value | object | - |
aggregations
| Name | Type | Description |
|---|---|---|
| function | string | - |
| property | string | - |
attributes
| Name | Type | Description |
|---|---|---|
| property | string | - |
conversion_date
filters
| Name | Type | Description |
|---|---|---|
| conditions | Array of object | - |
| operator | string | - |
| property | string | - |
| value | object | - |
conditions
| Name | Type | Description |
|---|---|---|
| conditions | Array of object | - |
| operator | string | - |
| property | string | - |
| value | object | - |
conditions
| Name | Type | Description |
|---|---|---|
| conditions | Array of object | - |
| operator | string | - |
| property | string | - |
| value | object | - |
conditions
| Name | Type | Description |
|---|---|---|
| conditions | Array of object | - |
| operator | string | - |
| property | string | - |
| value | object | - |
groupings
| Name | Type | Description |
|---|---|---|
| property | string | - |
| show_empty | boolean | - |
modifiers
ordinations
| Name | Type | Description |
|---|---|---|
| direction | string | - |
| nulls | string | - |
| property | string | - |
pagination
| Name | Type | Description |
|---|---|---|
| page | integer | - |
| per_page | integer | - |
period
| Name | Type | Description |
|---|---|---|
| from | string | - |
| preset | string | - |
| to | string | - |
transformations
| Name | Type | Description |
|---|---|---|
| name | string | - |
| parameters | Array of Object | - |
Response
200
Report as JSON
| Name | Type | Description |
|---|---|---|
| data_hierarchical | object | - |
| data_json_row | Array of object | - |
| data_table | object | - |
| dictionaries | object | - |
| total_count | integer | - |
data_hierarchical
data_json_row
dictionaries
| Name | Type | Description |
|---|---|---|
| clients | object | - |
| custom_field_options | object | - |
| custom_fields | object | - |
| groups | object | - |
| projects | object | - |
| status | object | - |
| tags | object | - |
| tasks | object | - |
| user_tags | object | - |
| users | object | - |
clients
custom_field_options
custom_fields
groups
projects
status
tags
tasks
user_tags
users
400
Invalid request parameters
401
Unauthorized
402
Report view quota exceeded
403
Forbidden — the plan lacks the report export entitlement
422
Currency conversion requested but an FX rate is missing for the period
500
Internal server error
POST Generate dictionary from filters
https://focus.toggl.com/api/reports/workspaces/{workspace_id}/query/dictionary
Generates a dictionary containing task, project, client, and status information based on the provided filters.
- cURL
- Go
- Ruby
- JavaScript
- Python
- Rust
curl -X POST https://focus.toggl.com/api/reports/workspaces/{workspace_id}/query/dictionary \
-H "Content-Type: application/json" \
-d '[\{"conditions":[\{"conditions":[\{"conditions":[\{"conditions":[\{"conditions":[\{\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}]' \
-u <email>:<password>
bytes, err := json.Marshal('[\{"conditions":[\{"conditions":[\{"conditions":[\{"conditions":[\{"conditions":[\{\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}]')
if err != nil {
print(err)
}
req, err := http.NewRequest(http.MethodPost,
"https://focus.toggl.com/api/reports/workspaces/{workspace_id}/query/dictionary", 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://focus.toggl.com/api/reports/workspaces/{workspace_id}/query/dictionary')
req = Net::HTTP::Post.new(uri)
req['Content-Type'] = "application/json"
req.body = [\{"conditions":[\{"conditions":[\{"conditions":[\{"conditions":[\{"conditions":[\{\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}].to_json
req.basic_auth '<email>', '<password>'
res = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') do |http|
http.request(req)
end
puts JSON.parse(res.body)
fetch("https://focus.toggl.com/api/reports/workspaces/{workspace_id}/query/dictionary", {
method: "POST",
body: [\{"conditions":[\{"conditions":[\{"conditions":[\{"conditions":[\{"conditions":[\{\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],
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://focus.toggl.com/api/reports/workspaces/{workspace_id}/query/dictionary', json=[\{"conditions":[\{"conditions":[\{"conditions":[\{"conditions":[\{"conditions":[\{\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}], 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://focus.toggl.com/api/reports/workspaces/{workspace_id}/query/dictionary".to_string())
.json(&serde_json::json!([\{"conditions":[\{"conditions":[\{"conditions":[\{"conditions":[\{"conditions":[\{\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}]))
.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 |
|---|---|---|
| items | Array of object | - |
items
| Name | Type | Description |
|---|---|---|
| conditions | Array of object | - |
| operator | string | - |
| property | string | - |
| value | object | - |
conditions
| Name | Type | Description |
|---|---|---|
| conditions | Array of object | - |
| operator | string | - |
| property | string | - |
| value | object | - |
conditions
| Name | Type | Description |
|---|---|---|
| conditions | Array of object | - |
| operator | string | - |
| property | string | - |
| value | object | - |
conditions
| Name | Type | Description |
|---|---|---|
| conditions | Array of object | - |
| operator | string | - |
| property | string | - |
| value | object | - |
conditions
| Name | Type | Description |
|---|---|---|
| conditions | Array of object | - |
| operator | string | - |
| property | string | - |
| value | object | - |
Response
200
Successfully generated dictionary
| Name | Type | Description |
|---|---|---|
| clients | object | - |
| custom_field_options | object | - |
| custom_fields | object | - |
| groups | object | - |
| projects | object | - |
| status | object | - |
| tags | object | - |
| tasks | object | - |
| user_tags | object | - |
| users | object | - |
clients
custom_field_options
custom_fields
groups
projects
status
tags
tasks
user_tags
users
400
Invalid request parameters
401
Unauthorized
403
Forbidden
500
Internal server error
POST Generate workload report
https://focus.toggl.com/api/reports/workspaces/{workspace_id}/workload
Generates a workload report based on the given input. Breakdown reports (grouped by user_account_id) support optional pagination via 'page' and 'per_page'. Paginated response includes 'total_count' with the total number of users matching the filters. An ordination on 'user_account_id' ('asc' or 'desc') orders breakdown members by display name across the whole result, not just the current page; it defaults to ascending. Ordinations on other properties are passed through to the reporting engine. Totals rows, trend buckets, and breakdown nodes include working, scheduled, scheduled draft, and scheduled remaining sums in minutes. The fields are 'sum_working_minutes', 'sum_scheduled_minutes', 'sum_scheduled_draft_minutes', and 'sum_scheduled_remaining_minutes'. Scheduled minutes cover non-draft task estimates, projected unmaterialized recurring periods, and planned calendar events. Scheduled draft minutes are gross task estimates from visible draft projects. Zero means none or not visible. A draft legacy calendar task can overlap with its still-planned calendar event, so the draft and scheduled sums are not strictly additive. Scheduled remaining minutes net each assignee's tracked time and roll unfinished estimates forward from workspace-local today. Past and overdue task slices are zero, while planned events count only from today.
- cURL
- Go
- Ruby
- JavaScript
- Python
- Rust
curl -X POST https://focus.toggl.com/api/reports/workspaces/{workspace_id}/workload \
-H "Content-Type: application/json" \
-d '\{"aggregation_filters":[\{"aggregation":\{"function":"string","property":"string"\},"conditions":[\{"aggregation":\{"function":"string","property":"string"\},"conditions":[\{"aggregation":\{"function":"string","property":"string"\},"conditions":[\{"aggregation":\{\},"conditions":[\{\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"aggregations":[\{"function":"string","property":"string"\}],"attributes":[\{"property":"string"\}],"conversion_date":\{\},"currency":"string","filters":[\{"conditions":[\{"conditions":[\{"conditions":[\{"conditions":[\{\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"groupings":[\{"property":"string","show_empty":"boolean"\}],"limit":"integer","modifiers":\{\},"ordinations":[\{"direction":"string","nulls":"string","property":"string"\}],"pagination":\{"page":"integer","per_page":"integer"\},"period":\{"from":"string","preset":"string","to":"string"\},"transformations":[\{"name":"string","parameters":[\{\}]\}]\}' \
-u <email>:<password>
bytes, err := json.Marshal('\{"aggregation_filters":[\{"aggregation":\{"function":"string","property":"string"\},"conditions":[\{"aggregation":\{"function":"string","property":"string"\},"conditions":[\{"aggregation":\{"function":"string","property":"string"\},"conditions":[\{"aggregation":\{\},"conditions":[\{\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"aggregations":[\{"function":"string","property":"string"\}],"attributes":[\{"property":"string"\}],"conversion_date":\{\},"currency":"string","filters":[\{"conditions":[\{"conditions":[\{"conditions":[\{"conditions":[\{\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"groupings":[\{"property":"string","show_empty":"boolean"\}],"limit":"integer","modifiers":\{\},"ordinations":[\{"direction":"string","nulls":"string","property":"string"\}],"pagination":\{"page":"integer","per_page":"integer"\},"period":\{"from":"string","preset":"string","to":"string"\},"transformations":[\{"name":"string","parameters":[\{\}]\}]\}')
if err != nil {
print(err)
}
req, err := http.NewRequest(http.MethodPost,
"https://focus.toggl.com/api/reports/workspaces/{workspace_id}/workload", 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://focus.toggl.com/api/reports/workspaces/{workspace_id}/workload')
req = Net::HTTP::Post.new(uri)
req['Content-Type'] = "application/json"
req.body = \{"aggregation_filters":[\{"aggregation":\{"function":"string","property":"string"\},"conditions":[\{"aggregation":\{"function":"string","property":"string"\},"conditions":[\{"aggregation":\{"function":"string","property":"string"\},"conditions":[\{"aggregation":\{\},"conditions":[\{\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"aggregations":[\{"function":"string","property":"string"\}],"attributes":[\{"property":"string"\}],"conversion_date":\{\},"currency":"string","filters":[\{"conditions":[\{"conditions":[\{"conditions":[\{"conditions":[\{\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"groupings":[\{"property":"string","show_empty":"boolean"\}],"limit":"integer","modifiers":\{\},"ordinations":[\{"direction":"string","nulls":"string","property":"string"\}],"pagination":\{"page":"integer","per_page":"integer"\},"period":\{"from":"string","preset":"string","to":"string"\},"transformations":[\{"name":"string","parameters":[\{\}]\}]\}.to_json
req.basic_auth '<email>', '<password>'
res = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') do |http|
http.request(req)
end
puts JSON.parse(res.body)
fetch("https://focus.toggl.com/api/reports/workspaces/{workspace_id}/workload", {
method: "POST",
body: \{"aggregation_filters":[\{"aggregation":\{"function":"string","property":"string"\},"conditions":[\{"aggregation":\{"function":"string","property":"string"\},"conditions":[\{"aggregation":\{"function":"string","property":"string"\},"conditions":[\{"aggregation":\{\},"conditions":[\{\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"aggregations":[\{"function":"string","property":"string"\}],"attributes":[\{"property":"string"\}],"conversion_date":\{\},"currency":"string","filters":[\{"conditions":[\{"conditions":[\{"conditions":[\{"conditions":[\{\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"groupings":[\{"property":"string","show_empty":"boolean"\}],"limit":"integer","modifiers":\{\},"ordinations":[\{"direction":"string","nulls":"string","property":"string"\}],"pagination":\{"page":"integer","per_page":"integer"\},"period":\{"from":"string","preset":"string","to":"string"\},"transformations":[\{"name":"string","parameters":[\{\}]\}]\},
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://focus.toggl.com/api/reports/workspaces/{workspace_id}/workload', json=\{"aggregation_filters":[\{"aggregation":\{"function":"string","property":"string"\},"conditions":[\{"aggregation":\{"function":"string","property":"string"\},"conditions":[\{"aggregation":\{"function":"string","property":"string"\},"conditions":[\{"aggregation":\{\},"conditions":[\{\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"aggregations":[\{"function":"string","property":"string"\}],"attributes":[\{"property":"string"\}],"conversion_date":\{\},"currency":"string","filters":[\{"conditions":[\{"conditions":[\{"conditions":[\{"conditions":[\{\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"groupings":[\{"property":"string","show_empty":"boolean"\}],"limit":"integer","modifiers":\{\},"ordinations":[\{"direction":"string","nulls":"string","property":"string"\}],"pagination":\{"page":"integer","per_page":"integer"\},"period":\{"from":"string","preset":"string","to":"string"\},"transformations":[\{"name":"string","parameters":[\{\}]\}]\}, 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://focus.toggl.com/api/reports/workspaces/{workspace_id}/workload".to_string())
.json(&serde_json::json!(\{"aggregation_filters":[\{"aggregation":\{"function":"string","property":"string"\},"conditions":[\{"aggregation":\{"function":"string","property":"string"\},"conditions":[\{"aggregation":\{"function":"string","property":"string"\},"conditions":[\{"aggregation":\{\},"conditions":[\{\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"aggregations":[\{"function":"string","property":"string"\}],"attributes":[\{"property":"string"\}],"conversion_date":\{\},"currency":"string","filters":[\{"conditions":[\{"conditions":[\{"conditions":[\{"conditions":[\{\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"groupings":[\{"property":"string","show_empty":"boolean"\}],"limit":"integer","modifiers":\{\},"ordinations":[\{"direction":"string","nulls":"string","property":"string"\}],"pagination":\{"page":"integer","per_page":"integer"\},"period":\{"from":"string","preset":"string","to":"string"\},"transformations":[\{"name":"string","parameters":[\{\}]\}]\}))
.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 |
|---|---|---|
| aggregation_filters | Array of object | - |
| aggregations | Array of object | - |
| attributes | Array of object | - |
| conversion_date | object | ConversionDate is the profitability report's optional "as of" date: every converted value is looked up at this one date instead of each row's own business/fee date. Optional — omitted means each row uses its own date. Applies to actuals and fixed fees; the forecast always converts at today. A date past our latest published rate falls back to that latest rate (no error). Has no effect unless the request selects a converted property (converted_revenue / converted_labor_cost). |
| currency | string | Currency is the profitability report's FX-conversion target (ISO 4217). Optional: when omitted, the converted properties target the workspace's configured currency. Malformed input is a 400. Has no effect unless the request selects a converted property (converted_revenue / converted_labor_cost). |
| filters | Array of object | - |
| groupings | Array of object | - |
| limit | integer | - |
| modifiers | object | - |
| ordinations | Array of object | - |
| pagination | object | - |
| period | object | - |
| transformations | Array of object | - |
aggregation_filters
| Name | Type | Description |
|---|---|---|
| aggregation | object | - |
| conditions | Array of object | - |
| operator | string | - |
| property | string | - |
| value | object | - |
aggregation
| Name | Type | Description |
|---|---|---|
| function | string | - |
| property | string | - |
conditions
| Name | Type | Description |
|---|---|---|
| aggregation | object | - |
| conditions | Array of object | - |
| operator | string | - |
| property | string | - |
| value | object | - |
aggregation
| Name | Type | Description |
|---|---|---|
| function | string | - |
| property | string | - |
conditions
| Name | Type | Description |
|---|---|---|
| aggregation | object | - |
| conditions | Array of object | - |
| operator | string | - |
| property | string | - |
| value | object | - |
aggregation
| Name | Type | Description |
|---|---|---|
| function | string | - |
| property | string | - |
conditions
| Name | Type | Description |
|---|---|---|
| aggregation | object | - |
| conditions | Array of object | - |
| operator | string | - |
| property | string | - |
| value | object | - |
aggregations
| Name | Type | Description |
|---|---|---|
| function | string | - |
| property | string | - |
attributes
| Name | Type | Description |
|---|---|---|
| property | string | - |
conversion_date
filters
| Name | Type | Description |
|---|---|---|
| conditions | Array of object | - |
| operator | string | - |
| property | string | - |
| value | object | - |
conditions
| Name | Type | Description |
|---|---|---|
| conditions | Array of object | - |
| operator | string | - |
| property | string | - |
| value | object | - |
conditions
| Name | Type | Description |
|---|---|---|
| conditions | Array of object | - |
| operator | string | - |
| property | string | - |
| value | object | - |
conditions
| Name | Type | Description |
|---|---|---|
| conditions | Array of object | - |
| operator | string | - |
| property | string | - |
| value | object | - |
groupings
| Name | Type | Description |
|---|---|---|
| property | string | - |
| show_empty | boolean | - |
modifiers
ordinations
| Name | Type | Description |
|---|---|---|
| direction | string | - |
| nulls | string | - |
| property | string | - |
pagination
| Name | Type | Description |
|---|---|---|
| page | integer | - |
| per_page | integer | - |
period
| Name | Type | Description |
|---|---|---|
| from | string | - |
| preset | string | - |
| to | string | - |
transformations
| Name | Type | Description |
|---|---|---|
| name | string | - |
| parameters | Array of Object | - |
Response
200
Successfully generated workload report
| Name | Type | Description |
|---|---|---|
| data_hierarchical | object | - |
| data_json_row | Array of object | - |
| data_table | object | - |
| dictionaries | object | - |
| total_count | integer | - |
data_hierarchical
data_json_row
dictionaries
| Name | Type | Description |
|---|---|---|
| clients | object | - |
| custom_field_options | object | - |
| custom_fields | object | - |
| groups | object | - |
| projects | object | - |
| status | object | - |
| tags | object | - |
| tasks | object | - |
| user_tags | object | - |
| users | object | - |
clients
custom_field_options
custom_fields
groups
projects
status
tags
tasks
user_tags
users
400
Invalid request parameters
403
Insufficient permissions
500
Internal server error