Command reference
All 154 commands in pdcli v0.22.0. Every command also
accepts the global flags --output, --jq, --fields, --resolve-fields, --profile, --no-color, --verbose, --no-retry, --timeout, and --limit.
Run pdcli <command> --help for the live version.
Top-level commands
Section titled “Top-level commands”pdcli api
Section titled “pdcli api”Make a raw API request (host-locked to your Pipedrive company domain)
pdcli api <method> <path> [flags]| Flag | Description |
| --- | --- |
| --body <value> | Request body (JSON string, @file, or pipe stdin) |
| --paginate | Follow pagination and collect every page into one array (GET only; pager inferred from the /api/v1/ or /api/v2/ path). Note: —jq then sees the bare concatenated item array (filter with .[]), whereas without —paginate it sees the full envelope (.data[]). |
pdcli api GET /api/v2/dealspdcli api GET /api/v1/currenciespdcli api POST /api/v2/deals --body '{"title":"New deal"}'pdcli api DELETE /api/v1/webhooks/1pdcli audit
Section titled “pdcli audit”Data-quality audit: stale deals, missing fields, duplicates, overdue pileups
pdcli audit [flags]| Flag | Description |
| --- | --- |
| --checks <value> | Comma-separated subset of checks (stale-deals, no-next-activity, past-close-date, missing-fields, ancient-deals, missing-close-time, duplicate-persons, uncontactable-persons, duplicate-orgs, overdue-activities, currency-missing) |
| --strict | Exit 1 when any must-severity check has findings |
pdcli auditpdcli audit --checks stale-deals,duplicate-persons --verbosepdcli audit --strict # exit 1 on must-severity findings (CI)pdcli backup
Section titled “pdcli backup”Export the whole account to a JSON tree (resumable, one file per resource)
pdcli backup [flags]| Flag | Description |
| --- | --- |
| --dir <value> | Target directory for the export |
| --resume | Skip resources already completed in a previous run |
pdcli backuppdcli backup --dir ./my-backuppdcli backup --dir ./my-backup --resumepdcli changes
Section titled “pdcli changes”Incremental change feed across deals/persons/orgs/activities/products. Self-advancing watermark: each run resumes where the last left off and advances it past the newest change only after a successful emit, so a failed run replays rather than skips (use —peek to read without advancing).
pdcli changes [flags]| Flag | Description |
| --- | --- |
| --since <value> | Start point: RFC3339 timestamp or Nd/Nm. Omit to resume from the stored watermark. |
| --peek | Read without advancing the stored watermark |
pdcli changes --since 7dpdcli changespdcli changes --peek --output jsonpdcli digest
Section titled “pdcli digest”Monday packet: one pipeline-scoped fetch fanned into velocity, health, coverage, funnel, forecast and hygiene. —deep adds changelog-mined aging/slippage/stage-skips; —format md|html (+ —out) writes a shareable artifact for cron → Slack/email.
pdcli digest [flags]| Flag | Description |
| --- | --- |
| --pipeline <value> | Pipeline ID (required when the account has several) |
| --period <value> | Trailing window for closed deals / the goal (Nd or Nm) |
| --target <value> | Manual revenue quota override (skips the Goals API) |
| --commit-threshold <value> | Min effective win-probability (%) counted toward commit |
| --deep | Mine each deal’s changelog to add aging/slippage/stage-skips (one request per deal; warns over 100) |
| --format <md|html> | Render the packet as a shareable artifact |
| --out <value> | Write the —format artifact to this file instead of stdout |
pdcli digestpdcli digest --pipeline 1 --output jsonpdcli digest --deeppdcli digest --format md --out monday.mdpdcli doctor
Section titled “pdcli doctor”Run diagnostic checks on the CLI environment. Exits 78 (EX_CONFIG) when any check fails. —offline skips the network probe — the CI preflight mode.
pdcli doctor [flags]| Flag | Description |
| --- | --- |
| --offline | Skip the API reachability probe (CI preflight mode; zero network egress) |
pdcli doctorpdcli doctor --offlinepdcli doctor --output jsonpdcli funnel
Section titled “pdcli funnel”Stage-to-stage conversion approximated from closed deals (final stage reached)
pdcli funnel [flags]| Flag | Description |
| --- | --- |
| --period <value> | Trailing window for closed deals (Nd or Nm) |
| --pipeline <value> | Pipeline ID (required when the account has several) |
| --exact | Mine real stage transitions from each deal’s changelog instead of approximating from the final stage (one request per deal). —period scopes only closed (won/lost) deals; open deals are always included. |
pdcli funnelpdcli funnel --pipeline 1 --period 180dpdcli lookup
Section titled “pdcli lookup”Find item IDs by an exact field value — the create-vs-update primitive.
pdcli lookup <entity> [flags]| Flag | Description |
| --- | --- |
| --field <value> | Field name (built-in or custom) to search on |
| --value <value> | Value to match against the field |
| --match <exact|beginning|middle> | Match mode (case-sensitive) |
| --first | Return only the first match (a single object) |
pdcli lookup deal --field "PO Number" --value PO-1234pdcli lookup person --field Email --value a@b.com --first --jq .idpdcli lookup org --field Name --value Acme --match beginningpdcli quota
Section titled “pdcli quota”Show the remaining Pipedrive daily API token budget. Makes one cheap probe request purely to read the rate-limit headers. The budget is COMPANY-WIDE — shared across every integration and user on the account — so treat the reading as a hint, not a guarantee. —min / —threshold gate CI: they exit 75 (rate-limited) when the budget is too low.
pdcli quota [flags]| Flag | Description |
| --- | --- |
| --min <value> | Exit 75 if the remaining daily token budget is below this many tokens |
| --threshold <value> | Exit 75 if the remaining daily token budget is below this percentage |
pdcli quotapdcli quota --output jsonpdcli quota --min 5000pdcli quota --threshold 10pdcli search
Section titled “pdcli search”Search across deals, persons, organizations, products, leads, files, and projects
pdcli search <term> [flags]| Flag | Description |
| --- | --- |
| --item-types <value> | Comma-separated item types (deal,person,organization,product,lead,file,mail_attachment,project) |
| --exact | Exact match (allows 1-character terms) |
| --status <open|won|lost> | Filter by deal status (only with —item-types deal) |
| --person <value> | Filter by person ID (only with —item-types deal) |
| --org <value> | Filter by organization ID (only with —item-types deal) |
pdcli search "acme"pdcli search "acme" --item-types deal,person --output jsonpdcli search "acme" --item-types deal --status openpdcli version
Section titled “pdcli version”Show CLI version and environment info
pdcli version [flags]pdcli versionpdcli watch
Section titled “pdcli watch”Anomaly poller: run the hygiene checks and emit only findings that are NEW since the last run, advancing a per-profile state. Exits 8 when new findings arm the gate (default: must-severity) so cron can branch — pdcli watch \|\| notify. —peek reads without advancing state.
pdcli watch [flags]| Flag | Description |
| --- | --- |
| --checks <value> | Comma-separated subset of checks (stale-deals, no-next-activity, past-close-date, missing-fields, ancient-deals, missing-close-time, duplicate-persons, uncontactable-persons, duplicate-orgs, overdue-activities, currency-missing) |
| --severity <must|should|all> | Which severities arm the exit-8 gate |
| --peek | Emit and gate without advancing the stored state |
pdcli watchpdcli watch --checks stale-deals,past-close-datepdcli watch --severity all --output jsonpdcli watch --peekpdcli activity
Section titled “pdcli activity”pdcli activity create
Section titled “pdcli activity create”Create an activity
pdcli activity create [flags]| Flag | Description |
| --- | --- |
| --subject <value> | Activity subject |
| --type <value> | Activity type |
| --due-date <value> | Due date (YYYY-MM-DD) |
| --due-time <value> | Due time (HH:MM) |
| --duration <value> | Duration (HH:MM) |
| --deal <value> | Linked deal ID |
| --person <value> | Linked person ID |
| --org <value> | Linked organization ID |
| --owner <value> | Owner (user) ID |
| --note <value> | Activity note |
| --done | Mark the activity as done |
| --field <value> | Custom/standard field as “Name=Value” (repeatable) |
| --body <value> | Raw JSON body to merge (flags win) |
pdcli activity create --subject "Demo call" --type call --due-date 2026-06-10pdcli activity create --subject "Follow up" --field "Outcome=Positive"pdcli activity create --subject "Raw" --body '{"priority":5}'pdcli activity delete
Section titled “pdcli activity delete”Delete an activity
pdcli activity delete <id> [flags]| Flag | Description |
| --- | --- |
| -y, --yes | Skip the confirmation prompt |
pdcli activity delete 9pdcli activity delete 9 --yespdcli activity get
Section titled “pdcli activity get”Get an activity by ID
pdcli activity get <id> [flags]pdcli activity get 9pdcli activity get 9 --output jsonpdcli activity list
Section titled “pdcli activity list”List activities
pdcli activity list [flags]| Flag | Description |
| --- | --- |
| --owner <value> | Filter by owner (user) ID |
| --deal <value> | Filter by deal ID |
| --person <value> | Filter by person ID |
| --org <value> | Filter by organization ID |
| --type <value> | Filter by activity type key (applied client-side) |
| --done | Only completed activities |
| --todo | Only open (not done) activities |
| --filter <value> | Filter by saved filter ID |
| --ids <value> | Comma-separated IDs to fetch (max 100) |
| --sort-by <id|update_time|add_time|due_date> | Sort field |
| --sort-direction <asc|desc> | Sort direction |
| --updated-since <value> | Only items updated at/after this RFC3339 time (no fractional seconds) |
| --updated-until <value> | Only items updated before this RFC3339 time (no fractional seconds) |
pdcli activity listpdcli activity list --todo --deal 42pdcli activity list --type call --output jsonpdcli activity type list
Section titled “pdcli activity type list”List activity types. The Key (key_string) is what activity --type takes.
pdcli activity type list [flags]pdcli activity type listpdcli activity type list --output jsonpdcli activity update
Section titled “pdcli activity update”Update an activity (v2 PATCH — only provided fields change)
pdcli activity update <id> [flags]| Flag | Description |
| --- | --- |
| --subject <value> | Activity subject |
| --type <value> | Activity type |
| --due-date <value> | Due date (YYYY-MM-DD) |
| --due-time <value> | Due time (HH:MM) |
| --duration <value> | Duration (HH:MM) |
| --deal <value> | Linked deal ID |
| --person <value> | Linked person ID |
| --org <value> | Linked organization ID |
| --owner <value> | Owner (user) ID |
| --note <value> | Activity note |
| --done | Mark the activity as done |
| --undone | Mark the activity as not done |
| --field <value> | Custom/standard field as “Name=Value” (repeatable) |
| --body <value> | Raw JSON body to merge (flags win) |
pdcli activity update 9 --subject "Renamed"pdcli activity update 9 --donepdcli activity update 9 --field "Outcome=Positive"pdcli alias
Section titled “pdcli alias”pdcli alias list
Section titled “pdcli alias list”List all configured aliases
pdcli alias list [flags]pdcli alias listpdcli alias set
Section titled “pdcli alias set”Create or update an alias
pdcli alias set <name> <command> [flags]pdcli alias set wd "deal list --status won"pdcli alias set open "deal list --status open --limit 50"pdcli alias unset
Section titled “pdcli alias unset”Remove an alias
pdcli alias unset <name> [flags]pdcli alias unset wdpdcli audit
Section titled “pdcli audit”pdcli audit stage-skips
Section titled “pdcli audit stage-skips”Stage-skip & sandbagging audit: deals that jumped gates or were pulled backward, mined from each deal’s changelog (one request per deal)
pdcli audit stage-skips [flags]| Flag | Description |
| --- | --- |
| --pipeline <value> | Pipeline ID (required when the account has several) |
pdcli audit stage-skipspdcli audit stage-skips --pipeline 1 --output jsonpdcli auth
Section titled “pdcli auth”pdcli auth login
Section titled “pdcli auth login”Authenticate with Pipedrive (personal API token, or OAuth with —oauth)
pdcli auth login [flags]| Flag | Description |
| --- | --- |
| --company <value> | Company domain (“acme” from acme.pipedrive.com — full URL accepted) |
| --api-token <value> | Personal API token (app.pipedrive.com/settings/api). Prefer the prompt or env so the token stays out of shell history |
| --oauth | Use OAuth 2.0 via your own Developer Hub app (browser flow) |
| --client-id <value> | OAuth app client ID (—oauth; env PDCLI_CLIENT_ID) |
| --client-secret <value> | OAuth app client secret (—oauth; env PDCLI_CLIENT_SECRET) |
| --port <value> | OAuth callback port — must match the app’s registered callback URL (—oauth) |
pdcli auth loginpdcli auth login --company acme --api-token <token>pdcli auth login --oauthpdcli auth login --oauth --client-id <id> --client-secret <secret>pdcli auth logout
Section titled “pdcli auth logout”Log out and remove the stored API token
pdcli auth logout [flags]pdcli auth logoutpdcli auth status
Section titled “pdcli auth status”Show current authentication status
pdcli auth status [flags]pdcli auth statuspdcli backup
Section titled “pdcli backup”pdcli backup diff
Section titled “pdcli backup diff”Field-level diff between two backup snapshots — added/removed/modified records and per-field changes, computed locally with no API calls
pdcli backup diff <a> <b> [flags]| Flag | Description |
| --- | --- |
| --raw | Do not resolve custom-field names/option labels (show raw hash keys/ids) |
pdcli backup diff ./backup-mon ./backup-tuepdcli backup diff ./old ./new --output jsonpdcli backup diff ./old ./new --rawpdcli config
Section titled “pdcli config”pdcli config get
Section titled “pdcli config get”Get a config value for the active profile
pdcli config get <key> [flags]pdcli config get company_domainpdcli config get default_outputpdcli config list
Section titled “pdcli config list”List all config for the active profile
pdcli config list [flags]pdcli config listpdcli config set
Section titled “pdcli config set”Set a config value for the active profile
pdcli config set <key> <value> [flags]pdcli config set company_domain acmepdcli config set default_output jsonpdcli config unset
Section titled “pdcli config unset”Remove a config key from the active profile
pdcli config unset <key> [flags]pdcli config unset default_outputpdcli deal
Section titled “pdcli deal”pdcli deal bulk-update
Section titled “pdcli deal bulk-update”Update many deals at once (by —ids, a saved —filter, or ids piped on stdin)
pdcli deal bulk-update [flags]| Flag | Description |
| --- | --- |
| --ids <value> | Comma-separated deal IDs |
| --filter <value> | Pipedrive saved filter ID to select deals |
| --stage <value> | Move to stage ID |
| --pipeline <value> | Move to pipeline ID |
| --status <open|won|lost> | Set status |
| --owner <value> | Assign owner (user) ID |
| --field <value> | Custom/standard field as “Name=Value” (repeatable) |
| --body <value> | Raw JSON body to merge (flags win) |
| --dry-run | List the targets without updating anything |
| -y, --yes | Skip the confirmation prompt |
pdcli deal bulk-update --ids 1,2,3 --stage 5pdcli deal bulk-update --filter 9 --status wonpdcli deal list --status open --jq '.[].id' | pdcli deal bulk-update --owner 42pdcli deal bulk-update --filter 9 --stage 5 --dry-runpdcli deal context
Section titled “pdcli deal context”One-call denormalized deal bundle — deal + person + org + activities + notes + products + participants, custom fields resolved to names and risk flags derived. Prompt-ready for agents (the joins v2 will not do).
pdcli deal context <id> [flags]| Flag | Description |
| --- | --- |
| --no-activities | Skip the activities slice |
| --no-notes | Skip the notes slice |
| --no-products | Skip the products slice |
| --no-participants | Skip the participants slice |
| --mail | Include a mail summary (off by default; needs the mail:read scope and email sync) |
| --mail-limit <value> | Max mail messages to scan for the summary |
| --activity-limit <value> | Max activities to include |
| --note-limit <value> | Max notes to include |
pdcli deal context 42pdcli deal context 42 --no-notes --no-productspdcli deal context 42 --output jsonpdcli deal convert
Section titled “pdcli deal convert”Convert a deal to a lead. The conversion runs as an async job; use —wait to poll until it finishes. WARNING: on success the source deal is deleted.
pdcli deal convert <id> [flags]| Flag | Description |
| --- | --- |
| --wait | Poll the conversion status until it finishes |
| --timeout-secs <value> | Max seconds to poll when —wait is set |
| -y, --yes | Skip the confirmation prompt |
pdcli deal convert 42pdcli deal convert 42 --yespdcli deal convert 42 --waitpdcli deal create
Section titled “pdcli deal create”Create a deal
pdcli deal create [flags]| Flag | Description |
| --- | --- |
| --title <value> | Deal title |
| --value <value> | Deal value |
| --currency <value> | Deal currency (e.g. EUR) |
| --status <open|won|lost> | Deal status |
| --stage <value> | Stage ID |
| --pipeline <value> | Pipeline ID |
| --person <value> | Linked person ID |
| --org <value> | Linked organization ID |
| --owner <value> | Owner (user) ID |
| --probability <value> | Success probability (0-100) |
| --expected-close-date <value> | Expected close date (YYYY-MM-DD) |
| --field <value> | Custom/standard field as “Name=Value” (repeatable) |
| --body <value> | Raw JSON body to merge (flags win) |
pdcli deal create --title "Acme renewal" --value 5000 --currency EURpdcli deal create --title "Sized" --field "Deal Size=Large"pdcli deal create --title "Raw" --body '{"probability":75}'pdcli deal delete
Section titled “pdcli deal delete”Delete a deal
pdcli deal delete <id> [flags]| Flag | Description |
| --- | --- |
| -y, --yes | Skip the confirmation prompt |
pdcli deal delete 42pdcli deal delete 42 --yespdcli deal follower add
Section titled “pdcli deal follower add”Add a follower (user) to a deal
pdcli deal follower add <id> [flags]| Flag | Description |
| --- | --- |
| --user <value> | User ID |
pdcli deal follower add 42 --user 5pdcli deal follower add 42 --user 5 --output jsonpdcli deal follower list
Section titled “pdcli deal follower list”List followers of a deal
pdcli deal follower list <id> [flags]pdcli deal follower list 42pdcli deal follower list 42 --output jsonpdcli deal follower remove
Section titled “pdcli deal follower remove”Remove a follower from a deal
pdcli deal follower remove <id> [flags]| Flag | Description |
| --- | --- |
| --user <value> | User ID |
| -y, --yes | Skip the confirmation prompt |
pdcli deal follower remove 42 --user 5pdcli deal follower remove 42 --user 5 --yespdcli deal get
Section titled “pdcli deal get”Get a deal by ID
pdcli deal get <id> [flags]pdcli deal get 42pdcli deal get 42 --output jsonpdcli deal history
Section titled “pdcli deal history”Field-change history for a deal, newest-first (the API’s native order)
pdcli deal history <id> [flags]| Flag | Description |
| --- | --- |
| --field <value> | Show only changes to this field key (e.g. stage_id) |
pdcli deal history 42pdcli deal history 42 --field stage_idpdcli deal history 42 --limit 20 --resolve-fieldspdcli deal list
Section titled “pdcli deal list”List deals
pdcli deal list [flags]| Flag | Description |
| --- | --- |
| --archived | List archived deals instead of active ones |
| --status <open|won|lost|deleted> | Filter by status |
| --stage <value> | Filter by stage ID |
| --pipeline <value> | Filter by pipeline ID |
| --owner <value> | Filter by owner (user) ID |
| --person <value> | Filter by person ID |
| --org <value> | Filter by organization ID |
| --filter <value> | Filter by saved filter ID |
| --ids <value> | Comma-separated IDs to fetch (max 100) |
| --sort-by <id|update_time|add_time> | Sort field |
| --sort-direction <asc|desc> | Sort direction |
| --updated-since <value> | Only items updated at/after this RFC3339 time (no fractional seconds) |
| --updated-until <value> | Only items updated before this RFC3339 time (no fractional seconds) |
pdcli deal listpdcli deal list --status won --limit 50pdcli deal list --stage 3 --output jsonpdcli deal participant add
Section titled “pdcli deal participant add”Add a participant (person) to a deal
pdcli deal participant add <id> [flags]| Flag | Description |
| --- | --- |
| --person <value> | Person ID |
pdcli deal participant add 42 --person 10pdcli deal participant add 42 --person 10 --output jsonpdcli deal participant list
Section titled “pdcli deal participant list”List participants of a deal
pdcli deal participant list <id> [flags]pdcli deal participant list 42pdcli deal participant list 42 --output jsonpdcli deal participant remove
Section titled “pdcli deal participant remove”Remove a participant from a deal
pdcli deal participant remove <id> [flags]| Flag | Description |
| --- | --- |
| --participant <value> | Deal-participant ID |
| -y, --yes | Skip the confirmation prompt |
pdcli deal participant remove 42 --participant 3pdcli deal participant remove 42 --participant 3 --yespdcli deal product add
Section titled “pdcli deal product add”Attach a product to a deal
pdcli deal product add <id> [flags]| Flag | Description |
| --- | --- |
| --product <value> | Product ID |
| --price <value> | Item price (per unit) |
| --quantity <value> | Quantity |
| --discount <value> | Discount value |
| --discount-type <percentage|amount> | Discount type |
| --tax <value> | Product tax percentage |
| --comments <value> | Comments |
pdcli deal product add 42 --product 10 --price 90pdcli deal product add 42 --product 10 --price 90 --quantity 3pdcli deal product add 42 --product 10 --price 90 --discount 10 --discount-type percentagepdcli deal product list
Section titled “pdcli deal product list”List products attached to a deal
pdcli deal product list <id> [flags]| Flag | Description |
| --- | --- |
| --sort-by <id|add_time|update_time|order_nr> | Field to sort by |
| --sort-direction <asc|desc> | Sort direction |
pdcli deal product list 42pdcli deal product list 42 --sort-by add_time --sort-direction descpdcli deal product list 42 --output jsonpdcli deal product remove
Section titled “pdcli deal product remove”Remove a product attached to a deal
pdcli deal product remove <id> [flags]| Flag | Description |
| --- | --- |
| --attachment <value> | Deal-product (attachment) ID |
| -y, --yes | Skip the confirmation prompt |
pdcli deal product remove 42 --attachment 3pdcli deal product remove 42 --attachment 3 --yespdcli deal product update
Section titled “pdcli deal product update”Update a product attached to a deal (v2 PATCH — only provided fields change)
pdcli deal product update <id> [flags]| Flag | Description |
| --- | --- |
| --attachment <value> | Deal-product (attachment) ID |
| --product <value> | Product ID |
| --price <value> | Item price (per unit) |
| --quantity <value> | Quantity |
| --discount <value> | Discount value |
| --discount-type <percentage|amount> | Discount type |
| --tax <value> | Product tax percentage |
| --comments <value> | Comments |
pdcli deal product update 42 --attachment 3 --quantity 5pdcli deal product update 42 --attachment 3 --price 120pdcli deal product update 42 --attachment 3 --discount 15 --discount-type amountpdcli deal summary
Section titled “pdcli deal summary”Summary of open/won/lost deals, totalled per currency
pdcli deal summary [flags]| Flag | Description |
| --- | --- |
| --status <open|won|lost> | Filter by status |
| --pipeline <value> | Filter by pipeline ID |
| --stage <value> | Filter by stage ID |
| --filter <value> | Filter by saved filter ID |
pdcli deal summarypdcli deal summary --status open --pipeline 1pdcli deal summary --output jsonpdcli deal update
Section titled “pdcli deal update”Update a deal (v2 PATCH — only provided fields change)
pdcli deal update <id> [flags]| Flag | Description |
| --- | --- |
| --title <value> | Deal title |
| --value <value> | Deal value |
| --currency <value> | Deal currency (e.g. EUR) |
| --status <open|won|lost> | Deal status |
| --stage <value> | Stage ID |
| --pipeline <value> | Pipeline ID |
| --person <value> | Linked person ID |
| --org <value> | Linked organization ID |
| --owner <value> | Owner (user) ID |
| --probability <value> | Success probability (0-100) |
| --expected-close-date <value> | Expected close date (YYYY-MM-DD) |
| --field <value> | Custom/standard field as “Name=Value” (repeatable) |
| --body <value> | Raw JSON body to merge (flags win) |
pdcli deal update 42 --stage 5pdcli deal update 42 --status wonpdcli deal update 42 --field "Deal Size=Large"pdcli deal upsert
Section titled “pdcli deal upsert”Idempotent deal upsert: match by —by, then create or PATCH only the changed fields. Refuses (exit 65) if more than one record matches.
pdcli deal upsert <value> [flags]| Flag | Description |
| --- | --- |
| --by <value> | Match field: title, or a searchable custom field |
| --field <value> | Field to set as “Name=Value” (repeatable) |
| --body <value> | Raw JSON body to merge |
| --dry-run | Preview the action without writing |
pdcli deal upsert "Acme expansion" --by title --field "Stage=Won"pdcli deal upsert "D-42" --by "External ID" --body '{"value":5000}'pdcli deal upsert "Acme expansion" --by title --field "Stage=Won" --dry-runpdcli field
Section titled “pdcli field”pdcli field create
Section titled “pdcli field create”Create a custom field on an entity
pdcli field create <entity> [flags]| Flag | Description |
| --- | --- |
| --name <value> | Field name (label) |
| --type <value> | Field type (e.g. varchar, double, monetary, enum, set) |
| --options <value> | Comma-separated option labels (required for enum/set) |
pdcli field create deal --name "Budget" --type doublepdcli field create person --name "Tier" --type enum --options "Gold,Silver,Bronze"pdcli field delete
Section titled “pdcli field delete”Delete a custom field (data stored on records is lost)
pdcli field delete <entity> <field> [flags]| Flag | Description |
| --- | --- |
| -y, --yes | Skip the confirmation prompt |
pdcli field delete deal dcf558aac1ae4e8c4f849ba5e668430d8df9be12pdcli field delete deal dcf558aac1ae4e8c4f849ba5e668430d8df9be12 --yespdcli field get
Section titled “pdcli field get”Show one field by human name or hashed key
pdcli field get <entity> <field> [flags]pdcli field get deal "Deal Size"pdcli field get deal dcf558aac1ae4e8c4f849ba5e668430d8df9be12pdcli field list
Section titled “pdcli field list”List fields for an entity, including custom-field hash keys
pdcli field list <entity> [flags]pdcli field list dealpdcli field list person --output jsonpdcli field option add
Section titled “pdcli field option add”Add an option to an enum/set custom field
pdcli field option add <entity> <field> [flags]| Flag | Description |
| --- | --- |
| --label <value> | Label for the new option |
pdcli field option add deal dcf558aac1ae4e8c4f849ba5e668430d8df9be12 --label "Critical"pdcli field option remove
Section titled “pdcli field option remove”Remove an option from an enum/set custom field (records lose the value)
pdcli field option remove <entity> <field> [flags]| Flag | Description |
| --- | --- |
| --option <value> | Option ID to remove (see field get) |
| -y, --yes | Skip the confirmation prompt |
pdcli field option remove deal dcf558aac1ae4e8c4f849ba5e668430d8df9be12 --option 4pdcli field update
Section titled “pdcli field update”Update a custom field (field_code and field_type cannot change)
pdcli field update <entity> <field> [flags]| Flag | Description |
| --- | --- |
| --name <value> | New field name (label) |
pdcli field update deal dcf558aac1ae4e8c4f849ba5e668430d8df9be12 --name "New name"pdcli file
Section titled “pdcli file”pdcli file delete
Section titled “pdcli file delete”Delete a file
pdcli file delete <id> [flags]| Flag | Description |
| --- | --- |
| -y, --yes | Skip the confirmation prompt |
pdcli file delete 5pdcli file delete 5 --yespdcli file download
Section titled “pdcli file download”Download a file by ID
pdcli file download <id> [flags]| Flag | Description |
| --- | --- |
| --out <value> | Path to write to (default: file name) |
pdcli file download 5pdcli file download 5 --out ./report.pdfpdcli file get
Section titled “pdcli file get”Get a file by ID
pdcli file get <id> [flags]pdcli file get 5pdcli file get 5 --output jsonpdcli file list
Section titled “pdcli file list”List files
pdcli file list [flags]pdcli file listpdcli file list --limit 50 --output jsonpdcli file remote-link
Section titled “pdcli file remote-link”Link an existing remote file (Google Drive) to an item
pdcli file remote-link [flags]| Flag | Description |
| --- | --- |
| --deal <value> | Link to a deal ID |
| --org <value> | Link to an organization ID |
| --person <value> | Link to a person ID |
| --remote-id <value> | ID of the remote file (e.g. Google Drive file ID) |
| --remote-location <googledrive> | Remote storage location |
pdcli file remote-link --deal 42 --remote-id 1AbCpdcli file remote-link --person 9 --remote-id 1AbC --output jsonpdcli file update
Section titled “pdcli file update”Update a file name and/or description
pdcli file update <id> [flags]| Flag | Description |
| --- | --- |
| --name <value> | The visible name of the file |
| --description <value> | The description of the file |
pdcli file update 5 --name report.pdfpdcli file update 5 --description "Signed contract"pdcli file upload
Section titled “pdcli file upload”Upload a file
pdcli file upload <path> [flags]| Flag | Description |
| --- | --- |
| --deal <value> | Associate with a deal ID |
| --person <value> | Associate with a person ID |
| --org <value> | Associate with an organization ID |
pdcli file upload ./report.pdfpdcli file upload ./report.pdf --deal 42pdcli filter
Section titled “pdcli filter”pdcli filter create
Section titled “pdcli filter create”Create a filter
pdcli filter create [flags]| Flag | Description |
| --- | --- |
| --name <value> | Filter name |
| --type <deals|leads|org|people|products|activity|projects> | Filter type |
| --conditions <value> | Conditions JSON (a value, @file, or piped stdin). Fields are referenced by numeric field_id — run pdcli filter helpers for the valid operators. The blob needs the two-level glue structure {“glue”:“and”,“conditions”:[{“glue”:“and”,…},{“glue”:“or”,…}]}. |
pdcli filter create --name "Open deals" --type deals --conditions @conditions.jsoncat conditions.json | pdcli filter create --name "Open deals" --type dealspdcli filter delete
Section titled “pdcli filter delete”Delete a filter
pdcli filter delete <id> [flags]| Flag | Description |
| --- | --- |
| -y, --yes | Skip the confirmation prompt |
pdcli filter delete 5pdcli filter delete 5 --yespdcli filter export
Section titled “pdcli filter export”Export a filter (or all filters) as portable {name, type, conditions} JSON. To recreate it, feed the fields to filter create separately (the create command takes —name/—type/—conditions, not one blob).
pdcli filter export [id] [flags]| Flag | Description |
| --- | --- |
| --all | Export every filter |
pdcli filter export 5 > filter.jsonpdcli filter export --all > filters.json# recreate on another account (conditions reference numeric field_id):pdcli filter create --name "$(jq -r .name filter.json)" --type "$(jq -r .type filter.json)" --conditions "$(jq -c .conditions filter.json)"pdcli filter get
Section titled “pdcli filter get”Get a filter by ID
pdcli filter get <id> [flags]pdcli filter get 5pdcli filter get 5 --output jsonpdcli filter helpers
Section titled “pdcli filter helpers”List the operators available for authoring filter conditions
pdcli filter helpers [flags]| Flag | Description |
| --- | --- |
| --type <value> | Only show operators for this field data type (e.g. varchar, date, int) |
pdcli filter helperspdcli filter helpers --type varcharpdcli filter helpers --output jsonpdcli filter list
Section titled “pdcli filter list”List filters
pdcli filter list [flags]| Flag | Description |
| --- | --- |
| --type <deals|leads|org|people|products|activity|projects> | Filter by type |
pdcli filter listpdcli filter list --type deals --output jsonpdcli filter update
Section titled “pdcli filter update”Update a filter (only provided fields change)
pdcli filter update <id> [flags]| Flag | Description |
| --- | --- |
| --name <value> | Filter name |
| --conditions <value> | Conditions JSON (a value or @file). Fields are referenced by numeric field_id — run pdcli filter helpers for the valid operators. |
pdcli filter update 5 --name "Renamed filter"pdcli filter update 5 --conditions @conditions.jsonpdcli goal
Section titled “pdcli goal”pdcli goal list
Section titled “pdcli goal list”List goals
pdcli goal list [flags]| Flag | Description |
| --- | --- |
| --assignee <value> | Filter by assignee (user) ID |
| --type <value> | Filter by goal type name |
pdcli goal listpdcli goal list --assignee 7 --type deals_won --output jsonpdcli lead
Section titled “pdcli lead”pdcli lead convert
Section titled “pdcli lead convert”Convert a lead to a deal. The conversion runs as an async job; use —wait to poll until it finishes. On success the lead is deleted.
pdcli lead convert <id> [flags]| Flag | Description |
| --- | --- |
| --stage <value> | Stage ID for the new deal (a pipeline is inferred from it) |
| --pipeline <value> | Pipeline ID for the new deal (ignored when —stage is set) |
| --wait | Poll the conversion status until it finishes |
| --timeout-secs <value> | Max seconds to poll when —wait is set |
pdcli lead convert adf21080-0e10-11eb-879b-05d71fb426ecpdcli lead convert adf21080-0e10-11eb-879b-05d71fb426ec --stage 7pdcli lead convert adf21080-0e10-11eb-879b-05d71fb426ec --waitpdcli lead create
Section titled “pdcli lead create”Create a lead
pdcli lead create [flags]| Flag | Description |
| --- | --- |
| --title <value> | Lead title |
| --person <value> | Linked person ID |
| --org <value> | Linked organization ID |
| --owner <value> | Owner (user) ID |
| --value <value> | Lead value amount (requires —currency) |
| --currency <value> | Lead value currency (requires —value) |
| --expected-close-date <value> | Expected close date (YYYY-MM-DD) |
| --body <value> | Raw JSON body to merge (flags win) |
pdcli lead create --title "Acme renewal" --value 5000 --currency EURpdcli lead create --title "Linked" --person 4 --org 5pdcli lead create --title "Raw" --body '{"visible_to":"3"}'pdcli lead delete
Section titled “pdcli lead delete”Delete a lead
pdcli lead delete <id> [flags]| Flag | Description |
| --- | --- |
| -y, --yes | Skip the confirmation prompt |
pdcli lead delete adf21080-0e10-11eb-879b-05d71fb426ecpdcli lead delete adf21080-0e10-11eb-879b-05d71fb426ec --yespdcli lead get
Section titled “pdcli lead get”Get a lead by ID
pdcli lead get <id> [flags]pdcli lead get adf21080-0e10-11eb-879b-05d71fb426ecpdcli lead get adf21080-0e10-11eb-879b-05d71fb426ec --output jsonpdcli lead label list
Section titled “pdcli lead label list”List lead labels
pdcli lead label list [flags]pdcli lead label listpdcli lead label list --output jsonpdcli lead list
Section titled “pdcli lead list”List leads
pdcli lead list [flags]| Flag | Description |
| --- | --- |
| --owner <value> | Filter by owner (user) ID |
| --person <value> | Filter by person ID |
| --org <value> | Filter by organization ID |
pdcli lead listpdcli lead list --owner 3 --output jsonpdcli lead update
Section titled “pdcli lead update”Update a lead (v1 PATCH — only provided fields change)
pdcli lead update <id> [flags]| Flag | Description |
| --- | --- |
| --title <value> | Lead title |
| --person <value> | Linked person ID |
| --org <value> | Linked organization ID |
| --owner <value> | Owner (user) ID |
| --value <value> | Lead value amount (requires —currency) |
| --currency <value> | Lead value currency (requires —value) |
| --expected-close-date <value> | Expected close date (YYYY-MM-DD) |
| --body <value> | Raw JSON body to merge (flags win) |
pdcli lead update adf21080-0e10-11eb-879b-05d71fb426ec --title "Renamed"pdcli lead update adf21080-0e10-11eb-879b-05d71fb426ec --value 7500 --currency USDpdcli mail
Section titled “pdcli mail”pdcli mail list
Section titled “pdcli mail list”List the synced email linked to a deal. Message bodies are excluded by design (privacy posture) — the 225-char snippet is the preview; each row carries has_body_flag and body_url so you can fetch a body yourself. Requires the mail:read scope and a configured email sync.
pdcli mail list [flags]| Flag | Description |
| --- | --- |
| --deal <value> | Deal ID to list mail for |
pdcli mail list --deal 42pdcli mail list --deal 42 --output jsonpdcli mcp
Section titled “pdcli mcp”pdcli mcp serve
Section titled “pdcli mcp serve”Run pdcli as a Model Context Protocol (MCP) server over stdio.
pdcli mcp serve [flags]| Flag | Description |
| --- | --- |
| --allow-writes | Expose mutating tools (create/update/delete/merge/bulk). Off by default — read-only. |
| --all-tools | Expose every command as a tool instead of the curated core set |
| --topics <value> | Comma-separated topics to expose (e.g. deal,person) instead of the curated set |
| --tool-timeout <value> | Seconds a tool call may run before its child process is terminated |
pdcli mcp servepdcli mcp serve --allow-writespdcli mcp serve --topics deal,person,orgpdcli mcp serve --all-tools --allow-writespdcli metrics
Section titled “pdcli metrics”pdcli metrics aging
Section titled “pdcli metrics aging”Deal aging: days-in-current-stage per open deal, bucketed, with a p90-dwell flag (mines each open deal’s changelog, one request per deal)
pdcli metrics aging [flags]| Flag | Description |
| --- | --- |
| --pipeline <value> | Pipeline ID (required when the account has several) |
| --buckets <value> | Comma-separated day thresholds; cohorts are 0-N1/N1-N2/…/last+ (lower bound inclusive, upper exclusive) |
pdcli metrics agingpdcli metrics aging --pipeline 1 --buckets 30,60,90pdcli metrics conversion-matrix
Section titled “pdcli metrics conversion-matrix”Stage-transition matrix: every stage move (incl. backward & re-entry) mined from per-deal changelogs, with Won/Lost terminal columns
pdcli metrics conversion-matrix [flags]| Flag | Description |
| --- | --- |
| --pipeline <value> | Pipeline ID (required when the account has several) |
pdcli metrics conversion-matrixpdcli metrics conversion-matrix --pipeline 1 --output jsonpdcli metrics coverage
Section titled “pdcli metrics coverage”Pipeline coverage: probability-weighted open pipeline vs the revenue still needed to hit quota
pdcli metrics coverage [flags]| Flag | Description |
| --- | --- |
| --pipeline <value> | Pipeline ID (required when the account has several) |
| --period <value> | Goal measurement window (Nd or Nm) |
| --target <value> | Manual revenue quota override (skips the Goals API entirely) |
| --currency <value> | Restrict the open pipeline to this currency code (required when the pipeline holds deals in more than one currency) |
pdcli metrics coveragepdcli metrics coverage --pipeline 1pdcli metrics coverage --target 250000pdcli metrics coverage --period 1m --output jsonpdcli metrics forecast
Section titled “pdcli metrics forecast”Time-phased forecast: open pipeline bucketed by close-month into commit / best-case / weighted views, segregated per currency
pdcli metrics forecast [flags]| Flag | Description |
| --- | --- |
| --pipeline <value> | Pipeline ID (required when the account has several) |
| --commit-threshold <value> | Min effective win-probability (%) for a deal to count toward commit |
pdcli metrics forecastpdcli metrics forecast --pipeline 1pdcli metrics forecast --commit-threshold 80 --output jsonpdcli metrics slippage
Section titled “pdcli metrics slippage”Close-date slippage: open deals whose expected close date keeps getting pushed out (mined per-deal changelog)
pdcli metrics slippage [flags]| Flag | Description |
| --- | --- |
| --pipeline <value> | Pipeline ID (required when the account has several) |
| --min-pushes <value> | Only show deals pushed forward at least this many times |
pdcli metrics slippagepdcli metrics slippage --pipeline 1pdcli metrics slippage --min-pushes 2 --output jsonpdcli metrics velocity
Section titled “pdcli metrics velocity”Sales Velocity Equation: (open × win rate × avg won value) / cycle days
pdcli metrics velocity [flags]| Flag | Description |
| --- | --- |
| --period <value> | Trailing window for closed deals (Nd or Nm) |
| --pipeline <value> | Restrict to a pipeline ID |
| --owner <value> | Restrict to an owner (user) ID |
pdcli metrics velocitypdcli metrics velocity --period 30d --pipeline 1pdcli note
Section titled “pdcli note”pdcli note comment add
Section titled “pdcli note comment add”Add a comment to a note
pdcli note comment add <noteId> [flags]| Flag | Description |
| --- | --- |
| --content <value> | Comment content |
pdcli note comment add 5 --content "Nice work"pdcli note comment add 5 --content "Reviewed" --output jsonpdcli note comment delete
Section titled “pdcli note comment delete”Delete a comment from a note
pdcli note comment delete <noteId> [flags]| Flag | Description |
| --- | --- |
| --comment <value> | Comment ID (UUID) |
| -y, --yes | Skip the confirmation prompt |
pdcli note comment delete 5 --comment <uuid>pdcli note comment delete 5 --comment <uuid> --yespdcli note comment list
Section titled “pdcli note comment list”List comments on a note
pdcli note comment list <noteId> [flags]pdcli note comment list 5pdcli note comment list 5 --output jsonpdcli note comment update
Section titled “pdcli note comment update”Update a comment on a note
pdcli note comment update <noteId> [flags]| Flag | Description |
| --- | --- |
| --comment <value> | Comment ID (UUID) |
| --content <value> | New comment content |
pdcli note comment update 5 --comment <uuid> --content "Edited"pdcli note create
Section titled “pdcli note create”Create a note
pdcli note create [flags]| Flag | Description |
| --- | --- |
| --content <value> | Note content |
| --deal <value> | Attach to deal ID |
| --person <value> | Attach to person ID |
| --org <value> | Attach to organization ID |
| --lead <value> | Attach to lead ID (UUID) |
| --body <value> | Raw JSON body to merge (flags win) |
pdcli note create --content "Called the lead"pdcli note create --content "Follow up" --deal 42pdcli note create --content "Pinned" --body '{"pinned_to_deal_flag":1}'pdcli note delete
Section titled “pdcli note delete”Delete a note
pdcli note delete <id> [flags]| Flag | Description |
| --- | --- |
| -y, --yes | Skip the confirmation prompt |
pdcli note delete 5pdcli note delete 5 --yespdcli note get
Section titled “pdcli note get”Get a note by ID
pdcli note get <id> [flags]pdcli note get 5pdcli note get 5 --output jsonpdcli note list
Section titled “pdcli note list”List notes
pdcli note list [flags]| Flag | Description |
| --- | --- |
| --deal <value> | Filter by deal ID |
| --person <value> | Filter by person ID |
| --org <value> | Filter by organization ID |
pdcli note listpdcli note list --deal 42 --output jsonpdcli note update
Section titled “pdcli note update”Update a note (only provided fields change)
pdcli note update <id> [flags]| Flag | Description |
| --- | --- |
| --content <value> | Note content |
| --body <value> | Raw JSON body to merge (flags win) |
pdcli note update 5 --content "Revised note"pdcli note update 5 --body '{"pinned_to_deal_flag":1}'pdcli org
Section titled “pdcli org”pdcli org create
Section titled “pdcli org create”Create an organization
pdcli org create [flags]| Flag | Description |
| --- | --- |
| --name <value> | Organization name |
| --owner <value> | Owner (user) ID |
| --field <value> | Custom/standard field as “Name=Value” (repeatable) |
| --body <value> | Raw JSON body to merge (flags win) |
pdcli org create --name "Acme Corp"pdcli org create --name "Tiered" --field "Tier=Gold"pdcli org create --name "Raw" --body '{"visible_to":3}'pdcli org delete
Section titled “pdcli org delete”Delete an organization
pdcli org delete <id> [flags]| Flag | Description |
| --- | --- |
| -y, --yes | Skip the confirmation prompt |
pdcli org delete 7pdcli org delete 7 --yespdcli org follower add
Section titled “pdcli org follower add”Add a follower (user) to an organization
pdcli org follower add <id> [flags]| Flag | Description |
| --- | --- |
| --user <value> | User ID |
pdcli org follower add 42 --user 5pdcli org follower add 42 --user 5 --output jsonpdcli org follower list
Section titled “pdcli org follower list”List followers of an organization
pdcli org follower list <id> [flags]pdcli org follower list 42pdcli org follower list 42 --output jsonpdcli org follower remove
Section titled “pdcli org follower remove”Remove a follower from an organization
pdcli org follower remove <id> [flags]| Flag | Description |
| --- | --- |
| --user <value> | User ID |
| -y, --yes | Skip the confirmation prompt |
pdcli org follower remove 42 --user 5pdcli org follower remove 42 --user 5 --yespdcli org get
Section titled “pdcli org get”Get an organization by ID
pdcli org get <id> [flags]pdcli org get 7pdcli org get 7 --output jsonpdcli org import
Section titled “pdcli org import”Bulk-create organizations from a CSV (headers map to fields, custom fields by name)
pdcli org import <file> [flags]| Flag | Description |
| --- | --- |
| --upsert | Match each row on —match-on, then create or update |
| --match-on <value> | Field to match rows on in —upsert mode (e.g. name) |
| --dry-run | Validate every row without creating anything |
| -y, --yes | Skip the confirmation prompt |
pdcli org import orgs.csvpdcli org import orgs.csv --dry-runpdcli org list
Section titled “pdcli org list”List organizations
pdcli org list [flags]| Flag | Description |
| --- | --- |
| --owner <value> | Filter by owner (user) ID |
| --filter <value> | Filter by saved filter ID |
| --ids <value> | Comma-separated IDs to fetch (max 100) |
| --sort-by <id|update_time|add_time> | Sort field |
| --sort-direction <asc|desc> | Sort direction |
| --updated-since <value> | Only items updated at/after this RFC3339 time (no fractional seconds) |
| --updated-until <value> | Only items updated before this RFC3339 time (no fractional seconds) |
pdcli org listpdcli org list --owner 3 --output jsonpdcli org merge
Section titled “pdcli org merge”Merge one organization into another. WARNING: the positional <id> is the LOSING record — Pipedrive deletes it. —into is the surviving record whose data wins on conflict. All related data (deals, activities, notes, files) is transferred to the survivor.
pdcli org merge <id> [flags]| Flag | Description |
| --- | --- |
| --into <value> | ID of the surviving organization to keep (the winner) |
| -y, --yes | Skip the confirmation prompt |
pdcli org merge 123 --into 456pdcli org merge 123 --into 456 --yespdcli org relationship add
Section titled “pdcli org relationship add”Create an organization relationship. For a parent relationship the —owner organization is the parent and —linked is the daughter.
pdcli org relationship add [flags]| Flag | Description |
| --- | --- |
| --type <parent|related> | Relationship type |
| --owner <value> | Owner organization ID (the parent for type parent) |
| --linked <value> | Linked organization ID (the daughter for type parent) |
pdcli org relationship add --type parent --owner 1481 --linked 1480pdcli org relationship add --type related --owner 1 --linked 2pdcli org relationship list
Section titled “pdcli org relationship list”List relationships for an organization
pdcli org relationship list [flags]| Flag | Description |
| --- | --- |
| --org <value> | Organization ID to list relationships for |
pdcli org relationship list --org 1481pdcli org relationship list --org 1481 --output jsonpdcli org relationship remove
Section titled “pdcli org relationship remove”Delete an organization relationship
pdcli org relationship remove <id> [flags]| Flag | Description |
| --- | --- |
| -y, --yes | Skip the confirmation prompt |
pdcli org relationship remove 7pdcli org relationship remove 7 --yespdcli org update
Section titled “pdcli org update”Update an organization (v2 PATCH — only provided fields change)
pdcli org update <id> [flags]| Flag | Description |
| --- | --- |
| --name <value> | Organization name |
| --owner <value> | Owner (user) ID |
| --field <value> | Custom/standard field as “Name=Value” (repeatable) |
| --body <value> | Raw JSON body to merge (flags win) |
pdcli org update 7 --name "Acme Inc"pdcli org update 7 --owner 9pdcli org update 7 --field "Tier=Gold"pdcli org upsert
Section titled “pdcli org upsert”Idempotent organization upsert: match by —by, then create or PATCH only the changed fields. Refuses (exit 65) if more than one record matches.
pdcli org upsert <value> [flags]| Flag | Description |
| --- | --- |
| --by <value> | Match field: name, or a searchable custom field |
| --field <value> | Field to set as “Name=Value” (repeatable) |
| --body <value> | Raw JSON body to merge |
| --dry-run | Preview the action without writing |
pdcli org upsert Acme --by name --field "Tier=Gold"pdcli org upsert "D-42" --by "External ID" --body '{"owner_id":42}'pdcli org upsert Acme --by name --field "Tier=Gold" --dry-runpdcli person
Section titled “pdcli person”pdcli person create
Section titled “pdcli person create”Create a person
pdcli person create [flags]| Flag | Description |
| --- | --- |
| --name <value> | Person name |
| --email <value> | Email address (repeatable; first is primary) |
| --phone <value> | Phone number (repeatable; first is primary) |
| --org <value> | Linked organization ID |
| --owner <value> | Owner (user) ID |
| --field <value> | Custom/standard field as “Name=Value” (repeatable) |
| --body <value> | Raw JSON body to merge (flags win) |
pdcli person create --name "Jane Doe" --email jane@acme.compdcli person create --name "Jane" --field "Segment=Enterprise"pdcli person create --name "Raw" --body '{"visible_to":"3"}'pdcli person delete
Section titled “pdcli person delete”Delete a person
pdcli person delete <id> [flags]| Flag | Description |
| --- | --- |
| -y, --yes | Skip the confirmation prompt |
pdcli person delete 42pdcli person delete 42 --yespdcli person follower add
Section titled “pdcli person follower add”Add a follower (user) to a person
pdcli person follower add <id> [flags]| Flag | Description |
| --- | --- |
| --user <value> | User ID |
pdcli person follower add 42 --user 5pdcli person follower add 42 --user 5 --output jsonpdcli person follower list
Section titled “pdcli person follower list”List followers of a person
pdcli person follower list <id> [flags]pdcli person follower list 42pdcli person follower list 42 --output jsonpdcli person follower remove
Section titled “pdcli person follower remove”Remove a follower from a person
pdcli person follower remove <id> [flags]| Flag | Description |
| --- | --- |
| --user <value> | User ID |
| -y, --yes | Skip the confirmation prompt |
pdcli person follower remove 42 --user 5pdcli person follower remove 42 --user 5 --yespdcli person get
Section titled “pdcli person get”Get a person by ID
pdcli person get <id> [flags]pdcli person get 5pdcli person get 5 --output jsonpdcli person import
Section titled “pdcli person import”Bulk-create persons from a CSV (headers map to fields, custom fields by name)
pdcli person import <file> [flags]| Flag | Description |
| --- | --- |
| --upsert | Match each row on —match-on, then create or update |
| --match-on <value> | Field to match rows on in —upsert mode (e.g. email) |
| --dry-run | Validate every row without creating anything |
| -y, --yes | Skip the confirmation prompt |
pdcli person import people.csvpdcli person import people.csv --dry-runpdcli person list
Section titled “pdcli person list”List persons (contacts)
pdcli person list [flags]| Flag | Description |
| --- | --- |
| --owner <value> | Filter by owner (user) ID |
| --org <value> | Filter by organization ID |
| --filter <value> | Filter by saved filter ID |
| --ids <value> | Comma-separated IDs to fetch (max 100) |
| --sort-by <id|update_time|add_time> | Sort field |
| --sort-direction <asc|desc> | Sort direction |
| --updated-since <value> | Only items updated at/after this RFC3339 time (no fractional seconds) |
| --updated-until <value> | Only items updated before this RFC3339 time (no fractional seconds) |
pdcli person listpdcli person list --org 7 --output jsonpdcli person merge
Section titled “pdcli person merge”Merge one person into another. WARNING: the positional <id> is the LOSING record — Pipedrive deletes it. —into is the surviving record whose data wins on conflict. All related data (deals, activities, notes, files) is transferred to the survivor.
pdcli person merge <id> [flags]| Flag | Description |
| --- | --- |
| --into <value> | ID of the surviving person to keep (the winner) |
| -y, --yes | Skip the confirmation prompt |
pdcli person merge 123 --into 456pdcli person merge 123 --into 456 --yespdcli person update
Section titled “pdcli person update”Update a person (v2 PATCH — only provided fields change)
pdcli person update <id> [flags]| Flag | Description |
| --- | --- |
| --name <value> | Person name |
| --email <value> | Email address (repeatable; first is primary) |
| --phone <value> | Phone number (repeatable; first is primary) |
| --org <value> | Linked organization ID |
| --owner <value> | Owner (user) ID |
| --field <value> | Custom/standard field as “Name=Value” (repeatable) |
| --body <value> | Raw JSON body to merge (flags win) |
pdcli person update 42 --name "New name"pdcli person update 42 --email new@acme.compdcli person update 42 --field "Segment=Enterprise"pdcli person upsert
Section titled “pdcli person upsert”Idempotent person upsert: match by —by, then create or PATCH only the changed fields. Refuses (exit 65) if more than one record matches.
pdcli person upsert <value> [flags]| Flag | Description |
| --- | --- |
| --by <value> | Match field: email, name, phone, or a searchable custom field |
| --field <value> | Field to set as “Name=Value” (repeatable) |
| --body <value> | Raw JSON body to merge |
| --dry-run | Preview the action without writing |
pdcli person upsert a@x.com --by email --field "Tier=Gold"pdcli person upsert "Jane Doe" --by name --body '{"owner_id":42}'pdcli person upsert a@x.com --by email --field "Tier=Gold" --dry-runpdcli pipeline
Section titled “pdcli pipeline”pdcli pipeline get
Section titled “pdcli pipeline get”Get a pipeline by ID
pdcli pipeline get <id> [flags]pdcli pipeline get 1pdcli pipeline get 1 --output jsonpdcli pipeline health
Section titled “pdcli pipeline health”Per-stage pipeline health: value, weighted value, stale deals, missing next steps
pdcli pipeline health [flags]| Flag | Description |
| --- | --- |
| --pipeline <value> | Pipeline ID (required when the account has several) |
pdcli pipeline healthpdcli pipeline health --pipeline 1pdcli pipeline list
Section titled “pdcli pipeline list”List pipelines
pdcli pipeline list [flags]pdcli pipeline listpdcli pipeline list --output jsonpdcli product
Section titled “pdcli product”pdcli product create
Section titled “pdcli product create”Create a product
pdcli product create [flags]| Flag | Description |
| --- | --- |
| --name <value> | Product name |
| --code <value> | Product code (SKU) |
| --unit <value> | Unit of measure |
| --description <value> | Product description |
| --owner <value> | Owner (user) ID |
| --price <value> | Unit price (requires —currency) |
| --currency <value> | Price currency (requires —price) |
| --field <value> | Custom/standard field as “Name=Value” (repeatable) |
| --body <value> | Raw JSON body to merge (flags win) |
pdcli product create --name "Widget" --code W-1 --price 9.99 --currency EURpdcli product create --name "Sized" --field "Material=Steel"pdcli product create --name "Raw" --body '{"tax":19}'pdcli product delete
Section titled “pdcli product delete”Delete a product
pdcli product delete <id> [flags]| Flag | Description |
| --- | --- |
| -y, --yes | Skip the confirmation prompt |
pdcli product delete 7pdcli product delete 7 --yespdcli product get
Section titled “pdcli product get”Get a product by ID
pdcli product get <id> [flags]pdcli product get 7pdcli product get 7 --output jsonpdcli product list
Section titled “pdcli product list”List products
pdcli product list [flags]| Flag | Description |
| --- | --- |
| --owner <value> | Filter by owner (user) ID |
| --filter <value> | Filter by saved filter ID |
| --ids <value> | Comma-separated IDs to fetch (max 100) |
| --sort-by <id|name|add_time|update_time> | Sort field |
| --sort-direction <asc|desc> | Sort direction |
| --updated-since <value> | Only items updated at/after this RFC3339 time (no fractional seconds) |
pdcli product listpdcli product list --owner 3 --output jsonpdcli product update
Section titled “pdcli product update”Update a product (v2 PATCH — only provided fields change)
pdcli product update <id> [flags]| Flag | Description |
| --- | --- |
| --name <value> | Product name |
| --code <value> | Product code (SKU) |
| --unit <value> | Unit of measure |
| --description <value> | Product description |
| --owner <value> | Owner (user) ID |
| --price <value> | Unit price (requires —currency) |
| --currency <value> | Price currency (requires —price) |
| --field <value> | Custom/standard field as “Name=Value” (repeatable) |
| --body <value> | Raw JSON body to merge (flags win) |
pdcli product update 7 --name "New name"pdcli product update 7 --price 12.50 --currency USDpdcli product update 7 --field "Material=Steel"pdcli profile
Section titled “pdcli profile”pdcli profile current
Section titled “pdcli profile current”Show the active profile
pdcli profile current [flags]pdcli profile currentpdcli profile list
Section titled “pdcli profile list”List all configured profiles
pdcli profile list [flags]pdcli profile listpdcli profile use
Section titled “pdcli profile use”Switch the active profile
pdcli profile use <name> [flags]pdcli profile use workpdcli project
Section titled “pdcli project”pdcli project create
Section titled “pdcli project create”Create a project
pdcli project create [flags]| Flag | Description |
| --- | --- |
| --title <value> | Project title |
| --description <value> | Project description |
| --status <value> | Project status |
| --start-date <value> | Start date (YYYY-MM-DD) |
| --end-date <value> | End date (YYYY-MM-DD) |
| --owner <value> | Owner (user) ID |
| --board <value> | Board ID |
| --phase <value> | Phase ID |
| --body <value> | Raw JSON body to merge (flags win) |
pdcli project create --title "Launch"pdcli project create --title "Launch" --owner 3 --status openpdcli project create --title "Raw" --body '{"deal_ids":[1,2]}'pdcli project delete
Section titled “pdcli project delete”Delete a project
pdcli project delete <id> [flags]| Flag | Description |
| --- | --- |
| -y, --yes | Skip the confirmation prompt |
pdcli project delete 7pdcli project delete 7 --yespdcli project get
Section titled “pdcli project get”Get a project by ID
pdcli project get <id> [flags]pdcli project get 3pdcli project get 3 --output jsonpdcli project list
Section titled “pdcli project list”List projects
pdcli project list [flags]| Flag | Description |
| --- | --- |
| --archived | List archived projects instead of active ones |
pdcli project listpdcli project list --output jsonpdcli project update
Section titled “pdcli project update”Update a project (v2 PATCH — only provided fields change)
pdcli project update <id> [flags]| Flag | Description |
| --- | --- |
| --title <value> | Project title |
| --description <value> | Project description |
| --status <value> | Project status |
| --start-date <value> | Start date (YYYY-MM-DD) |
| --end-date <value> | End date (YYYY-MM-DD) |
| --owner <value> | Owner (user) ID |
| --board <value> | Board ID |
| --phase <value> | Phase ID |
| --body <value> | Raw JSON body to merge (flags win) |
pdcli project update 7 --title "Relaunch"pdcli project update 7 --status closedpdcli project update 7 --owner 9pdcli rep
Section titled “pdcli rep”pdcli rep scorecard
Section titled “pdcli rep scorecard”Per-rep scorecard: win rate, cycle, velocity and deal hygiene by owner, across all pipelines (account-wide) unless narrowed
pdcli rep scorecard [flags]| Flag | Description |
| --- | --- |
| --period <value> | Trailing window for closed deals (Nd or Nm) |
| --pipeline <value> | Restrict to a pipeline ID |
| --owner <value> | Restrict to a single owner (user) ID |
pdcli rep scorecardpdcli rep scorecard --period 30d --pipeline 1pdcli rep scorecard --owner 42 --output jsonpdcli stage
Section titled “pdcli stage”pdcli stage get
Section titled “pdcli stage get”Get a stage by ID
pdcli stage get <id> [flags]pdcli stage get 5pdcli stage get 5 --output jsonpdcli stage list
Section titled “pdcli stage list”List stages
pdcli stage list [flags]| Flag | Description |
| --- | --- |
| --pipeline <value> | Filter by pipeline ID |
pdcli stage listpdcli stage list --pipeline 1 --output jsonpdcli sync
Section titled “pdcli sync”pdcli sync warehouse
Section titled “pdcli sync warehouse”Incremental NDJSON export for a data warehouse: appends only records changed since the last run, per-entity, with high-water marks in manifest.json. First run seeds a full export. NOTE: pull-based CDC sees creates/updates only — hard deletes are not captured; reconcile against a periodic full backup.
pdcli sync warehouse [flags]| Flag | Description |
| --- | --- |
| --dir <value> | Output directory for the NDJSON files + manifest |
| --since <value> | Override the start for all entities (RFC3339 or Nd/Nm) |
| --full | Ignore watermarks and rebuild from scratch (truncates files) |
| -y, --yes | Skip the —full truncation confirmation |
pdcli sync warehouse --dir ./warehousepdcli sync warehouse --dir ./warehouse --since 7dpdcli sync warehouse --dir ./warehouse --fullpdcli task
Section titled “pdcli task”pdcli task create
Section titled “pdcli task create”Create a task
pdcli task create [flags]| Flag | Description |
| --- | --- |
| --title <value> | Task title |
| --project <value> | Project ID |
| --description <value> | Task description |
| --assignee <value> | Assignee (user) ID |
| --due-date <value> | Due date (YYYY-MM-DD) |
| --parent <value> | Parent task ID |
| --body <value> | Raw JSON body to merge (flags win) |
pdcli task create --title "Write spec" --project 3pdcli task create --title "Subtask" --project 3 --parent 5 --assignee 7pdcli task create --title "Raw" --project 3 --body '{"priority":5}'pdcli task delete
Section titled “pdcli task delete”Delete a task
pdcli task delete <id> [flags]| Flag | Description |
| --- | --- |
| -y, --yes | Skip the confirmation prompt |
pdcli task delete 7pdcli task delete 7 --yespdcli task get
Section titled “pdcli task get”Get a task by ID
pdcli task get <id> [flags]pdcli task get 9pdcli task get 9 --output jsonpdcli task list
Section titled “pdcli task list”List tasks
pdcli task list [flags]| Flag | Description |
| --- | --- |
| --project <value> | Filter by project ID |
| --assignee <value> | Filter by assignee (user) ID |
| --parent <value> | Filter by parent task ID |
| --done | Only completed tasks |
| --todo | Only open (not done) tasks |
pdcli task listpdcli task list --project 3 --todopdcli task list --assignee 7 --output jsonpdcli task update
Section titled “pdcli task update”Update a task (v2 PATCH — only provided fields change)
pdcli task update <id> [flags]| Flag | Description |
| --- | --- |
| --title <value> | Task title |
| --project <value> | Project ID |
| --description <value> | Task description |
| --assignee <value> | Assignee (user) ID |
| --due-date <value> | Due date (YYYY-MM-DD) |
| --parent <value> | Parent task ID |
| --done | Mark the task as done |
| --undone | Mark the task as not done |
| --body <value> | Raw JSON body to merge (flags win) |
pdcli task update 7 --title "Renamed"pdcli task update 7 --donepdcli task update 7 --assignee 9pdcli user
Section titled “pdcli user”pdcli user find
Section titled “pdcli user find”Find users by name
pdcli user find <term> [flags]| Flag | Description |
| --- | --- |
| --by-email | Match the term against email addresses only |
pdcli user find "jane"pdcli user find "jane@acme.com" --by-email --output jsonpdcli user list
Section titled “pdcli user list”List all users
pdcli user list [flags]pdcli user listpdcli user list --output jsonpdcli user me
Section titled “pdcli user me”Show the authenticated user
pdcli user me [flags]pdcli user mepdcli webhook
Section titled “pdcli webhook”pdcli webhook create
Section titled “pdcli webhook create”Create a webhook
pdcli webhook create [flags]| Flag | Description |
| --- | --- |
| --url <value> | Webhook subscription URL |
| --event-action <create|change|delete|> | Event action to subscribe to |
| --event-object <activity|board|deal|deal_installment|deal_product|lead|note|organization|person|phase|pipeline|product|project|stage|task|user|> | Event object to subscribe to |
| --name <value> | Webhook name |
| --version <value> | Webhook payload version |
| --http-auth-user <value> | HTTP basic auth username for the endpoint |
| --http-auth-password <value> | HTTP basic auth password for the endpoint |
pdcli webhook create --url https://example.com/hook --event-action change --event-object dealpdcli webhook create --url https://example.com/hook --event-action "*" --event-object "*"pdcli webhook delete
Section titled “pdcli webhook delete”Delete a webhook
pdcli webhook delete <id> [flags]| Flag | Description |
| --- | --- |
| -y, --yes | Skip the confirmation prompt |
pdcli webhook delete 3pdcli webhook delete 3 --yespdcli webhook list
Section titled “pdcli webhook list”List webhooks
pdcli webhook list [flags]pdcli webhook listpdcli webhook list --output jsonpdcli webhook listen
Section titled “pdcli webhook listen”Run a local webhook dev loop. In tunnel mode it registers a temporary Pipedrive webhook pointing at your public tunnel (—url) and prints/forwards each delivery, deleting the webhook on exit. In —synthetic mode it polls the changes feed instead and emits the same delivery envelope with zero inbound network — useful behind a firewall or for reactive agents.
pdcli webhook listen [flags]| Flag | Description |
| --- | --- |
| --url <value> | Public tunnel URL that forwards to the local receiver (tunnel mode) |
| --forward-to <value> | POST each delivery to this local URL as well |
| --events <value> | Comma-separated entity.action filters, e.g. deal.change,person.* |
| --port <value> | Local receiver port (tunnel mode) |
| --synthetic | Poll the changes feed and emit webhook-shaped events (no inbound network) |
| --since <value> | Synthetic start point: RFC3339 timestamp or Nd/Nm (else the stored watermark) |
| --interval <value> | Milliseconds between synthetic poll cycles |
| --once | Process a single delivery / poll cycle then exit |
| --max-events <value> | Exit after emitting this many events |
pdcli webhook listen --url https://abc123.ngrok.app --forward-to http://localhost:3000pdcli webhook listen --url https://abc123.ngrok.app --events deal.change,person.*pdcli webhook listen --synthetic --since 15m