> **Building with AI coding agents?** Install the authstack plugin with one command. This equips your agent with accurate Scalekit implementation patterns.
>
> **Recommended** (the `-y` flags skip prompts, so the command runs without an interactive terminal):
> ```bash
> npx -y @scalekit-inc/cli setup -y
> ```
>
> Global:
> ```bash
> npm install -g @scalekit-inc/cli
> scalekit setup -y
> ```
>
> Supports Claude Code, Cursor, GitHub Copilot, Codex + skills for other Agent Skills-compatible agents in `~/.agents/skills`.
> Skills: integrate-agentkit, implement-saaskit, add-mcp-oauth, implement-sso, implement-scim.
> [Full setup guide](https://docs.scalekit.com/dev-kit/build-with-ai/)

---

# Connect AI agents to WakaTime

The WakaTime connector lets your AI agent act in each user's WakaTime account. Each user signs in to WakaTime once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 35 tools.

**Authentication:** OAuth 2.0
**Categories:** Analytics, Developer Tools
**Tools:** 35: 32 read, 3 write, 0 destructive
**Users sign in with:** OAuth
**OAuth app:** Your own WakaTime app
**Built by:** Scalekit connector
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=WAKATIME)

## Setup

1. ### Install the SDK

   **Node.js**

   ```bash
   npm install @scalekit-sdk/node dotenv
   ```

   **Python**

   ```bash
   pip install scalekit-sdk-python python-dotenv
   ```

