datarooms
List, create, configure, and read analytics for datarooms.
A dataroom groups documents under one access boundary. The CLI now covers the full lifecycle: create, configure, audit, read analytics, and inspect contents.
$ papermark datarooms create --name "Acme Series B" --description "Q2 2026 raise"
ID: dr_K8mN2pQr
NAME: Acme Series Blist
papermark datarooms list [--limit <n>] [--cursor <id>] [--query <substring>]| Flag | Default | Effect |
|---|---|---|
-l, --limit <n> | 25 | Page size, 1–100 |
-c, --cursor <id> | none | Continuation cursor from a previous response's meta.next_cursor |
-q, --query <substring> | none | Filter by name substring |
--json | auto when piped | Machine-readable output |
$ papermark datarooms list
ID NAME UPDATED
dr_K8mN2pQr Acme Series B 2 days ago
dr_aBc456 Brand-X DD 1 month agoget
papermark datarooms get <id>Fetches one dataroom by ID. Includes settings (conversations,
agents, bulkDownload) plus document and link counts.
create
papermark datarooms create \
--name <name> \
[--internal-name <slug>] \
[--description <text>]| Flag | Default | Effect |
|---|---|---|
-n, --name <name> | required | Display name shown to viewers |
--internal-name <slug> | auto | Internal slug for the dashboard URL; lowercase, hyphenated |
-d, --description <text> | none | Free-text description shown on the dataroom landing |
papermark datarooms create \
--name "Acme Series B" \
--internal-name "acme-series-b" \
--description "Q2 2026 fundraise materials"The dataroom starts empty. Add documents next; see attach.
update
papermark datarooms update <id> \
[--name <name>] \
[--internal-name <slug>] \
[--description <text>] \
[--conversations on|off] \
[--agents on|off] \
[--bulk-download on|off]Patches dataroom settings. Pass only the flags you want to change; everything else stays as it was.
| Flag | Effect |
|---|---|
--conversations on|off | Enable in-dataroom conversations between you and viewers |
--agents on|off | Enable AI agents that can answer viewer questions about the documents |
--bulk-download on|off | Allow viewers to download every document as a zip |
# Open up bulk download for the partner round
papermark datarooms update dr_K8mN2pQr --bulk-download onlinks
papermark datarooms links <id> [--limit <n>] [--cursor <id>]Lists every share link pointing at this dataroom. Equivalent to
papermark links list --dataroom <id>, kept under datarooms for
ergonomic grouping.
papermark datarooms links dr_K8mN2pQr --json | jq '.data[] | {name, viewCount}'Mint a new dataroom-bound link with
papermark links create --dataroom <id>.
viewers
papermark datarooms viewers <id> [--limit <n>] [--cursor <id>] [--email <email>]Lists persistent visitors (one row per email) tied to this
dataroom. Different from per-link views: a viewer who hits two
links in the same dataroom shows up once here, but twice in
papermark views list.
| Flag | Effect |
|---|---|
--email <email> | Filter to one email address |
$ papermark datarooms viewers dr_K8mN2pQr --email alice@acme.com
ID EMAIL FIRST SEEN LAST SEEN
viewer_qRsT01 alice@acme.com 3 days ago 2 hours agostats
Aliases: analytics.
papermark datarooms stats <id> [--since <unix-ms>] [--until <unix-ms>]Aggregate analytics for the dataroom: total views, unique visitors, time spent, page-level engagement across every document inside.
| Flag | Default | Effect |
|---|---|---|
--since <unix-ms> | dataroom creation | Lower bound, Unix timestamp in milliseconds |
--until <unix-ms> | now | Upper bound, Unix timestamp in milliseconds |
The unusual unix-ms format is because stats is backed by a
Tinybird query and uses the wire format the analytics service
prefers; the rest of the API takes ISO 8601.
stats is rate-limited more strictly than the rest of the
surface (per-token cap is lower than the default 60 RPM). Cache
the response if you're polling.
# Last 7 days
SINCE=$(node -e "console.log(Date.now() - 7*24*60*60*1000)")
papermark datarooms stats dr_K8mN2pQr --since "$SINCE"documents
papermark datarooms documents <id> [--limit <n>] [--cursor <id>] [--folder <id>]Lists documents inside the dataroom, with folder filter.
| Flag | Effect |
|---|---|
--folder <id> | Limit to one folder (datarooms have an internal folder tree) |
papermark datarooms documents dr_K8mN2pQr --json \
| jq '.data[] | {name, folder: .folderId}'attach
papermark datarooms attach <id> --document <doc-id> [--folder-id <fid>]Attaches an existing team-library document to the dataroom. The
document stays in the library; this only adds it to the dataroom's
contents. Pass --folder-id to place it inside a dataroom folder.
# Upload to your team, then attach to the dataroom
DOC_ID=$(papermark documents upload ./term-sheet.pdf --json | jq -r '.data.id')
papermark datarooms attach dr_K8mN2pQr --document "$DOC_ID"Bulk variant:
for f in ~/acme/*.pdf; do
DOC_ID=$(papermark documents upload "$f" --json | jq -r '.data.id')
papermark datarooms attach dr_K8mN2pQr --document "$DOC_ID"
doneThe attach response carries the dataroom-document id as id (the
attachment, distinct from the underlying document_id). You need that
id to move or detach the document later — datarooms documents lists
it too.
move
papermark datarooms move <id> <ddId> --folder-id <fid>
papermark datarooms move <id> <ddId> --rootMoves a document to a different folder within the dataroom, keyed
by its dataroom-document id (ddId).
| Flag | Effect |
|---|---|
--folder-id <fid> | Move into the folder fid |
--root | Move to the dataroom root (alias for --folder-id root) |
--folder-id "" / --folder-id root | Also move to the dataroom root |
One of --folder-id or --root is required; passing --root together
with a specific --folder-id is rejected.
# Into a folder…
papermark datarooms move dr_K8mN2pQr ddoc_3f9 --folder-id fld_legal
# …and back to the root (these are equivalent)
papermark datarooms move dr_K8mN2pQr ddoc_3f9 --root
papermark datarooms move dr_K8mN2pQr ddoc_3f9 --folder-id ""detach
papermark datarooms detach <id> <ddId>Removes one document's attachment to the dataroom, keyed by its
dataroom-document id (ddId). The document stays in the team library
and remains attached to any other datarooms — only this attachment is
removed. Use this instead of deleting and recreating a folder when you
just need to pull one file.
papermark datarooms detach dr_K8mN2pQr ddoc_3f9groups
papermark datarooms groups <subcommand> [args]A group is a named audience inside a dataroom: members (by email or
domain) plus per-document view/download permissions. Share a group by
minting a link with
links create --dataroom <id> --group <gid>;
only group members can open it. A freshly created group sees
nothing until you grant permissions.
The full flow:
# 1. Create the group
GID=$(papermark datarooms groups create dr_K8mN2pQr \
--name "Series B investors" --domains acme.vc --json | jq -r '.data.id')
# 2. Add explicit members
papermark datarooms groups members add dr_K8mN2pQr "$GID" \
-e jane@fund.com,joe@fund.com
# 3. Grant access to the deck (item ids come from `datarooms documents`)
papermark datarooms groups permissions set dr_K8mN2pQr "$GID" \
--item ddoc_3f9 --type document --view on --download off
# 4. Mint the group link
papermark links create --dataroom dr_K8mN2pQr --group "$GID" \
--name "Investor access"groups list / get
papermark datarooms groups list <id> [--limit <n>] [--cursor <id>]
papermark datarooms groups get <id> <gid>list shows each group with its member count, link count, domain
rules, and allow_all flag.
groups create / update
papermark datarooms groups create <id> --name <name> [--domains <d1,d2>] [--allow-all]
papermark datarooms groups update <id> <gid> [--name <name>] [--domains <d1,d2>] [--allow-all on|off]| Flag | Default | Effect |
|---|---|---|
-n, --name <name> | required on create | Group name |
--domains <domains> | none | Comma-separated email domains treated as members (acme.com admits jane@acme.com). On update, replaces the current list; empty string clears it |
--allow-all / --allow-all on|off | off | Skip the membership check: anyone passing the link's other access gates counts as a member |
groups delete
papermark datarooms groups delete <id> <gid>Deletes the group, its memberships, its permissions, and every share link pointing at it. Active group links stop resolving immediately. This matches the dashboard and cannot be undone.
groups members
papermark datarooms groups members list <id> <gid> [--limit <n>] [--cursor <id>]
papermark datarooms groups members add <id> <gid> -e <email1,email2,...>
papermark datarooms groups members remove <id> <gid> <memberId>add takes up to 500 comma-separated emails, is idempotent, and
sends no invitation emails; members simply gain access the next
time they open a group link. remove takes the membership id from
members list (not the email). Viewers admitted via --domains or
--allow-all are not listed as members.
groups permissions
papermark datarooms groups permissions get <id> <gid> [--limit <n>] [--cursor <id>]
papermark datarooms groups permissions set <id> <gid> (--file <path> | --item <itemId> --type <document|folder> [--view on|off] [--download on|off])Per-item access controls. Items without an entry are invisible to the group's viewers.
set uses delta semantics, matching the dashboard: entries you send
are upserted, entries you omit keep their current state, and ancestor
folders of anything made visible are shown automatically so the tree
stays navigable.
| Flag | Default | Effect |
|---|---|---|
--file <path> | none | JSON array of {item_id, item_type, can_view, can_download} for bulk changes |
--item <itemId> | none | Single item: a dataroom-document id (from documents) or a dataroom folder id |
--type <document|folder> | none | Item type for --item |
--view <on|off> | on | Allow viewing |
--download <on|off> | off | Allow downloading (also needs --allow-download on the link) |
# Bulk: grant view on everything in a JSON manifest
papermark datarooms groups permissions set dr_K8mN2pQr grp_9a1 --file ./perms.json
# Hide one document from the group
papermark datarooms groups permissions set dr_K8mN2pQr grp_9a1 \
--item ddoc_3f9 --type document --view off --download offdelete
papermark datarooms delete <id>Deletes the dataroom. Deletion cascades to every link and folder and is unrecoverable; documents stay in the team library.
Required scopes
| Operation | Scope |
|---|---|
list, get, documents, viewers | datarooms.read |
create, update, delete | datarooms.write |
links | datarooms.read + links.read |
stats | datarooms.read + analytics.read |
attach | datarooms.write + documents.read |
move, detach | datarooms.write |
groups list/get, groups members list, groups permissions get | datarooms.read |
groups create/update/delete, groups members add/remove, groups permissions set | datarooms.write |
Related
- Guide: Create a dataroom with documents: the worked end-to-end recipe
- Guide: Share a dataroom with an investor group: groups, permissions, and group links end to end
links create --dataroom: mint a dataroom-bound share linklinks permissions: per-link file permissions without a group- MCP: Datarooms tools: the same surface for agent-driven workflows