# List recordings
Source: https://apidocs.neetorecord.com/api-reference-v1/recordings/list
bundled-v1/recordings.yaml GET /recordings
List all recordings.
**Deprecated:** This is a **v1** endpoint. It will continue to work, but we
recommend migrating to the [v2 equivalent](/api-reference) for improved REST
compliance (correct HTTP status codes, consistent response envelopes, and
hyphenated URLs).
Replace `{your-subdomain}` with your workspace's subdomain.
Learn how to find your subdomain in [Workspace subdomain](/getting-started/workspace-subdomain).
# Add team members
Source: https://apidocs.neetorecord.com/api-reference-v1/team-members/add
bundled-v1/team-members.yaml POST /team_members
Add team members to the workspace.
**Deprecated:** This is a **v1** endpoint. It will continue to work, but we
recommend migrating to the [v2 equivalent](/api-reference) for improved REST
compliance (correct HTTP status codes, consistent response envelopes, and
hyphenated URLs).
Replace `{your-subdomain}` with your workspace's subdomain.
Learn how to find your subdomain in [Workspace subdomain](/getting-started/workspace-subdomain).
# List team members
Source: https://apidocs.neetorecord.com/api-reference-v1/team-members/list
bundled-v1/team-members.yaml GET /team_members
List team members in the workspace.
**Deprecated:** This is a **v1** endpoint. It will continue to work, but we
recommend migrating to the [v2 equivalent](/api-reference) for improved REST
compliance (correct HTTP status codes, consistent response envelopes, and
hyphenated URLs).
Replace `{your-subdomain}` with your workspace's subdomain.
Learn how to find your subdomain in [Workspace subdomain](/getting-started/workspace-subdomain).
# Remove team member
Source: https://apidocs.neetorecord.com/api-reference-v1/team-members/remove
bundled-v1/team-members.yaml DELETE /team_members/{team_member_id}
Remove team members from the workspace.
**Deprecated:** This is a **v1** endpoint. It will continue to work, but we
recommend migrating to the [v2 equivalent](/api-reference) for improved REST
compliance (correct HTTP status codes, consistent response envelopes, and
hyphenated URLs).
Replace `{your-subdomain}` with your workspace's subdomain.
Learn how to find your subdomain in [Workspace subdomain](/getting-started/workspace-subdomain).
# Update team member details
Source: https://apidocs.neetorecord.com/api-reference-v1/team-members/update
bundled-v1/team-members.yaml PATCH /team_members/{team_member_id}
Update a team member.
**Deprecated:** This is a **v1** endpoint. It will continue to work, but we
recommend migrating to the [v2 equivalent](/api-reference) for improved REST
compliance (correct HTTP status codes, consistent response envelopes, and
hyphenated URLs).
Replace `{your-subdomain}` with your workspace's subdomain.
Learn how to find your subdomain in [Workspace subdomain](/getting-started/workspace-subdomain).
# Get workspace analytics
Source: https://apidocs.neetorecord.com/api-reference/analytics/get
bundled/analytics.yaml GET /analytics
Retrieves how many uploaded recordings and views the workspace has, along with its ten most watched recordings. For a single recording's view history, use the [Get view analytics for a recording](/api-reference/recordings/analytics) API.
Replace `{your-subdomain}` with your workspace's subdomain.
Learn how to find your subdomain in [Workspace subdomain](/getting-started/workspace-subdomain).
# Create a folder
Source: https://apidocs.neetorecord.com/api-reference/folders/create
bundled/folders.yaml POST /folders
Creates a folder. Pass `parent_folder_id` to nest it inside an existing folder.
Replace `{your-subdomain}` with your workspace's subdomain.
Learn how to find your subdomain in [Workspace subdomain](/getting-started/workspace-subdomain).
# List all folders
Source: https://apidocs.neetorecord.com/api-reference/folders/list
bundled/folders.yaml GET /folders
Lists every folder in the workspace, with the number of recordings in each.
Replace `{your-subdomain}` with your workspace's subdomain.
Learn how to find your subdomain in [Workspace subdomain](/getting-started/workspace-subdomain).
# Create a recording request
Source: https://apidocs.neetorecord.com/api-reference/recording-requests/create
bundled/recording-requests.yaml POST /recording_requests
Creates a recording request and returns a URL to share with whoever will record the video. The request is created on behalf of an active member of the workspace, and it counts against that person's monthly recording limit.
Replace `{your-subdomain}` with your workspace's subdomain.
Learn how to find your subdomain in [Workspace subdomain](/getting-started/workspace-subdomain).
# Get view analytics for a recording
Source: https://apidocs.neetorecord.com/api-reference/recordings/analytics
bundled/recordings.yaml GET /recordings/{id}/analytics
Retrieves the total view count for a recording, broken down by day. For workspace wide numbers, use the [Analytics](/api-reference/analytics/get) API.
Replace `{your-subdomain}` with your workspace's subdomain.
Learn how to find your subdomain in [Workspace subdomain](/getting-started/workspace-subdomain).
# Check chapter generation status
Source: https://apidocs.neetorecord.com/api-reference/recordings/chapter-status
bundled/recordings.yaml GET /recordings/{id}/chapter-status
Reports whether the recording has chapters and how the most recent generation ended. Poll this after `POST /recordings/{id}/trigger-chapters`.
Replace `{your-subdomain}` with your workspace's subdomain.
Learn how to find your subdomain in [Workspace subdomain](/getting-started/workspace-subdomain).
# Get chapters
Source: https://apidocs.neetorecord.com/api-reference/recordings/chapters
bundled/recordings.yaml GET /recordings/{id}/chapters
Retrieves the auto generated chapters of a recording. The list is empty until chapters have been generated.
Replace `{your-subdomain}` with your workspace's subdomain.
Learn how to find your subdomain in [Workspace subdomain](/getting-started/workspace-subdomain).
# Add a CTA
Source: https://apidocs.neetorecord.com/api-reference/recordings/create-cta
bundled/recordings.yaml POST /recordings/{id}/ctas
Adds a call to action button that appears over the video between the given start and end times.
Replace `{your-subdomain}` with your workspace's subdomain.
Learn how to find your subdomain in [Workspace subdomain](/getting-started/workspace-subdomain).
# List CTAs
Source: https://apidocs.neetorecord.com/api-reference/recordings/ctas
bundled/recordings.yaml GET /recordings/{id}/ctas
Lists the call to action buttons configured on a recording.
Replace `{your-subdomain}` with your workspace's subdomain.
Learn how to find your subdomain in [Workspace subdomain](/getting-started/workspace-subdomain).
# Delete a recording
Source: https://apidocs.neetorecord.com/api-reference/recordings/delete
bundled/recordings.yaml DELETE /recordings/{id}
Permanently deletes a recording along with everything derived from it. This cannot be undone.
Replace `{your-subdomain}` with your workspace's subdomain.
Learn how to find your subdomain in [Workspace subdomain](/getting-started/workspace-subdomain).
# Get a download URL
Source: https://apidocs.neetorecord.com/api-reference/recordings/download-url
bundled/recordings.yaml GET /recordings/{id}/download-url
Returns a presigned URL for downloading the recording. The URL is short lived, so request it immediately before use. If `is_download_file_ready` is `false`, the MP4 is out of date. Call `POST /recordings/{id}/trigger-mp4` to regenerate it, then retry.
Replace `{your-subdomain}` with your workspace's subdomain.
Learn how to find your subdomain in [Workspace subdomain](/getting-started/workspace-subdomain).
# Get the embed code
Source: https://apidocs.neetorecord.com/api-reference/recordings/embed-code
bundled/recordings.yaml GET /recordings/{id}/embed-code
Retrieves the iframe markup for embedding a recording in another page.
Replace `{your-subdomain}` with your workspace's subdomain.
Learn how to find your subdomain in [Workspace subdomain](/getting-started/workspace-subdomain).
# Get a recording
Source: https://apidocs.neetorecord.com/api-reference/recordings/get
bundled/recordings.yaml GET /recordings/{id}
Retrieves a single recording.
Replace `{your-subdomain}` with your workspace's subdomain.
Learn how to find your subdomain in [Workspace subdomain](/getting-started/workspace-subdomain).
# List recordings
Source: https://apidocs.neetorecord.com/api-reference/recordings/list
bundled/recordings.yaml GET /recordings
List all recordings.
Replace `{your-subdomain}` with your workspace's subdomain.
Learn how to find your subdomain in [Workspace subdomain](/getting-started/workspace-subdomain).
# Get a screenshot at a timestamp
Source: https://apidocs.neetorecord.com/api-reference/recordings/screenshot
bundled/recordings.yaml GET /recordings/{id}/screenshot
Extracts a still frame of the recording at the given timestamp and returns a presigned URL to the image. If `is_screenshot_ready` is `false`, the recording's downloadable video is not up to date yet — call `POST /recordings/{id}/trigger-mp4` to regenerate it, then retry.
Replace `{your-subdomain}` with your workspace's subdomain.
Learn how to find your subdomain in [Workspace subdomain](/getting-started/workspace-subdomain).
# Search recordings by title
Source: https://apidocs.neetorecord.com/api-reference/recordings/search
bundled/recordings.yaml GET /recordings/search
Searches recordings whose title matches the query.
Replace `{your-subdomain}` with your workspace's subdomain.
Learn how to find your subdomain in [Workspace subdomain](/getting-started/workspace-subdomain).
# Search recordings by transcript
Source: https://apidocs.neetorecord.com/api-reference/recordings/search-by-transcript
bundled/recordings.yaml GET /recordings/search-by-transcript
Searches the text of recording transcripts. Use this to find the recording where something was said, rather than one whose title matches.
Replace `{your-subdomain}` with your workspace's subdomain.
Learn how to find your subdomain in [Workspace subdomain](/getting-started/workspace-subdomain).
# Get the share link
Source: https://apidocs.neetorecord.com/api-reference/recordings/share-link
bundled/recordings.yaml GET /recordings/{id}/share-link
Retrieves the public watch link for a recording, along with whether that link has expired or sits behind access control.
Replace `{your-subdomain}` with your workspace's subdomain.
Learn how to find your subdomain in [Workspace subdomain](/getting-started/workspace-subdomain).
# Get the transcript
Source: https://apidocs.neetorecord.com/api-reference/recordings/transcript
bundled/recordings.yaml GET /recordings/{id}/transcript
Retrieves the full transcript with its timestamped segments. Both fields come back empty when no transcript has been generated yet.
Replace `{your-subdomain}` with your workspace's subdomain.
Learn how to find your subdomain in [Workspace subdomain](/getting-started/workspace-subdomain).
# Check transcript generation status
Source: https://apidocs.neetorecord.com/api-reference/recordings/transcript-status
bundled/recordings.yaml GET /recordings/{id}/transcript-status
Reports whether the recording has transcript text and how the most recent generation ended. Poll this after `POST /recordings/{id}/trigger-transcript`.
Replace `{your-subdomain}` with your workspace's subdomain.
Learn how to find your subdomain in [Workspace subdomain](/getting-started/workspace-subdomain).
# Generate chapters
Source: https://apidocs.neetorecord.com/api-reference/recordings/trigger-chapters
bundled/recordings.yaml POST /recordings/{id}/trigger-chapters
Queues chapter generation. Chapters are derived from the transcript, so generate the transcript first when the recording does not have one. Generation runs in the background, so poll `GET /recordings/{id}/chapter-status` for the outcome.
Replace `{your-subdomain}` with your workspace's subdomain.
Learn how to find your subdomain in [Workspace subdomain](/getting-started/workspace-subdomain).
# Regenerate the downloadable MP4
Source: https://apidocs.neetorecord.com/api-reference/recordings/trigger-mp4
bundled/recordings.yaml POST /recordings/{id}/trigger-mp4
Regenerates the recording's downloadable MP4 when it is out of date. Call this after a screenshot request returns `is_screenshot_ready: false`, then retry the screenshot once the status is `ready`.
Replace `{your-subdomain}` with your workspace's subdomain.
Learn how to find your subdomain in [Workspace subdomain](/getting-started/workspace-subdomain).
# Generate the transcript
Source: https://apidocs.neetorecord.com/api-reference/recordings/trigger-transcript
bundled/recordings.yaml POST /recordings/{id}/trigger-transcript
Queues transcript generation, or regenerates an existing transcript in another language. Generation runs in the background, so poll `GET /recordings/{id}/transcript-status` for the outcome.
Replace `{your-subdomain}` with your workspace's subdomain.
Learn how to find your subdomain in [Workspace subdomain](/getting-started/workspace-subdomain).
# Update a recording
Source: https://apidocs.neetorecord.com/api-reference/recordings/update
bundled/recordings.yaml PATCH /recordings/{id}
Updates a recording's title, summary, folder, or tags. Only the attributes present in the request body are changed.
Replace `{your-subdomain}` with your workspace's subdomain.
Learn how to find your subdomain in [Workspace subdomain](/getting-started/workspace-subdomain).
# List all tags
Source: https://apidocs.neetorecord.com/api-reference/tags/list
bundled/tags.yaml GET /tags
Lists every tag in the workspace, with the number of recordings carrying it. Tags are created implicitly: sending a name that does not exist yet in `tag_names` on the [Update a recording](/api-reference/recordings/update) API creates the tag, so there is no separate create endpoint.
Replace `{your-subdomain}` with your workspace's subdomain.
Learn how to find your subdomain in [Workspace subdomain](/getting-started/workspace-subdomain).
# Add team members
Source: https://apidocs.neetorecord.com/api-reference/team-members/add
bundled/team-members.yaml POST /team-members
Add team members to the workspace.
Replace `{your-subdomain}` with your workspace's subdomain.
Learn how to find your subdomain in [Workspace subdomain](/getting-started/workspace-subdomain).
# Get team member details
Source: https://apidocs.neetorecord.com/api-reference/team-members/get
bundled/team-members.yaml GET /team-members/{team_member_id}
Retrieves details of a specific team member.
Replace `{your-subdomain}` with your workspace's subdomain.
Learn how to find your subdomain in [Workspace subdomain](/getting-started/workspace-subdomain).
# List team members
Source: https://apidocs.neetorecord.com/api-reference/team-members/list
bundled/team-members.yaml GET /team-members
List team members in the workspace.
Replace `{your-subdomain}` with your workspace's subdomain.
Learn how to find your subdomain in [Workspace subdomain](/getting-started/workspace-subdomain).
# Remove team member
Source: https://apidocs.neetorecord.com/api-reference/team-members/remove
bundled/team-members.yaml DELETE /team-members/{team_member_id}
Remove team members from the workspace.
Replace `{your-subdomain}` with your workspace's subdomain.
Learn how to find your subdomain in [Workspace subdomain](/getting-started/workspace-subdomain).
# Update team member
Source: https://apidocs.neetorecord.com/api-reference/team-members/update
bundled/team-members.yaml PATCH /team-members/{team_member_id}
Update a team member.
Replace `{your-subdomain}` with your workspace's subdomain.
Learn how to find your subdomain in [Workspace subdomain](/getting-started/workspace-subdomain).
# analytics
Source: https://apidocs.neetorecord.com/cli-reference/analytics
Workspace wide recording and view counts, with the most watched recordings.
Workspace level numbers across every uploaded recording. For the view history of
a single recording, use
[`recordings analytics`](/cli-reference/recordings#recordings-analytics). For
fields and response details, see the [API reference](/api-reference/analytics/get).
Sample output on this page is the JSON envelope you get with `--json`. On a
terminal the same data prints as a table or a key-value list. See
[Output formats](/cli/output-formats).
## analytics show
Reports how many recordings and views the workspace has, plus its ten most
watched recordings. Pass a date range to scope it to recordings created in that
window.
```bash theme={"system"}
neetorecord analytics show --from-date 2025-01-01 --to-date 2025-06-30
```
| Flag | Type | Required | Default | Description |
| ------------- | -------- | -------- | ------- | ------------------------------------------------- |
| `--from-date` | `string` | | | Start date filter (ISO format, e.g. '2024-01-01') |
| `--to-date` | `string` | | | End date filter (ISO format, e.g. '2024-12-31') |
Both dates are ISO format (`YYYY-MM-DD`) and both are optional. `--from-date`
and `--to-date` filter on when a recording was created, not when it was viewed.
```json theme={"system"}
{
"data": {
"total_recordings": 95,
"total_views": 1840,
"top_recordings": [
{
"id": "4f9c2a1b7e5d3086af12",
"title": "Sprint demo",
"view_count": 24
}
]
}
}
```
The `id` of a top recording is its public link id, which
[`recordings show`](/cli-reference/recordings#recordings-show) accepts.
# folders
Source: https://apidocs.neetorecord.com/cli-reference/folders
List and create the folders that recordings are organized into.
Folders group recordings in the workspace and can be nested. Move a recording
into a folder with [`recordings update --folder-id`](/cli-reference/recordings#recordings-update).
For fields and response details, see the [API reference](/api-reference/folders/list).
Sample output on this page is the JSON envelope you get with `--json`. On a
terminal the same data prints as a table or a key-value list. See
[Output formats](/cli/output-formats).
## folders list
Lists every folder in the workspace with the number of recordings in each.
```bash theme={"system"}
neetorecord folders list --page-size 50
```
| Flag | Type | Required | Default | Description |
| ------------- | ----- | -------- | ------- | ------------------------ |
| `--page` | `int` | | `0` | Page number |
| `--page-size` | `int` | | `0` | Items per page (max 100) |
```json theme={"system"}
{
"data": [
{
"id": "hqzptnv",
"name": "Product demos",
"parent_id": null,
"recording_count": 12,
"created_at": "2025-06-02T11:40:18.000Z"
}
],
"pagination": {
"total_records": 8,
"total_pages": 1,
"current_page_number": 1,
"page_size": 50
}
}
```
## folders create
Creates a folder. Pass `--parent-folder-id` to nest it under an existing one.
```bash theme={"system"}
neetorecord folders create --name "Onboarding" --parent-folder-id hqzptnv
```
| Flag | Type | Required | Default | Description |
| -------------------- | -------- | -------- | ------- | ------------------------------------- |
| `--name` | `string` | Yes | | Folder name |
| `--parent-folder-id` | `string` | | | Parent folder ID (for nested folders) |
```json theme={"system"}
{
"data": {
"id": "wbrkxdm",
"name": "Onboarding",
"parent_id": "hqzptnv",
"created_at": "2025-07-14T08:12:03.000Z"
}
}
```
With `--quiet` the command prints just the new folder's id, which makes it easy
to chain:
```bash theme={"system"}
id=$(neetorecord folders create --name "Onboarding" --quiet)
neetorecord recordings update 3f6a1c58-9b2e-4d77-8a10-5c0b1e2f3a4d --folder-id "$id"
```
# Commands overview
Source: https://apidocs.neetorecord.com/cli-reference/overview
Every neetorecord command grouped by resource, with links to the full reference.
## Global flags
These flags work on every command and are left out of the per-command flag tables below. See [Output formats](/cli/output-formats) for details.
| Flag | Description |
| ------------- | ----------------------------------------------------- |
| `--json` | Output as JSON |
| `--quiet` | Output raw data only (no envelope) |
| `--toon` | Output in TOON format (token-optimized for AI agents) |
| `--subdomain` | Override saved subdomain |
### analytics
View organization analytics
| Command | Description |
| -------------------------------------------------------- | -------------------------------- |
| [`neetorecord analytics show`](/cli-reference/analytics) | Show organization-wide analytics |
### doctor
Check CLI health and connectivity
| Command | Description |
| ---------------------------------------------- | --------------------------------- |
| [`neetorecord doctor`](/cli-reference/utility) | Check CLI health and connectivity |
### folders
Manage recording folders
| Command | Description |
| ------------------------------------------------------ | ------------------- |
| [`neetorecord folders create`](/cli-reference/folders) | Create a new folder |
| [`neetorecord folders list`](/cli-reference/folders) | List all folders |
### login
Authenticate to NeetoRecord via browser
| Command | Description |
| --------------------------------------------- | --------------------------------------- |
| [`neetorecord login`](/cli-reference/utility) | Authenticate to NeetoRecord via browser |
### logout
Sign out and clear saved credentials
| Command | Description |
| ---------------------------------------------- | ------------------------------------ |
| [`neetorecord logout`](/cli-reference/utility) | Sign out and clear saved credentials |
### recording-requests
Manage recording requests
| Command | Description |
| ---------------------------------------------------------------------------- | -------------------------- |
| [`neetorecord recording-requests create`](/cli-reference/recording-requests) | Create a recording request |
### recordings
Manage recordings
| Command | Description |
| -------------------------------------------------------------------------- | ------------------------------------------------------------------- |
| [`neetorecord recordings analytics`](/cli-reference/recordings) | Get view analytics for a recording |
| [`neetorecord recordings chapter-status`](/cli-reference/recordings) | Check chapter generation status for a recording |
| [`neetorecord recordings chapters`](/cli-reference/recordings) | Get chapters for a recording |
| [`neetorecord recordings create-cta`](/cli-reference/recordings) | Add a CTA to a recording |
| [`neetorecord recordings ctas`](/cli-reference/recordings) | List CTAs for a recording |
| [`neetorecord recordings delete`](/cli-reference/recordings) | Delete a recording |
| [`neetorecord recordings download-url`](/cli-reference/recordings) | Get a presigned download URL for a recording |
| [`neetorecord recordings embed-code`](/cli-reference/recordings) | Get the embed code for a recording |
| [`neetorecord recordings list`](/cli-reference/recordings) | List recordings |
| [`neetorecord recordings screenshot`](/cli-reference/recordings) | Get a URL to a still-frame screenshot of a recording at a timestamp |
| [`neetorecord recordings search`](/cli-reference/recordings) | Search recordings by title |
| [`neetorecord recordings search-by-transcript`](/cli-reference/recordings) | Search recordings by transcript content |
| [`neetorecord recordings share-link`](/cli-reference/recordings) | Get the public share link for a recording |
| [`neetorecord recordings show`](/cli-reference/recordings) | Show a recording |
| [`neetorecord recordings transcript`](/cli-reference/recordings) | Get transcript for a recording |
| [`neetorecord recordings transcript-status`](/cli-reference/recordings) | Check transcript generation status for a recording |
| [`neetorecord recordings trigger-chapters`](/cli-reference/recordings) | Trigger chapter generation for a recording |
| [`neetorecord recordings trigger-mp4`](/cli-reference/recordings) | Trigger MP4 generation for a recording |
| [`neetorecord recordings trigger-transcript`](/cli-reference/recordings) | Trigger transcript generation for a recording |
| [`neetorecord recordings update`](/cli-reference/recordings) | Update a recording |
### setup
Set up NeetoRecord for AI coding assistants
| Command | Description |
| ------------------------------------------------------ | ----------------------------------------------- |
| [`neetorecord setup claude`](/cli-reference/utility) | Register NeetoRecord plugin with Claude Code |
| [`neetorecord setup codex`](/cli-reference/utility) | Add NeetoRecord instructions for OpenAI Codex |
| [`neetorecord setup copilot`](/cli-reference/utility) | Add NeetoRecord instructions for GitHub Copilot |
| [`neetorecord setup cursor`](/cli-reference/utility) | Write NeetoRecord rules for Cursor IDE |
| [`neetorecord setup gemini`](/cli-reference/utility) | Add NeetoRecord instructions for Gemini CLI |
| [`neetorecord setup windsurf`](/cli-reference/utility) | Write NeetoRecord rules for Windsurf IDE |
### tags
List recording tags
| Command | Description |
| ---------------------------------------------- | ------------- |
| [`neetorecord tags list`](/cli-reference/tags) | List all tags |
### team-members
Manage team members
| Command | Description |
| ---------------------------------------------------------------- | -------------------- |
| [`neetorecord team-members create`](/cli-reference/team-members) | Invite team members |
| [`neetorecord team-members delete`](/cli-reference/team-members) | Remove a team member |
| [`neetorecord team-members list`](/cli-reference/team-members) | List team members |
| [`neetorecord team-members show`](/cli-reference/team-members) | Show a team member |
| [`neetorecord team-members update`](/cli-reference/team-members) | Update a team member |
### update
Update the CLI to the latest version
| Command | Description |
| ---------------------------------------------- | ------------------------------------ |
| [`neetorecord update`](/cli-reference/utility) | Update the CLI to the latest version |
### version
Print the CLI version
| Command | Description |
| ----------------------------------------------- | --------------------- |
| [`neetorecord version`](/cli-reference/utility) | Print the CLI version |
### whoami
Show current authenticated user(s)
| Command | Description |
| ---------------------------------------------- | ---------------------------------- |
| [`neetorecord whoami`](/cli-reference/utility) | Show current authenticated user(s) |
# recording-requests
Source: https://apidocs.neetorecord.com/cli-reference/recording-requests
Ask someone to record a video and get back a link to send them.
A recording request creates an empty recording in the workspace along with a
URL the recipient opens to record and upload their video. For fields and
response details, see the
[API reference](/api-reference/recording-requests/create).
Sample output on this page is the JSON envelope you get with `--json`. On a
terminal the same data prints as a table or a key-value list. See
[Output formats](/cli/output-formats).
## recording-requests create
Creates a request and returns the URL to share with whoever will record it.
```bash theme={"system"}
neetorecord recording-requests create \
--title "Walk me through the billing bug" \
--created-by-email oliver@example.com \
--request-instructions "Start from the invoice list and reproduce the error." \
--request-notes "Raised by support ticket 4821."
```
| Flag | Type | Required | Default | Description |
| ------------------------ | -------- | -------- | ------- | -------------------------------------------------------------- |
| `--created-by-email` | `string` | Yes | | Email of the recording requester |
| `--request-instructions` | `string` | | | Instructions shown to the person who will upload the recording |
| `--request-notes` | `string` | | | Private notes for this request |
| `--title` | `string` | Yes | | Title of the requested recording |
`--created-by-email` must be the email of an active member of the workspace.
That person is recorded as the requester, and the request counts against their
monthly recording limit.
```json theme={"system"}
{
"data": {
"recording_request": {
"id": "7d2e5b90-1c34-4a68-b7f5-9e0a2c3d4b18",
"title": "Walk me through the billing bug",
"request_url": "https://acme.neetorecord.com/request/7d2e5b90-1c34-4a68-b7f5-9e0a2c3d4b18",
"created_at": "2025-07-14T08:31:47.000Z"
}
}
}
```
`--request-instructions` is shown to the person who opens the link.
`--request-notes` is private to the workspace.
# recordings
Source: https://apidocs.neetorecord.com/cli-reference/recordings
List, search, update, and delete recordings, and work with their transcripts, chapters, links, and CTAs.
Recordings are the core NeetoRecord resource. For fields and response details,
see the [API reference](/api-reference/recordings/list).
Every command below takes the recording as a positional argument. That argument
accepts either the recording's `id` or its `public_link_id`, which is the last
segment of a watch URL such as
`https://acme.neetorecord.com/watch/4f9c2a1b7e5d3086af12`.
Sample output on this page is the JSON envelope you get with `--json`. On a
terminal the same data prints as a table or a key-value list. See
[Output formats](/cli/output-formats).
## recordings list
Lists the recordings in the workspace, newest first. Use it to find a recording
id to pass to the other commands.
```bash theme={"system"}
neetorecord recordings list --page 1 --page-size 30
```
| Flag | Type | Required | Default | Description |
| ------------- | ----- | -------- | ------- | ------------------------ |
| `--page` | `int` | | `0` | Page number |
| `--page-size` | `int` | | `0` | Items per page (max 100) |
```json theme={"system"}
{
"data": [
{
"id": "3f6a1c58-9b2e-4d77-8a10-5c0b1e2f3a4d",
"title": "Sprint demo",
"default_title": "Recording on 12 Jul 2025",
"duration": 412.5,
"view_count": 24,
"is_uploaded": true,
"requested": false,
"summary": "Walkthrough of the new folders view.",
"public_link_id": "4f9c2a1b7e5d3086af12",
"created_at": "2025-07-12T09:14:22.000Z",
"updated_at": "2025-07-12T10:02:41.000Z",
"uploaded_at": "2025-07-12T09:21:05.000Z",
"public_url": "https://acme.neetorecord.com/watch/4f9c2a1b7e5d3086af12",
"transcoded_url": "https://cdn.neetorecord.com/transcoded/4f9c2a1b7e5d3086af12/index.m3u8",
"thumbnail_url": "https://cdn.neetorecord.com/thumbnails/4f9c2a1b7e5d3086af12.jpg",
"user_name": "Oliver Smith",
"tags": [
{
"id": "b21f7c90-4d3e-4a15-9c68-0f2e8b7a6d54",
"name": "demo",
"style": "secondary"
}
],
"folder_name": "Product demos",
"folder_id": "8c1d4e77-2b3a-4f56-9e08-7d5c6b4a3f21"
}
],
"breadcrumbs": [
{ "label": "Show", "command": "neetorecord recordings show " }
],
"pagination": {
"total_records": 95,
"total_pages": 4,
"current_page_number": 1,
"page_size": 30
}
}
```
## recordings show
Shows one recording in full.
```bash theme={"system"}
neetorecord recordings show 3f6a1c58-9b2e-4d77-8a10-5c0b1e2f3a4d
```
**Required arguments**
* `` - the recording id or public link id.
The output is the same recording object that `list` returns, wrapped in `data`
with no pagination block.
## recordings search
Searches recordings by title. Use it when you know roughly what a recording is
called but not its id.
```bash theme={"system"}
neetorecord recordings search --query "sprint"
```
| Flag | Type | Required | Default | Description |
| ------------- | -------- | -------- | ------- | ------------------------ |
| `--page` | `int` | | `0` | Page number |
| `--page-size` | `int` | | `0` | Items per page (max 100) |
| `--query` | `string` | Yes | | Title search query |
The output matches `recordings list`.
## recordings search-by-transcript
Searches the text of recording transcripts. Use it to find the recording where
something was said, rather than one whose title matches.
```bash theme={"system"}
neetorecord recordings search-by-transcript --query "pricing page"
```
| Flag | Type | Required | Default | Description |
| ------------- | -------- | -------- | ------- | ----------------------------- |
| `--page` | `int` | | `0` | Page number |
| `--page-size` | `int` | | `0` | Items per page (max 100) |
| `--query` | `string` | Yes | | Text to search in transcripts |
The output matches `recordings list`.
## recordings update
Renames a recording, replaces its summary, moves it between folders, or replaces
its tags. Only the flags you pass are changed.
```bash theme={"system"}
neetorecord recordings update 3f6a1c58-9b2e-4d77-8a10-5c0b1e2f3a4d \
--title "Sprint demo, July" \
--tag demo --tag internal
```
**Required arguments**
* `` - the recording id or public link id.
| Flag | Type | Required | Default | Description |
| ------------- | ------------- | -------- | ------- | -------------------------------------------------- |
| `--folder-id` | `string` | | | Folder ID to move to (empty to remove from folder) |
| `--summary` | `string` | | | New summary |
| `--tag` | `stringArray` | | `[]` | Tag name (repeatable; replaces all existing tags) |
| `--title` | `string` | | | New title |
`--tag` replaces every tag on the recording, so pass the complete list each
time. Tags that do not exist yet are created. Passing `--folder-id ""` removes
the recording from its folder. `--folder-id` accepts the id returned by
[`folders list`](/cli-reference/folders).
The output is the updated recording object, wrapped in `data`.
## recordings delete
Deletes a recording and everything derived from it. This cannot be undone.
```bash theme={"system"}
neetorecord recordings delete 3f6a1c58-9b2e-4d77-8a10-5c0b1e2f3a4d
```
**Required arguments**
* `` - the recording id or public link id.
```
Recording deleted.
```
## recordings transcript
Prints the full transcript with its timestamped segments.
```bash theme={"system"}
neetorecord recordings transcript 3f6a1c58-9b2e-4d77-8a10-5c0b1e2f3a4d
```
**Required arguments**
* `` - the recording id or public link id.
```json theme={"system"}
{
"data": {
"recording_id": "4f9c2a1b7e5d3086af12",
"transcript": {
"text": "Let me walk through the new folders view.",
"segments": [
{
"start": 0.0,
"end": 3.4,
"text": "Let me walk through the new folders view."
}
]
}
}
}
```
## recordings transcript-status
Reports whether a transcript exists and where generation has got to. Check this
before polling for transcript text.
```bash theme={"system"}
neetorecord recordings transcript-status 3f6a1c58-9b2e-4d77-8a10-5c0b1e2f3a4d
```
**Required arguments**
* `` - the recording id or public link id.
```json theme={"system"}
{
"data": {
"recording_id": "4f9c2a1b7e5d3086af12",
"status": "success",
"has_transcript": true
}
}
```
## recordings trigger-transcript
Starts transcript generation, or regenerates an existing transcript in another
language. Generation runs in the background.
```bash theme={"system"}
neetorecord recordings trigger-transcript 3f6a1c58-9b2e-4d77-8a10-5c0b1e2f3a4d --language en
```
**Required arguments**
* `` - the recording id or public link id.
| Flag | Type | Required | Default | Description |
| ------------ | -------- | -------- | ------- | ------------------------- |
| `--language` | `string` | | | Language code (e.g. 'en') |
```json theme={"system"}
{
"data": {
"recording_id": "4f9c2a1b7e5d3086af12",
"status": "triggered"
}
}
```
## recordings chapters
Prints the auto generated chapters of a recording.
```bash theme={"system"}
neetorecord recordings chapters 3f6a1c58-9b2e-4d77-8a10-5c0b1e2f3a4d
```
**Required arguments**
* `` - the recording id or public link id.
```json theme={"system"}
{
"data": {
"recording_id": "4f9c2a1b7e5d3086af12",
"chapters": [
{ "title": "Intro", "start": 0 },
{ "title": "Folders view", "start": 48 }
]
}
}
```
## recordings chapter-status
Reports whether chapters exist and where generation has got to.
```bash theme={"system"}
neetorecord recordings chapter-status 3f6a1c58-9b2e-4d77-8a10-5c0b1e2f3a4d
```
**Required arguments**
* `` - the recording id or public link id.
```json theme={"system"}
{
"data": {
"recording_id": "4f9c2a1b7e5d3086af12",
"status": "success",
"has_chapters": true
}
}
```
## recordings trigger-chapters
Starts chapter generation for a recording. It needs a transcript, so run
`trigger-transcript` first if the recording does not have one.
```bash theme={"system"}
neetorecord recordings trigger-chapters 3f6a1c58-9b2e-4d77-8a10-5c0b1e2f3a4d
```
**Required arguments**
* `` - the recording id or public link id.
```json theme={"system"}
{
"data": {
"recording_id": "4f9c2a1b7e5d3086af12",
"status": "triggered"
}
}
```
## recordings share-link
Prints the public watch link, and whether that link has expired or is behind
access control.
```bash theme={"system"}
neetorecord recordings share-link 3f6a1c58-9b2e-4d77-8a10-5c0b1e2f3a4d
```
**Required arguments**
* `` - the recording id or public link id.
```json theme={"system"}
{
"data": {
"recording_id": "4f9c2a1b7e5d3086af12",
"public_url": "https://acme.neetorecord.com/watch/4f9c2a1b7e5d3086af12",
"is_expired": false,
"access_control_protected": false
}
}
```
## recordings embed-code
Prints the iframe snippet for embedding a recording in another page.
```bash theme={"system"}
neetorecord recordings embed-code 3f6a1c58-9b2e-4d77-8a10-5c0b1e2f3a4d
```
**Required arguments**
* `` - the recording id or public link id.
```json theme={"system"}
{
"data": {
"recording_id": "4f9c2a1b7e5d3086af12",
"embed_url": "https://acme.neetorecord.com/embeds/3f6a1c58-9b2e-4d77-8a10-5c0b1e2f3a4d",
"embed_html": ""
}
}
```
## recordings download-url
Returns a presigned URL for downloading the recording. The URL is short lived,
so fetch it right before you use it.
```bash theme={"system"}
neetorecord recordings download-url 3f6a1c58-9b2e-4d77-8a10-5c0b1e2f3a4d --format mp4
```
**Required arguments**
* `` - the recording id or public link id.
| Flag | Type | Required | Default | Description |
| ---------- | -------- | -------- | ------- | -------------------------------- |
| `--format` | `string` | | `mp4` | Download format: 'mp4' or 'webm' |
```json theme={"system"}
{
"data": {
"recording_id": "4f9c2a1b7e5d3086af12",
"file_format": "mp4",
"is_download_file_ready": true,
"download_url": "https://cdn.neetorecord.com/downloads/4f9c2a1b7e5d3086af12.mp4?Expires=1752312000",
"url_expires_in_seconds": 600
}
}
```
When the MP4 has not been prepared yet, the response carries
`"is_download_file_ready": false` and no URL. Run `trigger-mp4`, then try again.
## recordings trigger-mp4
Starts preparing the downloadable MP4 for a recording. Run it when
`download-url` reports that the file is not ready.
```bash theme={"system"}
neetorecord recordings trigger-mp4 3f6a1c58-9b2e-4d77-8a10-5c0b1e2f3a4d
```
**Required arguments**
* `` - the recording id or public link id.
```json theme={"system"}
{
"data": {
"recording_id": "4f9c2a1b7e5d3086af12",
"status": "generating"
}
}
```
`status` is `generating` when regeneration was queued, `already_generating`
when a conversion is already running, and `ready` when the MP4 is already up to
date.
## recordings screenshot
Returns a URL to a still frame captured at a timestamp. Useful for pulling a
thumbnail out of a recording, or for looking at what was on screen when
something was said.
```bash theme={"system"}
neetorecord recordings screenshot 3f6a1c58-9b2e-4d77-8a10-5c0b1e2f3a4d \
--timestamp 48.5 --format png
```
**Required arguments**
* `` - the recording id or public link id.
| Flag | Type | Required | Default | Description |
| ------------- | --------- | -------- | ------- | -------------------------------------------- |
| `--format` | `string` | | `png` | Image format: 'png' or 'jpeg' |
| `--timestamp` | `float64` | Yes | `0` | Timestamp in seconds of the frame to capture |
`--timestamp` must fall within the recording's duration.
```json theme={"system"}
{
"data": {
"recording_id": "4f9c2a1b7e5d3086af12",
"timestamp": 48.5,
"image_format": "png",
"is_screenshot_ready": true,
"screenshot_url": "https://cdn.neetorecord.com/screenshots/4f9c2a1b7e5d3086af12-48.5.png?Expires=1752312000",
"url_expires_in_seconds": 600
}
}
```
## recordings analytics
Reports the view count for a single recording, broken down by day.
```bash theme={"system"}
neetorecord recordings analytics 3f6a1c58-9b2e-4d77-8a10-5c0b1e2f3a4d
```
**Required arguments**
* `` - the recording id or public link id.
```json theme={"system"}
{
"data": {
"recording_id": "4f9c2a1b7e5d3086af12",
"total_views": 24,
"views_by_day": [
{ "date": "2025-07-12", "count": 9 },
{ "date": "2025-07-13", "count": 15 }
]
}
}
```
For workspace wide numbers, see [`analytics show`](/cli-reference/analytics).
## recordings ctas
Lists the call to action buttons configured on a recording.
```bash theme={"system"}
neetorecord recordings ctas 3f6a1c58-9b2e-4d77-8a10-5c0b1e2f3a4d
```
**Required arguments**
* `` - the recording id or public link id.
```json theme={"system"}
{
"data": {
"recording_id": "4f9c2a1b7e5d3086af12",
"ctas": [
{
"id": "c47e2f81-6a90-4b3d-8e21-5f0c9d7b1a63",
"label": "Book a demo",
"link": "https://acme.neetocal.com/meeting-with-oliver",
"start": 30.0,
"end": 90.0,
"position": "top-right",
"show_only_at_end": false
}
]
}
}
```
## recordings create-cta
Adds a call to action button that appears over the video for a time range.
```bash theme={"system"}
neetorecord recordings create-cta 3f6a1c58-9b2e-4d77-8a10-5c0b1e2f3a4d \
--label "Book a demo" \
--link "https://acme.neetocal.com/meeting-with-oliver" \
--start 30 --end 90 --position bottom-right
```
**Required arguments**
* `` - the recording id or public link id.
| Flag | Type | Required | Default | Description |
| -------------------- | --------- | -------- | ----------- | -------------------------------------------------------- |
| `--background-color` | `string` | | `#000000` | Button background color hex |
| `--end` | `float64` | Yes | `0` | End time in seconds |
| `--label` | `string` | Yes | | Button label text |
| `--link` | `string` | | | URL the button links to |
| `--position` | `string` | | `top-right` | Position: top-right, top-left, bottom-right, bottom-left |
| `--show-only-at-end` | `bool` | | `false` | Only show at end of recording |
| `--start` | `float64` | Yes | `0` | Start time in seconds |
| `--text-color` | `string` | | `#FFFFFF` | Button text color hex |
```json theme={"system"}
{
"data": {
"id": "c47e2f81-6a90-4b3d-8e21-5f0c9d7b1a63",
"recording_id": "4f9c2a1b7e5d3086af12",
"label": "Book a demo",
"link": "https://acme.neetocal.com/meeting-with-oliver",
"start": 30.0,
"end": 90.0,
"position": "bottom-right",
"background_color": "#000000",
"text_color": "#FFFFFF",
"show_only_at_end": false
}
}
```
# tags
Source: https://apidocs.neetorecord.com/cli-reference/tags
List the recording tags used in the workspace.
Tags label recordings for filtering and search. They are created implicitly:
passing a name that does not exist yet to
[`recordings update --tag`](/cli-reference/recordings#recordings-update) creates
the tag, so there is no separate create command. For fields and response
details, see the [API reference](/api-reference/tags/list).
Sample output on this page is the JSON envelope you get with `--json`. On a
terminal the same data prints as a table or a key-value list. See
[Output formats](/cli/output-formats).
## tags list
Lists every tag in the workspace with the number of recordings carrying it. Use
it to check the exact spelling of a tag before passing it to
`recordings update`.
```bash theme={"system"}
neetorecord tags list
```
| Flag | Type | Required | Default | Description |
| ------------- | ----- | -------- | ------- | ------------------------ |
| `--page` | `int` | | `0` | Page number |
| `--page-size` | `int` | | `0` | Items per page (max 100) |
```json theme={"system"}
{
"data": [
{
"id": "b21f7c90-4d3e-4a15-9c68-0f2e8b7a6d54",
"name": "demo",
"style": "secondary",
"recording_count": 12
}
],
"pagination": {
"total_records": 15,
"total_pages": 1,
"current_page_number": 1,
"page_size": 30
}
}
```
# team-members
Source: https://apidocs.neetorecord.com/cli-reference/team-members
List, invite, update, and remove the people in your NeetoRecord workspace.
Team members are the people in the workspace. For fields and response details,
see the [API reference](/api-reference/team-members/list).
Sample output on this page is the JSON envelope you get with `--json`. On a
terminal the same data prints as a table or a key-value list. See
[Output formats](/cli/output-formats).
## team-members list
Lists the members of the workspace. Pass `--email` to look one up without
paging through the list.
```bash theme={"system"}
neetorecord team-members list --email oliver@example.com
```
| Flag | Type | Required | Default | Description |
| ------------- | -------- | -------- | ------- | ------------------------ |
| `--email` | `string` | | | Filter by email address |
| `--page` | `int` | | `0` | Page number |
| `--page-size` | `int` | | `0` | Items per page (max 100) |
```json theme={"system"}
{
"data": [
{
"id": "aaaabbbb-cccc-dddd-eeee-ffff00001111",
"email": "oliver@example.com",
"first_name": "Oliver",
"last_name": "Smith",
"time_zone": "Asia/Kolkata",
"profile_image_url": null,
"active": true,
"organization_role": "Admin"
}
],
"breadcrumbs": [
{ "label": "Show", "command": "neetorecord team-members show " }
],
"pagination": {
"total_records": 24,
"total_pages": 1,
"current_page_number": 1,
"page_size": 30
}
}
```
## team-members show
Shows one member.
```bash theme={"system"}
neetorecord team-members show aaaabbbb-cccc-dddd-eeee-ffff00001111
```
**Required arguments**
* `` - the team member id, as returned by `team-members list`.
```json theme={"system"}
{
"data": {
"team_member": {
"id": "aaaabbbb-cccc-dddd-eeee-ffff00001111",
"email": "oliver@example.com",
"first_name": "Oliver",
"last_name": "Smith",
"time_zone": "Asia/Kolkata",
"profile_image_url": null,
"active": true,
"organization_role": "Admin"
}
}
}
```
## team-members create
Invites one or more people to the workspace. Repeat `--email` to invite several
at once.
```bash theme={"system"}
neetorecord team-members create \
--email oliver@example.com --email sam@example.com \
--role Standard \
--invited-by admin@example.com
```
| Flag | Type | Required | Default | Description |
| ------------------------- | ------------- | -------- | ------- | ------------------------------------ |
| `--email` | `stringArray` | Yes | `[]` | Email address to invite (repeatable) |
| `--invited-by` | `string` | | | Inviter name or email |
| `--role` | `string` | Yes | | Organization role |
| `--send-invitation-email` | `bool` | | `true` | Send invitation email |
`--role` must match one of the roles configured on your workspace's Roles page,
and it is case sensitive. Pass `--send-invitation-email=false` to add people
without emailing them.
```json theme={"system"}
{
"data": {
"message": "Users added successfully"
}
}
```
## team-members update
Changes a member's name, email, time zone, or role. Only the flags you pass are
changed.
```bash theme={"system"}
neetorecord team-members update aaaabbbb-cccc-dddd-eeee-ffff00001111 \
--first-name Oliver --last-name Smith --role Admin
```
**Required arguments**
* `` - the team member id, as returned by `team-members list`.
| Flag | Type | Required | Default | Description |
| -------------- | -------- | -------- | ------- | ----------------- |
| `--email` | `string` | | | New email address |
| `--first-name` | `string` | | | First name |
| `--last-name` | `string` | | | Last name |
| `--role` | `string` | | | Organization role |
| `--time-zone` | `string` | | | Time zone |
The output is the updated team member, wrapped in `data`.
## team-members delete
Removes a member from the workspace.
```bash theme={"system"}
neetorecord team-members delete aaaabbbb-cccc-dddd-eeee-ffff00001111
```
**Required arguments**
* `` - the team member id, as returned by `team-members list`.
```
Team member removed.
```
Removing the last admin of a workspace is rejected.
# utility
Source: https://apidocs.neetorecord.com/cli-reference/utility
Sign in, check health, print the version, upgrade, and install shell completion.
The commands that manage the CLI itself rather than workspace data. For the
full story on signing in, see [Authentication](/cli/authentication).
## login
Signs in to a workspace through the browser and saves the session to
`~/.config/neetorecord/auth.json`. Run it once per workspace you work with.
```bash theme={"system"}
neetorecord login --subdomain acme
```
```
Authenticated as oliver@example.com on acme.neetorecord.com.
```
Without `--subdomain` the command prompts for it.
## logout
Signs out of a workspace and removes its saved session.
```bash theme={"system"}
neetorecord logout --subdomain acme
```
| Flag | Type | Required | Default | Description |
| ------- | ------ | -------- | ------- | --------------------------------- |
| `--all` | `bool` | | `false` | Sign out of every saved subdomain |
With exactly one workspace signed in, `--subdomain` can be left out. With
several, pass `--subdomain` to pick one or `--all` to sign out of every
workspace.
```
Signed out of acme.neetorecord.com.
```
## whoami
Prints the account and workspace the CLI is signed in as. Run it when you are
not sure which workspace a command is about to hit.
```bash theme={"system"}
neetorecord whoami
```
```
Authenticated as oliver@example.com on acme.neetorecord.com (default).
```
When several workspaces are signed in, every one is listed.
## doctor
Checks authentication, API reachability, and the CLI version in a single pass.
Start here when a command fails and the message does not make the cause obvious.
```bash theme={"system"}
neetorecord doctor
```
```
✓ Authentication: authenticated as oliver@example.com on acme.neetorecord.com
✓ API connection: https://acme.neetorecord.com (responding in 214ms)
✓ CLI version: 1.2.2
```
Each check runs independently, so a failing one does not hide the others.
## version
Prints the version, commit, and build date of the installed binary. Include this
in bug reports.
```bash theme={"system"}
neetorecord version
```
```
neetorecord 1.2.2 (commit: 1f96f14, built: 2025-07-14)
```
## update
Upgrades the CLI in place. It detects how the binary was installed and runs the
matching upgrade: `brew upgrade` for a Homebrew install, the install script
otherwise, and the PowerShell script on Windows.
```bash theme={"system"}
neetorecord update
```
## setup
Teaches an AI coding assistant how to drive the CLI by writing that assistant's
rules file. See [AI assistants](/cli/ai-assistants) for what each subcommand
writes.
```bash theme={"system"}
neetorecord setup claude
```
Available subcommands: `claude`, `cursor`, `windsurf`, `copilot`, `gemini`,
`codex`.
## commands
Prints the full command tree, including every flag, as JSON. This is what an AI
assistant should read when it needs a flag that its rules file does not cover,
and it is always accurate for the installed binary.
```bash theme={"system"}
neetorecord commands
```
```json theme={"system"}
[
{
"command": "neetorecord folders",
"description": "Manage recording folders",
"subcommands": [
{
"command": "neetorecord folders create",
"description": "Create a new folder",
"flags": [
{
"name": "name",
"type": "string",
"description": "Folder name",
"required": true
}
]
}
]
}
]
```
## Shell completion
`completion` writes the completion script under
`~/.config/neetorecord/completions` and wires your shell to load it on the next
start. There is nothing to source by hand.
```bash zsh theme={"system"}
neetorecord completion zsh
```
```bash bash theme={"system"}
neetorecord completion bash
```
```bash fish theme={"system"}
neetorecord completion fish
```
```powershell powershell theme={"system"}
neetorecord completion powershell
```
The zsh, bash, and PowerShell variants add a small block to `~/.zshrc`,
`~/.bashrc`, or your PowerShell profile. Re-running refreshes both the script
and that block instead of duplicating it. The fish script goes to
`~/.config/fish/completions`, which fish loads on its own.
Start a new shell to pick up the completions.
The script is generated from the command tree at the time you run it. Re-run
`neetorecord completion ` after every upgrade so completions include
the newest commands and flags.
Pass `--print` to write the script to standard output instead of installing it,
which is handy when you manage shell config yourself:
```bash theme={"system"}
neetorecord completion zsh --print > /usr/local/share/zsh/site-functions/_neetorecord
```
# AI assistants
Source: https://apidocs.neetorecord.com/cli/ai-assistants
Let Claude Code, Cursor, Windsurf, Copilot, Gemini, and Codex drive the NeetoRecord CLI.
`neetorecord setup ` writes the rules file that teaches an AI coding
assistant how to use the CLI: how authentication works, what the global flags
do, how output is shaped, and how to discover commands it has not seen before.
## Set up an assistant
```bash theme={"system"}
neetorecord setup claude
```
| Subcommand | What it writes |
| ---------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
| `setup claude` | Extracts the NeetoRecord plugin to `~/.config/neetorecord/claude-plugin` and prints the two slash commands that finish the install. |
| `setup cursor` | `.cursor/rules/neetorecord.mdc` in the current directory. |
| `setup windsurf` | `.windsurf/rules/neetorecord.md` in the current directory. |
| `setup copilot` | Appends a `## NeetoRecord CLI` section to `.github/copilot-instructions.md`. |
| `setup gemini` | Appends a `## NeetoRecord CLI` section to `GEMINI.md`. |
| `setup codex` | Appends a `## NeetoRecord CLI` section to `AGENTS.md`. |
The Cursor, Windsurf, Copilot, and Codex files are written relative to the
current directory, so run those from the root of the project you want them in.
Cursor and Windsurf rules are left alone if the file already exists. The append
mode commands replace their own section and leave the rest of the file
untouched, so re-running them after a CLI upgrade is safe.
### Claude Code
`setup claude` needs Claude Code to have been run at least once, so that
`~/.claude/` exists. It extracts the plugin and then prints the slash commands
to run inside Claude Code:
```
/plugin marketplace add ~/.config/neetorecord/claude-plugin
/plugin install neetorecord@neetorecord
```
Claude Code installs plugins through those interactive commands, so there is no
shell equivalent.
## What makes the CLI work well for agents
`neetorecord commands` prints the whole command tree with every flag as
JSON. An assistant can read it instead of guessing at a flag.
`--toon` carries the same data as the JSON envelope in a compact encoding,
which keeps large listings from filling the context window.
Every command exits non-zero on failure and writes one line to stderr, so a
failure is easy to detect and to act on.
`--quiet` prints just the identifier after a create or update, which is what
an assistant needs to feed the next command.
## MCP instead of the CLI
Assistants that speak the Model Context Protocol can talk to NeetoRecord
directly, with no binary to install. See the [MCP documentation](/mcp/introduction)
for the hosted server and its per client setup.
# Authentication
Source: https://apidocs.neetorecord.com/cli/authentication
Sign in to NeetoRecord from the CLI and work with more than one workspace.
The CLI signs in through the browser and stores a session per workspace. It does
not use the `X-Api-Key` header that the [REST API](/getting-started/authentication)
uses, so there is no API key to create or rotate for CLI use.
## Sign in
```bash theme={"system"}
neetorecord login --subdomain acme
```
```
Authenticated as oliver@example.com on acme.neetorecord.com.
```
Without `--subdomain` the command asks for it:
```
Enter your NeetoRecord subdomain (e.g., 'acme' for acme.neetorecord.com):
```
The subdomain is the first part of your workspace URL. If you sign in to
NeetoRecord at `acme.neetorecord.com`, the subdomain is `acme`. See
[Workspace subdomain](/getting-started/workspace-subdomain).
`login` opens your browser to complete the sign in and writes the resulting
session to `~/.config/neetorecord/auth.json`. Running it again for the same
subdomain refreshes that entry.
## Check who you are signed in as
```bash theme={"system"}
neetorecord whoami
```
```
Authenticated as oliver@example.com on acme.neetorecord.com (default).
```
With several workspaces signed in, `whoami` lists all of them, and
`neetorecord whoami --subdomain acme` shows just one.
## Working with several workspaces
`auth.json` holds one entry per subdomain. Which one a command uses depends on
how many are signed in:
| Signed in workspaces | What happens |
| -------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
| None | Every command that calls the API fails with `Not authenticated. Run 'neetorecord login' to authenticate.` |
| One | That workspace is the default. `--subdomain` is optional. |
| Two or more | `--subdomain ` is required on every command that calls the API, including `doctor`. The error lists the signed in subdomains. |
```bash theme={"system"}
neetorecord recordings list --subdomain acme
```
## Sign out
```bash theme={"system"}
neetorecord logout --subdomain acme
```
```
Signed out of acme.neetorecord.com.
```
`neetorecord logout` with no flags signs out of the only workspace when
exactly one is signed in, and errors when several are. `--all` signs out of
every workspace at once.
## Check connectivity
`doctor` reports authentication, API reachability, and the CLI version in one
go. It is the first thing to run when a command fails for a reason you cannot
place.
```bash theme={"system"}
neetorecord doctor
```
```
✓ Authentication: authenticated as oliver@example.com on acme.neetorecord.com
✓ API connection: https://acme.neetorecord.com (responding in 214ms)
✓ CLI version: 1.2.2
```
## Point the CLI at another environment
Set `NEETORECORD_BASE_URL` to override the default
`https://.neetorecord.com` host. This is meant for local and staging
servers.
```bash theme={"system"}
export NEETORECORD_BASE_URL=http://acme.lvh.me:8980
neetorecord login --subdomain acme
```
# Installation
Source: https://apidocs.neetorecord.com/cli/installation
Install the NeetoRecord CLI on macOS, Linux, or Windows.
## Install
```bash macOS theme={"system"}
brew install neetozone/tap/neetorecord
```
```bash Linux theme={"system"}
curl -fsSL https://neetorecord.com/cli/install.sh | sh
```
```powershell Windows theme={"system"}
irm https://neetorecord.com/cli/install.ps1 | iex
```
The formula lives in the `neetozone/tap` tap. Passing the fully qualified name
taps it for you, so there is no separate `brew tap` step. To upgrade a Homebrew
install later, run `brew upgrade neetorecord`.
The shell script downloads the binary for your platform and installs it to
`/usr/local/bin`, asking for `sudo` only if that directory is not writable. The
PowerShell script installs to `%LOCALAPPDATA%\Programs\neetorecord` and adds
that directory to your user `PATH`.
### Other options
If you would rather not use Homebrew, the Linux shell script works on macOS
too:
```bash theme={"system"}
curl -fsSL https://neetorecord.com/cli/install.sh | sh
```
```cmd theme={"system"}
curl -fsSL https://neetorecord.com/cli/install.cmd -o install.cmd && install.cmd
```
## Verify the install
```bash theme={"system"}
neetorecord version
```
```
neetorecord 1.2.2 (commit: 1f96f14, built: 2025-07-14)
```
`neetorecord --help` lists every command, and `neetorecord doctor` checks that
the binary can reach your workspace.
## Upgrade
```bash theme={"system"}
neetorecord update
```
`update` detects how the CLI was installed and runs the matching upgrade: `brew
upgrade` for a Homebrew install, the install script otherwise, and the
PowerShell script on Windows.
Shell completions are generated from the command tree at install time. Re-run
`neetorecord completion ` after upgrading so completions cover the new
commands. See [Shell completion](/cli-reference/utility#shell-completion).
## Next step
Sign in to your workspace: [Authentication](/cli/authentication).
# Introduction
Source: https://apidocs.neetorecord.com/cli/introduction
Manage NeetoRecord recordings, folders, tags, and analytics from the terminal.
`neetorecord` is the command line interface for NeetoRecord. It calls the same
v2 REST API that powers the web app, so anything you can read or change through
the [API](/api-reference/recordings/list) you can also do from a shell script, a
CI job, or an AI coding assistant.
## Why use the CLI
`neetorecord login` signs you in through the browser and stores a session
per workspace. There is no key to paste into a config file or a CI secret.
Commands print a table on a terminal and JSON when piped. `--quiet` prints
the bare identifier, which is what you want inside a shell pipeline.
Sign in to as many subdomains as you need and choose one per command with
`--subdomain`.
`--toon` trims output tokens, and `neetorecord setup` teaches Claude Code,
Cursor, Windsurf, Copilot, Gemini, and Codex how to drive the CLI.
## Prerequisites
* A NeetoRecord workspace, and your [workspace subdomain](/getting-started/workspace-subdomain).
* macOS, Linux, or Windows.
## Next steps
Install the CLI with Homebrew, a shell script, or PowerShell.
Sign in, switch workspaces, and check who you are signed in as.
Tables, JSON envelopes, quiet mode, and TOON.
Every command grouped by resource.
# Output formats
Source: https://apidocs.neetorecord.com/cli/output-formats
Tables on a terminal, JSON when piped, plus quiet and TOON modes.
Every command picks its output format from the terminal and the global flags.
On a terminal you get a readable table or key-value list. Anywhere else, and
whenever a format flag is set, you get machine readable output.
| Flag | Output |
| -------------------------------- | ------------------------------------------------------------------- |
| *none, on a terminal* | Table for lists, key-value for a single resource, with breadcrumbs. |
| *none, when piped or redirected* | JSON envelope. |
| `--json` | JSON envelope, even on a terminal. |
| `--quiet` | Raw data only, with no envelope. |
| `--toon` | TOON, a compact encoding for AI agents. |
When more than one flag is set the precedence is `--toon`, then `--quiet`, then
`--json`, then the default.
## Pretty output
```bash theme={"system"}
neetorecord recordings list
```
Lists print as a table, single resources as a key-value list, and both end with
breadcrumbs suggesting the command to run next:
```
Show: neetorecord recordings show
```
## JSON envelope
```bash theme={"system"}
neetorecord recordings list --json
```
```json theme={"system"}
{
"data": [
{
"id": "9f8b1c2d",
"title": "Sprint demo",
"duration": 412.5,
"view_count": 24
}
],
"breadcrumbs": [
{ "label": "Show", "command": "neetorecord recordings show " }
],
"pagination": {
"total_records": 95,
"total_pages": 4,
"current_page_number": 1,
"page_size": 30
}
}
```
`data` holds the resource or the array of resources. `breadcrumbs` is left out
when a command has none, and `pagination` appears only on list commands.
## Quiet output
`--quiet` drops the envelope and prints the payload alone. For commands that
create or update a resource it prints just the identifier, and for `delete` it
prints `success`. That makes it the right choice inside a shell pipeline:
```bash theme={"system"}
id=$(neetorecord folders create --name "Onboarding" --quiet)
neetorecord recordings update 9f8b1c2d --folder-id "$id" --quiet
```
## TOON output
`--toon` emits [TOON](https://github.com/toon-format/toon), a token optimized
encoding of the same data. It carries the same fields as the JSON envelope in
noticeably fewer tokens, which matters when the output is going into an AI
assistant's context window.
```bash theme={"system"}
neetorecord recordings list --toon
```
## Pagination
List commands take `--page` and `--page-size`, with a maximum page size of 100.
The `pagination` block reports `current_page_number`, `total_pages`,
`total_records`, and `page_size`, so a script can keep incrementing `--page`
until it reaches `total_pages`.
```bash theme={"system"}
neetorecord recordings list --page 2 --page-size 50 --json
```
# Troubleshooting
Source: https://apidocs.neetorecord.com/cli/troubleshooting
Common NeetoRecord CLI errors and how to clear them.
Run `neetorecord doctor` first. It checks authentication, reachability of your
workspace, and the installed version in one pass, and each check runs
independently so one failure does not hide the rest.
```bash theme={"system"}
neetorecord doctor
```
## Common errors
No workspace is signed in. Run `neetorecord login --subdomain ` and
complete the browser sign in. See [Authentication](/cli/authentication).
More than one workspace is signed in, so the CLI will not guess which one
you mean. Add `--subdomain ` to the command. `logout` says
`specify --subdomain or --all` instead, because `--all` signs out of every
workspace at once. `neetorecord whoami` lists what is signed in.
The `--subdomain` value does not match any saved session. Check the spelling
against `neetorecord whoami`, and sign in to that workspace if it is
missing.
The subdomain passed to `login` does not resolve to a NeetoRecord workspace.
It is the first part of your workspace URL: for `acme.neetorecord.com`, the
subdomain is `acme`. See [Workspace subdomain](/getting-started/workspace-subdomain).
A required flag is missing. Run the command with `--help`, or check the flag
table on that command's [reference page](/cli-reference/overview).
The binary is not on your `PATH`. The shell installer puts it in
`/usr/local/bin` and the PowerShell installer in
`%LOCALAPPDATA%\Programs\neetorecord`, adding that directory to your user
`PATH`. Open a new shell after installing so the change takes effect, and
see [Installation](/cli/installation).
Completion scripts are generated from the command tree at the moment you
install them, so they go stale after an upgrade. Re-run
`neetorecord completion ` and start a new shell. See
[Shell completion](/cli-reference/utility#shell-completion).
`neetorecord setup claude` looks for a Claude Code config directory in your
home directory. Run Claude Code once so it creates `~/.claude/`, then run
setup again.
## API errors
Errors returned by NeetoRecord come through with the server's own message. In
JSON output they arrive inside the envelope, so inspect the payload for `error`
or `errors` keys. A few worth knowing:
| Situation | What you see |
| -------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- |
| A screenshot before the MP4 is ready | `is_screenshot_ready: false`. Run [`recordings trigger-mp4`](/cli-reference/recordings#recordings-trigger-mp4), then retry. |
| A download URL before the MP4 is ready | `is_download_file_ready: false`. Same fix. |
| A screenshot timestamp past the end of a recording | `Timestamp must be a number between 0 and seconds.` |
| Removing the last admin | The request is rejected, because a workspace must keep at least one admin. |
## Reporting a problem
Include the output of `neetorecord version` and `neetorecord doctor`, and the
command you ran with `--json` so the response envelope is visible. Reach us
through the [help center](https://help.neetorecord.com) or at
[support@neetorecord.com](mailto:support@neetorecord.com).
# Authentication
Source: https://apidocs.neetorecord.com/getting-started/authentication
Learn how to authenticate your requests to the NeetoRecord API using API keys.
### Generating an API Key
To use the NeetoRecord APIs, you must first generate an API key.
[Learn how to generate your API key here.](https://help.neetorecord.com/articles/api-keys)
### Making authenticated API requests
To authenticate your API requests, include a valid API key in the X-Api-Key header.
```bash theme={"system"}
curl https://{your-subdomain}.neetorecord.com/api/external/v1/recordings \
--header 'X-Api-Key: your-api-key' \
--header 'Content-Type: application/json'
```
### Header Format
Include your API key in the `X-Api-Key` header of every request:
```http theme={"system"}
X-Api-Key: your_api_key_here
```
Generate separate API keys for different workspaces. An API key generated in
one workspace will not work in another.
API keys provide access to sensitive data. Treat them like passwords and
follow security best practices.
## Error Responses
### 401 Unauthorized
If your API key is missing, invalid, or expired, you'll receive a 401 error:
```json theme={"system"}
{
"error": "Could not authenticate, invalid API Key"
}
```
### Common Authentication Issues
**Problem**: API key is missing or invalid.
**Solution**: Verify your API key is correct and hasn't been revoked/expired.
**Problem**: Subdomain is left as the default value (**spinkart**) or
incorrect.
**Solution**: Verify your subdomain name is properly added in the request
URL.
# Introduction
Source: https://apidocs.neetorecord.com/getting-started/introduction
Welcome to the NeetoRecord API documentation.
The NeetoRecord API is organized around REST principles and uses standard HTTP response codes. All API endpoints return JSON responses and require authentication.
Before you start with NeetoRecord APIs you will need the following:
1. [Workspace subdomain](/getting-started/workspace-subdomain).
2. [API key](/getting-started/authentication).
## Rate Limiting
API requests are subject to rate limiting to ensure fair use. If you exceed the rate limit, you'll receive a 429 response. If you encounter this error try again after some time.
## Need help?
Visit our [help center](https://help.neetorecord.com), email us at [support@neetorecord.com](mailto:support@neetorecord.com), or join the [Neeto Community](https://neeto.com/community).
The community is powered by Slack and is the fastest way to get help directly from the developers, designers, and product folks building NeetoRecord.
# Pagination
Source: https://apidocs.neetorecord.com/getting-started/pagination
Learn how to handle paginated responses in the NeetoRecord API.
## Pagination Parameters
You can control pagination using the following query parameters:
The page of results you want to retrieve (starting from 1).
The number of items to return per page.
## Example Usage
Here's how to retrieve paginated results using cURL:
```bash cURL theme={"system"}
curl --request GET \
--url "https://{your-subdomain}.neetorecord.com/api/external/v1/recordings?page_number=2&page_size=25" \
--header 'X-Api-Key: your-api-key'
```
```javascript JavaScript theme={"system"}
const response = await fetch(
"https://{your-subdomain}.neetorecord.com/api/external/v1/recordings?page_number=2&page_size=25",
{
method: "GET",
headers: {
"X-Api-Key": "your-api-key",
"Content-Type": "application/json",
},
}
);
const data = await response.json();
console.log(data);
```
```python Python theme={"system"}
import requests
url = "https://{your-subdomain}.neetorecord.com/api/external/v1/recordings"
params = {
"page_number": 2,
"page_size": 25
}
headers = {
"X-Api-Key": "your-api-key",
"Content-Type": "application/json"
}
response = requests.get(url, params=params, headers=headers)
data = response.json()
print(data)
```
This retrieves the second page of recordings, with 25 results per page.
## Response Structure
Paginated responses include metadata about the pagination in JSON format:
```json Response Example theme={"system"}
{
"recordings": [
// ... array of recording objects
],
"pagination": {
"total_records": 150,
"current_page_number": 2,
"total_pages": 6,
"page_size": 25
}
}
```
The total number of items across all pages.
The current page number (if pagination was used).
The total number of pages available (if pagination was used).
The number of items per page.
## Default Behavior
If pagination parameters are not provided, default values will be applied: -
**page\_number**: 1 (first page) - **page\_size**: 30 (30 items per page)
## Best Practices
1. **Start with reasonable page sizes**: Use page sizes between 10-100 items for optimal performance.
2. **Handle empty results**: Always check if the returned array is empty to detect the end of data.
3. **Use total\_records**: Use the `pagination.total_records` field to calculate the total number of pages needed.
4. **Implement error handling**: Handle cases where the requested page doesn't exist.
# HTTP response codes
Source: https://apidocs.neetorecord.com/getting-started/response-codes
Learn about the HTTP status codes returned by the API.
## Success Codes
The request was successful and the server returned the requested data.
The request was successful and a new resource was created. Returned for POST requests that create new resources.
The request was successful but there is no content to return. Typically returned for DELETE operations.
## Error codes
There was an issue with the request. This usually indicates malformed JSON,
missing required parameters, or invalid parameter values.
The request needs to be authenticated. This typically means:
* Missing API key.
* Invalid API key.
* Expired API key.
An operation was not allowed. This could mean:
* Insufficient permissions for the requested action.
* Attempting to access a resource you don't own.
* API key doesn't have the required scope.
The requested URL or resource was not found. This could indicate:
* Incorrect endpoint URL.
* Resource ID doesn't exist.
* Workspace subdomain is incorrect.
The given request could not be processed by the server due to malformed
request. Check the request body once again.
Rate limit exceeded. Try again after some time.
An unexpected error occurred on the server. If this persists, please contact
support.
The server does not support the functionality required to fulfill the request.
## Error Response Format
When an error occurs, the API returns a JSON response with error details:
```json 401 Unauthorized theme={"system"}
{
"error": "Could not authenticate, invalid API Key"
}
```
A human-readable error message.
When debugging API issues, the HTTP status
code often provides
the first clue about what went wrong. Start by checking the status code before
diving into the response body.
# Workspace subdomain
Source: https://apidocs.neetorecord.com/getting-started/workspace-subdomain
Learn how to find your workspace subdomain.
## What is a subdomain?
A subdomain is the part of your workspace URL that comes before the main domain. For example, in the URL:
```
https://spinkart.neetorecord.com
```
**spinkart** is the subdomain.
This subdomain is crucial for making API requests, as it identifies your specific workspace within NeetoRecord.
## Step-by-step instructions
You can usually find this in your browser's address bar when logged into your workspace.
Example:
```
https://your-subdomain.neetorecord.com
```
Our main domain is: `neetorecord.com`
Everything before `neetorecord.com` is your subdomain.
**Example:**
* URL: `https://green-earth.neetorecord.com`
* Subdomain: `green-earth`
## Using Your Subdomain in API Requests
Once you've identified your subdomain, you'll use it in all API requests. The base URL format is:
```
https://{your-subdomain}.neetorecord.com/api/external/v1
```
For example, if your subdomain is `mycompany`, your API base URL would be:
```
https://mycompany.neetorecord.com/api/external/v1
```
## Common Examples
Here are some common subdomain patterns:
| Type | Example URL | Subdomain |
| ---------- | ---------------------------------------- | ---------------- |
| Company | `https://acmecorp.neetorecord.com` | `acmecorp` |
| Department | `https://marketing.neetorecord.com` | `marketing` |
| Project | `https://product-launch.neetorecord.com` | `product-launch` |
# Authentication
Source: https://apidocs.neetorecord.com/mcp/authentication
Connect as yourself with OAuth, or as the whole workspace with an API key.
The MCP server accepts two kinds of credentials, and the difference is not just
setup. It decides **what the assistant can see**.
| | OAuth | API key |
| -------------------------- | ------------------------------ | -------------------------------------- |
| Scope | The person who approved it | The whole workspace |
| Identity | Tied to a NeetoRecord user | Tied to nothing and nobody |
| Set up by | Pasting the server URL | Pasting a key into a config file |
| Used by | Every client | Every client except Claude and ChatGPT |
| Reaches several workspaces | Yes, tick them while approving | No, one key is one workspace |
| Revoked by | Removing the connector | Revoking the key in workspace settings |
Claude and ChatGPT always use OAuth. Claude Code, Codex, Cursor, Gemini CLI, VS
Code, and Windsurf support both, and you choose by what you put in their config
file: leave the credential out and the client signs you in over OAuth, supply one
and the client reaches the whole workspace. Both routes hit the same server and
expose the same [tools](/mcp/tools).
## OAuth, scoped to you
The assistant acts as the person who approved the connection. Every tool call
runs with that person's permissions: listings and searches come back filtered to
what they can see, and a recording they cannot open is refused rather than
returned.
That makes OAuth the better fit whenever a real person is driving the assistant,
because the blast radius of the connection is the same as the blast radius of
that person's account.
Clients that add a server by URL discover everything else on their own. The
server publishes its OAuth metadata at
`https://connect.neetorecord.com/.well-known/oauth-authorization-server`, and
registers each client automatically, so there is no client ID or secret for you
to create.
| Detail | Value |
| ------------------- | ---------------------------------------------------------------------------------- |
| Grant type | Authorization code with PKCE (`S256`) |
| Scope | `mcp` |
| Client registration | Dynamic, per [RFC 7591](https://datatracker.ietf.org/doc/html/rfc7591) |
| Refresh | Refresh tokens are issued, so the connection survives without you signing in again |
| Revoke | From your assistant, by removing the connector |
What you see when you connect:
1. **Choose your workspace.** Enter the subdomain of the workspace you want the
assistant to reach. For `acme.neetorecord.com`, enter `acme`.
2. **Sign in to that workspace**, if you are not signed in already.
3. **Pick the workspaces to connect.** When your email belongs to more than one
workspace, the approval screen lists them all. The one you signed in to is
always included; tick any others the same connection should reach.
4. **Authorize.** The assistant is granted access as you, to each workspace you
ticked.
One OAuth connection can therefore cover several workspaces. Name the one you
mean in a prompt, or ask the assistant to list what it can reach. Every tool
takes an optional `workspace` argument for this.
## API key, scoped to the workspace
An API key carries no identity. Every tool call covers the entire workspace, no
matter whose machine the assistant is running on or who is typing. Two people
sharing one key are indistinguishable to NeetoRecord, and neither is limited to
their own recordings.
That is what you want for automation that has to see everything, and what you do
not want on a laptop belonging to someone who should only see their own work.
The key is the same one the [REST API](/getting-started/authentication) uses,
sent as a bearer token:
```json theme={"system"}
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
```
API keys are created in your NeetoRecord workspace settings.
[Learn how to generate your API key here.](https://help.neetorecord.com/articles/api-keys)
A key belongs to one workspace. To let an assistant work with two workspaces,
add the server twice with a different key and a different server name in each
entry.
An API key gives access to every recording in the workspace and is not tied to
a person, so it cannot be traced back to one either. Treat it like a password:
keep it out of shared config files and commits, and revoke it if it leaks.
Prefer OAuth wherever the client supports it.
## How the three interfaces authenticate
| Interface | Credential | Scope | Where it goes |
| ------------------------------------------- | ------------------------------------- | ------------------------------------ | -------------------------------------------------------------------------------------- |
| [REST API](/getting-started/authentication) | API key | Workspace | `X-Api-Key` header on each request. |
| [CLI](/cli/authentication) | Browser sign in, stored per workspace | The signed in user | `~/.config/neetorecord/auth.json`. No API key involved. |
| MCP | OAuth, or an API key | The approving user, or the workspace | Browser approval, or an `Authorization: Bearer` header in the assistant's config file. |
# Connect your assistant
Source: https://apidocs.neetorecord.com/mcp/connect
Server details and per client setup for the NeetoRecord MCP server.
## Server details
| Setting | Value |
| -------------- | ---------------------------------------------- |
| Endpoint | `https://connect.neetorecord.com/mcp/messages` |
| Transport | HTTP |
| Authentication | OAuth, or `Authorization: Bearer YOUR_API_KEY` |
How you connect decides what the assistant can see, so pick the method before the
client. See [Authentication](/mcp/authentication) for what the two mean in
practice.
| Your assistant | OAuth, scoped to you | API key, scoped to the workspace |
| --------------------------------------------------------- | -------------------- | -------------------------------- |
| Claude, ChatGPT | Yes | Not supported |
| Claude Code, Codex, Cursor, Gemini CLI, VS Code, Windsurf | Yes | Yes |
Claude and ChatGPT only ever act as you. The editor and terminal clients support
both, and the difference is one line of config: leave the credential out and the
client signs you in over OAuth, supply one and the client reaches the whole
workspace.
## OAuth, scoped to you
Nothing to create in NeetoRecord beforehand. You give the client the server URL
and approve the connection in the browser.
Custom connectors work on claude.ai, in the Claude desktop app, and in
Cowork. The steps below are the same in all three, and a connector you add
in one shows up in the others.
1. Open **[Settings > Connectors](https://claude.ai/customize/connectors)**.
2. Click **Add**, then **Add custom connector**.
3. Give it a name and paste the server URL:
```
https://connect.neetorecord.com/mcp/messages
```
Leave **Advanced settings** alone. The OAuth client ID and secret there
are for servers that cannot register clients on their own, and
NeetoRecord does that automatically.
4. Click **Add**, then **Connect** to start the sign in.
If connectors are managed centrally in your organization, an Owner adds it
once under
**[Organization settings > Connectors](https://claude.ai/admin-settings/connectors)**,
after which everyone else connects from their own Connectors list.
Anthropic documents the current steps in
[Get started with custom connectors using remote MCP](https://support.claude.com/en/articles/11175166-get-started-with-custom-connectors-using-remote-mcp).
Custom MCP servers are added through developer mode.
1. Open **Settings → Security and login** and turn on **Developer mode**.
The **Plugins** settings section links straight to it.
2. Go to **Plugins**, click **Browse plugins**, then the **plus** button.
3. In **New Plugin**, enter a name, set **Connection** to **Server URL**,
and paste:
```
https://connect.neetorecord.com/mcp/messages
```
4. Leave **Authentication** on **OAuth**. ChatGPT reads NeetoRecord's OAuth
settings from the URL, so **Advanced OAuth settings** needs nothing from
you.
5. Tick **I understand and want to continue**, then click **Create** and
approve the NeetoRecord sign in.
OpenAI documents the current steps in
[Building MCP servers for plugins and API integrations](https://developers.openai.com/api/docs/mcp).
They renamed the app directory to the plugin directory in July 2026, so
older walkthroughs may say "apps" or "connectors" where the UI now says
"plugins".
Add the server without a header. The missing credential is what makes Claude
Code sign you in rather than send a key.
```bash theme={"system"}
claude mcp add --transport http neetorecord https://connect.neetorecord.com/mcp/messages
```
Run `claude mcp list` and the server reads `Needs authentication`. Start
Claude Code, run `/mcp`, pick **neetorecord**, and complete the sign in in
the browser.
Add the server to `~/.cursor/mcp.json`, or to `.cursor/mcp.json` for a
single project, with no `headers` block:
```json theme={"system"}
{
"mcpServers": {
"neetorecord": {
"url": "https://connect.neetorecord.com/mcp/messages"
}
}
}
```
Restart Cursor, then approve the NeetoRecord sign in when it prompts.
Add the server to `~/.gemini/settings.json`, or to `.gemini/settings.json`
for a single project, with no `headers` block. Streamable HTTP servers go
under `httpUrl`, not `url`, which Gemini CLI reserves for SSE:
```json theme={"system"}
{
"mcpServers": {
"neetorecord": {
"httpUrl": "https://connect.neetorecord.com/mcp/messages"
}
}
}
```
Gemini CLI starts the sign in when the server answers with a 401 and
registers itself automatically.
Codex uses TOML rather than JSON. Add the server to `~/.codex/config.toml`,
or to `.codex/config.toml` for a single project, with no credential fields.
OAuth is what Codex falls back to when none are given:
```toml theme={"system"}
[mcp_servers.neetorecord]
url = "https://connect.neetorecord.com/mcp/messages"
```
Then start the sign in:
```bash theme={"system"}
codex mcp login neetorecord
```
Create `.vscode/mcp.json` with no `headers` block. VS Code nests servers
under `servers`, not `mcpServers`:
```json theme={"system"}
{
"servers": {
"neetorecord": {
"type": "http",
"url": "https://connect.neetorecord.com/mcp/messages"
}
}
}
```
Needs VS Code 1.99 or later with GitHub Copilot in Agent mode. Approve the
NeetoRecord sign in when it prompts.
Add the server to `~/.codeium/windsurf/mcp_config.json` with no `headers`
block. Windsurf uses `serverUrl` rather than `url`:
```json theme={"system"}
{
"mcpServers": {
"neetorecord": {
"serverUrl": "https://connect.neetorecord.com/mcp/messages"
}
}
}
```
Enable the server under **Settings → Cascade → MCP Servers**, then approve
the NeetoRecord sign in when it prompts.
### What the sign in looks like
Whichever client you started from, NeetoRecord runs the same steps.
Enter the subdomain of the workspace you want the assistant to reach. For
`acme.neetorecord.com`, enter `acme`. See
[Workspace subdomain](/getting-started/workspace-subdomain).
Sign in to that workspace if you are not signed in already.
**Workspaces to connect** lists every workspace your email belongs to. The
one you just signed in to is ticked and cannot be unticked. Tick any others
you want the same connection to reach.
This section only appears when your email belongs to more than one
workspace. With a single workspace, the screen goes straight to the details
and the buttons.
Click **Authorize**. The assistant is granted access as you, with your
permissions, to each workspace you ticked.
There is no API key to create for this route, and nothing to paste back into the
assistant.
Once connected, name the workspace in a prompt when you want a specific one. To
add a workspace later, run the sign in again and tick it.
## API key, scoped to the workspace
The same six clients, configured with a key instead. Every tool call then
reaches the whole workspace rather than just your own recordings, which is what
you want for automation and not what you want on a shared machine.
Add the server to `~/.claude.json` under `mcpServers`:
```json theme={"system"}
{
"mcpServers": {
"neetorecord": {
"type": "http",
"url": "https://connect.neetorecord.com/mcp/messages",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
}
```
Restart Claude Code after saving.
Add the server to `~/.cursor/mcp.json` under `mcpServers`:
```json theme={"system"}
{
"mcpServers": {
"neetorecord": {
"url": "https://connect.neetorecord.com/mcp/messages",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
}
```
Restart Cursor, or reload the window from the command palette.
Add the server to `~/.gemini/settings.json` under `mcpServers`. Streamable
HTTP servers go under `httpUrl`, not `url`:
```json theme={"system"}
{
"mcpServers": {
"neetorecord": {
"httpUrl": "https://connect.neetorecord.com/mcp/messages",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
}
```
Codex uses TOML rather than JSON, and takes the name of an environment
variable rather than the key itself, which keeps the key out of the file:
```toml theme={"system"}
[mcp_servers.neetorecord]
url = "https://connect.neetorecord.com/mcp/messages"
bearer_token_env_var = "NEETORECORD_API_KEY"
```
Export `NEETORECORD_API_KEY` in the environment Codex runs in.
Create `.vscode/mcp.json` in your workspace. VS Code nests servers under
`servers`, not `mcpServers`:
```json theme={"system"}
{
"servers": {
"neetorecord": {
"type": "http",
"url": "https://connect.neetorecord.com/mcp/messages",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
}
```
This needs VS Code 1.99 or later with GitHub Copilot in Agent mode. The
editor prompts for your API key the first time the server is used.
Unlike the other clients, this config lives inside your project rather
than your home directory, so a pasted key can end up in a commit. Add
`.vscode/mcp.json` to `.gitignore`, or leave the key out of the file and
let VS Code prompt for it.
Add the server to `~/.codeium/windsurf/mcp_config.json`. Windsurf uses
`serverUrl` rather than `url`:
```json theme={"system"}
{
"mcpServers": {
"neetorecord": {
"serverUrl": "https://connect.neetorecord.com/mcp/messages",
"headers": {
"Authorization": "Bearer YOUR_API_KEY"
}
}
}
}
```
Enable the server under **Settings → Cascade → MCP Servers**. Windsurf
allows at most 100 tools across every connected server, so disable servers
you are not using if NeetoRecord's tools do not appear.
Replace `YOUR_API_KEY` with a key from your workspace. See
[Authentication](/mcp/authentication).
## Confirm the connection
Ask the assistant something only the server can answer, for example
"List my five most recent NeetoRecord recordings." If it answers with real
recordings, the connection works. If it does not, see
[Troubleshooting](/mcp/troubleshooting).
# Examples
Source: https://apidocs.neetorecord.com/mcp/examples
Things to ask an AI assistant once it is connected to NeetoRecord.
These are prompts, not commands. Ask in your own words. What follows each one is
the work the assistant does through the [tools](/mcp/tools) to answer.
## Find the recording where something was said
> Which of our recordings talks about the pricing page redesign? Jump to the
> part where it comes up.
The assistant searches transcripts rather than titles, then reads the matching
transcript and reports the timestamped segment. Ask it to show you what was on
screen at that moment and it captures the frame at that timestamp.
## Turn a recording into written notes
> Summarize yesterday's sprint demo as bullet points, with a timestamp for each
> section.
The assistant pulls the transcript and the chapters and writes them up. If the
recording has no transcript yet, it can start generation and check the status
before continuing.
## Share a recording
> Give me the share link for the onboarding walkthrough, and the embed code for
> the docs site.
The assistant looks the recording up by title, then returns the public link and
the iframe snippet. It also sees whether the link has expired or is behind
access control.
## Tidy up the library
> Move every recording tagged "demo" from last quarter into a Product demos
> folder.
The assistant lists the tags and folders, creates the folder if it is missing,
and moves the recordings one by one.
## Check how recordings are doing
> How many views did we get last month, and which recording did best?
The assistant reads workspace wide analytics for the date range and can drill
into a single recording's day by day view counts.
## Ask a teammate for a recording
> Ask Sam to record a walkthrough of the billing bug and send me the link.
The assistant creates a recording request and returns the URL to pass on.
## Work with a recording from another workspace
> Here is a NeetoRecord link a customer sent us. What is in it?
For a publicly accessible recording outside your workspace, the assistant falls
back to the public tools and reads its details, transcript, and chapters. This
works only when the recording needs no sign in, and it respects whatever the
owner allowed, so transcripts or downloads may be unavailable.
# Introduction
Source: https://apidocs.neetorecord.com/mcp/introduction
Connect an AI assistant to your NeetoRecord workspace over the Model Context Protocol.
NeetoRecord runs a hosted MCP server. Point a compatible AI assistant at it and
the assistant can work with your recordings directly: no local install, no
glue code.
Once connected, an assistant can search recordings by title or by what was said
in them, read transcripts and chapters, pull a still frame out of a video,
produce share links and embed codes, organize recordings into folders and tags,
and report view analytics. The full list is on the [Tools](/mcp/tools) page.
## What you need
* An AI assistant that supports MCP. Setup steps for Claude, ChatGPT, Claude
Code, Codex, Cursor, Gemini CLI, VS Code with GitHub Copilot, and Windsurf are
on [Connect your assistant](/mcp/connect).
* A NeetoRecord API key, but only for workspace scoped access. Every client can
sign you in over OAuth instead, which needs nothing beyond the server URL. See
[Authentication](/mcp/authentication).
The choice decides what the assistant can reach: an OAuth connection acts as you
and sees what you see, while an API key acts as the workspace and sees everything
in it.
## Next steps
Generate an API key and understand how the server uses it.
Server details and per client configuration.
Prompts that show what the connection is good for.
Every tool the server exposes, grouped by resource.
# Tools
Source: https://apidocs.neetorecord.com/mcp/tools
Every tool the NeetoRecord MCP server exposes, grouped by resource.
You do not call these by name. Ask for what you want and the assistant picks the
tool. The list is here so you know what is possible, and so you can nudge an
assistant that reaches for the wrong thing.
Every tool takes an optional `workspace` argument, the subdomain of a connected
workspace. Left out, it uses the workspace the connection was set up with.
## Recordings
Backed by the recordings endpoints. For field level detail, see the
[API reference](/api-reference/recordings/list).
| Tool | What it does |
| -------------------------------------------------------------------------------- | --------------------------------------------------------------- |
| [`ListRecordings`](/api-reference/recordings/list) | Lists recordings with optional filters and pagination. |
| [`GetRecording`](/api-reference/recordings/get) | Gets full details of one recording by id. |
| [`SearchRecordingsByTitle`](/api-reference/recordings/search) | Exact or partial title search across recordings. |
| [`SearchRecordingsByTranscript`](/api-reference/recordings/search-by-transcript) | Full text search across transcript content. |
| [`UpdateRecording`](/api-reference/recordings/update) | Updates a recording's title, summary, or tags. |
| [`MoveRecordingToFolder`](/api-reference/recordings/update) | Moves a recording into a folder, or out of its current one. |
| [`DeleteRecording`](/api-reference/recordings/delete) | Permanently deletes a recording and everything derived from it. |
`DeleteRecording` cannot be undone. Assistants are told it is destructive, but
confirm what is about to be deleted before you approve the call.
## Transcripts and chapters
| Tool | What it does |
| ----------------------------------------------------------------------------- | ---------------------------------------------------------------- |
| [`GetTranscript`](/api-reference/recordings/transcript) | Gets the full transcript with timestamps. |
| [`GetTranscriptStatus`](/api-reference/recordings/transcript-status) | Reports whether a transcript exists and how generation is going. |
| [`TriggerTranscriptGeneration`](/api-reference/recordings/trigger-transcript) | Starts or restarts transcript generation. |
| [`GetChapters`](/api-reference/recordings/chapters) | Gets the auto generated chapters. |
| [`GetChapterStatus`](/api-reference/recordings/chapter-status) | Reports whether chapters exist and how generation is going. |
| [`TriggerChapterGeneration`](/api-reference/recordings/trigger-chapters) | Starts chapter generation. |
## Sharing and media
| Tool | What it does |
| --------------------------------------------------------------- | --------------------------------------------------------------------------- |
| [`GetShareLink`](/api-reference/recordings/share-link) | Gets the public share link, and whether it is expired or access controlled. |
| [`GetEmbedCode`](/api-reference/recordings/embed-code) | Gets the HTML embed code for a recording. |
| [`GetDownloadUrl`](/api-reference/recordings/download-url) | Gets a presigned download URL, valid for a limited time. |
| [`TriggerMp4Generation`](/api-reference/recordings/trigger-mp4) | Starts preparing the downloadable MP4. |
| [`GetScreenshot`](/api-reference/recordings/screenshot) | Captures a still frame at a timestamp and returns the image inline. |
## Folders and tags
| Tool | What it does |
| ----------------------------------------------- | -------------------------------------------------- |
| [`ListFolders`](/api-reference/folders/list) | Lists the recording folders in the workspace. |
| [`CreateFolder`](/api-reference/folders/create) | Creates a folder, optionally nested under another. |
| [`ListTags`](/api-reference/tags/list) | Lists the recording tags in the workspace. |
## Calls to action
| Tool | What it does |
| --------------------------------------------------- | -------------------------------------------------- |
| [`ListCtas`](/api-reference/recordings/ctas) | Lists the CTA buttons configured on a recording. |
| [`CreateCta`](/api-reference/recordings/create-cta) | Adds a CTA button to a recording for a time range. |
## Analytics
| Tool | What it does |
| -------------------------------------------------------------- | --------------------------------------------------------- |
| [`GetOrganizationAnalytics`](/api-reference/analytics/get) | Aggregate recording and view counts across the workspace. |
| [`GetRecordingAnalytics`](/api-reference/recordings/analytics) | View analytics for one recording. |
## Recording requests
| Tool | What it does |
| -------------------------------------------------------------------- | ---------------------------------------------------------------- |
| [`CreateRecordingRequest`](/api-reference/recording-requests/create) | Creates a recording request for an active user in the workspace. |
## Public recordings
These reach recordings in other workspaces, and only when the recording is
publicly accessible with no sign in required. They return less than their
workspace counterparts, and they respect what the owner allowed, so a transcript
or a download may be unavailable.
| Tool | What it does |
| --------------------------- | ------------------------------------------------ |
| `GetPublicRecordingDetails` | Gets details of a publicly accessible recording. |
| `GetPublicTranscript` | Gets its transcript with timestamps. |
| `GetPublicChapters` | Gets its chapters. |
| `GetPublicShareLink` | Gets its share link. |
| `GetPublicEmbedCode` | Gets its embed code. |
| `GetPublicDownloadUrl` | Gets a presigned download URL for it. |
| `GetPublicScreenshot` | Captures a still frame from it at a timestamp. |
## Workspaces
| Tool | What it does |
| ---------------- | ---------------------------------------------------------------------- |
| `ListWorkspaces` | Lists the workspaces this connection can reach, with their subdomains. |
# Troubleshooting
Source: https://apidocs.neetorecord.com/mcp/troubleshooting
What to check when an assistant cannot reach NeetoRecord.
**Restart the client first.** Every client reads its MCP config at startup,
and Cursor can also reload the window from the command palette. Then check
the items for your kind of client.
On Claude or ChatGPT, which connect over OAuth, confirm the connector was
actually added and that you completed the sign in rather than closing the
browser tab partway. In ChatGPT the plugin is only created once you tick the
risk acknowledgement.
On Claude Code, Cursor, VS Code, or Windsurf, which read a JSON config file:
1. **Check the config key.** Claude Code, Cursor, Gemini CLI, and Windsurf
nest servers under `mcpServers`. VS Code uses `servers`, and Codex uses a
`[mcp_servers.]` section in TOML. A server under the wrong key is
ignored silently.
2. **Check the URL key.** Windsurf expects `serverUrl`, and Gemini CLI
expects `httpUrl` because it reserves `url` for SSE. Claude Code, Codex,
Cursor, and VS Code expect `url`.
3. **Check the endpoint.** It is
`https://connect.neetorecord.com/mcp/messages`, with no trailing slash.
4. **Check the syntax.** In JSON a trailing comma or an unclosed brace makes
the whole file unreadable, which takes out any other servers too.
Full snippets for each client are on [Connect your assistant](/mcp/connect).
On an API key connection, the `Authorization` header must read
`Bearer YOUR_API_KEY`, with the word `Bearer` and a single space before the
key. Confirm the key has not been revoked, and that it belongs to the
workspace you expect: a key generated in one workspace does not work in
another. Generate a new key from
[workspace settings](https://help.neetorecord.com/articles/api-keys) if you
are unsure.
On an OAuth connection there is no key to check. Remove the connector and
add it again to run the sign in from the start.
The first screen asks for a workspace subdomain, not a full URL or an email
address. For `acme.neetorecord.com`, enter `acme`. See
[Workspace subdomain](/getting-started/workspace-subdomain).
If you have more than one workspace, the assistant reaches the one you
picked here. Connect the server once per workspace to reach several.
That is the scoping working as intended. An OAuth connection acts as the
person who approved it, so listings and searches come back filtered to your
permissions, and asking for a specific recording you cannot open is refused
rather than answered.
If the assistant genuinely needs to reach everything in the workspace, that
is what an API key connection is for. See
[Authentication](/mcp/authentication).
An OAuth connection covers the workspaces you approved it from. Name the
workspace in your prompt, or ask the assistant to list the workspaces it can
reach. To add another one, run the sign in again from that workspace.
MCP needs VS Code 1.99 or later with GitHub Copilot running in Agent mode.
Check the version, switch Copilot to Agent mode, and confirm that
`.vscode/mcp.json` is in the workspace you have open. VS Code prompts for
your API key the first time the server is used, so answer that prompt.
Enable the server under **Settings → Cascade → MCP Servers** after saving
the config. Windsurf also caps the total number of tools at 100 across every
connected server, so turn off servers you are not using and reload.
Workspace tools only reach recordings in the workspace the API key belongs
to. For a recording in someone else's workspace, the assistant has to use
the public tools, and those work only when the recording is publicly
accessible with no sign in required. Check that the watch URL's subdomain
matches the workspace you connected.
Those are generated after a recording is uploaded, and they may not exist
yet. Ask the assistant to check the transcript or chapter status and to
trigger generation, then try again once it reports success. A screenshot
also needs an up to date MP4, so the assistant may have to start MP4
generation first.
Public recordings can also have transcripts or downloads switched off by
their owner, in which case there is nothing to fetch.
Custom connectors are added under **Settings → Connectors**, and the
connector has to be authorized against your workspace before it can be used.
Remove and re-add it if the authorization did not complete. The same
connector list backs claude.ai, the Claude desktop app, and Cowork, so
fixing it in one fixes it everywhere.
## Still stuck
Reach us through the [help center](https://help.neetorecord.com), or at
[support@neetorecord.com](mailto:support@neetorecord.com). Tell us which client
you are using and what the assistant reports when it tries a NeetoRecord tool.