PapermarkDocs

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 B

list

papermark datarooms list [--limit <n>] [--cursor <id>] [--query <substring>]
FlagDefaultEffect
-l, --limit <n>25Page size, 1–100
-c, --cursor <id>noneContinuation cursor from a previous response's meta.next_cursor
-q, --query <substring>noneFilter by name substring
--jsonauto when pipedMachine-readable output
$ papermark datarooms list
ID                  NAME                       UPDATED
dr_K8mN2pQr         Acme Series B              2 days ago
dr_aBc456           Brand-X DD                 1 month ago

get

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>]
FlagDefaultEffect
-n, --name <name>requiredDisplay name shown to viewers
--internal-name <slug>autoInternal slug for the dashboard URL; lowercase, hyphenated
-d, --description <text>noneFree-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.

FlagEffect
--conversations on|offEnable in-dataroom conversations between you and viewers
--agents on|offEnable AI agents that can answer viewer questions about the documents
--bulk-download on|offAllow viewers to download every document as a zip
# Open up bulk download for the partner round
papermark datarooms update dr_K8mN2pQr --bulk-download on
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.

FlagEffect
--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 ago

stats

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.

FlagDefaultEffect
--since <unix-ms>dataroom creationLower bound, Unix timestamp in milliseconds
--until <unix-ms>nowUpper 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.

FlagEffect
--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"
done

The 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> --root

Moves a document to a different folder within the dataroom, keyed by its dataroom-document id (ddId).

FlagEffect
--folder-id <fid>Move into the folder fid
--rootMove to the dataroom root (alias for --folder-id root)
--folder-id "" / --folder-id rootAlso 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_3f9

groups

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]
FlagDefaultEffect
-n, --name <name>required on createGroup name
--domains <domains>noneComma-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|offoffSkip 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.

FlagDefaultEffect
--file <path>noneJSON array of {item_id, item_type, can_view, can_download} for bulk changes
--item <itemId>noneSingle item: a dataroom-document id (from documents) or a dataroom folder id
--type <document|folder>noneItem type for --item
--view <on|off>onAllow viewing
--download <on|off>offAllow 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 off

delete

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

OperationScope
list, get, documents, viewersdatarooms.read
create, update, deletedatarooms.write
linksdatarooms.read + links.read
statsdatarooms.read + analytics.read
attachdatarooms.write + documents.read
move, detachdatarooms.write
groups list/get, groups members list, groups permissions getdatarooms.read
groups create/update/delete, groups members add/remove, groups permissions setdatarooms.write

On this page