Get my added value per month, own hours only (Insights widget)
Insights endpoint hour-kpi-per-month-hours-only-widget-data (widget title 'Added value per month (only My hours)'). Help text: 'Shows the monthly value added for the fiscal year. It displays either the registered or the estimated value. All amounts are in {{currency}}, with invoices in other currencies being converted. Internal hours hold a zero value, and absence hours are omitted … accumulates the year-to-date values …'. Same body shape as hour-kpi-per-month. PASS-THROUGH PROXY. Insights' HTTP status, headers and body are returned to the caller unchanged. The controller says it exists only so the React frontend can reach Insights and must not be used for anything else.
Use it to:
- Show an employee the sales value of their own registered hours per month
Not for:
- Revenue or invoicing reporting — use the reporting / invoice APIs
- Anything outside the front-page widget (controller comment)
Behaviour:
- Read-after-write consistency: not yet documented.
Not yet documented: behaviour; examples; purpose → description; response → default ordering; response → empty result; response → pagination; response → success.
curl -X GET "https://app3.timelog.com/your-account/api/v2/insights-service/hour-kpi-per-month-hours-only" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_TOKEN"
import requests
import json
url = "https://app3.timelog.com/your-account/api/v2/insights-service/hour-kpi-per-month-hours-only"
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN"
}
response = requests.get(url, headers=headers)
print(response.json())
const response = await fetch("https://app3.timelog.com/your-account/api/v2/insights-service/hour-kpi-per-month-hours-only", {
method: "GET",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN"
}
});
const data = await response.json();
console.log(data);
package main
import (
"fmt"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "https://app3.timelog.com/your-account/api/v2/insights-service/hour-kpi-per-month-hours-only", nil)
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer YOUR_API_TOKEN")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
fmt.Println("Response Status:", resp.Status)
}
require 'net/http'
require 'json'
uri = URI('https://app3.timelog.com/your-account/api/v2/insights-service/hour-kpi-per-month-hours-only')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Get.new(uri)
request['Content-Type'] = 'application/json'
request['Authorization'] = 'Bearer YOUR_API_TOKEN'
response = http.request(request)
puts response.body
{
"Properties": {
"type": "example_string",
"width": 3.14,
"height": 3.14,
"sortOrder": 3.14,
"baseCurrencyAbb": "example_string",
"data": {
"hourKPIPerMonths": [
{
"year": 3.14,
"month": "example_string",
"amountRegistered": 3.14,
"amountEstimated": 3.14,
"hours": 3.14,
"hoursEstimated": 3.14,
"estimatedAmountYTD": 3.14,
"registeredAmountYTD": 3.14,
"hoursYTD": 3.14,
"hoursEstimatedYTD": 3.14
}
]
}
},
"Links": [
{
"Href": "example_string",
"Rel": "example_string"
}
],
"Actions": [
{}
]
}
{
"error": "Unauthorized",
"message": "Authentication required. Please provide a valid API token",
"code": 401
}
{
"error": "Internal Server Error",
"message": "An unexpected error occurred on the server",
"code": 500,
"requestId": "req_1234567890"
}
{
"Code": 42,
"Message": "example_string",
"Details": [
"null"
],
"Parameters": "null",
"Url": "example_string"
}
/v2/insights-service/hour-kpi-per-month-hours-only
Target server for requests. Edit to use your own host.
OAuth 2.0 bearer token, sent as Authorization: Bearer <token>. JWT and reference tokens are both accepted. The token must carry the required scope (default tlp).
The token's sub claim is the acting user. A token WITHOUT sub (client-credentials) acts as the system service user. If the sub user cannot log in (inactive, locked, deleted), the request is rejected with 401 — it is no longer let through without a user.
> Not yet documented: how to obtain a token.
> Not yet documented: token lifetime.
Authorization: Bearer <token>. JWT and reference tokens are both accepted. The token must carry the required scope (default tlp).
The token's sub claim is the acting user. A token WITHOUT sub (client-credentials) acts as the system service user. If the sub user cannot log in (inactive, locked, deleted), the request is rejected with 401 — it is no longer let through without a user.
> Not yet documented: how to obtain a token.
> Not yet documented: token lifetime.Request Preview
Response
Response will appear here after sending the request
Authentication
Bearer token. OAuth 2.0 bearer token, sent as Authorization: Bearer <token>. JWT and reference tokens are both accepted. The token must carry the required scope (default tlp).
The token's sub claim is the acting user. A token WITHOUT sub (client-credentials) acts as the system service user. If the sub user cannot log in (inactive, locked, deleted), the request is rejected with 401 — it is no longer let through without a user.
Not yet documented: how to obtain a token.
Not yet documented: token lifetime.
Responses
Added value per month for the fiscal year (used by hour-kpi-per-month and hour-kpi-per-month-hours-only). Not paged; data.hourKPIPerMonths holds one row per month. CONSUMER-DECLARED SHAPE. Meanings come from the frontend's use and the product's widget help text, not from the producer.
Not yet documented: source type.