> **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 tl;dv

The tl;dv connector lets your AI agent act in each user's tl;dv account. Each user connects their own tl;dv API key once, and Scalekit sends it with every call, so your agent never handles credentials. It comes with 5 tools.

**Authentication:** API Key
**Categories:** Transcription, Productivity
**Tools:** 5: 4 read, 1 write, 0 destructive
**Users sign in with:** API key
**Built by:** Scalekit connector
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=TLDV)

## 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 tl;dv connection

   In **AgentKit > Connections**, create a tl;dv connection. The name you give it is the `connection_name` your code passes. See [Configure connections](/agentkit/connections/).

4. ### 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 = 'tldv'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
   console.log('Authorize tl;dv:', 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: 'tldv_list_meetings',
     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 = "tldv"
   identifier = "user_123"

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

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

   ```bash
   python quickstart.py
   ```

   Each user opens the link once and enters their tl;dv credentials there. 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: 'tldv_get_meeting',
  toolInput: {
    meetingId: '<meetingId>',
  },
  connector: 'tldv',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="tldv_get_meeting",
    tool_input={
        "meetingId": "<meetingId>",
    },
    connection_name="tldv",
    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.

### `tldv_get_meeting`

Get Meeting · Read-only

Retrieve one tl;dv meeting by id.
Returns id, name, happenedAt, url, duration, organizer, invitees, template, extraProperties, plus phoneNumber and metadata when set at import.
Use get_meeting for metadata about one meeting. Use list_meetings to find ids, get_transcript for the spoken text, get_meeting_notes for the AI notes.

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

Inputs:

- `meetingId` (`string`, required): ID of the meeting, as returned by tldv_list_meetings (the id field).

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

### `tldv_get_meeting_notes`

Get Meeting Notes · Read-only

Retrieve the AI-generated notes of a tl;dv meeting.
Returns structuredNotes, markdownContent and topics for the meeting.
Use get_meeting_notes for a summary and key points. Use get_transcript for the verbatim text.
Prerequisite: a meeting id from list_meetings.

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

Inputs:

- `meetingId` (`string`, required): ID of the meeting, as returned by tldv_list_meetings (the id field).

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

### `tldv_get_transcript`

Get Transcript · Read-only

Retrieve the transcript of a tl;dv meeting.
Returns the transcript id, meetingId and a data array of sentences, each with speaker, text, startTime and endTime.
Use get_transcript for the full spoken text. Use get_meeting_notes for a summary instead. Only available once the transcript is complete; the meeting organizer's plan must allow API access.
Prerequisite: a meeting id from list_meetings.

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

Inputs:

- `meetingId` (`string`, required): ID of the meeting, as returned by tldv_list_meetings (the id field).

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

### `tldv_list_meetings`

List Meetings · Read-only

List meetings in tl;dv, optionally filtered by search text, date range, participation or meeting type.
Returns page, pages, total, pageSize and a results array with each meeting's id, name, happenedAt, url, duration, organizer and invitees.
Use list_meetings to find a meeting id. Use get_meeting for one meeting's full details, get_transcript for what was said, get_meeting_notes for the AI summary.

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

Inputs:

- `from` (`string`, optional): Only return meetings that happened on or after this date, as YYYY-MM-DD or an ISO 8601 date-time.
- `limit` (`integer`, optional): Number of results per page. Default is 50, maximum 100. The total number of results cannot exceed 10,000.
- `meetingType` (`string`, optional): Filter by meeting type: internal (all participants from the same organization) or external (at least one participant from outside it). One of: `internal`, `external`.
- `onlyParticipated` (`boolean`, optional): When true, only return meetings the user participated in. Default is false.
- `page` (`integer`, optional): Page number to return, starting at 1. Default is 1.
- `query` (`string`, optional): Text to search for in meetings.
- `to` (`string`, optional): Only return meetings that happened on or before this date, as YYYY-MM-DD or an ISO 8601 date-time.

Example input: `{}`

### `tldv_import_meeting`

Import Meeting · Write

Import a recording from a public URL into tl;dv as a new meeting for transcription.
Returns success, jobId and a message describing the import job.
Use import_meeting to add an existing audio or video file. The URL must be publicly accessible and in a supported format (.mp3, .mp4, .wav, .m4a, .mkv, .mov, .avi, .wma, .flac). Processing is asynchronous: poll list_meetings for the new meeting.

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

Inputs:

- `name` (`string`, required): Name of the imported meeting or recording.
- `url` (`string`, required): Publicly accessible URL of the media file. Supported formats: .mp3, .mp4, .wav, .m4a, .mkv, .mov, .avi, .wma, .flac.
- `dryRun` (`boolean`, optional): When true, validates the import without persisting it or running anything. For testing only.
- `happenedAt` (`string`, optional): When the meeting happened, as an ISO 8601 UTC date-time with fractional seconds. Defaults to the current time if omitted.
- `metadata` (`object`, optional): Flat object of your own identifiers (up to 20 keys; keys match ^[A-Za-z0-9_-]{1,64}$; values are strings up to 256 characters, numbers or booleans; no nesting). Returned verbatim by get_meeting. Example: {"crmRecordId": "rec_123", "callId": 42}.
- `participants` (`array`, optional): Emails of the participants invited to the meeting or recording.
- `phoneNumber` (`string`, optional): Phone number associated with the recording, such as the other party of a call. Maximum 64 characters.

Example input: `{"name":"<name>","url":"<url>"}`

## Related

Other Transcription connectors ([all 29](/agentkit/connectors/?category=transcription)):

- [Chorus](/agentkit/connectors/chorus/): Scalekit connector, Username and password, 9 tools
- [Diarize](/agentkit/connectors/diarize/): Scalekit connector, Access token, 3 tools
- [Gong](/agentkit/connectors/gong/): Scalekit connector, OAuth, 69 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 |
