clockify

An R wrapper around the Clockify API.

The documentation for {clockify} is hosted at https://datawookie.github.io/clockify/.

API Key

You’re going to need to have an API key from your Clockify account. If you don’t yet have an account, create one. Then retrieve the API key from the account settings.

Get Started

The first thing you’ll need to do is set up your API key. I store mine in an environment variable called CLOCKIFY_API_KEY.

CLOCKIFY_API_KEY <- Sys.getenv("CLOCKIFY_API_KEY")

Now load the {clockify} package and specify the API key.

library(clockify)

set_api_key(CLOCKIFY_API_KEY)

Let’s turn on some logging so we can see what’s happening behind the scenes.

Workspaces

Retrieve a list of available workspaces.

# A tibble: 3 × 3
  workspace_id             name               memberships      
  <chr>                    <chr>              <list>           
1 5ef46294df73063139f60bfc Fathom Data        <tibble [18 × 6]>
2 61343c45ab05e02be2c8c1fd Personal           <tibble [2 × 4]> 
3 630c61ba9c3a3c3112812332 {clockify} sandbox <tibble [5 × 6]> 

Select a specific workspace.

workspace("630c61ba9c3a3c3112812332")
[1] "630c61ba9c3a3c3112812332"

Users

Retrieve information on your user profile.

# A tibble: 1 × 3
  user_id                  user_name status
  <chr>                    <chr>     <chr> 
1 5f227e0cd7176a0e6e754409 Andrew    ACTIVE

Get a list of users.

# A tibble: 5 × 3
  user_id                  user_name   status                    
  <chr>                    <chr>       <chr>                     
1 5f227e0cd7176a0e6e754409 Andrew      ACTIVE                    
2 630f17f04a05b20faf7e0afc Bob Smith   ACTIVE                    
3 630f16ab90cfd878937a7997 <NA>        NOT_REGISTERED            
4 630f1cb9cb18da61cfd58659 Carol Brown PENDING_EMAIL_VERIFICATION
5 630f15d3b59c366b0e3ae2e6 Alice Jones ACTIVE                    

Clients

Get a list of clients.

# A tibble: 1 × 3
  client_id                workspace_id             client_name
  <chr>                    <chr>                    <chr>      
1 63a55695db26c25e9d4e2d02 630c61ba9c3a3c3112812332 RStudio    

Projects

Get a list of projects.

# A tibble: 3 × 5
  project_id               project_name client_id                billa…¹ archi…²
  <chr>                    <chr>        <chr>                    <lgl>   <lgl>  
1 632a94f8d801fa1178d366b8 test         <NA>                     TRUE    FALSE  
2 630ce53290cfd8789366fd49 {clockify}   63a55695db26c25e9d4e2d02 TRUE    FALSE  
3 630ce53cb59c366b0e27743f {emayili}    63a55695db26c25e9d4e2d02 TRUE    FALSE  
# … with abbreviated variable names ¹​billable, ²​archived

Time Entries

Retrieve Time Entries

Retrieve the time entries for the authenticated user.

Retrieve time entries for another user specified by their user ID.

time_entries(user_id = "630f15d3b59c366b0e3ae2e6")

Insert Time Entry

prepare_cran_entry <- time_entry_create(
  project_id = "630ce53290cfd8789366fd49",
  start = "2021-08-30 08:00:00",
  end = "2021-08-30 10:30:00",
  description = "Prepare for CRAN submission"
)

Check on the ID for this new time entry.

prepare_cran_entry$time_entry_id
[1] "63a97c6c0974236116042bac"

Confirm that it has been inserted.

time_entries(concise = FALSE) %>%
  select(time_entry_id, description, time_start, time_end)
# A tibble: 1 × 4
  time_entry_id            description   time_start          time_end           
  <chr>                    <chr>         <dttm>              <dttm>             
1 63a97c6c0974236116042bac Prepare for2021-08-30 08:00:00 2021-08-30 10:30:00

Delete Time Entry

time_entry_delete(prepare_cran_entry$time_entry_id)
[1] TRUE

Confirm that it has been deleted.

time_entries(concise = FALSE) %>%
  select(time_entry_id, description, time_start, time_end)
# A tibble: 0 × 4
# … with 4 variables: time_entry_id <chr>, description <chr>,
#   time_start <dttm>, time_end <dttm>

Endpoints