2. ### Set your credentials

   Add your Scalekit credentials to your `.env` file. Find values in **[app.scalekit.com](https://app.scalekit.com)** > **Developers** > **API Credentials**.

   ```sh title=".env"
   SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
   SCALEKIT_CLIENT_ID=<your-client-id>
   SCALEKIT_CLIENT_SECRET=<your-client-secret>
   ```

3. ### Create the WakaTime connection

   In **AgentKit > Connections**, create a WakaTime connection and copy its redirect URI. The name you give it is the `connection_name` your code passes. See [Configure connections](/agentkit/connections/).

4. ### Register an OAuth app

   WakaTime connections use your own OAuth app. Register one with WakaTime and add the redirect URI you copied.

   Then enter the app's Client ID and Client Secret on the WakaTime connection.

5. ### Authorize a user and make your first call

   **Node.js** (`quickstart.mts`)

   ```typescript
   import { ScalekitClient } from '@scalekit-sdk/node'
   import 'dotenv/config'
   import { createInterface } from 'node:readline/promises'

   const scalekit = new ScalekitClient(
     process.env.SCALEKIT_ENVIRONMENT_URL,
     process.env.SCALEKIT_CLIENT_ID,
     process.env.SCALEKIT_CLIENT_SECRET,
   )
   const actions = scalekit.actions

   const connector = 'wakatime'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
   console.log('Authorize WakaTime:', link)
   const rl = createInterface({ input: process.stdin, output: process.stdout })
   await rl.question('Press Enter after authorizing...')
   rl.close()

   // Make your first call
   const result = await actions.executeTool({
     connector,
     identifier,
     toolName: 'wakatime_get_current_user',
     toolInput: {},
   })
   console.log(result)
   ```

   ```bash
   npx tsx quickstart.mts
   ```

   **Python** (`quickstart.py`)

   ```python
   import os
   from scalekit import ScalekitClient
   from dotenv import load_dotenv
   load_dotenv()

   scalekit_client = ScalekitClient(
       env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),
       client_id=os.getenv("SCALEKIT_CLIENT_ID"),
       client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),
   )
   actions = scalekit_client.actions

   connection_name = "wakatime"
   identifier = "user_123"

   # Generate an authorization link for the user
   link_response = actions.get_authorization_link(
       connection_name=connection_name,
       identifier=identifier,
   )
   print("Authorize WakaTime:", link_response.link)
   input("Press Enter after authorizing...")

   # Make your first call
   result = actions.execute_tool(
       tool_input={},
       tool_name="wakatime_get_current_user",
       connection_name=connection_name,
       identifier=identifier,
   )
   print(result)
   ```

   ```bash
   python quickstart.py
   ```

   Each user signs in once. See [Authorize a user](/agentkit/tools/authorize/) for the full flow and statuses.

## Tools

Pass the exact name to `execute_tool`, with an input like each tool's example. To ask for a tool that's missing, use the [request form](https://scalekitsupport.portal.usepylon.com/forms/request-a-connector-tool).

**Node.js**

```typescript
const result = await actions.executeTool({
  toolName: 'wakatime_get_all_time_since_today',
  toolInput: {},
  connector: 'wakatime',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="wakatime_get_all_time_since_today",
    tool_input={},
    connection_name="wakatime",
    identifier="user_123",
)
```

`result.data` is the app's response as JSON, and `result.execution_id` (`executionId` in Node.js) is the ID of the call.

### `wakatime_get_all_time_since_today`

Get All Time Since Today · Read-only

Retrieve the total coding time logged since the account was created, optionally for one project.
Returns total seconds, a human-readable text, daily average, the date range and a freshness flag; a 202 status means stats are still being calculated.
Use this for a lifetime total. Use get_stats for a specific range or breakdown.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `project` (`string`, optional): Show the all-time total for this project only. Omit for the total across all projects.

Example input: `{}`

### `wakatime_get_commit`

Get Commit · Read-only

Retrieve a single commit of a WakaTime project by hash.
Returns the commit's message, author, committer, timestamps and total coding seconds, plus project and repository details.
Use this when you already have a commit hash. Use list_commits to find commits.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `hash` (`string`, required): Revision control hash of the commit, as returned by list_commits.
- `project` (`string`, required): Name of the WakaTime project, as returned by list_projects.
- `branch` (`string`, optional): Branch to filter the commit to. Defaults to the repository's default branch when omitted.

Example input: `{"hash":"<hash>","project":"<project>"}`

### `wakatime_get_current_user`

Get Current User · Read-only

Retrieve the authenticated WakaTime user's profile.
Returns id, username, display name, timezone, plan, last heartbeat details, and public profile settings. Email is included only when the email scope was granted.
Use this to identify the connected account or read its timezone before querying stats. Use get_stats for coding activity.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `wakatime_get_custom_rules_progress`

Get Custom Rules Progress · Read-only

Check the progress of a background job applying custom rules to past coding stats.
Returns the job id and a progress percentage from 0 to 100.
Use the job_id returned when custom rules were last updated.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `job_id` (`string`, required): ID of the custom-rules job to check.

Example input: `{"job_id":"<job_id>"}`

### `wakatime_get_durations`

Get Durations · Read-only

Retrieve the user's coding activity for one day as an array of durations.
Returns each duration with project, start time and length in seconds, sliced by project unless slice_by is set.
Use this for a detailed timeline of a single day. Use get_summaries for several days or get_heartbeats for raw activity events.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `date` (`string`, required): Day to fetch durations for, as YYYY-MM-DD. The result covers 12am to 11:59pm in the user's timezone (or the timezone input when the endpoint accepts one).
- `branches` (`string`, optional): Comma-separated list of branch names to include. Omit to include all branches.
- `project` (`string`, optional): Only include activity for this project name. Omit to include all projects.
- `slice_by` (`string`, optional): Primary key used to slice durations. One of project, entity, language, dependencies, os, editor, category, machine. The API defaults to project when omitted. One of: `project`, `entity`, `language`, `dependencies`, `os`, `editor`, `category`, `machine`.
- `timeout` (`integer`, optional): Keystroke timeout in minutes used when joining heartbeats into durations. Defaults to the user's own keystroke timeout setting when omitted.
- `timezone` (`string`, optional): Timezone for the requested dates, in Olson format such as America/Los_Angeles. Defaults to the user's timezone when omitted.
- `writes_only` (`boolean`, optional): When true, only count time from saving files. Defaults to the user's writes_only setting when omitted.

Example input: `{"date":"<date>"}`

### `wakatime_get_goal`

Get Goal · Read-only

Retrieve one coding goal by id.
Returns the goal's id, delta, target seconds, status, average status and per-period chart data from cached data; only an empty chart_data is returned while the cache warms.
Use list_goals to find goal ids.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `goal` (`string`, required): ID of the goal, as returned by list_goals.

Example input: `{"goal":"<goal>"}`

### `wakatime_get_insight`

Get Insight · Read-only

Retrieve a single insight about the user's coding activity for a time range.
Returns the data for the chosen insight type, such as weekdays, days, ai_days, best_day, daily_average, projects, languages, editors, categories, machines or operating systems, with a freshness flag.
Use this for one specific metric. Use get_stats for the full combined stats.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `insight_type` (`string`, required): Which insight to retrieve. One of stats, weekdays, days, ai_days, best_day, daily_average, projects, languages, editors, categories, machines, operating_systems. One of: `stats`, `weekdays`, `days`, `ai_days`, `best_day`, `daily_average`, `projects`, `languages`, `editors`, `categories`, `machines`, `operating_systems`.
- `range` (`string`, required): Time range for the insight: a year (YYYY), a month (YYYY-MM), or one of last_7_days, last_30_days, last_6_months, last_year, all_time.
- `timeout` (`integer`, optional): Keystroke timeout in minutes used when joining heartbeats into durations. Defaults to the user's own keystroke timeout setting when omitted.
- `weekday` (`string`, optional): Filter days to one weekday, either an integer 0-6 or a name from monday to sunday. Only applies when insight_type is days.
- `writes_only` (`boolean`, optional): When true, only count time from saving files. Defaults to the user's writes_only setting when omitted.

Example input: `{"insight_type":"stats","range":"<range>"}`

### `wakatime_get_org_dashboard_durations`

Get Org Dashboard Durations · Read-only

Retrieve one day of durations for every developer on an organization dashboard.
Returns each developer's durations for the day, sliced by project unless slice_by is set.
Use this for a team timeline. Use get_org_member_durations for one member.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `dashboard` (`string`, required): ID of the organization dashboard, as returned by list_org_dashboards.
- `date` (`string`, required): Day to fetch the dashboard durations for, as YYYY-MM-DD. The result covers 12am to 11:59pm in the user's timezone (or the timezone input when the endpoint accepts one).
- `org` (`string`, required): ID of the WakaTime organization, as returned by list_orgs.
- `branches` (`string`, optional): Comma-separated list of branch names to include. Omit to include all branches.
- `project` (`string`, optional): Only include activity for this project name. Omit to include all projects.
- `slice_by` (`string`, optional): Primary key used to slice durations. One of project, entity, language, dependencies, os, editor, category, machine. The API defaults to project when omitted. One of: `project`, `entity`, `language`, `dependencies`, `os`, `editor`, `category`, `machine`.

Example input: `{"dashboard":"<dashboard>","date":"<date>","org":"<org>"}`

### `wakatime_get_org_dashboard_summaries`

Get Org Dashboard Summaries · Read-only

Retrieve one day of coding activity for every developer on an organization dashboard.
Returns an array of per-developer summaries with grand total and breakdowns by project, language, editor and category.
Use this for a team overview. Use get_org_member_summaries for one member across several days.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `dashboard` (`string`, required): ID of the organization dashboard, as returned by list_org_dashboards.
- `date` (`string`, required): Day to fetch the dashboard summaries for, as YYYY-MM-DD. The result covers 12am to 11:59pm in the user's timezone (or the timezone input when the endpoint accepts one).
- `org` (`string`, required): ID of the WakaTime organization, as returned by list_orgs.
- `branches` (`string`, optional): Comma-separated list of branch names to include. Omit to include all branches.
- `project` (`string`, optional): Only include time logged to this project. Omit for all projects.

Example input: `{"dashboard":"<dashboard>","date":"<date>","org":"<org>"}`

### `wakatime_get_org_member_durations`

Get Org Member Durations · Read-only

Retrieve one day of durations for a single organization dashboard member.
Returns that member's durations, sliced by project unless slice_by is set.
Use this for a member's timeline. Use get_org_dashboard_durations for the whole team.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `dashboard` (`string`, required): ID of the organization dashboard, as returned by list_org_dashboards.
- `date` (`string`, required): Day to fetch the member durations for, as YYYY-MM-DD. The result covers 12am to 11:59pm in the user's timezone (or the timezone input when the endpoint accepts one).
- `member` (`string`, required): ID of the dashboard member, as returned by list_org_dashboard_members.
- `org` (`string`, required): ID of the WakaTime organization, as returned by list_orgs.
- `branches` (`string`, optional): Comma-separated list of branch names to include. Omit to include all branches.
- `project` (`string`, optional): Only include activity for this project name. Omit to include all projects.
- `slice_by` (`string`, optional): Primary key used to slice durations. One of project, entity, language, dependencies, os, editor, category, machine. The API defaults to project when omitted. One of: `project`, `entity`, `language`, `dependencies`, `os`, `editor`, `category`, `machine`.

Example input: `{"dashboard":"<dashboard>","date":"<date>","member":"<member>","org":"<org>"}`

### `wakatime_get_org_member_summaries`

Get Org Member Summaries · Read-only

Retrieve an organization dashboard member's coding activity as one summary per day across a date range.
Returns daily summaries with grand total and breakdowns by project, language, editor and category.
Use this for one member's trend. Use get_org_dashboard_summaries for the whole team on one day. Provide start and end together, or use range instead.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `dashboard` (`string`, required): ID of the organization dashboard, as returned by list_org_dashboards.
- `member` (`string`, required): ID of the dashboard member, as returned by list_org_dashboard_members.
- `org` (`string`, required): ID of the WakaTime organization, as returned by list_orgs.
- `branches` (`string`, optional): Comma-separated list of branch names to include. Omit to include all branches.
- `end` (`string`, optional): End date of the range as YYYY-MM-DD. Required unless range is provided; use together with start.
- `project` (`string`, optional): Only include time logged to this project. Omit for all projects.
- `range` (`string`, optional): Alternative to start and end. One of Today, Yesterday, Last 7 Days, Last 7 Days from Yesterday, Last 14 Days, Last 30 Days, This Week, Last Week, This Month, Last Month. One of: `Today`, `Yesterday`, `Last 7 Days`, `Last 7 Days from Yesterday`, `Last 14 Days`, `Last 30 Days`, `This Week`, `Last Week`, `This Month`, `Last Month`.
- `start` (`string`, optional): Start date of the range as YYYY-MM-DD. Required unless range is provided; use together with end.

Example input: `{"dashboard":"<dashboard>","member":"<member>","org":"<org>"}`

### `wakatime_get_private_leaderboard`

Get Private Leaderboard · Read-only

Retrieve the ranked members of one private leaderboard.
Returns leaders ordered by rank with running total and user details, plus the current user's rank and pagination fields.
Use list_private_leaderboards to find the board id first.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `board` (`string`, required): ID of the private leaderboard, as returned by list_private_leaderboards.
- `board_type` (`string`, optional): Ranking type: time for hours coded, manual for hours excluding AI coding, ai for AI lines, spend for AI spend. The API defaults to time. One of: `time`, `manual`, `ai`, `spend`.
- `country_code` (`string`, optional): Two-letter country code to filter leaders by. Omit for all countries.
- `language` (`string`, optional): Only rank activity in this language. Omit for all languages.
- `page` (`integer`, optional): Page number of the leaderboard. Defaults to the page containing the current user when omitted.

Example input: `{"board":"<board>"}`

### `wakatime_get_stats`

Get Stats · Read-only

Retrieve the user's coding stats for a time range.
Returns total time, daily average, best day, and breakdowns by language, editor, project, category, operating system, machine and dependencies, plus AI usage fields when available, and an is_up_to_date flag.
Use this for aggregated totals. Use get_summaries for per-day data and get_durations for one day's time slices. A 202 means stats are still being calculated, so retry.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `range` (`string`, required): Time range for the stats: a year (YYYY), a month (YYYY-MM), or one of last_7_days, last_30_days, last_6_months, last_year, all_time.
- `timeout` (`integer`, optional): Keystroke timeout in minutes used when joining heartbeats into durations. Defaults to the user's own keystroke timeout setting when omitted.
- `writes_only` (`boolean`, optional): When true, only count time from saving files. Defaults to the user's writes_only setting when omitted.

Example input: `{"range":"<range>"}`

### `wakatime_get_status_bar_today`

Get Status Bar Today · Read-only

Retrieve the user's coding activity for today as shown in IDE status bars.
Returns today's grand total and breakdowns by category, editor, language, machine, operating system and project from cached data; the response is empty until the cache is warm.
Use this for a quick view of today's time. Use get_summaries for a historical range.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `wakatime_get_summaries`

Get Summaries · Read-only

Retrieve the user's coding activity as one summary per day across a date range.
Returns an array of daily summaries with grand total and breakdowns by project, language, editor, category, operating system, machine and dependencies, plus the overall start and end.
Use this for day-by-day trends. Use get_stats for a single aggregated result. Provide start and end together, or use range instead.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `branches` (`string`, optional): Comma-separated list of branch names to include. Omit to include all branches.
- `end` (`string`, optional): End date of the range as YYYY-MM-DD. Required unless range is provided; use together with start.
- `project` (`string`, optional): Only include time logged to this project. Omit for all projects.
- `range` (`string`, optional): Alternative to start and end. One of Today, Yesterday, Last 7 Days, Last 7 Days from Yesterday, Last 14 Days, Last 30 Days, This Week, Last Week, This Month, Last Month. One of: `Today`, `Yesterday`, `Last 7 Days`, `Last 7 Days from Yesterday`, `Last 14 Days`, `Last 30 Days`, `This Week`, `Last Week`, `This Month`, `Last Month`.
- `start` (`string`, optional): Start date of the range as YYYY-MM-DD. Required unless range is provided; use together with end.
- `timeout` (`integer`, optional): Keystroke timeout in minutes used when joining heartbeats into durations. Defaults to the user's own keystroke timeout setting when omitted.
- `timezone` (`string`, optional): Timezone for the requested dates, in Olson format such as America/Los_Angeles. Defaults to the user's timezone when omitted.
- `writes_only` (`boolean`, optional): When true, only count time from saving files. Defaults to the user's writes_only setting when omitted.

Example input: `{}`

### `wakatime_list_commits`

List Commits · Read-only

List commits of a WakaTime project with the time spent coding on each.
Returns commits with hash, message, author, committer, total coding seconds, plus project and repository details and pagination fields.
Use this to see time per commit. Use get_commit for a single commit by hash.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `project` (`string`, required): Name of the WakaTime project, as returned by list_projects.
- `author` (`string`, optional): Only return commits authored by this username. Omit for all authors.
- `branch` (`string`, optional): Branch name to filter commits to. Defaults to the repository's default branch when omitted.
- `page` (`integer`, optional): Page number of commits. Omit for the first page.

Example input: `{"project":"<project>"}`

### `wakatime_list_custom_rules`

List Custom Rules · Read-only

List the user's custom rules for rewriting or deleting heartbeats.
Returns each rule's id, action, source, operation, source value, destinations and priority.
Use this to inspect how heartbeats are being rewritten. Use list_org_custom_rules for an organization's rules.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `wakatime_list_data_dumps`

List Data Dumps · Read-only

List the user's data exports.
Returns each export's id, type, status, percent complete, download url, expiry and failure flags.
Use this to check an export started with create_data_dump and to get its download url.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `wakatime_list_editors`

List Editors · Read-only

List the IDE plugins WakaTime supports.
Returns each editor plugin's id, name, color, website, repository, latest version and release flags.
Use this as a catalog of supported editors. Use list_user_agents for the plugins this user actually uses.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `unreleased` (`boolean`, optional): When true, also include unreleased plugins.

Example input: `{}`

### `wakatime_list_external_durations`

List External Durations · Read-only

List the user's external durations for one day.
Returns durations created by external apps such as calendar integrations, with id, external id, entity, type, provider, category, start time, end time and project.
Use this for time not logged by IDE plugins. Use get_durations for plugin-based durations.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `date` (`string`, required): Day to fetch external durations for, as YYYY-MM-DD. The result covers 12am to 11:59pm in the user's timezone (or the timezone input when the endpoint accepts one).
- `branches` (`string`, optional): Comma-separated list of branch names to include. Omit to include all branches.
- `project` (`string`, optional): Only include activity for this project name. Omit to include all projects.
- `timezone` (`string`, optional): Timezone for the requested dates, in Olson format such as America/Los_Angeles. Defaults to the user's timezone when omitted.

Example input: `{"date":"<date>"}`

### `wakatime_list_goals`

List Goals · Read-only

List the user's coding goals.
Returns each goal with its id, custom title, delta (day or week), target seconds, languages, projects, editors, status, average status and per-period chart data, from cached data.
Use this to find goal ids for get_goal.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `wakatime_list_heartbeats`

List Heartbeats · Read-only

List the heartbeats the user's plugins sent for one day.
Returns raw heartbeats with entity, type, category, time, project, branch, language and AI usage fields, plus the start, end and timezone of the day.
Use this for raw activity events. Use get_durations for the joined time slices.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `date` (`string`, required): Day to fetch heartbeats for, as YYYY-MM-DD. The result covers 12am to 11:59pm in the user's timezone (or the timezone input when the endpoint accepts one).

Example input: `{"date":"<date>"}`

### `wakatime_list_machine_names`

List Machine Names · Read-only

List the machines that have logged coding activity for the user.
Returns each machine's id, name, host value, ip, timezone and last seen time.
Use this to find machine names that appear in stats and summaries.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `wakatime_list_org_custom_rules`

List Org Custom Rules · Read-only

List the custom rules of an organization.
Returns each rule's action, source, operation, source value, destinations and priority.
Use list_custom_rules for the user's own rules.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `org` (`string`, required): ID of the WakaTime organization, as returned by list_orgs.

Example input: `{"org":"<org>"}`

### `wakatime_list_org_dashboard_members`

List Org Dashboard Members · Read-only

List the members of an organization dashboard.
Returns each member's id, username, full name, email, photo and view-only flag, plus pagination fields.
Use this to get the member id for the member summary and duration tools.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `dashboard` (`string`, required): ID of the organization dashboard, as returned by list_org_dashboards.
- `org` (`string`, required): ID of the WakaTime organization, as returned by list_orgs.

Example input: `{"dashboard":"<dashboard>","org":"<org>"}`

### `wakatime_list_org_dashboards`

List Org Dashboards · Read-only

List the dashboards of an organization.
Returns each dashboard's id, full name, creator, timezone and member count.
Use this to get the dashboard id for the other org dashboard tools. Use list_orgs first for the org id.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `org` (`string`, required): ID of the WakaTime organization, as returned by list_orgs.

Example input: `{"org":"<org>"}`

### `wakatime_list_orgs`

List Orgs · Read-only

List the organizations the user belongs to.
Returns each organization's id, name, people count, timezone, keystroke timeout and permission flags.
Use this first to get the org id required by the org tools.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `wakatime_list_private_leaderboards`

List Private Leaderboards · Read-only

List the user's private leaderboards.
Returns each leaderboard's id, name, member count and time range, plus a total.
Use this to find board ids for get_private_leaderboard. Use list_public_leaders for the public leaderboard.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `wakatime_list_program_languages`

List Program Languages · Read-only

List all verified programming languages WakaTime supports.
Returns each language's id, name, color and verification flag, plus total and total_pages.
Use this to find valid language names for filters on other tools.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `wakatime_list_projects`

List Projects · Read-only

List the user's WakaTime projects, optionally filtered by a search term.
Returns each project's id, name, repository, badge, color, url and first and last heartbeat times.
Use this to find project names to pass to other tools such as get_summaries or list_commits.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `q` (`string`, optional): Search term used to filter project names. Omit to list all projects.

Example input: `{}`

### `wakatime_list_public_leaders`

List Public Leaders · Read-only

List users on the public WakaTime leaderboard ranked by coding activity.
Returns leaders with rank, running total and user details, plus the current user's rank and pagination fields; the board updates at least every 12 hours.
Use this for the global ranking. Use get_private_leaderboard for a private board.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `board_type` (`string`, optional): Ranking type: time for hours coded, manual for hours excluding AI coding, ai for AI lines, spend for AI spend. The API defaults to time. One of: `time`, `manual`, `ai`, `spend`.
- `country_code` (`string`, optional): Two-letter country code to filter leaders by. Omit for all countries.
- `is_hireable` (`boolean`, optional): When true, only show users with the hireable badge.
- `language` (`string`, optional): Only rank activity in this language. Omit for all languages.
- `page` (`integer`, optional): Page number of the leaderboard. Defaults to the page of the authenticated user when omitted.

Example input: `{}`

### `wakatime_list_user_agents`

List User Agents · Read-only

List the editor plugins that have sent activity for the user.
Returns each user agent with its id, editor, plugin version, operating system, detected AI model and last seen time.
Use this to see which plugins are in use. Use list_editors for the catalog of all supported plugins.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `wakatime_create_data_dump`

Create Data Dump · Write

Start a background export of the user's coding data.
Returns the new export's id, type, status and percent complete; the download url appears once it completes.
Use list_data_dumps afterwards to poll status and get the download url. Large exports can take a while.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `type` (`string`, required): Type of export: daily for daily summaries, or heartbeats for raw heartbeats. One of: `daily`, `heartbeats`.
- `email_when_finished` (`boolean`, optional): Whether to email the user a download link when the export completes. The API defaults to true.

Example input: `{"type":"daily"}`

### `wakatime_create_external_duration`

Create External Duration · Write

Log a block of activity with a start and end time when heartbeats are not available, such as a meeting.
Returns the stored external duration. Reusing an external_id updates the existing duration instead of creating a duplicate.
Use this for time from external apps. Needs the write_heartbeats scope; start must be within one year and after the account was created.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `end_time` (`number`, required): UNIX epoch timestamp when the activity ended, in seconds; digits after the decimal point are fractions of a second.
- `entity` (`string`, required): Entity the time is logged towards, such as a file path, an app name or a domain.
- `external_id` (`string`, required): Unique identifier of this duration in the external system. Reusing it updates the existing duration.
- `start_time` (`number`, required): UNIX epoch timestamp when the activity started, in seconds; digits after the decimal point are fractions of a second.
- `type` (`string`, required): Type of the entity. One of file, app, event, url, domain. One of: `file`, `app`, `event`, `url`, `domain`.
- `branch` (`string`, optional): Branch name to log the time to.
- `category` (`string`, optional): Category of the activity. Normally inferred from type. One of coding, building, indexing, debugging, browsing, running tests, writing tests, manual testing, writing docs, communicating, code reviewing, notes, researching, learning, designing, ai coding. One of: `coding`, `building`, `indexing`, `debugging`, `browsing`, `running tests`, `writing tests`, `manual testing`, `writing docs`, `communicating`, `code reviewing`, `notes`, `researching`, `learning`, `designing`, `ai coding`.
- `language` (`string`, optional): Programming language to attribute the time to.
- `meta` (`string`, optional): Free-form metadata string, for example an event description.
- `project` (`string`, optional): Project name to log the time to.

Example input: `{"end_time":1,"entity":"<entity>","external_id":"<external_id>","start_time":1,"type":"file"}`

### `wakatime_create_heartbeat`

Create Heartbeat · Write

Log one heartbeat of coding activity for the user.
Returns the new heartbeat's id, entity, type and time.
Use this only to record activity from your own app; normal editor tracking is handled by wakatime-cli. Needs the write_heartbeats scope.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `entity` (`string`, required): Entity the heartbeat logs time against, such as an absolute file path or a domain.
- `time` (`number`, required): UNIX epoch timestamp of the activity in seconds; digits after the decimal point are fractions of a second.
- `type` (`string`, required): Type of the entity. One of file, app, url, domain. One of: `file`, `app`, `url`, `domain`.
- `branch` (`string`, optional): Branch name the activity happened on.
- `category` (`string`, optional): Category of the activity. Normally inferred from type. One of coding, building, indexing, debugging, browsing, running tests, writing tests, manual testing, writing docs, communicating, code reviewing, notes, researching, learning, designing, ai coding. One of: `coding`, `building`, `indexing`, `debugging`, `browsing`, `running tests`, `writing tests`, `manual testing`, `writing docs`, `communicating`, `code reviewing`, `notes`, `researching`, `learning`, `designing`, `ai coding`.
- `cursorpos` (`integer`, optional): Current cursor column position, starting at 1.
- `dependencies` (`string`, optional): Comma-separated list of dependencies detected in the entity file.
- `is_write` (`boolean`, optional): Whether the heartbeat was triggered by writing to a file.
- `language` (`string`, optional): Programming language of the entity.
- `lineno` (`integer`, optional): Current cursor line number, starting at 1.
- `lines` (`integer`, optional): Total number of lines in the entity when the entity type is file.
- `project` (`string`, optional): Project name to log the activity to.

Example input: `{"entity":"<entity>","time":1,"type":"file"}`

## Related

Other Analytics connectors ([all 109](/agentkit/connectors/?category=analytics)):

- [Microsoft 365](/agentkit/connectors/microsoft365/): Scalekit connector, OAuth, 317 tools
- [HubSpot](/agentkit/connectors/hubspot/): Scalekit connector, OAuth, 457 tools
- [Snowflake](/agentkit/connectors/snowflake/): Scalekit connector, OAuth, 42 tools


---

## More Scalekit documentation

| Resource | What it contains | When to use it |
|----------|-----------------|----------------|
| [/llms.txt](/llms.txt) | Structured index with routing hints per product area | Start here — find which documentation set covers your topic before loading full content |
| [/llms-full.txt](/llms-full.txt) | Complete documentation for all Scalekit products in one file | Use when you need exhaustive context across multiple products or when the topic spans several areas |
| [sitemap-0.xml](https://docs.scalekit.com/sitemap-0.xml) | Full URL list of every documentation page | Use to discover specific page URLs you can fetch for targeted, page-level answers |
