TimeCamp Users and Groups API

Administer the account - list all users, fetch your own profile (/me), invite and update users, manage per-user settings, and organize users into groups with group-level settings, schedulers, and roles and permissions (tt_role).

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