Commands
This is the full command reference for copera, grouped by domain. Run copera <command> --help for the complete flag list and examples for any command.
Most commands accept --json for machine-readable output, and the CLI auto-switches to JSON when stdout is piped or redirected. See Output formats.
Global flags available on every command: --token, --profile, --json, --output auto|json|table|plain, --quiet/-q, --no-input, --verbose.
Auth
copera auth login # guided browser flow
copera auth login --token=cp_pat_xxx # save a token directly
copera auth login --token # masked paste prompt, no browser
copera auth status # active profile + token source
copera auth whoami # who the token belongs to
copera auth logout # remove the stored credential
See Authentication for token types and login modes.
Boards
copera bases is a built-in alias for copera boards — use whichever feels natural.
copera boards list
copera boards list --query "roadmap" # search by name or description
copera boards get <board-id>
copera boards create --name "Q3 Roadmap"
copera boards create --name "CRM" --description "Sales pipeline" \
--table-name "Leads"
copera boards create --name "CRM" \
--column '{"label":"Contact","type":"CONTACT"}' \
--column '{"label":"Tasks","type":"CHECKLIST"}' \
--column '{"label":"Follow up","type":"DATE","format":"DATE_ISO"}'
copera boards update <board-id> --name "Q3 Launch Plan"
copera boards update <board-id> --description "Updated plan" --icon "🚀"
copera boards delete <board-id> --force
copera boards participants add --board <board-id> \
--participant <user-or-team-id> --participant <another-id>
copera boards participants remove <participant-id> --board <board-id> --force
--column is repeatable and accepts one JSON column blueprint. For larger
blueprints, use --data @board.json; explicit flags override matching fields
from the JSON input.
[
{
"_id": "64a1b2c3d4e5f6a7b8c9d0e1",
"name": "Engineering Roadmap",
"description": "Track features, bugs, and milestones across the engineering team.",
"createdAt": "2025-03-10T09:15:42.301Z",
"updatedAt": "2026-02-18T11:30:05.128Z"
}
]
Tables
copera tables list --board <board-id>
copera tables list --board <board-id> --query "tasks"
copera tables get <table-id> --board <board-id>
copera tables create --board <board-id> --name "Campaigns"
copera tables update <table-id> --board <board-id> --name "Launch Campaigns"
copera tables delete <table-id> --board <board-id> --force
Each table includes its full column schema — columnId, label, and type, plus options for STATUS and DROPDOWN columns. Use tables get to discover the column IDs and option IDs you need before creating or updating rows.
Columns
copera tables columns add --board <board-id> --table <table-id> \
--label "Priority" --type STATUS \
--option "Low:green" --option "High:red"
copera tables columns update <column-id> --board <board-id> --table <table-id> \
--label "Stage"
copera tables columns update <column-id> --board <board-id> --table <table-id> \
--add-option "Blocked:red"
In CLI v0.15.0, --option and --add-option are repeatable and accept "Label" or "Label:color". The CLI currently lists TEXT, PARAGRAPH, NUMBER, MONEY, DATE, EMAIL, PHONE, WEBSITE, CHECKBOX, STATUS, DROPDOWN, LABELS, USERS, LOCATION, DESCRIPTION, and FILE for --type.
Board blueprints additionally support CONTACT, CHECKLIST, and DATE with
DATE_ISO or DATE_TIME_ISO format through boards create --column or
boards create --data.
Export a table
copera tables export <table-id> --board <board-id> --view <view-id> \
--format CSV -o out.csv
--view is required and exports rows in the same shape as a saved view. --format accepts CSV, XLSX, JSON, MARKDOWN, HTML, PDF, ZIP, and ICS. -o/--output-file writes to a path (default: stdout; - also means stdout).
Rows
The CLI exposes the full row lifecycle — list, get, create, update, delete — plus comments, attachments, rich-text cells, and row authentication.
copera rows list --board <board-id> --table <table-id>
copera rows list --board <board-id> --table <table-id> --query "oauth"
copera rows get <row-id> --board <board-id> --table <table-id>
copera rows create --board <board-id> --table <table-id> \
--data '{"columns":[{"columnId":"<column-id>","value":"Hello"}]}'
copera rows update <row-id> --board <board-id> --table <table-id> \
--data '{"columns":[{"columnId":"<column-id>","value":"Updated"}]}'
copera rows delete <row-id> --board <board-id> --table <table-id> --force
copera rows list --board <board-id> --table <table-id> --offset 0 --limit 100
copera rows query --data @query.json
copera rows aggregate <board-id> <table-id> --data @aggregation.json
copera rows bulk <board-id> <table-id> --data @operations.json
copera rows views <board-id> <table-id>
--query searches the visible, non-password columns of the table.
Descriptions and rich-text cells
Rows have two separate long-text surfaces:
- Fixed legacy row description — shown by
rows getasDescription (legacy). Userows descriptionto read it. Updating it is no longer supported by the CLI. - RICH TEXT / DESCRIPTION table column cells — modern long-text columns. A table can have several, so target one with
--column <column-id>.
# Read the legacy row description
copera rows description <row-id> --board <board-id> --table <table-id>
# Read a RICH TEXT / DESCRIPTION column cell
copera rows column-content <row-id> --board <board-id> --table <table-id> \
--column <column-id>
# Write a RICH TEXT / DESCRIPTION column cell
copera rows update-column-content <row-id> --board <board-id> --table <table-id> \
--column <column-id> --content "# Notes"
update-column-content supports --operation replace (default), append, or prepend. To find a column ID for a table column named Description, run copera tables get <table-id> --board <board-id> --json.
Comments
copera rows comment <row-id> --board <board-id> --table <table-id> \
--content "Looks good"
copera rows comments <row-id> --board <board-id> --table <table-id>
Attachments
Download attachments from FILE columns or from comments:
# From a FILE column
copera rows attachments download <row-id> --board <board-id> --table <table-id> \
--column <column-id> --file <file-id> -o ./contract.pdf
# From a comment
copera rows comments attachments download <row-id> --board <board-id> --table <table-id> \
--comment <comment-id> --file <file-id> -o ./contract.pdf
Authenticate a row
Verify an identifier/password pair against the matching columns of a row (for example, a credentials table):
copera rows authenticate --board <board-id> --table <table-id> \
--identifier-column <column-id> --identifier-value "[email protected]" \
--password-column <column-id> --password-value "secret"
Stdin support
rows create, rows comment, and rows update-column-content read from stdin when their content flag is omitted:
echo '{"columns":[{"columnId":"<column-id>","value":"Hello"}]}' \
| copera rows create --board <board-id> --table <table-id>
echo "Looks good" \
| copera rows comment <row-id> --board <board-id> --table <table-id>
echo "# Notes" \
| copera rows update-column-content <row-id> --board <board-id> --table <table-id> \
--column <column-id>
Docs
Docs commands require a Personal Access Token (cp_pat_...).
copera docs tree
copera docs tree --parent <doc-id> # subtree under a doc
copera docs search "keyword"
copera docs get <doc-id> # metadata
copera docs content <doc-id> # body as Markdown
copera docs content <doc-id> --no-cache # bypass the local cache
copera docs create --title "New Doc" --content "Initial content"
copera docs update <doc-id> --content "Replacement content"
copera docs update <doc-id> --operation append --content "More content"
copera docs metadata <doc-id> --title "New title"
copera docs delete <doc-id> --force
copera docs generate --data @document.json
docs update --operation accepts replace (default), append, or prepend. Content updates are processed asynchronously — the API accepts the request and applies it shortly after. docs create and docs update both read from stdin when --content is omitted:
cat ./notes.md | copera docs create --title "Q2 Strategy"
cat ./report.md | copera docs update <doc-id>
Drive
Drive commands require a Personal Access Token with drive access.
copera drive tree
copera drive tree --parent <folder-id> # subtree under a folder
copera drive tree --depth 5 # control nesting depth (1-10, default 3)
copera drive search "quarterly report"
copera drive get <file-id>
copera drive download <file-id> -o report.pdf
copera drive upload ./report.pdf --parent <folder-id>
copera drive upload ./project/ --parent <folder-id> # recursive directory upload
copera drive mkdir "New Folder"
copera drive mkdir "Sub Folder" --parent <folder-id>
Uploads support multipart transfer, recursive directory upload (matching folder structure is created automatically), and a progress bar in interactive terminals. Tune them with --chunk-size <bytes> (default 10 MB) and --concurrency <n> (default 4). download writes to the current directory unless you pass -o/--dest.
Channels
copera channels list
copera channels list --query "deploy" # name, description, or participant
copera channels list --type <type> # filter by channel type
copera channels list --kind dm --participant <user-id>
copera channels message send "Hello" --channel <channel-id>
copera channels message send "Hello" --user <user-id> # DM by user ID
echo "Deploy done" | copera channels message send --channel <channel-id>
channels list --kind accepts group or dm. To send a direct message, use channels message send with --user <user-id> instead of --channel — Copera reuses the existing DM channel when one exists. Messages support Markdown (headings, bold/italic, lists, code blocks, blockquotes, links):
copera channels message send "## Build Report
* **Status:** Success
* **Duration:** 3m 42s
> All tests passed." --channel <channel-id>
Workspace
copera workspace info # workspace metadata
copera workspace members # members of the workspace
copera workspace teams # teams in the workspace
These require a Personal Access Token.
Search
Search across resource types. --type is repeatable to narrow the results:
copera search "contract"
copera search "contract" --type document --type driveContent
Requires a Personal Access Token.
Tempo, Agenda, Inbox, Automations, and Bookings
copera tempo calendars list # `time` is an alias
copera tempo calendars create --field name="Focus"
copera tempo shelf create --data @item.json
copera tempo shelf schedule <item-id> --data @schedule.json
copera agenda events list
copera agenda events create --data @event.json
copera agenda events respond <event-id> --field status=ACCEPTED
copera inbox list
copera inbox threads list <inbox-id> --query-param page=1
copera inbox send --data @message.json
copera inbox attachments upload <inbox-id> --file ./contract.pdf
copera inbox delete <inbox-id> --data @email-ids.json --force
copera automations list
copera automations run <automation-id> --data @trigger.json
copera automations retry <run-id>
copera bookings list
copera bookings cancel <booking-id> --field reason="Customer request" --force
copera booking-types create --data @booking-type.json
copera booking-host schedules create --data @availability.json
copera booking-host links create <booking-type-id> --field maxUses=1
These domains require a Personal Access Token carrying the corresponding
access_time, access_agenda, access_inbox, access_automations, or
access_bookings scope. Inbox is intentionally available through REST and the
CLI, not through hosted MCP.
Structured commands accept inline JSON, @file, or stdin with --data -.
Repeatable --field key=value flags override top-level JSON properties, while
--query-param key=value adds URL query parameters. Destructive operations
require interactive confirmation or --force.
Export jobs and result sets
copera exports job <job-id>
copera exports result-set --data '{"resultSetId":"<id>","format":"CSV"}'
Notifications
copera notifications list
copera notifications read <notification-id>
copera notifications unread <notification-id>
copera notifications delete <notification-id> --force
Requires a Personal Access Token.
Cache
The CLI caches document content locally for faster reads.
copera cache status # size, file count, and cache path
copera cache clean # clear the cache
Use copera docs content <id> --no-cache to bypass the cache for a single read without clearing it.
Utilities
copera version
copera version --json
copera update # update to the latest version
copera update --version 1.2.0 # pin to a specific version
copera update --force # skip the confirmation prompt
copera completion bash
copera completion zsh
copera completion fish
Pipe completion output into your shell startup file to enable tab completion:
copera completion zsh >> ~/.zshrc # zsh
copera completion bash >> ~/.bashrc # bash
copera completion fish > ~/.config/fish/completions/copera.fish # fish
Restart your shell or run source ~/.zshrc (or equivalent) to activate.
Related
- Authentication — token types and login flows.
- Configuration — profiles, default IDs, and environment variables.
- Public API Reference — the REST endpoints behind every command.