ProjectsList a project's tasks for moving hours

List a project's tasks for moving hours

Returns a project's active leaf tasks with their parent tasks, as a nested name / ID tree for choosing a move target.

Selects the project's ACTIVE leaf tasks (any task status) and adds all their ancestor tasks, then nests them: root tasks are the entities, sub-tasks sit in Items (recursively). Value = TaskID; Name = the task name, plus " (<task number>)" when the TaskNo feature is on and the task has a number. Parent tasks appear only as containers — time cannot be moved onto them (move / split refuse a parent task). Ordered by the project's task sort order. Unpaged. An unknown, 0 or negative projectId answers 200 with no Entities (captured).

Use it to:

  • Pick TargetTaskId for PUT /v2/adjustments/move-hours or the split halves

Not for:

  • Task search across projects → GET /v1/task/filter

Behaviour:

  • Idempotent.
  • Safe to retry.
  • Changes are visible to the next read immediately.

Call first: GET /v2/adjustments/move-hours/projects

Next: PUT /v2/adjustments/move-hours

See also: GET /v1/task

curl -X GET "https://app3.timelog.com/your-account/api/v2/adjustments/move-hours/projects/123/tasks" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_API_TOKEN"
{
  "Entities": [
    {
      "Properties": {
        "Name": "This is another test (0023)",
        "Value": 52
      }
    },
    {
      "Properties": {
        "Name": "Task 1",
        "Value": 1
      }
    },
    {
      "Properties": {
        "Name": "This is a test (0022)",
        "Value": 51
      }
    },
    {
      "Properties": {
        "Name": "Task 2",
        "Value": 2
      }
    },
    {
      "Properties": {
        "Name": "test task",
        "Value": 16
      }
    }
  ],
  "Links": [
    {
      "Href": "https://app{server-number}.timelog.com/{account}/api/v2/adjustments/move-hours/projects/1/tasks",
      "Rel": "self"
    }
  ]
}
GET
/v2/adjustments/move-hours/projects/{projectId}/tasks
GET
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
projectIdinteger
Required

The project. Not an integer → 404 with empty body (route constraint, captured); unknown / 0 / negative → 200 empty list (captured).

Format: int32
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

projectIdinteger
Required

The project. Not an integer → 404 with empty body (route constraint, captured); unknown / 0 / negative → 200 empty list (captured).

Responses

Entitiesarray

Omitted (not []) when the list is empty.

Linksarray