Skip to main content

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.

tip

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 get as Description (legacy). Use rows description to 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 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.