TimeCamp Tasks and Projects API

Manage the task and project tree that time is tracked against - create, update, and delete tasks, fetch task details, set task colors and tags. The v3 surface adds project listing and search, user assignment to projects, task duplication, archiving and restoring in batches, moving worklogs, and re-parenting tasks.

OpenAPI Specification

timecamp-openapi.yml Raw ↑
openapi: 3.0.0
info:
  title: TimeCamp API
  version: '1.0'
  contact:
    email: support@timecamp.com
  termsOfService: https://www.timecamp.com/terms-conditions/
  description: |
    Documentation for the TimeCamp system.

    Get your API token here:
    https://app.timecamp.com/app#/settings/users/me

    Be aware that you can reach API calls limit. Once you do you will get HTTP code 429 response.

    Request example:

    ```
    GET https://app.timecamp.com/third_party/api/user?user_id=1234567

    Headers:
    Authorization: Bearer 87c21299960a88888888fe123
    Accept: application/json
    ```
servers:
  - url: https://app.timecamp.com/third_party/api
    description: PRODUCTION
  - url: https://v4.api.timecamp.com
    description: PRODUCTION
tags:
  - name: '[v1] User'
    x-displayName: User
  - name: '[v1] Entry'
    x-displayName: Entry
  - name: '[v1] Tags'
    x-displayName: Tags
  - name: '[v1] Group'
    x-displayName: Group
  - name: '[v1] Approvals'
    x-displayName: Approvals
  - name: '[v1] Computer Activities'
    x-displayName: Computer Activities
  - name: '[v1] Timer'
    x-displayName: Timer
  - name: '[v1] Task'
    x-displayName: Task
  - name: '[v1] Attendance'
    x-displayName: Attendance
  - name: '[v1] Roles & Permissions'
    x-displayName: Roles & Permissions
  - name: '[v1] Billing Rates'
    x-displayName: Billing Rates
  - name: '[v1] Userlog'
    x-displayName: Userlog
  - name: '[v1] Activity alert'
    x-displayName: Activity alert
  - name: '[v3] Timer'
    x-displayName: Timer
  - name: '[v3] Invoices'
    x-displayName: Invoices
  - name: '[v3] Computer Activities'
    x-displayName: Computer Activities
  - name: '[v3] Time Entry'
    x-displayName: Time Entry
  - name: '[v3] Time Entry Restriction'
    x-displayName: Time Entry Restriction
  - name: '[v3] Task Archive'
    x-displayName: Task Archive
  - name: '[v3] Expense'
    x-displayName: Expense
  - name: '[v3] Plan'
    x-displayName: Plan
  - name: '[v3] Storage'
    x-displayName: Storage
  - name: '[v3] Module'
    x-displayName: Module
  - name: '[v3] Marketplace'
    x-displayName: Marketplace
  - name: '[v3] Remote work detection'
    x-displayName: Remote work detection
  - name: '[v3] Data Export'
    x-displayName: Data Export
  - name: '[v3] Custom Fields'
    x-displayName: Custom Fields
  - name: '[v3] Approval'
    x-displayName: Approval
  - name: '[v3] Groups Stats'
    x-displayName: Groups Stats
  - name: '[v3] Location'
    x-displayName: Location
  - name: '[v3] Task Picker'
    x-displayName: TaskPicker
  - name: '[v3] Task'
    x-displayName: Task
  - name: '[v3] Tags'
    x-displayName: Tags
  - name: '[v3] Projects'
    x-displayName: Projects
  - name: '[v3] Pivot'
    x-displayName: Pivot
  - name: '[v3] Attendance'
    x-displayName: Attendance
  - name: '[v3] Attendance Requests'
    x-displayName: Attendance Requests