Endpoints which have currently been implemented in this package. Endpoints which are only available on a paid plan are indicated with a 💰.

  • GET /workspaces/{workspaceId}/clients
  • POST /workspaces/{workspaceId}/clients
  • PUT /workspaces/{workspaceId}/clients/{clientId}
  • DELETE /workspaces/{workspaceId}/clients/{clientId}
  • GET /workspaces/{workspaceId}/projects
  • GET /workspaces/{workspaceId}/projects/{projectId}
  • POST /workspaces/{workspaceId}/projects
  • PUT /workspaces/{workspaceId}/projects/{projectId}
  • PUT /workspaces/{workspaceId}/projects/{projectId}/users/{userId}/hourly-rate
  • PUT /workspaces/{workspaceId}/projects/{projectId}/users/{userId}/cost-rate
  • PATCH /workspaces/{workspaceId}/projects/{projectId}/estimate
  • PATCH /workspaces/{workspaceId}/projects/{projectId}/memberships
  • PATCH /workspaces/{workspaceId}/projects/{projectId}/template
  • DELETE /workspaces/{workspaceId}/projects/{id}
  • GET /workspaces/{workspaceId}/tags
  • GET /workspaces/{workspaceId}/tags/{tagId}
  • POST /workspaces/{workspaceId}/tags
  • PUT /workspaces/{workspaceId}/tags/{tagId}
  • DELETE /workspaces/{workspaceId}/tags/{tagId}
  • GET /workspaces/{workspaceId}/projects/{projectId}/tasks
  • GET /workspaces/{workspaceId}/projects/{projectId}/tasks/{taskId}
  • POST /workspaces/{workspaceId}/projects/{projectId}/tasks
  • PUT /workspaces/{workspaceId}/projects/{projectId}/tasks/{taskId}
  • PUT /workspaces/{workspaceId}/projects/{projectId}/tasks/{taskId}/hourly-rate
  • PUT /workspaces/{workspaceId}/projects/{projectId}/tasks/{taskId}/cost-rate
  • DELETE /workspaces/{workspaceId}/projects/{projectId}/tasks/{taskId}
  • GET /workspaces/{workspaceId}/user/{userId}/time-entries
  • GET /workspaces/{workspaceId}/time-entries/{id}
  • POST /workspaces/{workspaceId}/time-entries
  • POST /workspaces/{workspaceId}/user/{userId}/time-entries 💰
  • PATCH /workspaces/{workspaceId}/user/{userId}/time-entries 💰
  • PUT /workspaces/{workspaceId}/time-entries/{id}
  • PATCH /workspaces/{workspaceId}/time-entries/invoiced
  • DELETE /workspaces/{workspaceId}/time-entries/{id}
  • GET /user
  • GET /workspaces/{workspaceId}/users
  • POST /workspaces/{workspaceId}/users 💰
  • PUT /workspaces/{workspaceId}/users/{userId}
  • PUT /workspaces/{workspaceId}/users/{userId}/hourly-rate
  • PUT /workspaces/{workspaceId}/users/{userId}/cost-rate
  • POST /workspaces/{workspaceId}/users/{userId}/roles
  • DELETE /workspaces/{workspaceId}/users/{userId}/roles
  • DELETE /workspaces/{workspaceId}/users/{userId}
  • GET /workspaces/{workspaceId}/user-groups
  • POST /workspaces/{workspaceId}/user-groups
  • PUT /workspaces/{workspaceId}/user-groups/{userGroupId}
  • DELETE /workspaces/{workspaceId}/user-groups/{userGroupId}
  • POST /workspaces/{workspaceId}/user-groups/{userGroupId}/users
  • DELETE /workspaces/{workspaceId}/user-groups/{userGroupId}/users/{userId}
  • GET /workspaces
  • GET /workspaces/{workspaceId}/custom-fields
  • GET /workspaces/{workspaceId}/projects/{projectid}/custom-fields
  • PATCH /workspaces/{workspaceId}/projects/{projectid}/custom-fields/{customFieldId}
  • DELETE /workspaces/{workspaceId}/projects/{projectid}/custom-fields/{customFieldId}
  • POST /workspaces/{workspaceId}/reports/summary
  • POST /workspaces/{workspaceId}/reports/detailed
  • POST /workspaces/{workspaceId}/reports/weekly
  • GET /workspaces/{workspaceId}/shared-reports
  • GET /shared-reports/{sharedReportId}
  • POST /workspaces/{workspaceId}/shared-reports
  • PUT /workspaces/{workspaceId}/shared-reports/{sharedReportId}
  • DELETE /workspaces/{workspaceId}/shared-reports/{sharedReportId}