# Batch Read Time Logs Source: https://docs.threadi.au/apis/stopwatch/batch-read-time-logs /apis/stopwatch-openapi.yaml post /stopwatch/v1/timelogs/batch/read Retrieves 1 or many **StopWatch Time Log** records by their ID(s). See [HubSpot API documentation](https://developers.hubspot.com/docs/api-reference/crm-objects-v3/batch/post-crm-v3-objects-objectType-batch-read) for the request **Body** structure and available **Query Parameters** # Create Time Log Source: https://docs.threadi.au/apis/stopwatch/create-time-log /apis/stopwatch-openapi.yaml post /stopwatch/v1/timelogs Creates a **StopWatch Time Log** record and attempts to set a corresponding HubSpot CRM association. # Get Time Log Source: https://docs.threadi.au/apis/stopwatch/get-time-log /apis/stopwatch-openapi.yaml get /stopwatch/v1/timelogs/{id} Retrieves a single **StopWatch Time Log** record by ID. See [HubSpot API documentation](https://developers.hubspot.com/docs/api-reference/latest/crm/objects/objects/get-object) for the list of valid **Query Parameters**. # Overview Source: https://docs.threadi.au/apis/stopwatch/index A secure authentication wrapper for HubSpot's App Objects API, allowing programmatic access to StopWatch Time Logs. * The **StopWatch API** can only be used by our **πŸ’« Unlimited** subscribers. Review all subscription options [here](/pricing?app=stopwatch). * The **StopWatch API** is only relevant to customers using **App Objects Mode**. For customers using the legacy **Custom Objects Mode**, please use [HubSpot's Custom Objects API](https://developers.hubspot.com/docs/api-reference/latest/crm/objects/custom-objects/get-custom-object) directly. The **StopWatch API** acts as a secure proxy for specific HubSpot CRM Objects, Owners and Properties APIs, relevant to the [StopWatch for HubSpot](/apps/stopwatch) app. It is specifically designed to allow controlled programmatic access to **StopWatch Time Log** records, bypassing the scope restrictions imposed by HubSpot on App Objects. Industry-standard Bearer token authentication with hashed storage. Automatic rewriting of HubSpot pagination links for intuitive paging. Critical HubSpot metadata (like rate limits) is passed directly to your app. Built for long-term stability with versioned endpoints. ## Why use the StopWatch API? HubSpot restricts the programmatic access to [App Object](https://developers.hubspot.com/docs/apps/developer-platform/add-features/app-objects/overview) records to the developer providing the given app. This means that while our customers can see their **StopWatch Time Log** records in HubSpot's UI, they cannot extract them programmatically using standard HubSpot API authentication methods. The **StopWatch API** provides a secure layer that uses the StopWatch App's permissions to create, read and update records on your behalf, giving you the access you need to programmatically interact with your **StopWatch Time Log** records. *** ## Base URL The API's base URL is: ```http theme={null} https://api.threadi.au ``` *** ## Authentication All requests to the **StopWatch API** must include an `Authorization` header with a static bearer authentication token. ```http theme={null} Authorization: Bearer {token} ``` API keys can be managed from within HubSpot, within the app's **Admin Settings** tab. Only the account's **Primary Admin** can manage API keys. See our Usage Guide's [**App Settings**](/apps/stopwatch#app-settings) section for more information. By default, each API key is **rate-limited to 1,000 requests per day** (UTC). If you need a higher daily limit, please submit a [support request](https://www.threadi.au/support?app_name=stopwatch). *** ## Key Features ### Link Rewriting When you fetch a list of **StopWatch Time Log** records or **HubSpot Owners**, HubSpot might return a `paging` object. We automatically rewrite these links so you can use them directly in your next request: ```json theme={null} "paging": { "next": { "after": "12345", "link": "https://api.threadi.au/stopwatch/v1/timelogs?limit=10&after=12345" } } ``` ### Owner Lookup Use the [List Owners](/apis/stopwatch/list-owners) endpoint to retrieve valid `hubspot_owner_id` values before creating Time Logs through the API. Use the returned Owner `id` values when setting `hubspot_owner_id` in your create Time Log requests. ### Response Headers The following `x-stopwatch-*` headers are supplied in the majority of cases: | key | example | | ------------------------------------------------------------------------------------------- | --------------- | | x-stopwatch-ratelimit-max | `1000` | | x-stopwatch-ratelimit-remaining | `123` | | x-stopwatch-ratelimit-reset | `1774913275000` | We also forward all `x-hubspot-*` headers from the underlying HubSpot response. This allows your integration to monitor rate limits in real-time. These headers could include: * `x-hubspot-correlation-id` * `x-hubspot-ratelimit-interval-milliseconds` * `x-hubspot-ratelimit-max` * `x-hubspot-ratelimit-remaining` * `x-hubspot-ratelimit-secondly` * `x-hubspot-ratelimit-secondly-remaining` Learn more about how to interpret these HubSpot headers [here](https://developers.hubspot.com/docs/developer-tooling/platform/usage-guidelines#rate-limit-error-responses). *** Next, explore our [API Reference](/apis/stopwatch/list-time-logs) to start building. # List Owners Source: https://docs.threadi.au/apis/stopwatch/list-owners /apis/stopwatch-openapi.yaml get /stopwatch/v1/owners Retrieves a list of HubSpot CRM Owners belonging to the authorised portal. Primarily supported so you can find valid `hubspot_owner_id` values for Time Log creation. See [HubSpot API documentation](https://developers.hubspot.com/docs/api-reference/latest/crm/owners/get-owners) for the list of valid **Query Parameters**. # List Properties Source: https://docs.threadi.au/apis/stopwatch/list-properties /apis/stopwatch-openapi.yaml get /stopwatch/v1/timelogs/properties Retrieves all properties for the **StopWatch Time Log** object type. See [HubSpot API documentation](https://developers.hubspot.com/docs/api-reference/crm-properties-v3/core/get-crm-v3-properties-objectType) for a list of available **Query Parameters** # List Time Logs Source: https://docs.threadi.au/apis/stopwatch/list-time-logs /apis/stopwatch-openapi.yaml get /stopwatch/v1/timelogs Retrieves a list of **StopWatch Time Log** records. Pagination links are automatically rewritten to point to the **StopWatch API**. See [HubSpot API documentation](https://developers.hubspot.com/docs/api-reference/crm-objects-v3/basic/get-crm-v3-objects-objectType) for a list of available **Query Parameters**, including indicating target response `properties` # Search Time Logs Source: https://docs.threadi.au/apis/stopwatch/search-time-logs /apis/stopwatch-openapi.yaml post /stopwatch/v1/timelogs/search Search for **StopWatch Time Log** records using HubSpot's flexible **CRM Search** engine. See [HubSpot API documentation](https://developers.hubspot.com/docs/api-reference/latest/crm/search-the-crm) for the expected request **Body** structure # StopWatch Time Log Schema Source: https://docs.threadi.au/apis/stopwatch/time-log-schema Data schema reference for **StopWatch Time Logs** * This data schema reference relates only to the **StopWatch Time Log** App Object type, not the legacy **Time Log** Custom Object type * Except for `hubspot_owner_id`, only properties unique to **StopWatch Time Logs** are included in this reference. All standard HubSpot properties exist on **StopWatch Time Logs** too, but they aren't listed here. * For the full OpenAPI definition, see the [StopWatch OpenAPI YAML](https://docs.threadi.au/apis/stopwatch-openapi.yaml). This reference summarises `components.schemas.Timelog` ## Data Object Shape ```json theme={null} { "id": "1234567890", "properties": { "a552213_record_id": "28270412 -- 2026-03-20 04:22:15.536", "a552213_assoc_obj_type": "contact", "a552213_assoc_record_id": "9876543210", "a552213_first_start_date": "2026-02-27T21:24:18.038Z", "a552213_total_minutes": 1440 ... }, "createdAt": "2026-02-27T21:24:18.038Z", "updatedAt": "2026-02-28T21:24:18.038Z", "archived": false } ``` *** ## Top-Level Fields | Name | Type | Description | | -------------------------- | ---------- | -------------------------------------------- | | `id` Unique | `string` | HubSpot object ID for the time log record | | `properties` | `object` | **StopWatch Time Log** properties | | `createdAt` | `datetime` | Record creation timestamp (UTC, ISO-8601) | | `updatedAt` | `datetime` | Record last update timestamp (UTC, ISO-8601) | | `archived` | `boolean` | Whether the record is archived in HubSpot | *** ## Properties (`properties`) ### Identity, Association & Ownership | Label | Name | Type | | ----------------------------------------------------------------------- | ----------------------------------------- | ------------------------------------------------------- | | StopWatch Record ID | `a552213_record_id` Unique | `string` | | Associated Object Type | `a552213_assoc_obj_type` | `enumeration` Options | | Associated Record ID | `a552213_assoc_record_id` | `string` | | Workflow Managed Tag | `a552213_workflow_managed_tag` | `string` | | Created via StopWatch API Hidden | `a552213_created_via_stopwatch_api` | `boolean` | | Last Updated via StopWatch API Hidden | `a552213_last_updated_via_stopwatch_api` | `datetime` | | Owner | `hubspot_owner_id` | `enumeration` Options | *** ### 1 Time Log Per Session Properties Only available for our πŸ’« **Unlimited** and πŸ‘₯ **Team** subscribers | Label | Name | Type | | ------------------------------ | ----------------------- | ------------------------------------------------------- | | Title | `a552213_title` | `string` | | Category | `a552213_category_text` | `enumeration` Options | | Description | `a552213_description` | `string` | *** ### Session State & Dates | Label | Name | Type | | ------------------------------------- | -------------------------- | ---------- | | Stopwatch Active | `a552213_toggle` | `boolean` | | First Start Date | `a552213_first_start_date` | `datetime` | | First Stop Date | `a552213_first_end_date` | `datetime` | | Last Start Date | `a552213_last_start_date` | `datetime` | | Last Stop Date | `a552213_last_end_date` | `datetime` | | Number of Sessions | `a552213_num_sessions` | `number` | *** ### Date Aggregations Only populated if at least one of the following user-specific settings is enabled: * 1 Time Log Per Session * Split Time Logs By Week * Split Time Logs By Month | Label | Name | Type | | ----------------------------------------- | -------------------- | ------ | | Time Log Week of Year | `a552213_week_year` | `date` | | Time Log Month of Year | `a552213_month_year` | `date` | *** ### Total Tracked Time Durations | Label | Name | Type | | -------------------------------------------------------------------------------- | ------------------------------ | -------- | | Total Tracked Time Minutes | `a552213_total_minutes` | `number` | | Total Tracked Time Hours Calculated | `a552213_total_hours_auto` | `number` | | Total Tracked Time Days Calculated | `a552213_total_days_auto` | `number` | | Total Tracked Time Years Calculated | `a552213_total_years_auto` | `number` | | Total Tracked Time Decades Calculated | `a552213_total_decades_auto` | `number` | | Total Tracked Time Centuries Calculated | `a552213_total_centuries_auto` | `number` | | Total Tracked Time Hours Legacy Deprecated | `a552213_total_hours` | `number` | | Total Tracked Time Days Legacy Deprecated | `a552213_total_days` | `number` | | Total Tracked Time Years Legacy Deprecated | `a552213_total_years` | `number` | | Total Tracked Time Decades Legacy Deprecated | `a552213_total_decades` | `number` | | Total Tracked Time Centuries Legacy Deprecated | `a552213_total_centuries` | `number` | *** ### Billable Tracked Time Durations & Metrics * Only populated for **StopWatch Time Logs** where at least 1 related time tracking session has been marked as 'Billable' * **Billable Amount**, **Cost Amount** and **Margin Amount** are only populated for our πŸ’« **Unlimited** subscribers | Label | Name | Type | | ----------------------------------------------------------------------------------- | --------------------------------- | -------- | | Billable Tracked Time Minutes | `a552213_billable_minutes` | `number` | | Billable Tracked Time Hours Calculated | `a552213_billable_hours_auto` | `number` | | Billable Tracked Time Days Calculated | `a552213_billable_days_auto` | `number` | | Billable Tracked Time Years Calculated | `a552213_billable_years_auto` | `number` | | Billable Tracked Time Decades Calculated | `a552213_billable_decades_auto` | `number` | | Billable Tracked Time Centuries Calculated | `a552213_billable_centuries_auto` | `number` | | Billable Percentage | `a552213_billable_percentage` | `number` | | Service Name | `a552213_service_name` | `string` | | Billable Rate | `a552213_billable_rate` | `number` | | Cost Rate | `a552213_cost_rate` | `number` | | Billable Amount Calculated | `a552213_billable_amount_auto` | `number` | | Cost Amount Calculated | `a552213_cost_amount_auto` | `number` | | Margin Amount Calculated | `a552213_margin_amount_auto` | `number` | | Billable Tracked Time Hours Legacy Deprecated | `a552213_billable_hours` | `number` | | Billable Tracked Time Days Legacy Deprecated | `a552213_billable_days` | `number` | | Billable Tracked Time Years Legacy Deprecated | `a552213_billable_years` | `number` | | Billable Tracked Time Decades Legacy Deprecated | `a552213_billable_decades` | `number` | | Billable Tracked Time Centuries Legacy Deprecated | `a552213_billable_centuries` | `number` | | Billable Amount Legacy Deprecated | `a552213_billable_amount` | `number` | | Cost Amount Legacy Deprecated | `a552213_cost_amount` | `number` | | Margin Amount Legacy Deprecated | `a552213_margin_amount` | `number` | *** ### Time Log Aggregation Flags | Label | Name | Type | | -------------------------------------------------------------- | -------------------------------------------- | --------- | | Is 1 Time Log Per Session Record | `a552213_is_one_time_log_per_session_record` | `boolean` | | Is Split Week Record Hidden | `a552213_is_split_week_record` | `boolean` | | Is Split Month Record Hidden | `a552213_is_split_month_record` | `boolean` | # Update Time Log Source: https://docs.threadi.au/apis/stopwatch/update-time-log /apis/stopwatch-openapi.yaml patch /stopwatch/v1/timelogs/{id} Updates a **StopWatch Time Log** record by ID. See [HubSpot API documentation](https://developers.hubspot.com/docs/api-reference/latest/crm/objects/objects/update-object) for the list of valid **Query Parameters**. # StopWatch for HubSpot Source: https://docs.threadi.au/apps/stopwatch This **App Usage Guide** aims to help you get up and running with **StopWatch for HubSpot**, an intuitive time tracking app designed specifically for HubSpot. Since September 2025, **StopWatch for HubSpot** has been **compatible with all HubSpot Portals** **StopWatch for HubSpot** has been [Certified by HubSpot](https://ecosystem.hubspot.com/marketplace/listing/hubclock-by-thread-integrations-552213) since July 2024 and was named an [Essential App for Customer Service](https://community.hubspot.com/t/updated-in-the-app-marketplace-essential-apps-for-customer-service/129698) in 2025. ## App Demo Videos