paths:
  /timer_running:
    get:
      summary: Get information about running timer
      tags:
        - '[v1] Timer'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                description: ''
                minItems: 1
                uniqueItems: true
                items:
                  type: object
                  properties:
                    timer_id:
                      oneOf:
                        - type: string
                        - type: number
                      minLength: 1
                    user_id:
                      oneOf:
                        - type: string
                        - type: number
                      minLength: 1
                    task_id:
                      oneOf:
                        - type: number
                        - type: string
                      nullable: true
                    started_at:
                      type: string
                      minLength: 1
                    name:
                      type: string
                      nullable: true
                  required:
                    - timer_id
                    - user_id
                    - started_at
              examples:
                info about running timer with no task:
                  value:
                    - timer_id: '18'
                      user_id: '123'
                      task_id: null
                      started_at: '2021-03-05 14:52:06'
                      name: null
      operationId: get-timer_running
      description: Returns information about running timer.
      security:
        - api_key_in_header: []
  /entries_merge:
    post:
      operationId: post--entries_merge
      description: Merge two time entries into one.
      tags:
        - '[v1] Entry'
      summary: Merge time entries
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                id:
                  type: string
                  description: 'first entry id to merge '
                to_id:
                  type: string
                  description: second entry id to merge
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                description: ''
                type: object
                properties:
                  entry_id:
                    oneOf:
                      - type: string
                      - type: integer
                  user_id:
                    oneOf:
                      - type: string
                      - type: integer
                    minLength: 1
                  date:
                    type: string
                    minLength: 1
                  task_id:
                    oneOf:
                      - type: string
                      - type: integer
                    minLength: 1
                  time_span:
                    type: number
                  locked:
                    oneOf:
                      - type: string
                      - type: integer
                    minLength: 1
                  last_modify:
                    type: string
                    minLength: 1
                  note:
                    type: string
                  start_time_hour:
                    type: string
                    minLength: 1
                  end_time_hour:
                    type: string
                    minLength: 1
                  invoiceId:
                    oneOf:
                      - type: string
                      - type: integer
                    minLength: 1
                  billable:
                    oneOf:
                      - type: string
                      - type: integer
                    minLength: 1
              examples:
                merged two entries:
                  value:
                    entry_id: 105445325
                    user_id: '5252'
                    date: '2020-02-02'
                    task_id: '0'
                    time_span: 4857
                    locked: '0'
                    last_modify: '2021-03-10 09:08:30'
                    note: ''
                    start_time_hour: '13:05:47'
                    end_time_hour: '14:24:41'
                    invoiceId: '0'
                    billable: '0'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
              examples:
                approval blocked:
                  value:
                    message: You can't edit time entry, because it is in approved or pending timesheet approval.
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
              examples:
                entry not found:
                  value:
                    message: Entry not found
        '406':
          description: Not Acceptable
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
              examples:
                provided same entries:
                  value:
                    message: You must provide different entries
                different users:
                  value:
                    message: Both entries must belong to the same user
      security:
        - api_key_in_header: []
  /entries_changes:
    get:
      operationId: get--entries_changes
      description: Get time enties changes.
      responses:
        '200':
          description: If task or tasks are not found then empty array is returned with 200 code.
          content:
            application/json:
              schema:
                type: array
                items: {}
              examples:
                empty:
                  value: []
                ok response:
                  value:
                    - old_time_span: 0
                      new_time_span: '0'
                      event_type: add
                      edited: '2020-02-10 05:05:05'
                      entry_id: '104950298'
                      duration: '0'
                      user_id: '5343'
                      description: ''
                      task_id: '77438101'
                      date: '2021-02-10'
                      start_time: '13:04:00'
                      end_time: '13:04:00'
                      locked: '0'
                      billable: 1
                      invoiceId: '0'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
              examples:
                dates not provided:
                  value:
                    message: 'you must provide "from" and "to" date like 2013-03-20 '
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
              examples:
                not permitted:
                  value:
                    message: you do not have permissions to get task with id {taskId} (you can set yourself as Time Tracking Administrator or Project Manager)
      tags:
        - '[v1] Entry'
      summary: Get time entries changes
      parameters:
        - schema:
            type: string
            example: 12,13,32
          in: query
          name: task_ids
          description: entry task id or ids
        - schema:
            type: string
            example: 45,55,64
          in: query
          name: user_ids
          description: entry user id or ids
        - schema:
            type: integer
          in: query
          name: limit
          description: number of results to get, if empty then get all of them
        - schema:
            type: string
            example: '2020-02-02'
          in: query
          name: from
          description: date in `YYYY-MM-DD` format
        - schema:
            type: string
            example: '2020-02-02'
          in: query
          name: to
          description: date in `YYYY-MM-DD` format
      security:
        - api_key_in_header: []
  /entries_deletions:
    get:
      operationId: get--entries_deletions
      description: Get time enties deletions.
      responses:
        '200':
          description: If task or tasks are not found then empty array is returned with 200 code.
          content:
            application/json:
              schema:
                type: array
                items: {}
              examples:
                empty:
                  value: []
                ok response:
                  value:
                    - old_time_span: 0
                      new_time_span: '0'
                      event_type: add
                      edited: '2020-02-10 05:05:05'
                      entry_id: '104950298'
                      duration: '0'
                      user_id: '5343'
                      description: ''
                      task_id: '77438101'
                      date: '2021-02-10'
                      start_time: '13:04:00'
                      end_time: '13:04:00'
                      locked: '0'
                      billable: 1
                      invoiceId: '0'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
              examples:
                dates not provided:
                  value:
                    message: 'you must provide "from" and "to" date like 2013-03-20 '
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
              examples:
                not permitted:
                  value:
                    message: you do not have permissions to get task with id {taskId} (you can set yourself as Time Tracking Administrator or Project Manager)
      tags:
        - '[v1] Entry'
      summary: Get time entries deletions
      parameters:
        - schema:
            type: string
            example: 12,13,32
          in: query
          name: task_ids
          description: entry task id or ids
        - schema:
            type: string
            example: 45,55,64
          in: query
          name: user_ids
          description: entry user id or ids
        - schema:
            type: integer
          in: query
          name: limit
          description: number of results to get, if empty then get all of them
        - schema:
            type: string
            example: '2020-02-02'
          in: query
          name: from
          description: date in `YYYY-MM-DD` format
        - schema:
            type: string
            example: '2020-02-02'
          in: query
          name: to
          description: date in `YYYY-MM-DD` format
      security:
        - api_key_in_header: []
    parameters: []
  /group:
    get:
      operationId: get--group
      description: Get all groups.
      responses:
        '200':
          description: OK - Array of groups
          content:
            application/json:
              schema:
                type: array
                description: ''
                minItems: 1
                uniqueItems: true
                items:
                  type: object
                  properties:
                    group_id:
                      oneOf:
                        - type: string
                        - type: integer
                      minLength: 1
                    name:
                      type: string
                      minLength: 1
                    parent_id:
                      oneOf:
                        - type: string
                        - type: integer
                      minLength: 1
                  required:
                    - group_id
                    - name
                    - parent_id
              examples:
                example response:
                  value:
                    - group_id: '530222'
                      name: People
                      parent_id: '0'
                    - group_id: '1764'
                      name: '[Inactive]'
                      parent_id: '1208'
      tags:
        - '[v1] Group'
      summary: Get all groups
      security:
        - api_key_in_header: []
    post:
      operationId: post--group
      description: |-
        Modify existing group. Edit permission is required.

        WARNING: backend might not return a response, but changes will be applied!
      responses:
        '200':
          description: OK - returns empty response.
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                description: ''
                type: object
                properties:
                  message:
                    type: string
              examples:
                group fields not provided:
                  value:
                    message: 'You must send valid group fields to change: name, parent_id'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                description: ''
                type: object
                properties:
                  message:
                    type: string
                    minLength: 1
                required:
                  - message
              examples:
                group id not provided or you are not permitted:
                  value:
                    message: You can not change this group
      tags:
        - '[v1] Group'
      requestBody:
        content:
          application/json:
            schema:
              description: ''
              type: object
              properties:
                group_id:
                  oneOf:
                    - type: string
                    - type: integer
                  description: group id to modify
                  example: 421
                name:
                  type: string
                  description: group name to set
                  example: NewName
                parent_id:
                  type: string
                  description: parent_id to set
                  example: '11'
              required:
                - group_id
            examples:
              change group name:
                value:
                  group_id: 390672
                  name: NewName
      summary: Update group
      security:
        - api_key_in_header: []
    delete:
      operationId: delete--group
      description: |-
        Delete a group. Edit permission is required.

        Root Group (`parent_id == 0`) cannot be deleted.

        All subgroups of deleted group have their `parent_id` changed to `root_group_id`.


        WARNING: backend might not return a response, but changes will be applied!
      tags:
        - '[v1] Group'
      responses:
        '200':
          description: OK - empty response is returned.
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
              examples:
                not permitted to delete this group:
                  value:
                    message: You can not remove this group
      requestBody:
        content:
          application/json:
            schema:
              description: ''
              type: object
              properties:
                group_id:
                  type: number
                  description: group id to delete
                  example: 390673
              required:
                - group_id
            examples:
              example:
                value:
                  group_id: 390673
      summary: Delete group
      security:
        - api_key_in_header: []
    put:
      operationId: put--group
      description: |-
        Add new group. Edit permission is required.


        There cannot be more than one root group (with parent_id = 0).
        Maximum group tree depth is 4 levels.

        If you get an error 403 `You can not change this group` try to wait about one minute and retry.
      tags:
        - '[v1] Group'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                description: ''
                type: object
                properties:
                  group_id:
                    oneOf:
                      - type: string
                      - type: integer
                    minLength: 1
                  name:
                    type: string
                    minLength: 1
                  admin_id:
                    oneOf:
                      - type: string
                      - type: integer
                    minLength: 1
                  parent_id:
                    oneOf:
                      - type: string
                      - type: integer
                    minLength: 1
                  root_group_id:
                    oneOf:
                      - type: string
                      - type: integer
                    minLength: 1
              examples:
                created group:
                  value:
                    group_id: '390673'
                    name: Name of New Group
                    admin_id: '0'
                    parent_id: '390672'
                    root_group_id: '390672'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
              examples:
                not permitted to create group:
                  value:
                    message: You can not change this group
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
              examples:
                create group too far:
                  value:
                    message: You can create groups only up to level 4
      requestBody:
        content:
          application/json:
            schema:
              description: ''
              type: object
              properties:
                parent_id:
                  oneOf:
                    - type: string
                    - type: integer
                  description: group parent id
                  example: 421
                name:
                  type: string
                  description: group name
                  example: NewName
              required:
                - name
            examples:
              create group:
                value:
                  parent_id: 390672
                  name: Name of New Group
              create root group:
                value:
                  parent_id: 0
                  name: Name of New Root Group
      summary: Create group
      security:
        - api_key_in_header: []
  /group/{group_id}/setting:
    get:
      operationId: get--group-setting
      description: Returns setting for given group_id.
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                description: ''
                type: object
                properties:
                  groupId:
                    oneOf:
                      - type: string
                      - type: integer
                    minLength: 1
                  name:
                    type: string
                    minLength: 1
                  value:
                    type: string
                    minLength: 1
                  inherited:
                    type: boolean
                  inheritedFromGroup:
                    type: integer
              examples:
                companyAddress setting:
                  value:
                    groupId: '521'
                    name: companyAddress
                    value: |-
                      Some Street 24
                      51-521 City, Country
                      VAT EU: PL1231231212
                    inherited: true
                    inheritedFromGroup: 0
        '404':
          description: Not Found - returns empty array when setting not found.
          content:
            application/json:
              schema:
                type: array
                items: {}
              examples:
                Example:
                  value: []
      tags:
        - '[v1] Group'
      summary: Get group setting
      parameters:
        - schema:
            type: string
            example: companyAddress
          in: query
          name: name
          description: name of setting to get
          required: true
      security:
        - api_key_in_header: []
    put:
      operationId: put--group-setting
      description: Update group setting.
      tags:
        - '[v1] Group'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                description: ''
                type: object
                properties:
                  groupId:
                    oneOf:
                      - type: string
                      - type: integer
                    minLength: 1
                  name:
                    type: string
                    minLength: 1
                  value:
                    type: string
                    minLength: 1
                  inherited:
                    type: boolean
                  inheritedFromGroup:
                    type: integer
              examples:
                changed company address:
                  value:
                    groupId: '521'
                    name: companyAddress
                    value: Some...new...adress
                    inherited: true
                    inheritedFromGroup: 0
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
              examples:
                cannot change this setting:
                  value:
                    message: Setting [setting_name] cannot be changed
                your plan limits you:
                  value:
                    message: You can't use this feature due to your plan.
      summary: Update group setting
      requestBody:
        content:
          application/json:
            schema:
              description: ''
              type: object
              properties:
                name:
                  type: string
                  description: name of setting to be updated
                  example: companyAddress
                value:
                  oneOf:
                    - type: string
                    - type: integer
                  description: new value
                  example: NewAddress
              required:
                - name
                - value
            examples:
              change companyAddress:
                value:
                  name: companyAddress
                  value: Some...new...adress
        description: ''
      security:
        - api_key_in_header: []
    delete:
      operationId: delete--group-setting
      description: Delete group setting.
      tags:
        - '[v1] Group'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                description: ''
                type: object
                properties:
                  groupId:
                    oneOf:
                      - type: string
                      - type: integer
                    minLength: 1
                  name:
                    type: string
                    minLength: 1
                  value:
                    type: string
                    minLength: 1
                  inherited:
                    type: boolean
                  inheritedFromGroup:
                    type: integer
              examples:
                deleted company address:
                  value:
                    groupId: '552'
                    name: companyAddress
                    value: ''
                    inherited: true
                    inheritedFromGroup: 0
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                description: ''
                type: object
                properties:
                  message:
                    type: string
                    minLength: 1
              examples:
                cannot delete setting or not permitted:
                  value:
                    message: Setting [setting_name] cannot be changed
      summary: Delete group setting
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: name of setting to be deleted
                  example: companyAddress
              required:
                - name
            examples:
              delete company address:
                value:
                  name: companyAddress
      security:
        - api_key_in_header: []
    parameters:
      - in: path
        name: group_id
        schema:
          type: integer
        description: group id
        required: true
  /group/{group_id}/user:
    summary: Manage users in a group
    get:
      operationId: get--group-user
      description: Get users from given group.
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                description: ''
                uniqueItems: true
                items:
                  type: object
                  properties:
                    group_id:
                      oneOf:
                        - type: string
                        - type: integer
                      minLength: 1
                    user_id:
                      oneOf:
                        - type: string
                        - type: integer
                      minLength: 1
                    activated:
                      oneOf:
                        - type: string
                        - type: integer
                      minLength: 1
                    role_id:
                      oneOf:
                        - type: string
                        - type: integer
                      minLength: 1
                    id:
                      oneOf:
                        - type: string
                        - type: integer
                      minLength: 1
                    email:
                      type: string
                      minLength: 1
                    pass_hash:
                      type: string
                      minLength: 1
                    synch_time:
                      type: string
                      minLength: 1
                    login_time:
                      type: string
                      minLength: 1
                    register_time:
                      type: string
                      minLength: 1
                    time_zone:
                      oneOf:
                        - type: string
                        - type: integer
                      minLength: 1
                    start_of_the_week:
                      oneOf:
                        - type: string
                        - type: integer
                      minLength: 1
                    display_name:
                      type: string
                      minLength: 1
                    activation_code:
                      type: string
                    forgotten_password_code:
                      type: string
                      minLength: 1
                    os_username:
                      type: string
                    operating_system:
                      type: string
                      minLength: 1
                    login_count:
                      type: string
                      minLength: 1
                    plan:
                      oneOf:
                        - type: string
                        - type: integer
                      minLength: 1
                    language:
                      oneOf:
                        - type: string
                        - type: integer
                      minL

# --- truncated at 32 KB (452 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/timecamp/refs/heads/main/openapi/timecamp-openapi.yml