> ## Documentation Index
> Fetch the complete documentation index at: https://docs.nekt.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Clockify as a data source

> Bring time entries, projects, tasks, users, approvals, time off, expenses and invoices from Clockify to Nekt.

Clockify is a time tracking and timesheet tool. This connector reads your Clockify workspaces through the Clockify REST API and brings the time entries of every user, with project, task, tags, billable and cost rates and custom field values, plus the workspace structure (users, user groups, clients, projects, tasks, tags, custom fields) and, when your plan includes them, approvals, time off, expenses and invoices.

> [!NOTE]
>
> The connector only reads data. It never creates, changes or deletes anything in Clockify.

## Configuring Clockify as a Source

In the [Sources](https://app.nekt.ai/sources) tab, click on the "Add source" button located on the top right of your screen. Then, select the Clockify option from the list of connectors.

Click **Next** and you'll be prompted to add your access.

### 1. Add account access

The connector signs in with a Clockify **API key**. The key reads Clockify as the person who created it, so use the key of a **workspace admin or owner**: other users can only read their own time entries, and several tables (users, user groups, approvals, time off, expenses, invoices) are only available to admins.

To create a key:

1. In Clockify, open your profile menu and go to **Profile settings**.
2. In the **API** section (under **Preferences > Advanced** on newer accounts), click **Generate** and copy the key.
3. If your workspace is opened at `yourcompany.clockify.me` (subdomain), generate the key while logged in to that subdomain: keys from other workspaces do not work there.

See [Clockify's API documentation](https://docs.clockify.me/).

The following configurations are available:

* **API Key**: The Clockify API key.
* **Region**: The data region of your workspace: `global` (default), `euc1` (EU - Germany), `euw2` (UK), `use2` (USA) or `apse2` (Australia). Workspaces created in a specific data region must select it.
* **Workspace Plan**: The Clockify plan of the workspace: `free`, `paid` (Basic, Standard or Pro) or `enterprise`. Clockify limits API requests per plan, and the connector paces its requests accordingly.
* **Start Date**: The earliest date to read time entries (by start time) and deleted time entries from. The other tables are always read in full.
* **Subdomain** (advanced): Only if your workspace is opened at `yourcompany.clockify.me`: type `yourcompany`. Leave empty otherwise.
* **Workspace IDs** (advanced): Comma-separated IDs of the workspaces to read. Leave empty to read every workspace the API key can access.
* **Time Entries Lookback (days)** (advanced): How far back each sync re-reads time entries to pick up edits. Default 30.
* **Minimum Seconds Between Requests** (advanced): Overrides the pacing derived from the Workspace Plan.

> [!WARNING]
>
> On the Clockify **Free** plan the API allows only **30 requests per hour** per workspace, so the connector waits about 2 minutes between requests and **every** sync takes hours, not only the first: roughly 15 requests plus 2 per project (Tasks), 1 per user (Time Entries) and about 4 per month since the previous sync. For example, 10 users and 30 projects with every table selected need about 100 requests, around 3.5 hours per sync. Select only the tables you need (Tasks is the most expensive). On paid plans the limit is 20 requests per second (50 on Enterprise).
>
> If Clockify reports a slower plan for a workspace than the one selected here, the connector paces for the slower one and the sync log asks you to update **Workspace Plan**.

Once you're done, click **Next**.

### 2. Select streams

Choose which data streams you want to sync. For faster extractions, select only the streams that are relevant to your analysis. You can select entire groups of streams or pick specific ones.

> Tip: The stream can be found more easily by typing its name.

Select the streams and click **Next**.

### 3. Configure data streams

Customize how you want your data to appear in your catalog. Select the desired layer where the data will be placed, a folder to organize it inside the layer, a name for each table (which will effectively contain the fetched data) and the type of sync.

* **Layer**: choose between the existing layers on your catalog. This is where you will find your new extracted tables as the extraction runs successfully.
* **Folder**: a folder can be created inside the selected layer to group all tables being created from this new data source.
* **Table name**: we suggest a name, but feel free to customize it. You have the option to add a **prefix** to all tables at once and make this process faster!
* **Sync Type**: you can choose between INCREMENTAL and FULL\_TABLE.
  * Incremental: every time the extraction happens, we'll get only the new data, which is good if, for example, you want to keep every record ever fetched.
  * Full table: every time the extraction happens, we'll get the current state of the data, which is good if, for example, you don't want to have deleted data in your catalog.

> [!NOTE]
>
> Clockify has no "changed since" filter for time entries. On **Incremental**, each sync re-reads every user's recent entries (the lookback window) and also reads Clockify's change log (marked experimental by Clockify) to fetch older entries that were edited, re-rated or added for past days since the previous sync. Deleted entries are not removed from Time Entries by incremental syncs: filter them with the Deleted Time Entries table. If the change log cannot be read in a sync, the sync log says so and only the lookback window is refreshed; an **Additional Full Sync** (for example weekly) realigns the whole history.

Once you are done configuring, click **Next**.

### 4. Configure data source

Describe your data source for easy identification within your organization, not exceeding 140 characters.

To define your [Trigger](https://docs.nekt.com/runs/scheduling-and-triggers.md), consider how often you want data to be extracted from this source. This decision usually depends on how frequently you need the new table data updated (every day, once a week, or only at specific times).

Optionally, you can define some additional settings:

* Configure Delta Log Retention and determine for how long we should store old states of this table as it gets updated. Read more about this resource [here](https://docs.nekt.com/get-started/core-concepts/resource-control).
* Determine when to execute an **Additional [Full Sync](https://docs.nekt.com/get-started/core-concepts/types-of-sync#additional-full-sync)**. This will complement the incremental data extractions, ensuring that your data is completely synchronized with your source every once in a while. Recommended for Time Entries (see the note above).

Once you are ready, click **Next** to finalize the setup.

### 5. Check your new source

You can view your new source on the [Sources](https://app.nekt.ai/sources) page. If needed, manually trigger the source extraction by clicking on the arrow button. Once executed, your data will appear in your Catalog.

> [!WARNING]
>
> For you to be able to see it on your [Catalog](https://app.nekt.ai/catalog), you need at least one successful source run.

# Streams and Fields

## Available streams

The table below lists every stream, its **slug** (the exact identifier to pass when creating the source via API), its sync type, what the API key needs to read it and a short description.

| Stream | Slug | Sync | Needs | Description |
| - | - | - | - | - |
| Workspaces | `workspaces` | Full table | Any API key. | Every workspace the API key can access (or the ones in Workspace IDs), with plan, rates and settings. |
| Users | `users` | Full table | Workspace admin or owner. | Every member of each workspace, whatever their status (active, inactive, invited, deleted accounts). |
| User Groups | `user_groups` | Full table | Workspace admin or owner. | User groups (teams) and their members and team managers. |
| Clients | `clients` | Full table | Any workspace member. | Clients, archived ones included. |
| Projects | `projects` | Full table | Any workspace member (members see the projects they can access). | Projects, archived ones included, with rates, estimates, members and total tracked time. |
| Tasks | `tasks` | Full table | Any workspace member (members see the projects they can access). | Tasks of every project (archived projects included), active and done. |
| Tags | `tags` | Full table | Any workspace member. | Tags, archived ones included. |
| Custom Fields | `custom_fields` | Full table | Custom fields included in the workspace's Clockify plan. | Custom fields of time entries and users, in every status. |
| Time Entries | `time_entries` | Incremental | Workspace admin or owner to read every user's entries; other users can only read their own. | Every user's time entries, with project, task, tags, rates, custom field values and duration. |
| Deleted Time Entries | `deleted_time_entries` | Incremental | Workspace admin or owner. | Time entries deleted in Clockify, so they can be removed from the Time Entries table downstream. |
| Approval Requests | `approval_requests` | Full table | Workspace admin or manager, with Approvals available in the plan. | Timesheet and expense approval requests, in every status. |
| Holidays | `holidays` | Full table | Workspace admin or owner, with Time off available in the plan. | Holidays configured for Time off. |
| Time Off Policies | `time_off_policies` | Full table | Workspace admin or owner, with Time off available in the plan. | Time off policies, archived ones included. |
| Time Off Requests | `time_off_requests` | Full table | Workspace admin or owner, with Time off available in the plan. | Time off requests in every status. |
| Expenses | `expenses` | Full table | Workspace admin or owner, with Expenses enabled and included in the plan. | Expenses with category, project, task, totals and approval status. |
| Expense Categories | `expense_categories` | Full table | Workspace admin or owner, with Expenses enabled and included in the plan. | Expense categories, archived ones included. |
| Invoices | `invoices` | Full table | Workspace admin or owner, with Invoicing enabled and included in the plan. | Invoices with client, amounts and status. |

> [!NOTE]
>
> When the API key cannot read a table (not an admin, or the feature is not enabled or not included in the workspace's Clockify plan), that table is skipped and not updated in that sync, the sync log names it and says what to change, and the other tables keep syncing. An invalid API key fails the sync. Nested information (settings, memberships, estimates, custom field values) comes as JSON text. Rates and invoice amounts are in cents of the currency; durations come both as ISO 8601 text (for example `PT1H30M`) and in seconds.

## Fields by stream

### Workspace and people

> [accordion] Workspaces
>
> Every workspace the API key can access (or the ones in Workspace IDs), with plan, rates and settings.
>
> Table: `workspaces` · Primary key: `id` · Sync: Full table · Needs: Any API key.
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `id` | String | Unique identifier of the workspace. |
> | `name` | String | Workspace name. |
> | `image_url` | String | URL of the workspace image. |
> | `cake_organization_id` | String | Identifier of the CAKE.com organization the workspace belongs to. |
> | `feature_subscription_type` | String | Clockify subscription plan of the workspace (e.g. FREE, BASIC, STANDARD, PRO, ENTERPRISE). |
> | `features` | String (JSON) | Features enabled for the workspace. |
> | `currencies` | String (JSON) | Currencies configured in the workspace, with the default one flagged. |
> | `hourly_rate` | String (JSON) | Default billable (hourly) rate of the workspace: amount in cents and currency. |
> | `cost_rate` | String (JSON) | Default cost rate of the workspace: amount in cents and currency. |
> | `memberships` | String (JSON) | Memberships of the workspace (users, their status and rates). |
> | `subdomain` | String (JSON) | Subdomain settings of the workspace (name and whether it is enabled). |
> | `workspace_settings` | String (JSON) | Workspace settings (time tracking, approvals, rounding, time off, formats). |
> | `extra_fields` | String (JSON) | Fields Clockify returned that this connector does not map to a column yet, keyed by their original names. |

> [accordion] Users
>
> Every member of each workspace, whatever their status (active, inactive, invited, deleted accounts).
>
> Table: `users` · Primary key: `workspace_id`, `id` · Sync: Full table · Needs: Workspace admin or owner.
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `id` | String | Unique identifier of the user. |
> | `workspace_id` | String | Identifier of the Clockify workspace the record belongs to. |
> | `name` | String | Name of the user. |
> | `email` | String | Email address of the user. |
> | `status` | String | Account status of the user (ACTIVE, PENDING\_EMAIL\_VERIFICATION, NOT\_REGISTERED, LIMITED, DELETED...). |
> | `profile_picture` | String | URL of the user's profile picture. |
> | `active_workspace` | String | Identifier of the workspace the user currently has active. |
> | `default_workspace` | String | Identifier of the user's default workspace. |
> | `memberships` | String (JSON) | The user's workspace membership: status, type and billable/cost rates. |
> | `custom_fields` | String (JSON) | Values of the user custom fields. |
> | `settings` | String (JSON) | User settings (time zone, week start, formats...). |
> | `extra_fields` | String (JSON) | Fields Clockify returned that this connector does not map to a column yet, keyed by their original names. |

> [accordion] User Groups
>
> User groups (teams) and their members and team managers.
>
> Table: `user_groups` · Primary key: `id` · Sync: Full table · Needs: Workspace admin or owner.
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `id` | String | Unique identifier of the user group. |
> | `workspace_id` | String | Identifier of the Clockify workspace the record belongs to. |
> | `name` | String | Name of the user group. |
> | `user_ids` | Array of strings | Identifiers of the users in the group. |
> | `team_managers` | String (JSON) | Team managers assigned to the group. |
> | `extra_fields` | String (JSON) | Fields Clockify returned that this connector does not map to a column yet, keyed by their original names. |

### Projects and catalog

> [accordion] Clients
>
> Clients, archived ones included.
>
> Table: `clients` · Primary key: `id` · Sync: Full table · Needs: Any workspace member.
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `id` | String | Unique identifier of the client. |
> | `workspace_id` | String | Identifier of the Clockify workspace the record belongs to. |
> | `name` | String | Client name. |
> | `email` | String | Client email. |
> | `cc_emails` | Array of strings | Additional emails that receive the client's invoices. |
> | `address` | String | Client address. |
> | `note` | String | Notes saved for the client. |
> | `archived` | Boolean | Whether the client is archived. |
> | `currency_id` | String | Identifier of the client's currency. |
> | `currency_code` | String | Currency code of the client (e.g. USD). |
> | `extra_fields` | String (JSON) | Fields Clockify returned that this connector does not map to a column yet, keyed by their original names. |

> [accordion] Projects
>
> Projects, archived ones included, with rates, estimates, members and total tracked time.
>
> Table: `projects` · Primary key: `id` · Sync: Full table · Needs: Any workspace member (members see the projects they can access).
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `id` | String | Unique identifier of the project. |
> | `workspace_id` | String | Identifier of the Clockify workspace the record belongs to. |
> | `name` | String | Project name. |
> | `client_id` | String | Identifier of the project's client. |
> | `client_name` | String | Name of the project's client. |
> | `color` | String | Project color (hexadecimal RGB, e.g. #03A9F4). |
> | `note` | String | Project note. |
> | `archived` | Boolean | Whether the project is archived. |
> | `billable` | Boolean | Whether the project is billable. |
> | `public` | Boolean | Whether the project is public (visible to every workspace member). |
> | `template` | Boolean | Whether the project is a template. |
> | `duration` | String | Total time tracked on the project (ISO 8601 duration, e.g. PT12H30M). |
> | `duration_seconds` | Integer | Total time tracked on the project, in seconds (parsed from duration). |
> | `hourly_rate_amount` | Integer | Billable (hourly) rate in cents of the currency. |
> | `hourly_rate_currency` | String | Currency of the billable (hourly) rate. |
> | `cost_rate_amount` | Integer | Cost rate in cents of the currency. |
> | `cost_rate_currency` | String | Currency of the cost rate. |
> | `estimate` | String (JSON) | Time estimate of the project (estimate and type). |
> | `time_estimate` | String (JSON) | Time estimate settings of the project (estimate, type, reset option, active). |
> | `budget_estimate` | String (JSON) | Budget estimate settings of the project (estimate, type, reset option, active). |
> | `memberships` | String (JSON) | Project memberships: users/groups with access and their project rates. |
> | `extra_fields` | String (JSON) | Fields Clockify returned that this connector does not map to a column yet, keyed by their original names. |

> [accordion] Tasks
>
> Tasks of every project (archived projects included), active and done.
>
> Table: `tasks` · Primary key: `id` · Sync: Full table · Needs: Any workspace member (members see the projects they can access).
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `id` | String | Unique identifier of the task. |
> | `workspace_id` | String | Identifier of the Clockify workspace the record belongs to. |
> | `project_id` | String | Identifier of the project the task belongs to. |
> | `name` | String | Task name. |
> | `status` | String | Task status (ACTIVE or DONE). |
> | `billable` | Boolean | Whether the task is billable. |
> | `assignee_id` | String | Identifier of the task's assignee (legacy single assignee). |
> | `assignee_ids` | Array of strings | Identifiers of the users assigned to the task. |
> | `user_group_ids` | Array of strings | Identifiers of the user groups assigned to the task. |
> | `estimate` | String | Time estimate of the task (ISO 8601 duration). |
> | `budget_estimate` | Integer | Budget estimate of the task, in cents. |
> | `duration` | String | Total time tracked on the task (ISO 8601 duration). |
> | `duration_seconds` | Integer | Total time tracked on the task, in seconds (parsed from duration). |
> | `hourly_rate_amount` | Integer | Billable (hourly) rate in cents of the currency. |
> | `hourly_rate_currency` | String | Currency of the billable (hourly) rate. |
> | `cost_rate_amount` | Integer | Cost rate in cents of the currency. |
> | `cost_rate_currency` | String | Currency of the cost rate. |
> | `extra_fields` | String (JSON) | Fields Clockify returned that this connector does not map to a column yet, keyed by their original names. |

> [accordion] Tags
>
> Tags, archived ones included.
>
> Table: `tags` · Primary key: `id` · Sync: Full table · Needs: Any workspace member.
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `id` | String | Unique identifier of the tag. |
> | `workspace_id` | String | Identifier of the Clockify workspace the record belongs to. |
> | `name` | String | Tag name. |
> | `archived` | Boolean | Whether the tag is archived. |
> | `extra_fields` | String (JSON) | Fields Clockify returned that this connector does not map to a column yet, keyed by their original names. |

> [accordion] Custom Fields
>
> Custom fields of time entries and users, in every status.
>
> Table: `custom_fields` · Primary key: `id` · Sync: Full table · Needs: Custom fields included in the workspace's Clockify plan.
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `id` | String | Unique identifier of the custom field. |
> | `workspace_id` | String | Identifier of the Clockify workspace the record belongs to. |
> | `name` | String | Custom field name. |
> | `description` | String | Custom field description. |
> | `type` | String | Custom field type (TXT, NUMBER, DROPDOWN\_SINGLE, DROPDOWN\_MULTIPLE, CHECKBOX, LINK). |
> | `entity_type` | String | Entity the custom field applies to (TIMEENTRY or USER). |
> | `status` | String | Custom field status (VISIBLE, INVISIBLE or INACTIVE). |
> | `required` | Boolean | Whether the custom field is mandatory. |
> | `only_admin_can_edit` | Boolean | Whether only admins can change the custom field's value. |
> | `placeholder` | String | Placeholder text of the custom field. |
> | `allowed_values` | Array of strings | Values allowed for dropdown custom fields. |
> | `workspace_default_value` | String (JSON) | Default value of the custom field in the workspace. |
> | `project_default_values` | String (JSON) | Default values of the custom field per project. |
> | `extra_fields` | String (JSON) | Fields Clockify returned that this connector does not map to a column yet, keyed by their original names. |

### Time tracking

> [accordion] Time Entries
>
> Every user's time entries, with project, task, tags, rates, custom field values and duration. Read per user, filtered by the entry start time. Each sync re-reads, per user, the entries that started up to **Time Entries Lookback** days before the previous sync, and fetches older entries that Clockify's change log reports as created or edited since the previous sync. A user read for the first time is read from the Start Date. Running timers come with an empty end and duration.
>
> Table: `time_entries` · Primary key: `id` · Sync: Incremental by `time_interval_start` · Needs: Workspace admin or owner to read every user's entries; other users can only read their own.
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `id` | String | Unique identifier of the time entry. |
> | `workspace_id` | String | Identifier of the Clockify workspace the record belongs to. |
> | `user_id` | String | Identifier of the user who tracked the time. |
> | `description` | String | Description of the time entry. |
> | `project_id` | String | Identifier of the project. |
> | `task_id` | String | Identifier of the task. |
> | `tag_ids` | Array of strings | Identifiers of the tags of the time entry. |
> | `billable` | Boolean | Whether the time entry is billable. |
> | `type` | String | Kind of time entry (REGULAR, BREAK, HOLIDAY or TIME\_OFF). |
> | `is_locked` | Boolean | Whether the time entry is locked for changes (e.g. approved or past the lock date). |
> | `kiosk_id` | String | Identifier of the kiosk the time was tracked on, if any. |
> | `approval_request_id` | String | Identifier of the approval request that includes the time entry, if any. |
> | `time_interval_start` | Datetime | When the time entry starts (UTC), used as the incremental replication key. |
> | `time_interval_end` | Datetime | When the time entry ends (UTC); empty while the timer is running. |
> | `time_interval_duration` | String | Duration of the time entry (ISO 8601, e.g. PT1H30M); empty while the timer is running. |
> | `duration_seconds` | Integer | Duration of the time entry in seconds (parsed from time\_interval\_duration). |
> | `time_interval_time_zone` | String | Time zone of the user when the entry was tracked. |
> | `time_interval_zoned_start` | String | Start of the entry in the user's time zone. |
> | `time_interval_zoned_end` | String | End of the entry in the user's time zone. |
> | `hourly_rate_amount` | Integer | Billable (hourly) rate in cents of the currency. |
> | `hourly_rate_currency` | String | Currency of the billable (hourly) rate. |
> | `cost_rate_amount` | Integer | Cost rate in cents of the currency. |
> | `cost_rate_currency` | String | Currency of the cost rate. |
> | `custom_field_values` | String (JSON) | Values of the time entry custom fields. |
> | `extra_fields` | String (JSON) | Fields Clockify returned that this connector does not map to a column yet, keyed by their original names. |

> [accordion] Deleted Time Entries
>
> Time entries deleted in Clockify, so they can be removed from the Time Entries table downstream. Read from Clockify's deleted-entities feed (marked experimental by Clockify) up to a few minutes before the sync starts, continuing exactly where the previous sync stopped. Join on `time_entry_id` to drop deleted entries from Time Entries. Clockify's feed does not list an entry created and deleted within the same time window, so the connector splits its reads at every Time Entries sync. An entry created and deleted while a Time Entries sync was reading can still be missed, and if Deleted Time Entries stops syncing for a long time while Time Entries keeps running, the sync log warns that some deletions may be missing; a Full sync of Time Entries removes any leftover.
>
> Table: `deleted_time_entries` · Primary key: `id` · Sync: Incremental by `deleted_at` · Needs: Workspace admin or owner.
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `id` | String | Unique identifier of the deletion record. |
> | `workspace_id` | String | Identifier of the Clockify workspace the record belongs to. |
> | `time_entry_id` | String | Identifier of the deleted time entry. |
> | `user_id` | String | Identifier of the user the deleted time entry belonged to. |
> | `deleted_at` | Datetime | When the time entry was deleted, used as the incremental replication key. |
> | `document_code` | String | Kind of the deleted document, as recorded by Clockify. |
> | `document` | String (JSON) | The deleted time entry as it was when deleted. |
> | `extra_fields` | String (JSON) | Fields Clockify returned that this connector does not map to a column yet, keyed by their original names. |

> [accordion] Approval Requests
>
> Timesheet and expense approval requests, in every status.
>
> Table: `approval_requests` · Primary key: `id` · Sync: Full table · Needs: Workspace admin or manager, with Approvals available in the plan.
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `id` | String | Unique identifier of the approval request. |
> | `workspace_id` | String | Identifier of the Clockify workspace the record belongs to. |
> | `type` | String | What is submitted for approval (TIMESHEET, EXPENSE or TIMESHEET\_AND\_EXPENSE). |
> | `status_state` | String | Approval state (PENDING, APPROVED, REJECTED, WITHDRAWN\_SUBMISSION, WITHDRAWN\_APPROVAL). |
> | `status_note` | String | Note left with the last status change. |
> | `status_updated_at` | Datetime | When the approval status last changed. |
> | `status_updated_by` | String | Identifier of the user who last changed the status. |
> | `status_updated_by_user_name` | String | Name of the user who last changed the status. |
> | `current_approval_level` | Integer | Approval level the request is currently in. |
> | `owner_user_id` | String | Identifier of the user whose time/expenses are submitted. |
> | `owner_user_name` | String | Name of the user whose time/expenses are submitted. |
> | `owner_time_zone` | String | Time zone of the submitting user. |
> | `owner_start_of_week` | String | First day of the week of the submitting user. |
> | `creator_user_id` | String | Identifier of the user who created the request. |
> | `creator_user_name` | String | Name of the user who created the request. |
> | `creator_user_email` | String | Email of the user who created the request. |
> | `date_range_start` | Datetime | Start of the submitted period. |
> | `date_range_end` | Datetime | End of the submitted period. |
> | `tracked_time` | String | Total tracked time in the period (ISO 8601 duration). |
> | `approved_time` | String | Approved time in the period (ISO 8601 duration). |
> | `pending_time` | String | Time pending approval in the period (ISO 8601 duration). |
> | `billable_time` | String | Billable time in the period (ISO 8601 duration). |
> | `break_time` | String | Break time in the period (ISO 8601 duration). |
> | `billable_amount` | Number | Billable amount of the submitted time. |
> | `cost_amount` | Number | Cost amount of the submitted time. |
> | `expense_total` | Number | Total of the submitted expenses. |
> | `entries` | String (JSON) | Time entries included in the request. |
> | `expenses` | String (JSON) | Expenses included in the request. |
> | `approval_request` | String (JSON) | Full approval request object as sent by Clockify. |
> | `extra_fields` | String (JSON) | Fields Clockify returned that this connector does not map to a column yet, keyed by their original names. |

### Time off

> [accordion] Holidays
>
> Holidays configured for Time off.
>
> Table: `holidays` · Primary key: `id` · Sync: Full table · Needs: Workspace admin or owner, with Time off available in the plan.
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `id` | String | Unique identifier of the holiday. |
> | `workspace_id` | String | Identifier of the Clockify workspace the record belongs to. |
> | `name` | String | Name of the holiday. |
> | `start_date` | Date | First day of the holiday. |
> | `end_date` | Date | Last day of the holiday. |
> | `occurs_annually` | Boolean | Whether the holiday repeats every year. |
> | `everyone_including_new` | Boolean | Whether the holiday applies to everyone, including users added later. |
> | `user_ids` | Array of strings | Identifiers of the users the holiday applies to. |
> | `user_group_ids` | Array of strings | Identifiers of the user groups the holiday applies to. |
> | `automatic_time_entry_creation` | Boolean | Whether time entries are created automatically for the holiday. |
> | `project_id` | String | Project used for the automatically created time entries. |
> | `task_id` | String | Task used for the automatically created time entries. |
> | `date_period` | String (JSON) | Period of the holiday as sent by Clockify (startDate, endDate). |
> | `extra_fields` | String (JSON) | Fields Clockify returned that this connector does not map to a column yet, keyed by their original names. |

> [accordion] Time Off Policies
>
> Time off policies, archived ones included.
>
> Table: `time_off_policies` · Primary key: `id` · Sync: Full table · Needs: Workspace admin or owner, with Time off available in the plan.
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `id` | String | Unique identifier of the time off policy. |
> | `workspace_id` | String | Identifier of the Clockify workspace the record belongs to. |
> | `name` | String | Name of the policy. |
> | `archived` | Boolean | Whether the policy is archived. |
> | `time_unit` | String | Time unit of the policy (DAYS or HOURS). |
> | `allow_half_day` | Boolean | Whether half days can be requested. |
> | `allow_negative_balance` | Boolean | Whether the balance may go negative. |
> | `everyone_including_new` | Boolean | Whether the policy applies to everyone, including users added later. |
> | `user_ids` | Array of strings | Identifiers of the users the policy applies to. |
> | `user_group_ids` | Array of strings | Identifiers of the user groups the policy applies to. |
> | `project_id` | String | Project used for automatically created time entries. |
> | `color` | String | Color of the policy. |
> | `icon` | String | Icon of the policy. |
> | `approve` | String (JSON) | Approval settings of the policy. |
> | `automatic_accrual` | String (JSON) | Automatic accrual settings of the policy. |
> | `automatic_time_entry_creation` | String (JSON) | Automatic time entry creation settings of the policy. |
> | `negative_balance` | String (JSON) | Negative balance settings (amount, time unit, period). |
> | `extra_fields` | String (JSON) | Fields Clockify returned that this connector does not map to a column yet, keyed by their original names. |

> [accordion] Time Off Requests
>
> Time off requests in every status.
>
> Table: `time_off_requests` · Primary key: `id` · Sync: Full table · Needs: Workspace admin or owner, with Time off available in the plan.
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `id` | String | Unique identifier of the time off request. |
> | `workspace_id` | String | Identifier of the Clockify workspace the record belongs to. |
> | `user_id` | String | Identifier of the user the time off is for. |
> | `user_name` | String | Name of the user the time off is for. |
> | `user_email` | String | Email of the user the time off is for. |
> | `user_time_zone` | String | Time zone of the user. |
> | `requester_user_id` | String | Identifier of the user who made the request. |
> | `requester_user_name` | String | Name of the user who made the request. |
> | `policy_id` | String | Identifier of the time off policy. |
> | `policy_name` | String | Name of the time off policy. |
> | `status_type` | String | Status of the request (PENDING, APPROVED or REJECTED). |
> | `status_changed_at` | Datetime | When the request status last changed. |
> | `status_changed_by_user_id` | String | Identifier of the user who last changed the status. |
> | `status_changed_by_user_name` | String | Name of the user who last changed the status. |
> | `status_note` | String | Note left when the status changed. |
> | `time_unit` | String | Time unit of the request (DAYS or HOURS). |
> | `balance` | Number | Time off balance of the user for the policy. |
> | `balance_diff` | Number | Balance consumed by this request. |
> | `note` | String | Note of the request. |
> | `created_at` | Datetime | When the request was created. |
> | `status` | String (JSON) | Full status object of the request. |
> | `time_off_period` | String (JSON) | Requested period (period start/end, half day settings). |
> | `extra_fields` | String (JSON) | Fields Clockify returned that this connector does not map to a column yet, keyed by their original names. |

### Expenses and invoices

> [accordion] Expenses
>
> Expenses with category, project, task, totals and approval status.
>
> Table: `expenses` · Primary key: `id` · Sync: Full table · Needs: Workspace admin or owner, with Expenses enabled and included in the plan.
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `id` | String | Unique identifier of the expense. |
> | `workspace_id` | String | Identifier of the Clockify workspace the record belongs to. |
> | `user_id` | String | Identifier of the user who recorded the expense. |
> | `date` | Date | Date of the expense. |
> | `category_id` | String | Identifier of the expense category. |
> | `category_name` | String | Name of the expense category. |
> | `project_id` | String | Identifier of the project the expense belongs to. |
> | `project_name` | String | Name of the project the expense belongs to. |
> | `client_id` | String | Identifier of the project's client. |
> | `client_name` | String | Name of the project's client. |
> | `task_id` | String | Identifier of the task the expense belongs to. |
> | `task_name` | String | Name of the task the expense belongs to. |
> | `quantity` | Number | Quantity (units) of the expense. |
> | `total` | Number | Total amount of the expense. |
> | `currency` | String | Currency of the expense. |
> | `billable` | Boolean | Whether the expense is billable. |
> | `notes` | String | Notes of the expense. |
> | `approval_request_id` | String | Identifier of the approval request that includes the expense. |
> | `approval_status` | String | Approval status of the expense. |
> | `detailed_approval_status` | String | Detailed approval status of the expense. |
> | `current_approval_level` | Integer | Approval level the expense is currently in. |
> | `locked` | Boolean | Whether the expense is locked for changes. |
> | `is_locked` | Boolean | Whether the expense is locked for changes (alternative flag sent by Clockify). |
> | `file_id` | String | Identifier of the attached receipt file. |
> | `file_name` | String | Name of the attached receipt file. |
> | `file_url` | String | URL of the attached receipt file. |
> | `category` | String (JSON) | Expense category object. |
> | `project` | String (JSON) | Project object of the expense. |
> | `task` | String (JSON) | Task object of the expense. |
> | `extra_fields` | String (JSON) | Fields Clockify returned that this connector does not map to a column yet, keyed by their original names. |

> [accordion] Expense Categories
>
> Expense categories, archived ones included.
>
> Table: `expense_categories` · Primary key: `id` · Sync: Full table · Needs: Workspace admin or owner, with Expenses enabled and included in the plan.
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `id` | String | Unique identifier of the expense category. |
> | `workspace_id` | String | Identifier of the Clockify workspace the record belongs to. |
> | `name` | String | Name of the expense category. |
> | `archived` | Boolean | Whether the category is archived. |
> | `has_unit_price` | Boolean | Whether the category has a unit price. |
> | `price_in_cents` | Integer | Unit price of the category, in cents. |
> | `unit` | String | Unit of the category (e.g. km). |
> | `extra_fields` | String (JSON) | Fields Clockify returned that this connector does not map to a column yet, keyed by their original names. |

> [accordion] Invoices
>
> Invoices with client, amounts and status.
>
> Table: `invoices` · Primary key: `id` · Sync: Full table · Needs: Workspace admin or owner, with Invoicing enabled and included in the plan.
>
> | Field | Type | Description |
> | :- | :- | :- |
> | `id` | String | Unique identifier of the invoice. |
> | `workspace_id` | String | Identifier of the Clockify workspace the record belongs to. |
> | `number` | String | Invoice number. |
> | `status` | String | Invoice status (UNSENT, SENT, PAID, PARTIALLY\_PAID, VOID, OVERDUE). |
> | `client_id` | String | Identifier of the invoiced client. |
> | `client_name` | String | Name of the invoiced client. |
> | `currency` | String | Currency of the invoice. |
> | `amount` | Integer | Invoice amount, in cents of the currency. |
> | `paid` | Integer | Amount already paid, in cents of the currency. |
> | `balance` | Integer | Amount still due, in cents of the currency. |
> | `issued_date` | Datetime | When the invoice was issued. |
> | `due_date` | Datetime | When the invoice is due. |
> | `extra_fields` | String (JSON) | Fields Clockify returned that this connector does not map to a column yet, keyed by their original names. |

## Limitations

* **Free plan**: 30 API requests per hour per workspace. Each project costs two requests in Tasks and each user at least one in Time Entries.
* **Edits to old time entries** come through Clockify's experimental change log; if it cannot be read, they wait for a Full sync (the sync log says so). Deleted entries stay in Time Entries until a Full sync; use Deleted Time Entries to filter them.
* **Mass edits of old time entries** (for example re-applying rates to months of entries) make the next sync re-read every user of the workspace from the oldest changed day, which takes long on the Free plan.
* **Template projects** are not read.
* Reports (summary, weekly, detailed, attendance), scheduling, webhooks and audit logs are not available in this connector.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.