Search historical meetings, retrieve minutes/AI outputs/verbatim transcripts, query meeting recordings, download Minutes media.
feishu-cli: if not yet installed, please go to riba2534/feishu-cli to get the installation method.
Prerequisites
- Authentication: vc read-type (
vc search/notes/recording、vc bot meeting-events) and all minutes commands require User Access Token(recommended to firstauth check --scope "...", then executefeishu-cli auth login --scope "..."or--domain vc --domain minutes --recommend);Exception:vc bot meeting-join/vc bot meeting-leavedefaults to Bot/Tenant identity, only App ID + App Secret are needed, no login required (see Section 6 and the identity explanation in "Notes") - App credentials: App App ID + App Secret (environment variables
FEISHU_APP_ID+FEISHU_APP_SECRETor~/.feishu-cli/config.yaml) - Pre-check:
feishu-cli auth statusto view login status;feishu-cli auth check --scope "vc:meeting.search:read"pre-check scope
Command quick reference
1. Search historical meetings (multi-dimensional filtering)
feishu-cli vc search [过滤条件]
Under the hood it uses POST /open-apis/vc/v1/meetings/search。Specify at least one filter condition。
| Parameter | Type | Description |
|---|---|---|
--query |
string | Keyword (1-50 characters) |
--start |
string | Start time (YYYY-MM-DD or RFC3339) |
--end |
string | End time (YYYY-MM-DD or RFC3339, a pure date is automatically aligned to 23:59:59) |
--organizer-ids |
string | Host open_id list, comma-separated |
--participant-ids |
string | Participant open_id list, comma-separated |
--room-ids |
string | Meeting room ID list, comma-separated |
--page-size |
int | Number per page (1-30, default 15) |
--page-token |
string | Pagination token |
-o, --output |
string | json formatted output |
2. Retrieve meeting minutes (three paths)
feishu-cli vc notes (--meeting-ids | --minute-tokens | --calendar-event-ids) [选项]
Three entriesmutually exclusive, all support comma-separated batches (up to 50 items).
| Parameter | Type | Description |
|---|---|---|
--meeting-ids |
CSV | Meeting ID list |
--minute-tokens |
CSV | Minutes token list |
--calendar-event-ids |
CSV | Calendar event instance ID list (automatically reverse-looks up meeting_ids + meeting_notes) |
--with-artifacts |
bool | Additionally retrieve AI outputs (summary / todos / chapters) |
--download-transcript |
bool | Download verbatim transcript to {output-dir}/artifact-{sanitized_title}-{token}/transcript.txt(if it already exists, add --overwrite) |
--output-dir |
string | Verbatim transcript output directory (defaults to the current directory) |
--overwrite |
bool | Overwrite existing verbatim transcript files |
-o, --output |
string | json formatted output |
JSON output structure: the top level is {items, summary}; each items[] is {id, ok, data, error}. The meeting fields of successful items are located in items[].data, including source / meeting_id / minute_token / title / minute_url / create_time / note_doc / verbatim_doc / shared_docs / artifacts / transcript_path。
3. Query meeting recordings → minute_token
feishu-cli vc recording (--meeting-ids | --calendar-event-ids)
Extract from the meeting recording URL minute_token, used for subsequently downloading media or retrieving Minutes. Mutually exclusive entries, batch up to 50 items. The output fields are meeting_id / minute_token / recording_url / duration, there is no status field.
| Parameter | Type | Description |
|---|---|---|
--meeting-ids |
CSV | Meeting ID list |
--calendar-event-ids |
CSV | Calendar event instance ID list |
-o, --output |
string | json formatted output |
4. Get basic Minutes info (can merge AI artifacts)
feishu-cli minutes get <minute_token> [--with-artifacts] [-o json]
| Parameter | Description |
|---|---|
<minute_token> |
Positional parameter, required |
--with-artifacts |
Additionally call the artifacts API to merge output (summary / todos / chapters) |
-o, --output json |
JSON format output |
5. Download Minutes media files (batch)
feishu-cli minutes download --minute-tokens <t1,t2,...> [--output <path>] [--overwrite] [--url-only]
First call GET /open-apis/minutes/v1/minutes/{token}/media to get the presigned URL, then perform HTTP streaming download. Built-in SSRF protection (rejects localhost/loopback/internal network ranges), redirect validation (max 5 times, prohibits HTTPS→HTTP downgrade), filename parsing (Content-Disposition / RFC 5987 filename* / Content-Type to infer extension), batch filename conflict deduplication (add {token}- prefix), 5 req/s rate limit (time.Ticker)。
| Parameter | Type | Description |
|---|---|---|
--minute-tokens |
CSV | Required, max 50 items |
--output |
string | Output path: for a single token it is a file or directory; for batch it must be a directory; defaults to the current directory |
--overwrite |
bool | Overwrite existing files |
--url-only |
bool | Only print the download URL, do not actually download |
6. Meeting bot join / leave / meeting events
feishu-cli vc bot meeting-join --meeting-number 123456789 [--password 1234] [--dry-run]
feishu-cli vc bot meeting-leave --meeting-id 6911188411932033028 [--dry-run]
feishu-cli vc bot meeting-events --meeting-id 6911188411932033028 --start 2026-03-01 --end 2026-03-31
Let the meeting bot join a meeting by meeting number, leave the meeting, and query meeting events on the bot side.
| Subcommand | Endpoint | Identity | Key parameters |
|---|---|---|---|
meeting-join |
POST /open-apis/vc/v1/bots/join |
Default Bot/Tenant | --meeting-number(required),--password(optional),--dry-run、-o json |
meeting-leave |
POST /open-apis/vc/v1/bots/leave |
Default Bot/Tenant | --meeting-id(required),--dry-run、-o json |
meeting-events |
GET /open-apis/vc/v1/bots/events |
Must use User Token | --meeting-id(required),--start、--end、--page-size(20-100, default 20),--page-token、--dry-run、-o json |
All three subcommands support
--dry-run(only print the request parameters/request body to be sent, do not actually call) and-o json(output the raw response).meeting-join/meeting-leavedefaults to Bot/Tenant identity, no login required; only when explicitly passing--user-access-tokenflag does it switch to User identity (these two commands useresolveFlagUserToken,does not readFEISHU_USER_ACCESS_TOKENenvironment variable).meeting-eventsendpoint does not accept Tenant Token: if logged in it will automatically use User Token, if not logged in it will be rejected by99991663rejection → need to firstfeishu-cli auth login。meeting-events's--page-sizevalue range is 20-100(different fromvc search's 1-30); passing 0 or not passing uses the default 20, passing 1-19 will be rejected.
Usage examples
# 关键词 + 时间范围搜索
feishu-cli vc search --query "周会" --start 2026-03-20 --end 2026-04-11
# 按主持人过滤 + JSON 输出
feishu-cli vc search --organizer-ids ou_xxx,ou_yyy -o json
# 通过会议 ID 批量查纪要
feishu-cli vc notes --meeting-ids 6900001,6900002
# 通过妙记 token 查 + 获取 AI 产物 + 下载逐字稿
feishu-cli vc notes --minute-tokens obcnxxxx \
--with-artifacts --download-transcript --output-dir ./notes
# 从日历事件反查并下载全部逐字稿
feishu-cli vc notes --calendar-event-ids <event_id> --download-transcript --output-dir ./notes
# 从会议 ID 反查 minute_token
feishu-cli vc recording --meeting-ids 6900001 -o json
# 单条妙记下载到当前目录(自动解析文件名)
feishu-cli minutes download --minute-tokens obcnxxxx
# 批量下载到指定目录
feishu-cli minutes download --minute-tokens t1,t2,t3 --output ./media --overwrite
# 只取下载链接不下载
feishu-cli minutes download --minute-tokens obcnxxxx --url-only
# 获取妙记信息并展示 AI 摘要
feishu-cli minutes get obcnxxxx --with-artifacts
# 机器人按会议号入会(默认 Bot/Tenant 身份,无需登录)
feishu-cli vc bot meeting-join --meeting-number 123456789 --password 1234
# 预览离会请求体不实际调用
feishu-cli vc bot meeting-leave --meeting-id 6911188411932033028 --dry-run
# 查询机器人会议事件(必须 User Token),分页 + JSON 输出
feishu-cli vc bot meeting-events --meeting-id 6911188411932033028 \
--start 2026-03-01 --end 2026-03-31 --page-size 50 -o json
Typical workflows
Workflow A: Meeting search → recording → Minutes media
# 1. 搜索目标会议
feishu-cli vc search --query "架构评审" --start 2026-03-01 -o json
# → 记录 meeting_id
# 2. 查会议录制,拿 minute_token
feishu-cli vc recording --meeting-ids <meeting_id> -o json
# → 记录 minute_token
# 3. 下载媒体文件
feishu-cli minutes download --minute-tokens <minute_token> --output ./media
Workflow B: Calendar event direct to Minutes download
# 1. 从日历事件一次性拿到纪要、AI 产物、逐字稿
feishu-cli vc notes --calendar-event-ids <event_id> \
--with-artifacts --download-transcript --output-dir ./notes -o json
# 2. 若要下载音视频,配合 recording 命令
feishu-cli vc recording --calendar-event-ids <event_id> -o json
# → 取得 minute_token
feishu-cli minutes download --minute-tokens <minute_token> --output ./media
Permission requirements
The following are the minimum required exact scopes; the project top-level CLAUDE.md uses
minutes:minutes*:*wildcard equivalent coverage (minutes:minutes:readonly+minutes:minutes.artifacts:read+minutes:minutes.media:export+minutes:minutes.transcript:export)。
| Command / Feature | Required scope |
|---|---|
vc search |
vc:meeting.search:read |
vc notes(meeting-ids path) |
vc:meeting.meetingevent:read、vc:note:read |
vc notes(minute-tokens path) |
minutes:minutes:readonly、vc:note:read |
vc notes --with-artifacts |
+ minutes:minutes.artifacts:read |
vc notes --download-transcript |
+ minutes:minutes.transcript:export |
vc notes(calendar-event-ids path) |
+ calendar:calendar:read、calendar:calendar.event:read |
vc recording |
vc:record:readonly(calendar path same as above with calendar permission appended) |
vc bot meeting-join |
vc:meeting.bot.join:write |
vc bot meeting-leave |
vc:meeting.bot.leave:write |
vc bot meeting-events |
vc read permission (must use User Token; if not logged in it will be rejected by 99991663 rejection) |
minutes get |
minutes:minutes:readonly(--with-artifacts additionally requires minutes:minutes.artifacts:read) |
minutes download |
minutes:minutes.media:export |
Permissions are enabled on the Feishu Open Platform's app permission management page; after enabling, execute feishu-cli auth login --scope "所需 scope..." or feishu-cli auth login --domain vc --domain minutes --recommend to reauthorize.
Notes
- Token identities have three tiers:
- User Token required:
vc search/notes/recording、vc bot meeting-events、minutes get/download. If not logged in, an error is reported in Chinese and the user is guided tofeishu-cli auth login;meeting-eventsendpoint does not accept Tenant Token; if not logged in, it is directly99991663rejected. - Defaults to Bot/Tenant:
vc bot meeting-join/vc bot meeting-leave, requires only App ID + App Secret, no login needed; only when--user-access-tokenflag is explicitly passed does it switch to User identity (usingresolveFlagUserToken,does not readFEISHU_USER_ACCESS_TOKENenvironment variable). - Override login state: except for
meeting-join/meeting-leave(only recognizes--user-access-tokenflag), other commands can also use theFEISHU_USER_ACCESS_TOKENenvironment variable.
- User Token required:
- Time format:
vc search --start/--endacceptsYYYY-MM-DD/YYYY-MM-DD HH:MM:SS/ RFC3339, both parsed in local time zone; date-only--endis automatically aligned to 23:59:59. - Batch limit: all CSV-type input parameters have a uniform limit of 50 entries; exceeding it directly reports an error.
- minute_token format: alphanumeric combination, length ≥5; the command performs pre-validation.
- calendar-event-id: refers to "calendar event instance ID", not the schedule event_id itself; can be obtained from
feishu-cli calendar agendaor the schedule view API. - Filename parsing:
minutes downloaddetermines the filename by the priority Content-Disposition > Content-Type extension >{token}.media; in batch mode, conflicts are automatically prefixed with{token}-. - SSRF protection: download URLs are validated, rejecting those pointing to internal network segments / localhost / non-http(s) schemes; redirects are limited to 5 and HTTPS → HTTP downgrade is prohibited.
- Data freshness: meeting minutes/妙记 can only be queried some time after the meeting ends; real-time meetings cannot be retrieved.
- Transcript deduplication: within the same
vc notescall, the transcript of the sameminute_tokenis downloaded only once.