# 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`. NeetoRecord dialog headed 'Connect your workspace' with a field for the workspace subdomain and a Continue button 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**. Menu under the Add button with two items, Browse connectors and 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. Claude's Add custom connector dialog with the name NeetoRecord and the server URL filled in, and empty optional OAuth client fields under Advanced settings 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. ChatGPT's Developer mode setting, tagged Elevated risk, with its toggle switched on 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. ChatGPT's New Plugin dialog with the name NeetoRecord, the server URL, Authentication set to OAuth, and a notice that OpenAI has not reviewed this MCP server 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). NeetoRecord dialog headed 'Connect your workspace' with a field for the workspace subdomain and a Continue button 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. NeetoRecord 'Authorize access' screen showing the workspace and signed-in email, a 'Workspaces to connect' list with three workspaces, and Cancel and Authorize 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.