List my incomplete milestones due by a date
Lists the milestones the caller is responsible for that are not completed and due on or before a date (overdue included), paged.
Returns the incomplete milestones whose responsible employee is the CALLER (recurring milestones as their individual instances, each with its own responsible employee and date), due on or before dueDate — overdue ones included — on active, non-template projects, earliest due date first, paged with $page / $pagesize (default 10) and a TotalRecord count. The controller is marked with FeaturePolicy(ShowMileStones), but that attribute only hides TAF links / actions: the route answers with the feature off too.
Use it to:
- Remind a user of milestones that are due or overdue
Not for:
- A project's milestone plan → not exposed in REST v2
Behaviour:
- Idempotent.
- Safe to retry.
- Changes are visible to the next read immediately.
Next: PUT /v2/milestones/{id}/status
Not yet documented: examples; response → success.
curl -X GET "https://app3.timelog.com/your-account/api/v2/milestones/incomplete?dueDate=2024-12-25T10%3A00%3A00Z&$page=1&$pagesize=10" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_TOKEN"
import requests
import json
url = "https://app3.timelog.com/your-account/api/v2/milestones/incomplete?dueDate=2024-12-25T10%3A00%3A00Z&$page=1&$pagesize=10"
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/milestones/incomplete?dueDate=2024-12-25T10%3A00%3A00Z&$page=1&$pagesize=10", {
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/milestones/incomplete?dueDate=2024-12-25T10%3A00%3A00Z&$page=1&$pagesize=10", 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/milestones/incomplete?dueDate=2024-12-25T10%3A00%3A00Z&$page=1&$pagesize=10')
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": {
"TotalRecord": "example_string",
"TotalPage": "example_string",
"PageNumber": "example_string"
},
"Entities": [
{
"Properties": {
"MilestoneId": 123,
"ProjectId": 123,
"ProjectName": "John Doe",
"ProjectNo": "null",
"ProjectNameFormatted": "null",
"DueDate": "2024-12-25T10:00:00Z",
"EmployeeId": 123,
"Name": "John Doe",
"IsCompleted": true,
"IsRecurring": true,
"Wbs": "null",
"No": "null",
"MilestoneTypeId": 123,
"DepartmentId": 123
},
"Links": [
{
"Href": "example_string",
"Rel": "example_string"
}
],
"Actions": [
{}
]
}
],
"Links": [
{
"Href": "example_string",
"Rel": "example_string"
}
]
}
{
"error": "Bad Request",
"message": "The request contains invalid parameters or malformed data",
"code": 400,
"details": [
{
"field": "email",
"message": "Invalid email format"
}
]
}
{
"error": "Unauthorized",
"message": "Authentication required. Please provide a valid API token",
"code": 401
}
{
"error": "Not Found",
"message": "The requested resource was not found",
"code": 404
}
/v2/milestones/incomplete
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.Latest due date (inclusive). Omitted → 404 action not matched (captured).
Filters on MilestoneRead.DueDate (lte).
Page number.
Page size. $top / $skip are parsed but ignored; no sort parameter.
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.
Query Parameters
Latest due date (inclusive). Omitted → 404 action not matched (captured).
Filters on MilestoneRead.DueDate (lte).
Page number.
Page size. $top / $skip are parsed but ignored; no sort parameter.
Responses
Paging values. They are returned as STRINGS, for example "TotalRecord": "12".
Omitted (not []) when the list is empty.