ProjectsComplete or reopen a milestone

Complete or reopen a milestone

Marks a milestone (or one occurrence of a recurring milestone) as completed or not completed.

Send the MilestoneId and IsRecurring of a GET /v2/milestones/incomplete entity unchanged. isRecurring=true treats id as a recurring-milestone INSTANCE ID and flips only that occurrence's IsCompleted (no event); isRecurring=false treats id as a milestone ID, sets its completion, refreshes the parent task's status, saves it with the caller as modifier and raises MilestoneChangeStatus. Setting the status it already has does nothing. Answers 200 with body null. The flag is trusted: a wrong isRecurring addresses a different milestone that shares the number.

Use it to:

  • Tick off a milestone from a reminder list

Behaviour:

  • Idempotent.
  • Safe to retry.
  • Side effect: Recurring instance: IsCompleted, LastModifiedBy, LastModified updated (no event).
  • Changes are visible to the next read immediately.

Call first: GET /v2/milestones/incomplete

Not yet documented: behaviour → side effects; examples.

curl -X PUT "https://app3.timelog.com/your-account/api/v2/milestones/123/status?isCompleted=true&isRecurring=true" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_API_TOKEN"
"null"
PUT
/v2/milestones/{id}/status
PUT
Base URLstring

Target server for requests. Edit to use your own host.

Bearer Token
Bearer Tokenstring
Required

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.

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.
path
idinteger
Required

MilestoneId from the list: a recurring-instance ID when isRecurring is true, otherwise a milestone ID. Unknown → 500.

Format: int32
query
isCompletedboolean
Required

true = completed, false = reopen. Omitted → 404 (captured).

query
isRecurringboolean
Required

Which ID space id belongs to — pass MilestoneRead.IsRecurring unchanged. Omitted → 404 (captured).

Request Preview
Response

Response will appear here after sending the request

Authentication

header
Authorizationstring
Required

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.

Path Parameters

idinteger
Required

MilestoneId from the list: a recurring-instance ID when isRecurring is true, otherwise a milestone ID. Unknown → 500.

Query Parameters

isCompletedboolean
Required

true = completed, false = reopen. Omitted → 404 (captured).

isRecurringboolean
Required

Which ID space id belongs to — pass MilestoneRead.IsRecurring unchanged. Omitted → 404 (captured).

Responses

*Success without content: HTTP 200 with the literal JSON body null. Body is the JSON literal null (TafSuccessResult), also when nothing changed.

Empty result: Not applicable.*