# CRM analytics dashboards, KPIs, and charts Source: https://dench.com/docs/analytics Build KPI stats, bar and line charts, funnels, forecasts, and world maps over any Dench CRM object from the app, chat, CLI, and API. Every CRM object has a dashboard. It sits above the table as a strip — KPI stats in the header, a bento of charts underneath — and opens in a full sheet from the toolbar's **Analytics** toggle. The math is one query, `computePanels`; the UI, the CLI, the API, the chat card and the App SDK all draw from it, so a number is the same number everywhere. ## What a dashboard is A dashboard is a list of **panels**. A panel names a metric, an optional group-by, an optional date bucketing and optional filters in the same `FilterGroup` shape saved views use. No SQL. | Panel | Draws | | - | - | | `stat` | one KPI (count, sum, or a derived metric) with a previous-period delta | | `bar`, `donut` | counts or sums by an enum / user / relation / boolean / text field | | `funnel` | the pipeline, stage by stage | | `leaderboard` | top 10 by owner or any relation | | `line`, `area` | a trend by day / week / month / quarter, optionally split by a group | | `forecast` | weighted open pipeline by close month | | `map` | a world map, drilled into the country or state where the data is | Derived metrics (`conversion_rate`, `win_rate`, `won_amount`, `lost_amount`, `open_pipeline`, `pipeline_forecast`, `mrr`, `arr`) read the object's **field roles** — amount, stage + won/lost/converted values, close date, owner, location, recurrence, stage probabilities — so they work on any custom object once the roles are mapped. Templates map them at install. Two synthetic fields work anywhere a field name goes: * `$createdAt` — the row's creation time. "New leads this week" needs no date column. * `$location` — the location role, resolved through one relation hop (`Account.HQ Location`) so a deal inherits its account's HQ. ## Period, views, drills * The header's **period pill** ("This month", "Last quarter", …) scopes every chart **and** the rows under the strip, and fills each stat's previous-period delta. It is never saved onto a view. * Dashboards are **per object or per view**. Every view shows the object's shared dashboard until it gets its own (`scope --mode own` starts it as a copy). Any active view follows its own filters by default. * Clicking a chart segment filters the table (chips in the header, one per dimension); the chart you clicked keeps its whole picture. Deep link: `/?path=&analytics=1[&view=][&analyticsPeriod=this_month]` opens the sheet with the pill set. ## Charts in chat Ask Dench a quantitative question ("pipeline by stage this quarter", "where are our customers", "win rate by rep") and the answer is a **live chart card** in the thread — the object's own `computePanels`, updating as rows land. Open takes you to the dashboard; an ad-hoc chart offers **Save to dashboard**. When the panel model cannot express the question (a join across objects, a custom formula, a cohort), Dench embeds a small App SDK widget instead, fed by `dench.analytics.compute`; **Keep as app** turns it into a workspace app. Off the web UI (Slack, iMessage, comments) you get the headline number and the deep link. ## CLI ```bash theme={null} # Read the dashboard (panels, roles, fields you may bucket on) dench crm analytics get deal --json dench crm analytics get company --view Customers --json # Compute — the whole dashboard, a subset, or ad-hoc panels dench crm analytics compute deal --period this_month --json dench crm analytics compute deal --panel tpl:sales:open-pipeline --json dench crm analytics compute lead --panels '[ {"title":"Leads by source","type":"donut","groupBy":"Source"}, {"title":"Leads per week","type":"line","dateField":"$createdAt","dateBucket":"week"} ]' --period this_quarter --json # Edit dench crm analytics save deal open-pipeline --panel '{"title":"Open pipeline","type":"stat","derived":"open_pipeline"}' dench crm analytics delete deal tpl:sales:deals-by-stage dench crm analytics reorder deal open-pipeline win-rate by-stage dench crm analytics roles deal --roles '{"amount":"Amount","stage":"Stage","wonValues":["Closed Won"],"lostValues":["Closed Lost"],"closeDate":"Close Date","owner":"Owner"}' dench crm analytics collapse deal dench crm analytics scope company Customers --mode own ``` `--period` is `this_week | this_month | last_month | this_quarter | last_quarter | this_year`. Each panel in a `compute` response says where its numbers came from (`source`): `aggregate` — pre-computed buckets, exact at any table size (counts, sums, averages, group-bys, monthly or coarser series, won/lost/open \$, MRR/ARR, forecast, win rate); `scan` — the newest rows; or `snapshot` — a background pass over every row that replaces a clipped scan. `truncated: true` appears only while a `scan` panel could not see every row; the snapshot is requested automatically and the next response is exact. `link` is the deep link above. ## API | Method | Path | | - | - | | `GET` | `/v1/crm/objects/{object}/analytics` | | `POST` | `/v1/crm/objects/{object}/analytics/compute` | | `PUT` / `DELETE` | `/v1/crm/objects/{object}/analytics/panels/{panelId}` | | `POST` | `/v1/crm/objects/{object}/analytics/reorder` | | `PUT` | `/v1/crm/objects/{object}/analytics/roles` | | `POST` | `/v1/crm/objects/{object}/analytics/collapse` · `/expand` | | `POST` | `/v1/crm/objects/{object}/views/{view}/analytics/scope` | Apps call the same query through the bridge: `dench.analytics.compute({ objectName, viewName?, panels?, panelIds?, period?, extraFilters? })` — see the Apps reference. # Aggregate memory Source: https://dench.com/docs/api-reference/agent-config/aggregate-memory /api-reference/openapi.json get /agent-config/mem Read aggregate memory. # Bootstrap Source: https://dench.com/docs/api-reference/agent-config/bootstrap /api-reference/openapi.json get /agent-config/bootstrap Read bootstrap state. # Bootstrap template Source: https://dench.com/docs/api-reference/agent-config/bootstrap-template /api-reference/openapi.json put /agent-config/bootstrap/template Update bootstrap template. # Complete bootstrap Source: https://dench.com/docs/api-reference/agent-config/complete-bootstrap /api-reference/openapi.json post /agent-config/bootstrap/complete Complete bootstrap. # Daily log Source: https://dench.com/docs/api-reference/agent-config/daily-log /api-reference/openapi.json get /agent-config/daily/{date} Read a daily activity path. # Default model Source: https://dench.com/docs/api-reference/agent-config/default-model /api-reference/openapi.json put /agent-config/model/default Set the default chat model. # Identity Source: https://dench.com/docs/api-reference/agent-config/identity /api-reference/openapi.json get /agent-config/identity Read IDENTITY.md. # Organisation Source: https://dench.com/docs/api-reference/agent-config/organisation /api-reference/openapi.json get /agent-config/organisation Read ORGANISATION.md. # Thread model Source: https://dench.com/docs/api-reference/agent-config/thread-model /api-reference/openapi.json put /agent-config/model/threads/{threadId} Set a thread model override. # Today's log Source: https://dench.com/docs/api-reference/agent-config/todays-log /api-reference/openapi.json get /agent-config/daily/today Read today's daily activity path. # Tool notes Source: https://dench.com/docs/api-reference/agent-config/tool-notes /api-reference/openapi.json get /agent-config/tools Read tool notes. # Update identity Source: https://dench.com/docs/api-reference/agent-config/update-identity /api-reference/openapi.json put /agent-config/identity Update IDENTITY.md. # Update memory Source: https://dench.com/docs/api-reference/agent-config/update-memory /api-reference/openapi.json put /agent-config/mem Update aggregate memory. # Update organisation Source: https://dench.com/docs/api-reference/agent-config/update-organisation /api-reference/openapi.json put /agent-config/organisation Update ORGANISATION.md. # Update tool notes Source: https://dench.com/docs/api-reference/agent-config/update-tool-notes /api-reference/openapi.json put /agent-config/tools Update tool notes. # Update user Source: https://dench.com/docs/api-reference/agent-config/update-user /api-reference/openapi.json put /agent-config/user Update USER.md. # User profile Source: https://dench.com/docs/api-reference/agent-config/user-profile /api-reference/openapi.json get /agent-config/user Read USER.md. # Decide approval Source: https://dench.com/docs/api-reference/approvals/decide-approval /api-reference/openapi.json post /approvals/{approvalId}/decision Record an approval decision. # List approvals Source: https://dench.com/docs/api-reference/approvals/list-approvals /api-reference/openapi.json get /approvals List approval requests visible in the workspace status payload. # Request approval Source: https://dench.com/docs/api-reference/approvals/request-approval /api-reference/openapi.json post /approvals Request human approval. # Enable or disable an installed app Source: https://dench.com/docs/api-reference/apps/enable-or-disable-an-installed-app /api-reference/openapi.json patch /apps/{slug} Enable or disable an installed app. # Install an App Store listing into the workspace Source: https://dench.com/docs/api-reference/apps/install-an-app-store-listing-into-the-workspace /api-reference/openapi.json post /apps/install Install an App Store listing into the workspace. # List an app's registered webhooks (URLs, never secrets) Source: https://dench.com/docs/api-reference/apps/list-an-apps-registered-webhooks-urls-never-secrets /api-reference/openapi.json get /apps/{slug}/webhooks List an app's registered webhooks (URLs, never secrets). # List apps Source: https://dench.com/docs/api-reference/apps/list-apps /api-reference/openapi.json get /apps List installed App Store apps in the workspace. # List Discover listings — Official (Dench) + Community shelves Source: https://dench.com/docs/api-reference/apps/list-discover-listings-—-official-dench-+-community-shelves /api-reference/openapi.json get /apps/gallery List Discover listings — Official (Dench) + Community shelves. # Pin or unpin an installed app in the rail Source: https://dench.com/docs/api-reference/apps/pin-or-unpin-an-installed-app-in-the-rail /api-reference/openapi.json post /apps/{slug}/pin Pin or unpin an installed app in the rail. # Publish an app's files as a versioned App Store listing Source: https://dench.com/docs/api-reference/apps/publish-an-apps-files-as-a-versioned-app-store-listing /api-reference/openapi.json post /apps/publish Publish an app's files as a versioned App Store listing. # Read events an app webhook received since a timestamp Source: https://dench.com/docs/api-reference/apps/read-events-an-app-webhook-received-since-a-timestamp /api-reference/openapi.json get /apps/{slug}/webhooks/{hookName}/events Read events an app webhook received since a timestamp. # Register an inbound webhook for an app. Returns the URL and signing secret ONCE Source: https://dench.com/docs/api-reference/apps/register-an-inbound-webhook-for-an-app-returns-the-url-and-signing-secret-once /api-reference/openapi.json post /apps/{slug}/webhooks Register an inbound webhook for an app. Returns the URL and signing secret ONCE. # Remove an app webhook and every event it stored Source: https://dench.com/docs/api-reference/apps/remove-an-app-webhook-and-every-event-it-stored /api-reference/openapi.json delete /apps/{slug}/webhooks/{hookName} Remove an app webhook and every event it stored. # Scaffold and register a new App Store app Source: https://dench.com/docs/api-reference/apps/scaffold-and-register-a-new-app-store-app /api-reference/openapi.json post /apps Scaffold and register a new App Store app. # Uninstall an app from the workspace Source: https://dench.com/docs/api-reference/apps/uninstall-an-app-from-the-workspace /api-reference/openapi.json delete /apps/{slug} Uninstall an app from the workspace. # Validate a .dench.app folder: manifest, permissions, and every window.dench call it makes Source: https://dench.com/docs/api-reference/apps/validate-a-denchapp-folder:-manifest-permissions-and-every-windowdench-call-it-makes /api-reference/openapi.json post /local/apps/validate Validate a .dench.app folder: manifest, permissions, and every window.dench call it makes. # Create sign-in request Source: https://dench.com/docs/api-reference/auth/create-sign-in-request /api-reference/openapi.json post /auth/signin-requests Create an agent sign-in request. # Finalize OTP session Source: https://dench.com/docs/api-reference/auth/finalize-otp-session /api-reference/openapi.json post /auth/otp/finalize Finalize an email OTP sign-in session. # Poll sign-in request Source: https://dench.com/docs/api-reference/auth/poll-sign-in-request /api-reference/openapi.json post /auth/signin-requests/{requestId}/poll Poll an agent sign-in request until approval. # Start email OTP Source: https://dench.com/docs/api-reference/auth/start-email-otp /api-reference/openapi.json post /auth/otp/start Start the email OTP sign-in flow. # Verify email OTP Source: https://dench.com/docs/api-reference/auth/verify-email-otp /api-reference/openapi.json post /auth/otp/verify Verify an email OTP sign-in code. # Billing status Source: https://dench.com/docs/api-reference/billing/billing-status /api-reference/openapi.json get /billing/status Get billing and AI credit status. # Top up credits Source: https://dench.com/docs/api-reference/billing/top-up-credits /api-reference/openapi.json post /billing/topup Create an AI credit top-up checkout link. # Upgrade workspace Source: https://dench.com/docs/api-reference/billing/upgrade-workspace /api-reference/openapi.json post /billing/upgrade Create a workspace upgrade checkout link. # Create a Dench Browser session and return a CDP connect URL for Playwright (chromium.connectOverCDP) plus a live-view URL. Use for durable scripts run from the sandbox Source: https://dench.com/docs/api-reference/browser/create-a-dench-browser-session-and-return-a-cdp-connect-url-for-playwright-chromiumconnectovercdp-plus-a-live-view-url-use-for-durable-scripts-run-from-the-sandbox /api-reference/openapi.json post /browser/sessions Create a Dench Browser session and return a CDP connect URL for Playwright (chromium.connectOverCDP) plus a live-view URL. Use for durable scripts run from the sandbox. # Drive Dench Browser with a single interactive action (open, inspect, click, fill, type, screenshot, stop). Pass the step in `action` plus its arguments Source: https://dench.com/docs/api-reference/browser/drive-dench-browser-with-a-single-interactive-action-open-inspect-click-fill-type-screenshot-stop-pass-the-step-in-`action`-plus-its-arguments /api-reference/openapi.json post /browser/cli Drive Dench Browser with a single interactive action (open, inspect, click, fill, type, screenshot, stop). Pass the step in `action` plus its arguments. # Get the status, connect URL, and live-view URL for a Dench Browser session Source: https://dench.com/docs/api-reference/browser/get-the-status-connect-url-and-live-view-url-for-a-dench-browser-session /api-reference/openapi.json get /browser/sessions/{sessionId} Get the status, connect URL, and live-view URL for a Dench Browser session. # Stop a Dench Browser session and release the remote browser Source: https://dench.com/docs/api-reference/browser/stop-a-dench-browser-session-and-release-the-remote-browser /api-reference/openapi.json delete /browser/sessions/{sessionId} Stop a Dench Browser session and release the remote browser. # Add CRM records (up to 100 ids per call) to a campaign; returns how many were added and why others were skipped Source: https://dench.com/docs/api-reference/campaigns/add-crm-records-up-to-100-ids-per-call-to-a-campaign;-returns-how-many-were-added-and-why-others-were-skipped /api-reference/openapi.json post /campaigns/{sequenceId}/people Add CRM records (up to 100 ids per call) to a campaign; returns how many were added and why others were skipped. # Add one person by email and/or LinkedIn profile URL Source: https://dench.com/docs/api-reference/campaigns/add-one-person-by-email-andor-linkedin-profile-url /api-reference/openapi.json post /campaigns/{sequenceId}/person Add one person by email and/or LinkedIn profile URL. # Add up to 50 selected recipients without another search. Deduplicates, applies suppression, and preserves the campaign's launch state Source: https://dench.com/docs/api-reference/campaigns/add-up-to-50-selected-recipients-without-another-search-deduplicates-applies-suppression-and-preserves-the-campaigns-launch-state /api-reference/openapi.json post /campaigns/{sequenceId}/people/batch Add up to 50 selected recipients without another search. Deduplicates, applies suppression, and preserves the campaign's launch state. # Approve people waiting for review (they start the sequence) or reject them Source: https://dench.com/docs/api-reference/campaigns/approve-people-waiting-for-review-they-start-the-sequence-or-reject-them /api-reference/openapi.json post /campaigns/{sequenceId}/sources/review Approve people waiting for review (they start the sequence) or reject them. # Archive a campaign and stop everyone still in flight. This is the app's Delete: campaigns are never erased, and their people, leads and activity stay Source: https://dench.com/docs/api-reference/campaigns/archive-a-campaign-and-stop-everyone-still-in-flight-this-is-the-apps-delete:-campaigns-are-never-erased-and-their-people-leads-and-activity-stay /api-reference/openapi.json post /campaigns/{sequenceId}/archive Archive a campaign and stop everyone still in flight. This is the app's Delete: campaigns are never erased, and their people, leads and activity stay. # Campaign funnel: enrolled, contacted, invited, accepted, messaged, replied, opens and clicks, and for a workflow how many people took each If / else and Wait for them to accept path (branchStats) Source: https://dench.com/docs/api-reference/campaigns/campaign-funnel:-enrolled-contacted-invited-accepted-messaged-replied-opens-and-clicks-and-for-a-workflow-how-many-people-took-each-if-else-and-wait-for-them-to-accept-path-branchstats /api-reference/openapi.json get /campaigns/{sequenceId}/analytics Campaign funnel: enrolled, contacted, invited, accepted, messaged, replied, opens and clicks, and for a workflow how many people took each If / else and Wait for them to accept path (branchStats). # Change a campaign's name, sender pools, send windows, daily email cap, stop-on-reply, start or end. Works until archived; existing conversations keep their assigned sender Source: https://dench.com/docs/api-reference/campaigns/change-a-campaigns-name-sender-pools-send-windows-daily-email-cap-stop-on-reply-start-or-end-works-until-archived;-existing-conversations-keep-their-assigned-sender /api-reference/openapi.json patch /campaigns/{sequenceId} Change a campaign's name, sender pools, send windows, daily email cap, stop-on-reply, start or end. Works until archived; existing conversations keep their assigned sender. # Copy a campaign into a new draft named " copy": the same steps, schedule, sender pools and personalized lines, its lead source paused, and no people. To reach more than 300 people, duplicate and add the next page of the search to the copy Source: https://dench.com/docs/api-reference/campaigns/copy-a-campaign-into-a-new-draft-named-"-copy":-the-same-steps-schedule-sender-pools-and-personalized-lines-its-lead-source-paused-and-no-people-to-reach-more-than-300-people-duplicate-and-add-the-next-page-of-the-search-to-the-copy /api-reference/openapi.json post /campaigns/{sequenceId}/duplicate Copy a campaign into a new draft named " copy": the same steps, schedule, sender pools and personalized lines, its lead source paused, and no people. To reach more than 300 people, duplicate and add the next page of the search to the copy. # Create a campaign from a reviewed signal draft. Does not launch the campaign Source: https://dench.com/docs/api-reference/campaigns/create-a-campaign-from-a-reviewed-signal-draft-does-not-launch-the-campaign /api-reference/openapi.json post /campaigns/builder/drafts/{draftId}/create Create a campaign from a reviewed signal draft. Does not launch the campaign. # Create a draft outreach campaign with email and LinkedIn sender pools and a business-hours send window in the given timezone Source: https://dench.com/docs/api-reference/campaigns/create-a-draft-outreach-campaign-with-email-and-linkedin-sender-pools-and-a-business-hours-send-window-in-the-given-timezone /api-reference/openapi.json post /campaigns Create a draft outreach campaign with email and LinkedIn sender pools and a business-hours send window in the given timezone. # Create an idempotent empty campaign draft with the caller's available sender pools. Does not launch or send Source: https://dench.com/docs/api-reference/campaigns/create-an-idempotent-empty-campaign-draft-with-the-callers-available-sender-pools-does-not-launch-or-send /api-reference/openapi.json post /campaigns/drafts Create an idempotent empty campaign draft with the caller's available sender pools. Does not launch or send. # Define up to 5 personalized lines (each used as {{key}} in steps) and what you sell. Saving starts writing missing lines for up to 100 people, about 3 cents a person; for more it returns needsConfirm and writes nothing until campaigns.personalization.write is confirmed Source: https://dench.com/docs/api-reference/campaigns/define-up-to-5-personalized-lines-each-used-as--in-steps-and-what-you-sell-saving-starts-writing-missing-lines-for-up-to-100-people-about-3-cents-a-person;-for-more-it-returns-needsconfirm-and-writes-nothing-until-campaignspersonalizationwrite-is-confirmed /api-reference/openapi.json put /campaigns/{sequenceId}/personalization Define up to 5 personalized lines (each used as {{key}} in steps) and what you sell. Saving starts writing missing lines for up to 100 people, about 3 cents a person; for more it returns needsConfirm and writes nothing until campaigns.personalization.write is confirmed. # Discard a saved draft that has not become a campaign Source: https://dench.com/docs/api-reference/campaigns/discard-a-saved-draft-that-has-not-become-a-campaign /api-reference/openapi.json delete /campaigns/builder/drafts/{draftId} Discard a saved draft that has not become a campaign. # Discover LinkedIn sender ids, labels, availability and remaining capacity visible to the acting workspace member. Never returns provider credentials Source: https://dench.com/docs/api-reference/campaigns/discover-linkedin-sender-ids-labels-availability-and-remaining-capacity-visible-to-the-acting-workspace-member-never-returns-provider-credentials /api-reference/openapi.json get /campaigns/accounts/linkedin Discover LinkedIn sender ids, labels, availability and remaining capacity visible to the acting workspace member. Never returns provider credentials. # Discover the mailboxes the acting workspace member can send campaign email from: ids for emailMailboxAccountIds, status, warm-up state and when it is done, the daily cold-email cap and what is left today. Never returns provider credentials Source: https://dench.com/docs/api-reference/campaigns/discover-the-mailboxes-the-acting-workspace-member-can-send-campaign-email-from:-ids-for-emailmailboxaccountids-status-warm-up-state-and-when-it-is-done-the-daily-cold-email-cap-and-what-is-left-today-never-returns-provider-credentials /api-reference/openapi.json get /campaigns/accounts/email Discover the mailboxes the acting workspace member can send campaign email from: ids for emailMailboxAccountIds, status, warm-up state and when it is done, the daily cold-email cap and what is left today. Never returns provider credentials. # Edit or reset one preview person's opening line before creating the campaign Source: https://dench.com/docs/api-reference/campaigns/edit-or-reset-one-preview-persons-opening-line-before-creating-the-campaign /api-reference/openapi.json put /campaigns/builder/drafts/{draftId}/people/{leadId}/opener Edit or reset one preview person's opening line before creating the campaign. # Edit the text, waits and conditions of a launched (or paused) campaign's steps in place. Each step keeps its id, type and place; pass the stepId and the updatedAt you read, and only the fields you change. A workflow keeps its paths and what each If / else checks (key, next, yesNext, noNext, check, conditionField, conditionOperator); conditionValue and acceptance waits stay editable. Messages already sent or being prepared keep their text; drafts use campaigns.steps.replace Source: https://dench.com/docs/api-reference/campaigns/edit-the-text-waits-and-conditions-of-a-launched-or-paused-campaigns-steps-in-place-each-step-keeps-its-id-type-and-place;-pass-the-stepid-and-the-updatedat-you-read-and-only-the-fields-you-change-a-workflow-keeps-its-paths-and-what-each-if-else-checks-key-next-yesnext-nonext-check-conditionfield-conditionoperator;-conditionvalue-and-acceptance-waits-stay-editable-messages-already-sent-or-being-prepared-keep-their-text;-drafts-use-campaignsstepsreplace /api-reference/openapi.json patch /campaigns/{sequenceId}/steps Edit the text, waits and conditions of a launched (or paused) campaign's steps in place. Each step keeps its id, type and place; pass the stepId and the updatedAt you read, and only the fields you change. A workflow keeps its paths and what each If / else checks (key, next, yesNext, noNext, check, conditionField, conditionOperator); conditionValue and acceptance waits stay editable. Messages already sent or being prepared keep their text; drafts use campaigns.steps.replace. # Estimate audience or weekly signal volume using the UI's cached estimator. Provider credits may apply Source: https://dench.com/docs/api-reference/campaigns/estimate-audience-or-weekly-signal-volume-using-the-uis-cached-estimator-provider-credits-may-apply /api-reference/openapi.json post /campaigns/builder/estimate Estimate audience or weekly signal volume using the UI's cached estimator. Provider credits may apply. # Everything a campaign did for one person, step by step: what was sent (subject and text), whether it was opened or clicked, what was skipped and why, waits, failures and retries Source: https://dench.com/docs/api-reference/campaigns/everything-a-campaign-did-for-one-person-step-by-step:-what-was-sent-subject-and-text-whether-it-was-opened-or-clicked-what-was-skipped-and-why-waits-failures-and-retries /api-reference/openapi.json get /campaigns/people/{enrollmentId}/timeline Everything a campaign did for one person, step by step: what was sent (subject and text), whether it was opened or clicked, what was skipped and why, waits, failures and retries. # Fill each unfinished person's empty email, LinkedIn URL, name and merge fields from their linked CRM record, e.g. after enriching the records. Never overwrites a value the campaign already has; returns how many people changed Source: https://dench.com/docs/api-reference/campaigns/fill-each-unfinished-persons-empty-email-linkedin-url-name-and-merge-fields-from-their-linked-crm-record-eg-after-enriching-the-records-never-overwrites-a-value-the-campaign-already-has;-returns-how-many-people-changed /api-reference/openapi.json post /campaigns/{sequenceId}/people/sync Fill each unfinished person's empty email, LinkedIn URL, name and merge fields from their linked CRM record, e.g. after enriching the records. Never overwrites a value the campaign already has; returns how many people changed. # Fill or fix one {{merge field}} for a person in a draft campaign, e.g. a missing Company that blocks launch; a matching column on their CRM record is updated too. Only before launch; written personalized lines are not merge fields and can't be set here Source: https://dench.com/docs/api-reference/campaigns/fill-or-fix-one--for-a-person-in-a-draft-campaign-eg-a-missing-company-that-blocks-launch;-a-matching-column-on-their-crm-record-is-updated-too-only-before-launch;-written-personalized-lines-are-not-merge-fields-and-cant-be-set-here /api-reference/openapi.json put /campaigns/people/{enrollmentId}/fields Fill or fix one {{merge field}} for a person in a draft campaign, e.g. a missing Company that blocks launch; a matching column on their CRM record is updated too. Only before launch; written personalized lines are not merge fields and can't be set here. # Generate the draft's sequence from a brief (goal, problem, tone, channels), as Generate sequence does. AI credits apply Source: https://dench.com/docs/api-reference/campaigns/generate-the-drafts-sequence-from-a-brief-goal-problem-tone-channels-as-generate-sequence-does-ai-credits-apply /api-reference/openapi.json post /campaigns/builder/drafts/{draftId}/sequence Generate the draft's sequence from a brief (goal, problem, tone, channels), as Generate sequence does. AI credits apply. # Give a person in a draft campaign a new or corrected email address; their linked CRM record gets it too. Only before launch; another person in the campaign can't share it Source: https://dench.com/docs/api-reference/campaigns/give-a-person-in-a-draft-campaign-a-new-or-corrected-email-address;-their-linked-crm-record-gets-it-too-only-before-launch;-another-person-in-the-campaign-cant-share-it /api-reference/openapi.json put /campaigns/people/{enrollmentId}/email Give a person in a draft campaign a new or corrected email address; their linked CRM record gets it too. Only before launch; another person in the campaign can't share it. # Give a person in a draft campaign a new or corrected LinkedIn profile URL; their linked CRM record gets it too. Only before launch Source: https://dench.com/docs/api-reference/campaigns/give-a-person-in-a-draft-campaign-a-new-or-corrected-linkedin-profile-url;-their-linked-crm-record-gets-it-too-only-before-launch /api-reference/openapi.json put /campaigns/people/{enrollmentId}/linkedin Give a person in a draft campaign a new or corrected LinkedIn profile URL; their linked CRM record gets it too. Only before launch. # Launch a ready draft. Pass the fingerprint from the preview and acknowledge the LinkedIn notice when LinkedIn steps exist Source: https://dench.com/docs/api-reference/campaigns/launch-a-ready-draft-pass-the-fingerprint-from-the-preview-and-acknowledge-the-linkedin-notice-when-linkedin-steps-exist /api-reference/openapi.json post /campaigns/{sequenceId}/launch Launch a ready draft. Pass the fingerprint from the preview and acknowledge the LinkedIn notice when LinkedIn steps exist. # Launch readiness without launching: blockers grouped by problem, warnings, and the fingerprint `launch` requires Source: https://dench.com/docs/api-reference/campaigns/launch-readiness-without-launching:-blockers-grouped-by-problem-warnings-and-the-fingerprint-`launch`-requires /api-reference/openapi.json get /campaigns/{sequenceId}/launch Launch readiness without launching: blockers grouped by problem, warnings, and the fingerprint `launch` requires. # List outreach campaigns (archived ones on request) Source: https://dench.com/docs/api-reference/campaigns/list-outreach-campaigns-archived-ones-on-request /api-reference/openapi.json get /campaigns List outreach campaigns (archived ones on request). # List people a signal found who are waiting for approval (manual approval mode) Source: https://dench.com/docs/api-reference/campaigns/list-people-a-signal-found-who-are-waiting-for-approval-manual-approval-mode /api-reference/openapi.json get /campaigns/{sequenceId}/sources/pending List people a signal found who are waiting for approval (manual approval mode). # List saved, unfinished campaign drafts that can be resumed Source: https://dench.com/docs/api-reference/campaigns/list-saved-unfinished-campaign-drafts-that-can-be-resumed /api-reference/openapi.json get /campaigns/builder/drafts List saved, unfinished campaign drafts that can be resumed. # Pause an active campaign Source: https://dench.com/docs/api-reference/campaigns/pause-an-active-campaign /api-reference/openapi.json post /campaigns/{sequenceId}/pause Pause an active campaign. # Preview a signal source using its current audience. Provider credits may apply; does not enroll people Source: https://dench.com/docs/api-reference/campaigns/preview-a-signal-source-using-its-current-audience-provider-credits-may-apply;-does-not-enroll-people /api-reference/openapi.json post /campaigns/{sequenceId}/sources/preview Preview a signal source using its current audience. Provider credits may apply; does not enroll people. # Read a campaign: settings, steps, people, their current step and hold, last touches, linked leads Source: https://dench.com/docs/api-reference/campaigns/read-a-campaign:-settings-steps-people-their-current-step-and-hold-last-touches-linked-leads /api-reference/openapi.json get /campaigns/{sequenceId} Read a campaign: settings, steps, people, their current step and hold, last touches, linked leads. # Read a campaign's personalized lines (written for each person): their {{keys}} for steps, instructions and fallbacks, how many people have them, and the cost per person Source: https://dench.com/docs/api-reference/campaigns/read-a-campaigns-personalized-lines-written-for-each-person:-their--for-steps-instructions-and-fallbacks-how-many-people-have-them-and-the-cost-per-person /api-reference/openapi.json get /campaigns/{sequenceId}/personalization Read a campaign's personalized lines (written for each person): their {{keys}} for steps, instructions and fallbacks, how many people have them, and the cost per person. # Read a campaign's saved signal source, targeting and schedule Source: https://dench.com/docs/api-reference/campaigns/read-a-campaigns-saved-signal-source-targeting-and-schedule /api-reference/openapi.json get /campaigns/{sequenceId}/sources Read a campaign's saved signal source, targeting and schedule. # Read a saved draft's setup (source, name, targeting, signals, terms, lookalike) to resume it Source: https://dench.com/docs/api-reference/campaigns/read-a-saved-drafts-setup-source-name-targeting-signals-terms-lookalike-to-resume-it /api-reference/openapi.json get /campaigns/builder/drafts/{draftId}/setup Read a saved draft's setup (source, name, targeting, signals, terms, lookalike) to resume it. # Read signal build progress, preview people, messages and errors Source: https://dench.com/docs/api-reference/campaigns/read-signal-build-progress-preview-people-messages-and-errors /api-reference/openapi.json get /campaigns/builder/drafts/{draftId} Read signal build progress, preview people, messages and errors. # Read signal choices, suggested terms and current source configuration Source: https://dench.com/docs/api-reference/campaigns/read-signal-choices-suggested-terms-and-current-source-configuration /api-reference/openapi.json get /campaigns/{sequenceId}/sources/signals Read signal choices, suggested terms and current source configuration. # Read the company profile and suggested campaign audience Source: https://dench.com/docs/api-reference/campaigns/read-the-company-profile-and-suggested-campaign-audience /api-reference/openapi.json get /campaigns/builder/profile Read the company profile and suggested campaign audience. # Read the Sources tab: each signal's status, last and next run, people found and anything needing attention Source: https://dench.com/docs/api-reference/campaigns/read-the-sources-tab:-each-signals-status-last-and-next-run-people-found-and-anything-needing-attention /api-reference/openapi.json get /campaigns/{sequenceId}/sources/overview Read the Sources tab: each signal's status, last and next run, people found and anything needing attention. # Remove a person who was never contacted from a draft campaign. Frees their place in the 300-person cap and keeps the draft launchable; stop anyone already contacted instead Source: https://dench.com/docs/api-reference/campaigns/remove-a-person-who-was-never-contacted-from-a-draft-campaign-frees-their-place-in-the-300-person-cap-and-keeps-the-draft-launchable;-stop-anyone-already-contacted-instead /api-reference/openapi.json delete /campaigns/people/{enrollmentId} Remove a person who was never contacted from a draft campaign. Frees their place in the 300-person cap and keeps the draft launchable; stop anyone already contacted instead. # Replace every step of a draft campaign (email, wait, LinkedIn visit, connection request, message, post reaction, InMail, If / else, Wait for them to accept). A workflow (stepModel workflow, or steps with key, next, yesNext or noNext) branches: condition and wait_for_connection steps continue on yesNext or noNext, other steps on next; each points at another step's key or end. Steps are checked first: a field the step type would drop, missing text, {TOKEN} single braces or paths that don't hold together are rejected, not saved. Configure sender pools on the campaign; step sender ids are legacy-only Source: https://dench.com/docs/api-reference/campaigns/replace-every-step-of-a-draft-campaign-email-wait-linkedin-visit-connection-request-message-post-reaction-inmail-if-else-wait-for-them-to-accept-a-workflow-stepmodel-workflow-or-steps-with-key-next-yesnext-or-nonext-branches:-condition-and-wait_for_connection-steps-continue-on-yesnext-or-nonext-other-steps-on-next;-each-points-at-another-steps-key-or-end-steps-are-checked-first:-a-field-the-step-type-would-drop-missing-text--single-braces-or-paths-that-dont-hold-together-are-rejected-not-saved-configure-sender-pools-on-the-campaign;-step-sender-ids-are-legacy-only /api-reference/openapi.json put /campaigns/{sequenceId}/steps Replace every step of a draft campaign (email, wait, LinkedIn visit, connection request, message, post reaction, InMail, If / else, Wait for them to accept). A workflow (stepModel workflow, or steps with key, next, yesNext or noNext) branches: condition and wait_for_connection steps continue on yesNext or noNext, other steps on next; each points at another step's key or end. Steps are checked first: a field the step type would drop, missing text, {TOKEN} single braces or paths that don't hold together are rejected, not saved. Configure sender pools on the campaign; step sender ids are legacy-only. # Resume a paused campaign Source: https://dench.com/docs/api-reference/campaigns/resume-a-paused-campaign /api-reference/openapi.json post /campaigns/{sequenceId}/resume Resume a paused campaign. # Resume every paused person in an active campaign at once, e.g. after a sending account is reconnected. Returns how many were resumed Source: https://dench.com/docs/api-reference/campaigns/resume-every-paused-person-in-an-active-campaign-at-once-eg-after-a-sending-account-is-reconnected-returns-how-many-were-resumed /api-reference/openapi.json post /campaigns/{sequenceId}/people/resume Resume every paused person in an active campaign at once, e.g. after a sending account is reconnected. Returns how many were resumed. # Resume one paused person in an active campaign Source: https://dench.com/docs/api-reference/campaigns/resume-one-paused-person-in-an-active-campaign /api-reference/openapi.json post /campaigns/people/{enrollmentId}/resume Resume one paused person in an active campaign. # Run a live campaign's signals now instead of waiting for the schedule (Run now). Provider credits apply; limited to 6 runs an hour Source: https://dench.com/docs/api-reference/campaigns/run-a-live-campaigns-signals-now-instead-of-waiting-for-the-schedule-run-now-provider-credits-apply;-limited-to-6-runs-an-hour /api-reference/openapi.json post /campaigns/{sequenceId}/sources/run Run a live campaign's signals now instead of waiting for the schedule (Run now). Provider credits apply; limited to 6 runs an hour. # Save a draft's Outreach and Review choices: AI or manual steps, the brief, the steps, who sends and when, and auto or manual approval Source: https://dench.com/docs/api-reference/campaigns/save-a-drafts-outreach-and-review-choices:-ai-or-manual-steps-the-brief-the-steps-who-sends-and-when-and-auto-or-manual-approval /api-reference/openapi.json patch /campaigns/builder/drafts/{draftId}/outreach Save a draft's Outreach and Review choices: AI or manual steps, the brief, the steps, who sends and when, and auto or manual approval. # Save a signal campaign's audience, signals and terms idempotently. Does not start a build Source: https://dench.com/docs/api-reference/campaigns/save-a-signal-campaigns-audience-signals-and-terms-idempotently-does-not-start-a-build /api-reference/openapi.json post /campaigns/builder/drafts Save a signal campaign's audience, signals and terms idempotently. Does not start a build. # Search and add up to 50 people to an existing campaign. New identities become Leads. Search credits apply; use nextPageToken for another page Source: https://dench.com/docs/api-reference/campaigns/search-and-add-up-to-50-people-to-an-existing-campaign-new-identities-become-leads-search-credits-apply;-use-nextpagetoken-for-another-page /api-reference/openapi.json post /campaigns/{sequenceId}/people/search Search and add up to 50 people to an existing campaign. New identities become Leads. Search credits apply; use nextPageToken for another page. # Search people by filters without adding CRM records or campaign recipients. Search credits apply; this is not a free provider preview Source: https://dench.com/docs/api-reference/campaigns/search-people-by-filters-without-adding-crm-records-or-campaign-recipients-search-credits-apply;-this-is-not-a-free-provider-preview /api-reference/openapi.json post /campaigns/audience/search Search people by filters without adding CRM records or campaign recipients. Search credits apply; this is not a free provider preview. # Set one person's personalized line by hand; an empty value undoes the edit. Braces are removed and text past the line's length is cut Source: https://dench.com/docs/api-reference/campaigns/set-one-persons-personalized-line-by-hand;-an-empty-value-undoes-the-edit-braces-are-removed-and-text-past-the-lines-length-is-cut /api-reference/openapi.json put /campaigns/people/{enrollmentId}/personalization Set one person's personalized line by hand; an empty value undoes the edit. Braces are removed and text past the line's length is cut. # Set up a lookalike from the best lead's LinkedIn URL (role, similar roles, place, industry, similar companies), suggest roles again, or re-scope to a company. Nothing is saved. Provider credits apply Source: https://dench.com/docs/api-reference/campaigns/set-up-a-lookalike-from-the-best-leads-linkedin-url-role-similar-roles-place-industry-similar-companies-suggest-roles-again-or-re-scope-to-a-company-nothing-is-saved-provider-credits-apply /api-reference/openapi.json post /campaigns/builder/lookalike Set up a lookalike from the best lead's LinkedIn URL (role, similar roles, place, industry, similar companies), suggest roles again, or re-scope to a company. Nothing is saved. Provider credits apply. # Show the message one person gets at one email or LinkedIn step, with their fields and personalized lines filled in: subject, body, sender, recipient, merge fields still missing, warnings, and why the step would be skipped. Nothing is sent, prepared or charged Source: https://dench.com/docs/api-reference/campaigns/show-the-message-one-person-gets-at-one-email-or-linkedin-step-with-their-fields-and-personalized-lines-filled-in:-subject-body-sender-recipient-merge-fields-still-missing-warnings-and-why-the-step-would-be-skipped-nothing-is-sent-prepared-or-charged /api-reference/openapi.json get /campaigns/{sequenceId}/preview Show the message one person gets at one email or LinkedIn step, with their fields and personalized lines filled in: subject, body, sender, recipient, merge fields still missing, warnings, and why the step would be skipped. Nothing is sent, prepared or charged. # Start the same billable signal/audience/message build used by the UI; poll the draft for progress Source: https://dench.com/docs/api-reference/campaigns/start-the-same-billable-signalaudiencemessage-build-used-by-the-ui;-poll-the-draft-for-progress /api-reference/openapi.json post /campaigns/builder/drafts/{draftId}/build Start the same billable signal/audience/message build used by the UI; poll the draft for progress. # Stop one person: nothing more is sent to them from this campaign Source: https://dench.com/docs/api-reference/campaigns/stop-one-person:-nothing-more-is-sent-to-them-from-this-campaign /api-reference/openapi.json post /campaigns/people/{enrollmentId}/stop Stop one person: nothing more is sent to them from this campaign. # Suggest market voices (LinkedIn experts) for the campaign's topics, to watch with voice_engagement. AI credits apply Source: https://dench.com/docs/api-reference/campaigns/suggest-market-voices-linkedin-experts-for-the-campaigns-topics-to-watch-with-voice_engagement-ai-credits-apply /api-reference/openapi.json post /campaigns/builder/voices Suggest market voices (LinkedIn experts) for the campaign's topics, to watch with voice_engagement. AI credits apply. # The campaigns a CRM record (a person or a lead) is in, newest first, with the person's status in each and the accounts that send to them Source: https://dench.com/docs/api-reference/campaigns/the-campaigns-a-crm-record-a-person-or-a-lead-is-in-newest-first-with-the-persons-status-in-each-and-the-accounts-that-send-to-them /api-reference/openapi.json get /campaigns/by-record/{entryId} The campaigns a CRM record (a person or a lead) is in, newest first, with the person's status in each and the accounts that send to them. # The campaign's activity log, newest first (sent, accepted, replied, skipped, failed, paused, stopped) Source: https://dench.com/docs/api-reference/campaigns/the-campaigns-activity-log-newest-first-sent-accepted-replied-skipped-failed-paused-stopped /api-reference/openapi.json get /campaigns/{sequenceId}/events The campaign's activity log, newest first (sent, accepted, replied, skipped, failed, paused, stopped). # Today's queue: who the campaign plans to contact today, warmest first, within the senders' limits Source: https://dench.com/docs/api-reference/campaigns/todays-queue:-who-the-campaign-plans-to-contact-today-warmest-first-within-the-senders-limits /api-reference/openapi.json get /campaigns/{sequenceId}/queue Today's queue: who the campaign plans to contact today, warmest first, within the senders' limits. # Turn an audience description into targeting filters. AI credits apply Source: https://dench.com/docs/api-reference/campaigns/turn-an-audience-description-into-targeting-filters-ai-credits-apply /api-reference/openapi.json post /campaigns/builder/autofill Turn an audience description into targeting filters. AI credits apply. # Turn off a campaign's personalized lines and cancel the ones not yet written. Refused while a step still uses one of the {{keys}} Source: https://dench.com/docs/api-reference/campaigns/turn-off-a-campaigns-personalized-lines-and-cancel-the-ones-not-yet-written-refused-while-a-step-still-uses-one-of-the- /api-reference/openapi.json delete /campaigns/{sequenceId}/personalization Turn off a campaign's personalized lines and cancel the ones not yet written. Refused while a step still uses one of the {{keys}}. # Update source cadence, pause/resume, targeting, signals or terms. Active sources may perform billable future work Source: https://dench.com/docs/api-reference/campaigns/update-source-cadence-pauseresume-targeting-signals-or-terms-active-sources-may-perform-billable-future-work /api-reference/openapi.json patch /campaigns/{sequenceId}/sources Update source cadence, pause/resume, targeting, signals or terms. Active sources may perform billable future work. # What the campaign is doing now, what comes next and when, and why it is holding Source: https://dench.com/docs/api-reference/campaigns/what-the-campaign-is-doing-now-what-comes-next-and-when-and-why-it-is-holding /api-reference/openapi.json get /campaigns/{sequenceId}/live What the campaign is doing now, what comes next and when, and why it is holding. # Where a campaign's people sit in the workspace's lead pipeline right now: each lead Status in order with how many enrolled leads are at it, and how many have no lead or a status outside the pipeline Source: https://dench.com/docs/api-reference/campaigns/where-a-campaigns-people-sit-in-the-workspaces-lead-pipeline-right-now:-each-lead-status-in-order-with-how-many-enrolled-leads-are-at-it-and-how-many-have-no-lead-or-a-status-outside-the-pipeline /api-reference/openapi.json get /campaigns/{sequenceId}/pipeline Where a campaign's people sit in the workspace's lead pipeline right now: each lead Status in order with how many enrolled leads are at it, and how many have no lead or a status outside the pipeline. # Write a fresh personalized line for one person: one key, or all of their lines when key is left out. About 3 cents Source: https://dench.com/docs/api-reference/campaigns/write-a-fresh-personalized-line-for-one-person:-one-key-or-all-of-their-lines-when-key-is-left-out-about-3-cents /api-reference/openapi.json post /campaigns/people/{enrollmentId}/personalization/rewrite Write a fresh personalized line for one person: one key, or all of their lines when key is left out. About 3 cents. # Write personalized lines for the people missing them (mode missing) or rewrite everyone's (mode all). Rewriting everyone or more than 100 people returns needsConfirm and the estimate until called with confirmed: true Source: https://dench.com/docs/api-reference/campaigns/write-personalized-lines-for-the-people-missing-them-mode-missing-or-rewrite-everyones-mode-all-rewriting-everyone-or-more-than-100-people-returns-needsconfirm-and-the-estimate-until-called-with-confirmed:-true /api-reference/openapi.json post /campaigns/{sequenceId}/personalization/write Write personalized lines for the people missing them (mode missing) or rewrite everyone's (mode all). Rewriting everyone or more than 100 people returns needsConfirm and the estimate until called with confirmed: true. # Delete threads Source: https://dench.com/docs/api-reference/chat/delete-threads /api-reference/openapi.json delete /chat/threads Delete one or more chat threads. # Follow stream Source: https://dench.com/docs/api-reference/chat/follow-stream /api-reference/openapi.json get /chat/threads/{threadId}/stream Follow a live chat response stream. # List threads Source: https://dench.com/docs/api-reference/chat/list-threads /api-reference/openapi.json get /chat/threads List past chat threads. # New chat Source: https://dench.com/docs/api-reference/chat/new-chat /api-reference/openapi.json post /chat/threads Start a new chat-turn workflow. # Read thread Source: https://dench.com/docs/api-reference/chat/read-thread /api-reference/openapi.json get /chat/threads/{threadId} Read a past chat thread. # Rename threads Source: https://dench.com/docs/api-reference/chat/rename-threads /api-reference/openapi.json patch /chat/threads Rename one or more chat threads. # Search chats Source: https://dench.com/docs/api-reference/chat/search-chats /api-reference/openapi.json get /chat/search Search past chat messages. # Send message Source: https://dench.com/docs/api-reference/chat/send-message /api-reference/openapi.json post /chat/threads/{threadId}/messages Send a message to an existing chat thread. # Thread tree Source: https://dench.com/docs/api-reference/chat/thread-tree /api-reference/openapi.json get /chat/tree Read the parent-child chat thread hierarchy. # A task's subtasks Source: https://dench.com/docs/api-reference/crm/a-tasks-subtasks /api-reference/openapi.json get /crm/tasks/{entryId}/subtasks A task's subtasks. # Abort transaction Source: https://dench.com/docs/api-reference/crm/abort-transaction /api-reference/openapi.json post /crm/transactions/{txnId}/abort Abort a CRM transaction. # Add a titled note to a CRM entry's activity timeline (markdown body). Research goes here, never into the Notes document Source: https://dench.com/docs/api-reference/crm/add-a-titled-note-to-a-crm-entrys-activity-timeline-markdown-body-research-goes-here-never-into-the-notes-document /api-reference/openapi.json post /crm/objects/{objectName}/entries/{entryId}/notes Add a titled note to a CRM entry's activity timeline (markdown body). Research goes here, never into the Notes document. # Add enum value Source: https://dench.com/docs/api-reference/crm/add-enum-value /api-reference/openapi.json post /crm/objects/{objectName}/fields/{fieldName}/enum Add an enum value. # Add operation Source: https://dench.com/docs/api-reference/crm/add-operation /api-reference/openapi.json post /crm/transactions/{txnId}/operations Add an operation to a CRM transaction. # Aggregate Source: https://dench.com/docs/api-reference/crm/aggregate /api-reference/openapi.json post /crm/aggregate Aggregate CRM entries. # Append cell Source: https://dench.com/docs/api-reference/crm/append-cell /api-reference/openapi.json post /crm/objects/{objectName}/entries/{entryId}/fields/{fieldName}/append Append to a CRM cell. # Batch operations Source: https://dench.com/docs/api-reference/crm/batch-operations /api-reference/openapi.json post /crm/batch Apply a CRM batch. # Begin transaction Source: https://dench.com/docs/api-reference/crm/begin-transaction /api-reference/openapi.json post /crm/transactions Begin a CRM transaction. # Bounded per-source counts of a CRM entry's activity ledger Source: https://dench.com/docs/api-reference/crm/bounded-per-source-counts-of-a-crm-entrys-activity-ledger /api-reference/openapi.json get /crm/objects/{objectName}/entries/{entryId}/activity/count Bounded per-source counts of a CRM entry's activity ledger. # Bring a hidden chart back onto the strip (hidden: false) Source: https://dench.com/docs/api-reference/crm/bring-a-hidden-chart-back-onto-the-strip-hidden:-false /api-reference/openapi.json post /crm/objects/{objectName}/analytics/panels/{panelId}/show Bring a hidden chart back onto the strip (hidden: false). # Bulk delete entries Source: https://dench.com/docs/api-reference/crm/bulk-delete-entries /api-reference/openapi.json post /crm/objects/{objectName}/entries/delete Bulk delete CRM entries. # Collapse the analytics strip above the object's table (team-shared, like saved views) Source: https://dench.com/docs/api-reference/crm/collapse-the-analytics-strip-above-the-objects-table-team-shared-like-saved-views /api-reference/openapi.json post /crm/objects/{objectName}/analytics/collapse Collapse the analytics strip above the object's table (team-shared, like saved views). # Comment on a CRM entry (markdown). Mention members with [@Name](/?member=); mention Dench with [@Dench](/?member=dench) or mentionDench Source: https://dench.com/docs/api-reference/crm/comment-on-a-crm-entry-markdown-mention-members-with-[@name]?member=;-mention-dench-with-[@dench]?member=dench-or-mentiondench /api-reference/openapi.json post /crm/objects/{objectName}/entries/{entryId}/comments Comment on a CRM entry (markdown). Mention members with [@Name](/?member=); mention Dench with [@Dench](/?member=dench) or mentionDench. # Commit transaction Source: https://dench.com/docs/api-reference/crm/commit-transaction /api-reference/openapi.json post /crm/transactions/{txnId}/commit Commit a CRM transaction. # Company profile Source: https://dench.com/docs/api-reference/crm/company-profile /api-reference/openapi.json post /enrichment/company Look up one company profile. # Compute chart-ready results (buckets / series / values) for the stored dashboard, a subset of its panels, or ad-hoc panel definitions — optionally scoped to a saved view, a period preset (with the previous interval as previousValue) and extra filters. Same query the strip renders from Source: https://dench.com/docs/api-reference/crm/compute-chart-ready-results-buckets-series-values-for-the-stored-dashboard-a-subset-of-its-panels-or-ad-hoc-panel-definitions-—-optionally-scoped-to-a-saved-view-a-period-preset-with-the-previous-interval-as-previousvalue-and-extra-filters-same-query-the-strip-renders-from /api-reference/openapi.json post /crm/objects/{objectName}/analytics/compute Compute chart-ready results (buckets / series / values) for the stored dashboard, a subset of its panels, or ad-hoc panel definitions — optionally scoped to a saved view, a period preset (with the previous interval as previousValue) and extra filters. Same query the strip renders from. # Create a named sidebar group (e.g. "Hiring") in the workspace-shared Library. Open to any member Source: https://dench.com/docs/api-reference/crm/create-a-named-sidebar-group-eg-"hiring"-in-the-workspace-shared-library-open-to-any-member /api-reference/openapi.json post /crm/sidebar/groups Create a named sidebar group (e.g. "Hiring") in the workspace-shared Library. Open to any member. # Create a saved view (named filters/sort/columns combo) on a CRM object Source: https://dench.com/docs/api-reference/crm/create-a-saved-view-named-filterssortcolumns-combo-on-a-crm-object /api-reference/openapi.json post /crm/objects/{objectName}/views Create a saved view (named filters/sort/columns combo) on a CRM object. # Create a subtask under a task (inherits the parent's record relations) Source: https://dench.com/docs/api-reference/crm/create-a-subtask-under-a-task-inherits-the-parents-record-relations /api-reference/openapi.json post /crm/tasks/{entryId}/subtasks Create a subtask under a task (inherits the parent's record relations). # Create a task linked to a CRM entry Source: https://dench.com/docs/api-reference/crm/create-a-task-linked-to-a-crm-entry /api-reference/openapi.json post /crm/objects/{objectName}/entries/{entryId}/tasks Create a task linked to a CRM entry. # Create document Source: https://dench.com/docs/api-reference/crm/create-document /api-reference/openapi.json post /crm/docs Create a CRM document. # Create entry Source: https://dench.com/docs/api-reference/crm/create-entry /api-reference/openapi.json post /crm/objects/{objectName}/entries Create a CRM entry. # Create field Source: https://dench.com/docs/api-reference/crm/create-field /api-reference/openapi.json post /crm/objects/{objectName}/fields Create a CRM field or read-only campaign activity boolean column. # Create many entries Source: https://dench.com/docs/api-reference/crm/create-many-entries /api-reference/openapi.json post /crm/objects/{objectName}/entries/batch Create many CRM entries. # Create object Source: https://dench.com/docs/api-reference/crm/create-object /api-reference/openapi.json post /crm/objects Create a CRM object. # Create or update one panel (upsert by id). With viewName the write lands on that saved view's own dashboard, forking a copy if it was still inheriting the object's Source: https://dench.com/docs/api-reference/crm/create-or-update-one-panel-upsert-by-id-with-viewname-the-write-lands-on-that-saved-views-own-dashboard-forking-a-copy-if-it-was-still-inheriting-the-objects /api-reference/openapi.json put /crm/objects/{objectName}/analytics/panels/{panelId} Create or update one panel (upsert by id). With viewName the write lands on that saved view's own dashboard, forking a copy if it was still inheriting the object's. # Create or upsert an action button on a named action column (fieldName is the column header; a column can hold multiple buttons — reuse fieldName to add more) Source: https://dench.com/docs/api-reference/crm/create-or-upsert-an-action-button-on-a-named-action-column-fieldname-is-the-column-header;-a-column-can-hold-multiple-buttons-—-reuse-fieldname-to-add-more /api-reference/openapi.json post /crm/actions Create or upsert an action button on a named action column (fieldName is the column header; a column can hold multiple buttons — reuse fieldName to add more). # Delete a comment (kept as a tombstone when it has replies) Source: https://dench.com/docs/api-reference/crm/delete-a-comment-kept-as-a-tombstone-when-it-has-replies /api-reference/openapi.json delete /crm/comments/{commentId} Delete a comment (kept as a tombstone when it has replies). # Delete a saved view by name (idempotent) Source: https://dench.com/docs/api-reference/crm/delete-a-saved-view-by-name-idempotent /api-reference/openapi.json delete /crm/objects/{objectName}/views/{viewName} Delete a saved view by name (idempotent). # Delete a task and its subtasks, or keep them as tasks Source: https://dench.com/docs/api-reference/crm/delete-a-task-and-its-subtasks-or-keep-them-as-tasks /api-reference/openapi.json delete /crm/tasks/{entryId} Delete a task and its subtasks, or keep them as tasks. # Delete an action button from a CRM field Source: https://dench.com/docs/api-reference/crm/delete-an-action-button-from-a-crm-field /api-reference/openapi.json delete /crm/actions/{actionId} Delete an action button from a CRM field. # Delete document Source: https://dench.com/docs/api-reference/crm/delete-document /api-reference/openapi.json delete /crm/docs/{documentId} Delete a CRM document page; its workspace file stays and nested pages move up. # Delete entry Source: https://dench.com/docs/api-reference/crm/delete-entry /api-reference/openapi.json delete /crm/objects/{objectName}/entries/{entryId} Delete a CRM entry. # Delete field Source: https://dench.com/docs/api-reference/crm/delete-field /api-reference/openapi.json delete /crm/objects/{objectName}/fields/{fieldName} Delete a CRM field. # Delete object Source: https://dench.com/docs/api-reference/crm/delete-object /api-reference/openapi.json delete /crm/objects/{name} Delete a CRM object. # Delete one panel (idempotent). Template panels are tombstoned so a re-install never resurrects them Source: https://dench.com/docs/api-reference/crm/delete-one-panel-idempotent-template-panels-are-tombstoned-so-a-re-install-never-resurrects-them /api-reference/openapi.json delete /crm/objects/{objectName}/analytics/panels/{panelId} Delete one panel (idempotent). Template panels are tombstoned so a re-install never resurrects them. # Describe the workspace sidebar: Library rows in tree order (with their groups), the home-level Pinned strip, what is hidden and why, and whether the caller is an admin Source: https://dench.com/docs/api-reference/crm/describe-the-workspace-sidebar:-library-rows-in-tree-order-with-their-groups-the-home-level-pinned-strip-what-is-hidden-and-why-and-whether-the-caller-is-an-admin /api-reference/openapi.json get /crm/sidebar Describe the workspace sidebar: Library rows in tree order (with their groups), the home-level Pinned strip, what is hidden and why, and whether the caller is an admin. # Dissolve a sidebar group; its rows return to the top level in its slot. Open to any member Source: https://dench.com/docs/api-reference/crm/dissolve-a-sidebar-group;-its-rows-return-to-the-top-level-in-its-slot-open-to-any-member /api-reference/openapi.json post /crm/sidebar/groups/delete Dissolve a sidebar group; its rows return to the top level in its slot. Open to any member. # Edit a comment you wrote Source: https://dench.com/docs/api-reference/crm/edit-a-comment-you-wrote /api-reference/openapi.json patch /crm/comments/{commentId} Edit a comment you wrote. # Edit part of one stored panel: only the keys in `patch` change (title, type, metric, metricField, groupBy, dateField, dateBucket, filters, derived, span, hidden, sortOrder); null clears an optional key. What the card's ⋮ menu writes Source: https://dench.com/docs/api-reference/crm/edit-part-of-one-stored-panel:-only-the-keys-in-`patch`-change-title-type-metric-metricfield-groupby-datefield-datebucket-filters-derived-span-hidden-sortorder;-null-clears-an-optional-key-what-the-cards-⋮-menu-writes /api-reference/openapi.json patch /crm/objects/{objectName}/analytics/panels/{panelId} Edit part of one stored panel: only the keys in `patch` change (title, type, metric, metricField, groupBy, dateField, dateBucket, filters, derived, span, hidden, sortOrder); null clears an optional key. What the card's ⋮ menu writes. # Enrich cell Source: https://dench.com/docs/api-reference/crm/enrich-cell /api-reference/openapi.json post /crm/enrich/cell Request enrichment for one CRM cell. # Enrich object Source: https://dench.com/docs/api-reference/crm/enrich-object /api-reference/openapi.json post /crm/enrich/object Request enrichment for a CRM object. # Every occurrence (task) of one series Source: https://dench.com/docs/api-reference/crm/every-occurrence-task-of-one-series /api-reference/openapi.json get /crm/tasks/series/{seriesId}/occurrences Every occurrence (task) of one series. # Every repeating-task series in the workspace Source: https://dench.com/docs/api-reference/crm/every-repeating-task-series-in-the-workspace /api-reference/openapi.json get /crm/tasks/series Every repeating-task series in the workspace. # Expand the analytics strip above the object's table Source: https://dench.com/docs/api-reference/crm/expand-the-analytics-strip-above-the-objects-table /api-reference/openapi.json post /crm/objects/{objectName}/analytics/expand Expand the analytics strip above the object's table. # Follow or unfollow a CRM entry's activity Source: https://dench.com/docs/api-reference/crm/follow-or-unfollow-a-crm-entrys-activity /api-reference/openapi.json put /crm/objects/{objectName}/entries/{entryId}/watch Follow or unfollow a CRM entry's activity. # Generate report Source: https://dench.com/docs/api-reference/crm/generate-report /api-reference/openapi.json post /crm/reports Generate a CRM report. # Get cell Source: https://dench.com/docs/api-reference/crm/get-cell /api-reference/openapi.json get /crm/objects/{objectName}/entries/{entryId}/fields/{fieldName} Get a CRM cell value. # Get entry Source: https://dench.com/docs/api-reference/crm/get-entry /api-reference/openapi.json get /crm/objects/{objectName}/entries/{entryId} Get a CRM entry. # Get object Source: https://dench.com/docs/api-reference/crm/get-object /api-reference/openapi.json get /crm/objects/{name} Get a CRM object. # Get one comment with its entry label Source: https://dench.com/docs/api-reference/crm/get-one-comment-with-its-entry-label /api-reference/openapi.json get /crm/comments/{commentId} Get one comment with its entry label. # Get one saved view's definition by name Source: https://dench.com/docs/api-reference/crm/get-one-saved-views-definition-by-name /api-reference/openapi.json get /crm/objects/{objectName}/views/{viewName} Get one saved view's definition by name. # Give a saved view its own dashboard (mode "own": starts as a copy of the object's panels) or hand it back to the object's shared one (mode "shared") Source: https://dench.com/docs/api-reference/crm/give-a-saved-view-its-own-dashboard-mode-"own":-starts-as-a-copy-of-the-objects-panels-or-hand-it-back-to-the-objects-shared-one-mode-"shared" /api-reference/openapi.json post /crm/objects/{objectName}/views/{viewName}/analytics/scope Give a saved view its own dashboard (mode "own": starts as a copy of the object's panels) or hand it back to the object's shared one (mode "shared"). # Has Dench read this record's email history? One row per address per mailbox Source: https://dench.com/docs/api-reference/crm/has-dench-read-this-records-email-history?-one-row-per-address-per-mailbox /api-reference/openapi.json get /crm/objects/{objectName}/entries/{entryId}/sync-history Has Dench read this record's email history? One row per address per mailbox. # Hide (`hidden: true`) or show the caller's own emails / messages with this record to the workspace. An account covers every contact and opportunity linked to it; existing ledger rows are restamped and the shared Brief regenerates Source: https://dench.com/docs/api-reference/crm/hide-`hidden:-true`-or-show-the-callers-own-emails-messages-with-this-record-to-the-workspace-an-account-covers-every-contact-and-opportunity-linked-to-it;-existing-ledger-rows-are-restamped-and-the-shared-brief-regenerates /api-reference/openapi.json put /crm/entries/{entryId}/privacy Hide (`hidden: true`) or show the caller's own emails / messages with this record to the workspace. An account covers every contact and opportunity linked to it; existing ledger rows are restamped and the shared Brief regenerates. # Hide a CRM object's workspace sidebar row for the whole workspace. Not a delete — the table keeps working. Admin-only Source: https://dench.com/docs/api-reference/crm/hide-a-crm-objects-workspace-sidebar-row-for-the-whole-workspace-not-a-delete-—-the-table-keeps-working-admin-only /api-reference/openapi.json post /crm/objects/{name}/archive Hide a CRM object's workspace sidebar row for the whole workspace. Not a delete — the table keeps working. Admin-only. # How a task repeats (rule, RRULE, trigger, ends, next due) Source: https://dench.com/docs/api-reference/crm/how-a-task-repeats-rule-rrule-trigger-ends-next-due /api-reference/openapi.json get /crm/tasks/{entryId}/repeat How a task repeats (rule, RRULE, trigger, ends, next due). # Inspect transaction Source: https://dench.com/docs/api-reference/crm/inspect-transaction /api-reference/openapi.json get /crm/transactions/{txnId} Inspect a CRM transaction. # Install CRM template Source: https://dench.com/docs/api-reference/crm/install-crm-template /api-reference/openapi.json post /crm/templates/{templateId}/install Install a CRM template. Idempotent: re-installs top up missing pieces and never duplicate objects, automations, or sample rows. # Link document Source: https://dench.com/docs/api-reference/crm/link-document /api-reference/openapi.json post /crm/docs/link Link a CRM document. # List a CRM entry's activity ledger (comments, notes, field changes, emails, meetings, Slack, LinkedIn) in one timeline, newest first by default Source: https://dench.com/docs/api-reference/crm/list-a-crm-entrys-activity-ledger-comments-notes-field-changes-emails-meetings-slack-linkedin-in-one-timeline-newest-first-by-default /api-reference/openapi.json get /crm/objects/{objectName}/entries/{entryId}/activity List a CRM entry's activity ledger (comments, notes, field changes, emails, meetings, Slack, LinkedIn) in one timeline, newest first by default. # List a CRM entry's audit history Source: https://dench.com/docs/api-reference/crm/list-a-crm-entrys-audit-history /api-reference/openapi.json get /crm/objects/{objectName}/entries/{entryId}/history List a CRM entry's audit history. # List a CRM entry's notes (titled, document-style comments), newest first Source: https://dench.com/docs/api-reference/crm/list-a-crm-entrys-notes-titled-document-style-comments-newest-first /api-reference/openapi.json get /crm/objects/{objectName}/entries/{entryId}/notes List a CRM entry's notes (titled, document-style comments), newest first. # List account-detection verdicts — why a domain (or personal address) did or did not become an account: verdict, counterparty type, probabilities, evidence threads, the rows created. `kind` picks the creator: `detections` (email + sweep), `linkedin` (the LinkedIn resolver's rows) or `all` (default). Newest first Source: https://dench.com/docs/api-reference/crm/list-account-detection-verdicts-—-why-a-domain-or-personal-address-did-or-did-not-become-an-account:-verdict-counterparty-type-probabilities-evidence-threads-the-rows-created-`kind`-picks-the-creator:-`detections`-email-+-sweep-`linkedin`-the-linkedin-resolvers-rows-or-`all`-default-newest-first /api-reference/openapi.json get /crm/detections List account-detection verdicts — why a domain (or personal address) did or did not become an account: verdict, counterparty type, probabilities, evidence threads, the rows created. `kind` picks the creator: `detections` (email + sweep), `linkedin` (the LinkedIn resolver's rows) or `all` (default). Newest first. # List actions Source: https://dench.com/docs/api-reference/crm/list-actions /api-reference/openapi.json get /crm/actions List CRM actions. # List comments on a CRM entry (roots newest first, with preview replies) Source: https://dench.com/docs/api-reference/crm/list-comments-on-a-crm-entry-roots-newest-first-with-preview-replies /api-reference/openapi.json get /crm/objects/{objectName}/entries/{entryId}/comments List comments on a CRM entry (roots newest first, with preview replies). # List CRM automations Source: https://dench.com/docs/api-reference/crm/list-crm-automations /api-reference/openapi.json get /crm/automations List deterministic CRM automations (rules that fire inside entry writes, e.g. qualified prospect → opportunity). # List CRM templates Source: https://dench.com/docs/api-reference/crm/list-crm-templates /api-reference/openapi.json get /crm/templates List one-click CRM templates (objects + automations + sample rows) with per-workspace installed flags. # List documents Source: https://dench.com/docs/api-reference/crm/list-documents /api-reference/openapi.json get /crm/docs List CRM documents. # List entries Source: https://dench.com/docs/api-reference/crm/list-entries /api-reference/openapi.json get /crm/objects/{objectName}/entries List CRM entries. # List every reply under a root comment, oldest first Source: https://dench.com/docs/api-reference/crm/list-every-reply-under-a-root-comment-oldest-first /api-reference/openapi.json get /crm/comments/{commentId}/replies List every reply under a root comment, oldest first. # List field names, types and effective constraints without indexing or enrichment internals Source: https://dench.com/docs/api-reference/crm/list-field-names-types-and-effective-constraints-without-indexing-or-enrichment-internals /api-reference/openapi.json get /crm/catalog/objects/{objectName}/fields List field names, types and effective constraints without indexing or enrichment internals. # List fields Source: https://dench.com/docs/api-reference/crm/list-fields /api-reference/openapi.json get /crm/objects/{objectName}/fields List fields for a CRM object, including read-only calculation metadata. # List Lead Finder filter vocabularies: exact enum values (seniorities, functions, industries, headcount, company types, languages) and curated suggestions (titles, locations, company HQ, universities, skills, keywords) Source: https://dench.com/docs/api-reference/crm/list-lead-finder-filter-vocabularies:-exact-enum-values-seniorities-functions-industries-headcount-company-types-languages-and-curated-suggestions-titles-locations-company-hq-universities-skills-keywords /api-reference/openapi.json get /local/enrichment/filter-options List Lead Finder filter vocabularies: exact enum values (seniorities, functions, industries, headcount, company types, languages) and curated suggestions (titles, locations, company HQ, universities, skills, keywords). # List members Source: https://dench.com/docs/api-reference/crm/list-members /api-reference/openapi.json get /members List workspace members for CRM user fields. # List names, display labels, visibility and workspace counts without internal state Source: https://dench.com/docs/api-reference/crm/list-names-display-labels-visibility-and-workspace-counts-without-internal-state /api-reference/openapi.json get /crm/catalog/objects List names, display labels, visibility and workspace counts without internal state. # List objects Source: https://dench.com/docs/api-reference/crm/list-objects /api-reference/openapi.json get /crm/objects List CRM objects. # List statuses Source: https://dench.com/docs/api-reference/crm/list-statuses /api-reference/openapi.json get /crm/objects/{objectName}/statuses List CRM statuses. # List the saved views on a CRM object (plus the active view) Source: https://dench.com/docs/api-reference/crm/list-the-saved-views-on-a-crm-object-plus-the-active-view /api-reference/openapi.json get /crm/objects/{objectName}/views List the saved views on a CRM object (plus the active view). # Look up up to 100 people or company profiles without buying emails or phones. Pass kind (people|companies) and lookups; results preserve inputIndex. People require linkedinUrl or email; companies require domain or linkedinUrl Source: https://dench.com/docs/api-reference/crm/look-up-up-to-100-people-or-company-profiles-without-buying-emails-or-phones-pass-kind-people|companies-and-lookups;-results-preserve-inputindex-people-require-linkedinurl-or-email;-companies-require-domain-or-linkedinurl /api-reference/openapi.json post /enrichment/profiles/bulk Look up up to 100 people or company profiles without buying emails or phones. Pass kind (people|companies) and lookups; results preserve inputIndex. People require linkedinUrl or email; companies require domain or linkedinUrl. # Make a task repeat, or change how it repeats (JSON rule or RRULE). An undated task gets its due date anchored on the first matching day from today Source: https://dench.com/docs/api-reference/crm/make-a-task-repeat-or-change-how-it-repeats-json-rule-or-rrule-an-undated-task-gets-its-due-date-anchored-on-the-first-matching-day-from-today /api-reference/openapi.json put /crm/tasks/{entryId}/repeat Make a task repeat, or change how it repeats (JSON rule or RRULE). An undated task gets its due date anchored on the first matching day from today. # Mark a task done Source: https://dench.com/docs/api-reference/crm/mark-a-task-done /api-reference/openapi.json post /crm/tasks/{entryId}/complete Mark a task done. # Materialize a saved view's rows (applies its filters/sort/pins), paginated Source: https://dench.com/docs/api-reference/crm/materialize-a-saved-views-rows-applies-its-filterssortpins-paginated /api-reference/openapi.json get /crm/objects/{objectName}/views/{viewName}/entries Materialize a saved view's rows (applies its filters/sort/pins), paginated. # Move a pinned view's sidebar row into the Archived flyout. Admin-only Source: https://dench.com/docs/api-reference/crm/move-a-pinned-views-sidebar-row-into-the-archived-flyout-admin-only /api-reference/openapi.json post /crm/objects/{objectName}/views/{viewName}/archive Move a pinned view's sidebar row into the Archived flyout. Admin-only. # Move a sidebar row into a group (groupId set) or back to the top level (groupId null). Open to any member Source: https://dench.com/docs/api-reference/crm/move-a-sidebar-row-into-a-group-groupid-set-or-back-to-the-top-level-groupid-null-open-to-any-member /api-reference/openapi.json post /crm/sidebar/groups/move Move a sidebar row into a group (groupId set) or back to the top level (groupId null). Open to any member. # Nest a task under a parent, or promote it (parentEntryId: null) Source: https://dench.com/docs/api-reference/crm/nest-a-task-under-a-parent-or-promote-it-parententryid:-null /api-reference/openapi.json put /crm/tasks/{entryId}/parent Nest a task under a parent, or promote it (parentEntryId: null). # Page all tasks linked to a record, including subtasks Source: https://dench.com/docs/api-reference/crm/page-all-tasks-linked-to-a-record-including-subtasks /api-reference/openapi.json post /crm/objects/{objectName}/entries/{entryId}/tasks/page Page all tasks linked to a record, including subtasks. # Page assigned tasks in priority order (or completed tasks by recency) Source: https://dench.com/docs/api-reference/crm/page-assigned-tasks-in-priority-order-or-completed-tasks-by-recency /api-reference/openapi.json post /crm/tasks/assigned/page Page assigned tasks in priority order (or completed tasks by recency). # Pause a repeating task Source: https://dench.com/docs/api-reference/crm/pause-a-repeating-task /api-reference/openapi.json post /crm/tasks/{entryId}/repeat/pause Pause a repeating task. # Persist the full panel order. panelIds must name every stored panel of the targeted dashboard Source: https://dench.com/docs/api-reference/crm/persist-the-full-panel-order-panelids-must-name-every-stored-panel-of-the-targeted-dashboard /api-reference/openapi.json post /crm/objects/{objectName}/analytics/reorder Persist the full panel order. panelIds must name every stored panel of the targeted dashboard. # Person contact Source: https://dench.com/docs/api-reference/crm/person-contact /api-reference/openapi.json post /enrichment/person/contact Look up verified emails and phones for people. # Person profile Source: https://dench.com/docs/api-reference/crm/person-profile /api-reference/openapi.json post /enrichment/person Look up one person profile. # Pin (pinned true) or unpin a Library row — or a whole group — on the home-level Pinned shortcut strip (the "tab on the left"). Does not move the row inside Library. Workspace-shared; open to any member Source: https://dench.com/docs/api-reference/crm/pin-pinned-true-or-unpin-a-library-row-—-or-a-whole-group-—-on-the-home-level-pinned-shortcut-strip-the-"tab-on-the-left"-does-not-move-the-row-inside-library-workspace-shared;-open-to-any-member /api-reference/openapi.json post /crm/sidebar/pins Pin (pinned true) or unpin a Library row — or a whole group — on the home-level Pinned shortcut strip (the "tab on the left"). Does not move the row inside Library. Workspace-shared; open to any member. # Preview search Source: https://dench.com/docs/api-reference/crm/preview-search /api-reference/openapi.json post /enrichment/search/preview Preview how many records a find would return. # Query entries Source: https://dench.com/docs/api-reference/crm/query-entries /api-reference/openapi.json post /crm/query Query CRM entries. # Queue a full, paged pull of the record's email history from every connected mailbox; the ledger fills as pages land Source: https://dench.com/docs/api-reference/crm/queue-a-full-paged-pull-of-the-records-email-history-from-every-connected-mailbox;-the-ledger-fills-as-pages-land /api-reference/openapi.json post /crm/objects/{objectName}/entries/{entryId}/sync-history Queue a full, paged pull of the record's email history from every connected mailbox; the ledger fills as pages land. # Read an object's analytics dashboard: panels, field roles, the strip's collapsed flag, the named view's own dashboard (if any), and the fields panels may bucket on (synthetic $createdAt / $location last) Source: https://dench.com/docs/api-reference/crm/read-an-objects-analytics-dashboard:-panels-field-roles-the-strips-collapsed-flag-the-named-views-own-dashboard-if-any-and-the-fields-panels-may-bucket-on-synthetic-$createdat-$location-last /api-reference/openapi.json get /crm/objects/{objectName}/analytics Read an object's analytics dashboard: panels, field roles, the strip's collapsed flag, the named view's own dashboard (if any), and the fields panels may bucket on (synthetic $createdAt / $location last). # Read company employees, founders, funding, investors, acquisitions, or investments. Pass domain or linkedinUrl, kind, limit (1–100), and optional pageToken. Does not import CRM records or buy contacts Source: https://dench.com/docs/api-reference/crm/read-company-employees-founders-funding-investors-acquisitions-or-investments-pass-domain-or-linkedinurl-kind-limit-1–100-and-optional-pagetoken-does-not-import-crm-records-or-buy-contacts /api-reference/openapi.json post /enrichment/company/related Read company employees, founders, funding, investors, acquisitions, or investments. Pass domain or linkedinUrl, kind, limit (1–100), and optional pageToken. Does not import CRM records or buy contacts. # Read-only source diagnostics: accessible evidence, association reasons, last Brief source manifest, generation queue, and your mailbox delivery health. Bounded, cursor-paged snapshot; does not certify complete history Source: https://dench.com/docs/api-reference/crm/read-only-source-diagnostics:-accessible-evidence-association-reasons-last-brief-source-manifest-generation-queue-and-your-mailbox-delivery-health-bounded-cursor-paged-snapshot;-does-not-certify-complete-history /api-reference/openapi.json get /crm/objects/{objectName}/entries/{entryId}/context Read-only source diagnostics: accessible evidence, association reasons, last Brief source manifest, generation queue, and your mailbox delivery health. Bounded, cursor-paged snapshot; does not certify complete history. # Rebuild a record's Brief from the current timeline Source: https://dench.com/docs/api-reference/crm/rebuild-a-records-brief-from-the-current-timeline /api-reference/openapi.json post /crm/objects/{objectName}/entries/{entryId}/brief/regenerate Rebuild a record's Brief from the current timeline. # Remove enum value Source: https://dench.com/docs/api-reference/crm/remove-enum-value /api-reference/openapi.json delete /crm/objects/{objectName}/fields/{fieldName}/enum/{value} Remove an enum value. # Remove template sample data Source: https://dench.com/docs/api-reference/crm/remove-template-sample-data /api-reference/openapi.json post /crm/templates/{templateId}/remove-sample-data Delete a CRM template's sample rows (tagged "Sample"); schema, views, and automations stay. # Rename a sidebar group. Open to any member Source: https://dench.com/docs/api-reference/crm/rename-a-sidebar-group-open-to-any-member /api-reference/openapi.json post /crm/sidebar/groups/rename Rename a sidebar group. Open to any member. # Rename enum value Source: https://dench.com/docs/api-reference/crm/rename-enum-value /api-reference/openapi.json post /crm/objects/{objectName}/fields/{fieldName}/enum/{oldValue}/rename Rename an enum value. # Rename object Source: https://dench.com/docs/api-reference/crm/rename-object /api-reference/openapi.json post /crm/objects/{from}/rename Rename a CRM object. # Rename view Source: https://dench.com/docs/api-reference/crm/rename-view /api-reference/openapi.json post /crm/objects/{objectName}/views/{viewName}/rename Rename a saved view in place — keeps its filters, pins, and sidebar slot. # Reopen a completed task Source: https://dench.com/docs/api-reference/crm/reopen-a-completed-task /api-reference/openapi.json post /crm/tasks/{entryId}/reopen Reopen a completed task. # Reorder enum values Source: https://dench.com/docs/api-reference/crm/reorder-enum-values /api-reference/openapi.json post /crm/objects/{objectName}/fields/{fieldName}/enum/reorder Reorder enum values. # Reorder fields Source: https://dench.com/docs/api-reference/crm/reorder-fields /api-reference/openapi.json post /crm/objects/{objectName}/fields/reorder Reorder CRM fields. # Replace a saved view's definition (upsert by name) Source: https://dench.com/docs/api-reference/crm/replace-a-saved-views-definition-upsert-by-name /api-reference/openapi.json patch /crm/objects/{objectName}/views/{viewName} Replace a saved view's definition (upsert by name). # Reposition one Library row (or group) among the Library's top-level slots. Does not add a home-level Pinned tab. Workspace-shared; admin-only Source: https://dench.com/docs/api-reference/crm/reposition-one-library-row-or-group-among-the-librarys-top-level-slots-does-not-add-a-home-level-pinned-tab-workspace-shared;-admin-only /api-reference/openapi.json post /crm/sidebar/move Reposition one Library row (or group) among the Library's top-level slots. Does not add a home-level Pinned tab. Workspace-shared; admin-only. # Research the account again and append a fresh dossier section to its Notes (needs a Website / Domain on the record) Source: https://dench.com/docs/api-reference/crm/research-the-account-again-and-append-a-fresh-dossier-section-to-its-notes-needs-a-website-domain-on-the-record /api-reference/openapi.json post /crm/entries/{entryId}/dossier/regenerate Research the account again and append a fresh dossier section to its Notes (needs a Website / Domain on the record). # Restore a CRM object's workspace sidebar row. Admin-only Source: https://dench.com/docs/api-reference/crm/restore-a-crm-objects-workspace-sidebar-row-admin-only /api-reference/openapi.json post /crm/objects/{name}/unarchive Restore a CRM object's workspace sidebar row. Admin-only. # Restore a view's sidebar row (re-asserts its pin). Admin-only Source: https://dench.com/docs/api-reference/crm/restore-a-views-sidebar-row-re-asserts-its-pin-admin-only /api-reference/openapi.json post /crm/objects/{objectName}/views/{viewName}/unarchive Restore a view's sidebar row (re-asserts its pin). Admin-only. # Resume a paused repeating task Source: https://dench.com/docs/api-reference/crm/resume-a-paused-repeating-task /api-reference/openapi.json post /crm/tasks/{entryId}/repeat/resume Resume a paused repeating task. # Run action Source: https://dench.com/docs/api-reference/crm/run-action /api-reference/openapi.json post /crm/actions/{actionId}/runs Run a CRM action on one or more entries. # Scan CRM entries with a resumable cursor. Empty filtered pages can have more results Source: https://dench.com/docs/api-reference/crm/scan-crm-entries-with-a-resumable-cursor-empty-filtered-pages-can-have-more-results /api-reference/openapi.json post /crm/query/page Scan CRM entries with a resumable cursor. Empty filtered pages can have more results. # Search bounded pages of readable CRM entries, optionally projecting cells. Always follow continueCursor until isDone Source: https://dench.com/docs/api-reference/crm/search-bounded-pages-of-readable-crm-entries-optionally-projecting-cells-always-follow-continuecursor-until-isdone /api-reference/openapi.json get /crm/search/page Search bounded pages of readable CRM entries, optionally projecting cells. Always follow continueCursor until isDone. # Search companies Source: https://dench.com/docs/api-reference/crm/search-companies /api-reference/openapi.json post /enrichment/company/search Search for companies through the enrichment gateway (also `dench companies find`). # Search entries Source: https://dench.com/docs/api-reference/crm/search-entries /api-reference/openapi.json get /crm/search Search CRM entries. # Search jobs Source: https://dench.com/docs/api-reference/crm/search-jobs /api-reference/openapi.json post /enrichment/jobs/search Search job postings through Dench find. `companyDomains` takes up to 1000 domains (chunked automatically); `dench jobs find --company-list ` resolves a saved company list into it. # Search people Source: https://dench.com/docs/api-reference/crm/search-people /api-reference/openapi.json post /enrichment/people/search Search for people through the enrichment gateway. `companyDomains` takes up to 1000 domains (e.g. a resolved company list; `dench leads find --company-list ` resolves one for you) — the gateway fans large lists out as sequential vendor-safe chunks behind one `nextPageToken` stream. # Set a card's width on the 6-track dashboard grid: span 2 (third), 3 (half), 4 (two thirds), 6 (full), or null for the chart kind's default Source: https://dench.com/docs/api-reference/crm/set-a-cards-width-on-the-6-track-dashboard-grid:-span-2-third-3-half-4-two-thirds-6-full-or-null-for-the-chart-kinds-default /api-reference/openapi.json post /crm/objects/{objectName}/analytics/panels/{panelId}/resize Set a card's width on the 6-track dashboard grid: span 2 (third), 3 (half), 4 (two thirds), 6 (full), or null for the chart kind's default. # Set cell Source: https://dench.com/docs/api-reference/crm/set-cell /api-reference/openapi.json put /crm/objects/{objectName}/entries/{entryId}/fields/{fieldName} Set a CRM cell value. # Set enum color Source: https://dench.com/docs/api-reference/crm/set-enum-color /api-reference/openapi.json post /crm/objects/{objectName}/fields/{fieldName}/enum/{value}/color Set an enum color. # Set many cells Source: https://dench.com/docs/api-reference/crm/set-many-cells /api-reference/openapi.json post /crm/cells/batch Set many CRM cell values. # Set or clear a task's priority Source: https://dench.com/docs/api-reference/crm/set-or-clear-a-tasks-priority /api-reference/openapi.json put /crm/tasks/{entryId}/priority Set or clear a task's priority. # Set statuses Source: https://dench.com/docs/api-reference/crm/set-statuses /api-reference/openapi.json put /crm/objects/{objectName}/statuses Set CRM statuses. # Set the object's analytics setup — the field roles shared by every chart and view (amount, stage, won/lost/converted values, stageProbabilities, closeDate, recurrence, owner, location). Replaces the mapping; with merge: true only the keys given change and null clears one Source: https://dench.com/docs/api-reference/crm/set-the-objects-analytics-setup-—-the-field-roles-shared-by-every-chart-and-view-amount-stage-wonlostconverted-values-stageprobabilities-closedate-recurrence-owner-location-replaces-the-mapping;-with-merge:-true-only-the-keys-given-change-and-null-clears-one /api-reference/openapi.json put /crm/objects/{objectName}/analytics/roles Set the object's analytics setup — the field roles shared by every chart and view (amount, stage, won/lost/converted values, stageProbabilities, closeDate, recurrence, owner, location). Replaces the mapping; with merge: true only the keys given change and null clears one. # Skip the current occurrence: the next one is created now Source: https://dench.com/docs/api-reference/crm/skip-the-current-occurrence:-the-next-one-is-created-now /api-reference/openapi.json post /crm/tasks/{entryId}/repeat/skip Skip the current occurrence: the next one is created now. # SQL query Source: https://dench.com/docs/api-reference/crm/sql-query /api-reference/openapi.json post /crm/sql Run CRM SQL-compatible query. # Start or resume preparation of exact task ordering and progress Source: https://dench.com/docs/api-reference/crm/start-or-resume-preparation-of-exact-task-ordering-and-progress /api-reference/openapi.json post /crm/tasks/prepare Start or resume preparation of exact task ordering and progress. # Status of the account's research dossier — the delimited `dench:dossier` section Dench keeps in the record's Notes: status, when it was written, how many dated updates followed, the last error Source: https://dench.com/docs/api-reference/crm/status-of-the-accounts-research-dossier-—-the-delimited-`dench:dossier`-section-dench-keeps-in-the-records-notes:-status-when-it-was-written-how-many-dated-updates-followed-the-last-error /api-reference/openapi.json get /crm/entries/{entryId}/dossier Status of the account's research dossier — the delimited `dench:dossier` section Dench keeps in the record's Notes: status, when it was written, how many dated updates followed, the last error. # Stop a task repeating (past occurrences are kept) Source: https://dench.com/docs/api-reference/crm/stop-a-task-repeating-past-occurrences-are-kept /api-reference/openapi.json delete /crm/tasks/{entryId}/repeat Stop a task repeating (past occurrences are kept). # Take a chart off the strip above the table (hidden: true). It stays in the full analytics view, counted by the strip's “+N more” Source: https://dench.com/docs/api-reference/crm/take-a-chart-off-the-strip-above-the-table-hidden:-true-it-stays-in-the-full-analytics-view-counted-by-the-strips-“+n-more” /api-reference/openapi.json post /crm/objects/{objectName}/analytics/panels/{panelId}/hide Take a chart off the strip above the table (hidden: true). It stays in the full analytics view, counted by the strip's “+N more”. # Tasks linked to a CRM entry Source: https://dench.com/docs/api-reference/crm/tasks-linked-to-a-crm-entry /api-reference/openapi.json get /crm/objects/{objectName}/entries/{entryId}/tasks Tasks linked to a CRM entry. # The record's generated Brief: health, who owes the next move, open threads, commitments, risks, next step. Read this before the ledger Source: https://dench.com/docs/api-reference/crm/the-records-generated-brief:-health-who-owes-the-next-move-open-threads-commitments-risks-next-step-read-this-before-the-ledger /api-reference/openapi.json get /crm/objects/{objectName}/entries/{entryId}/brief The record's generated Brief: health, who owes the next move, open threads, commitments, risks, next step. Read this before the ledger. # Toggle an emoji reaction on a comment Source: https://dench.com/docs/api-reference/crm/toggle-an-emoji-reaction-on-a-comment /api-reference/openapi.json put /crm/comments/{commentId}/reactions/{emoji} Toggle an emoji reaction on a comment. # Toggle CRM automation Source: https://dench.com/docs/api-reference/crm/toggle-crm-automation /api-reference/openapi.json patch /crm/automations/{automationId} Enable or disable a CRM automation. # Undo what the ingestion jobs created since a timestamp (admin): `kind` = `detections` (accounts + contacts from the email detector and the sweep), `linkedin` (the LinkedIn resolver's contacts + accounts; their conversations are unlinked and parked), `email-tasks` (auto-created tasks and cases) or `all` (default). Deletes only rows no human has touched and marks the verdicts / decisions rolled_back so they are never re-created. `dryRun` lists what would go; per-kind counts in `kinds` Source: https://dench.com/docs/api-reference/crm/undo-what-the-ingestion-jobs-created-since-a-timestamp-admin:-`kind`-=-`detections`-accounts-+-contacts-from-the-email-detector-and-the-sweep-`linkedin`-the-linkedin-resolvers-contacts-+-accounts;-their-conversations-are-unlinked-and-parked-`email-tasks`-auto-created-tasks-and-cases-or-`all`-default-deletes-only-rows-no-human-has-touched-and-marks-the-verdicts-decisions-rolled_back-so-they-are-never-re-created-`dryrun`-lists-what-would-go;-per-kind-counts-in-`kinds` /api-reference/openapi.json post /crm/detections/undo Undo what the ingestion jobs created since a timestamp (admin): `kind` = `detections` (accounts + contacts from the email detector and the sweep), `linkedin` (the LinkedIn resolver's contacts + accounts; their conversations are unlinked and parked), `email-tasks` (auto-created tasks and cases) or `all` (default). Deletes only rows no human has touched and marks the verdicts / decisions rolled_back so they are never re-created. `dryRun` lists what would go; per-kind counts in `kinds`. # Update an action button on a CRM field Source: https://dench.com/docs/api-reference/crm/update-an-action-button-on-a-crm-field /api-reference/openapi.json patch /crm/actions/{actionId} Update an action button on a CRM field. # Update entry Source: https://dench.com/docs/api-reference/crm/update-entry /api-reference/openapi.json patch /crm/objects/{objectName}/entries/{entryId} Update a CRM entry. # Update field Source: https://dench.com/docs/api-reference/crm/update-field /api-reference/openapi.json patch /crm/objects/{objectName}/fields/{fieldName} Update a CRM field or change/explicitly clear an existing campaign calculation. # Update many entries Source: https://dench.com/docs/api-reference/crm/update-many-entries /api-reference/openapi.json patch /crm/objects/{objectName}/entries/batch Update many CRM entries. # Update object Source: https://dench.com/docs/api-reference/crm/update-object /api-reference/openapi.json patch /crm/objects/{name} Update a CRM object. # Whether the caller hides their own emails / messages with this record from the workspace (directly, or through its account), and whether they own a connection the toggle applies to Source: https://dench.com/docs/api-reference/crm/whether-the-caller-hides-their-own-emails-messages-with-this-record-from-the-workspace-directly-or-through-its-account-and-whether-they-own-a-connection-the-toggle-applies-to /api-reference/openapi.json get /crm/entries/{entryId}/privacy Whether the caller hides their own emails / messages with this record from the workspace (directly, or through its account), and whether they own a connection the toggle applies to. # Whether you follow a CRM entry's activity Source: https://dench.com/docs/api-reference/crm/whether-you-follow-a-crm-entrys-activity /api-reference/openapi.json get /crm/objects/{objectName}/entries/{entryId}/watch Whether you follow a CRM entry's activity. # Your open tasks (plus ones completed today) Source: https://dench.com/docs/api-reference/crm/your-open-tasks-plus-ones-completed-today /api-reference/openapi.json get /crm/tasks/mine Your open tasks (plus ones completed today). # Activate a sequence so its enrollments begin sending Source: https://dench.com/docs/api-reference/email/activate-a-sequence-so-its-enrollments-begin-sending /api-reference/openapi.json post /email/sequences/{sequenceId}/activate Activate a sequence so its enrollments begin sending. # Add a step (subject, body, and wait delay) to a sequence Source: https://dench.com/docs/api-reference/email/add-a-step-subject-body-and-wait-delay-to-a-sequence /api-reference/openapi.json post /email/sequences/{sequenceId}/steps Add a step (subject, body, and wait delay) to a sequence. # Add campaign recipients from a CRM object: pick the object, the email field, and the entry ids Source: https://dench.com/docs/api-reference/email/add-campaign-recipients-from-a-crm-object:-pick-the-object-the-email-field-and-the-entry-ids /api-reference/openapi.json post /email/campaigns/{campaignId}/recipients/from-object Add campaign recipients from a CRM object: pick the object, the email field, and the entry ids. # Add recipients Source: https://dench.com/docs/api-reference/email/add-recipients /api-reference/openapi.json post /email/campaigns/{campaignId}/recipients Add recipients to a managed email campaign. # Archive a sequence (stops all sending) Source: https://dench.com/docs/api-reference/email/archive-a-sequence-stops-all-sending /api-reference/openapi.json post /email/sequences/{sequenceId}/archive Archive a sequence (stops all sending). # Begin verification Source: https://dench.com/docs/api-reference/email/begin-verification /api-reference/openapi.json post /email/sending-identities/{identityId}/verify Begin the full Dench sender verification flow for a sending identity. # Campaign status Source: https://dench.com/docs/api-reference/email/campaign-status /api-reference/openapi.json get /email/campaigns/{campaignId} Read campaign status and counters. # Cancel campaign Source: https://dench.com/docs/api-reference/email/cancel-campaign /api-reference/openapi.json post /email/campaigns/{campaignId}/cancel Cancel an email campaign. # Create a follow-up sequence from a connected inbox or verified sender Source: https://dench.com/docs/api-reference/email/create-a-follow-up-sequence-from-a-connected-inbox-or-verified-sender /api-reference/openapi.json post /email/sequences Create a follow-up sequence from a connected inbox or verified sender. # Create an editable Dench email draft and synchronize its selected native mailbox asynchronously. Use a stable requestId for retries Source: https://dench.com/docs/api-reference/email/create-an-editable-dench-email-draft-and-synchronize-its-selected-native-mailbox-asynchronously-use-a-stable-requestid-for-retries /api-reference/openapi.json post /email/drafts Create an editable Dench email draft and synchronize its selected native mailbox asynchronously. Use a stable requestId for retries. # Create campaign Source: https://dench.com/docs/api-reference/email/create-campaign /api-reference/openapi.json post /email/campaigns Create a managed email campaign draft from a connected inbox or verified sender. # Create sending identity Source: https://dench.com/docs/api-reference/email/create-sending-identity /api-reference/openapi.json post /email/sending-identities Create a durable Dench email sending identity record. # Create template Source: https://dench.com/docs/api-reference/email/create-template /api-reference/openapi.json post /email/templates Create a managed email campaign template. # Deactivate a sequence (pause sending, revert to draft) Source: https://dench.com/docs/api-reference/email/deactivate-a-sequence-pause-sending-revert-to-draft /api-reference/openapi.json post /email/sequences/{sequenceId}/deactivate Deactivate a sequence (pause sending, revert to draft). # Disable sender Source: https://dench.com/docs/api-reference/email/disable-sender /api-reference/openapi.json post /email/sending-identities/{identity}/disable Soft-disable a sender (or every sender on a domain) for the workspace; sends are blocked until restored. # Enroll explicit recipients into a sequence Source: https://dench.com/docs/api-reference/email/enroll-explicit-recipients-into-a-sequence /api-reference/openapi.json post /email/sequences/{sequenceId}/enroll Enroll explicit recipients into a sequence. # Enroll people from a CRM object: pick the object, the email field, and the entry ids Source: https://dench.com/docs/api-reference/email/enroll-people-from-a-crm-object:-pick-the-object-the-email-field-and-the-entry-ids /api-reference/openapi.json post /email/sequences/{sequenceId}/enroll/from-object Enroll people from a CRM object: pick the object, the email field, and the entry ids. # Identity DNS records Source: https://dench.com/docs/api-reference/email/identity-dns-records /api-reference/openapi.json get /email/sending-identities/{identityId}/dns Fetch DNS records (DKIM/SPF/DMARC) for a pending domain sender verification. # List a campaign's recipients (paginated, optional status filter) Source: https://dench.com/docs/api-reference/email/list-a-campaigns-recipients-paginated-optional-status-filter /api-reference/openapi.json get /email/campaigns/{campaignId}/recipients List a campaign's recipients (paginated, optional status filter). # List a sequence's enrollments (paginated, optional status filter) Source: https://dench.com/docs/api-reference/email/list-a-sequences-enrollments-paginated-optional-status-filter /api-reference/openapi.json get /email/sequences/{sequenceId}/enrollments List a sequence's enrollments (paginated, optional status filter). # List identities Source: https://dench.com/docs/api-reference/email/list-identities /api-reference/openapi.json get /email/sending-identities List the workspace's email sending identities. # List managed email campaigns (paginated, optional status filter) Source: https://dench.com/docs/api-reference/email/list-managed-email-campaigns-paginated-optional-status-filter /api-reference/openapi.json get /email/campaigns List managed email campaigns (paginated, optional status filter). # List messages Source: https://dench.com/docs/api-reference/email/list-messages /api-reference/openapi.json get /email/messages List recent raw email messages for the workspace. # List native mailboxes this caller may use Source: https://dench.com/docs/api-reference/email/list-native-mailboxes-this-caller-may-use /api-reference/openapi.json get /email/drafts/senders List native mailboxes this caller may use. # List the workspace's follow-up sequences Source: https://dench.com/docs/api-reference/email/list-the-workspaces-follow-up-sequences /api-reference/openapi.json get /email/sequences List the workspace's follow-up sequences. # Load the selected mailbox signature for explicit visible insertion Source: https://dench.com/docs/api-reference/email/load-the-selected-mailbox-signature-for-explicit-visible-insertion /api-reference/openapi.json get /email/drafts/{draftId}/signature Load the selected mailbox signature for explicit visible insertion. # Message status Source: https://dench.com/docs/api-reference/email/message-status /api-reference/openapi.json get /email/messages/{messageId} Read a raw email message's status and open/click counters. # Pause campaign Source: https://dench.com/docs/api-reference/email/pause-campaign /api-reference/openapi.json post /email/campaigns/{campaignId}/pause Pause a sending email campaign. # Pause one enrollment Source: https://dench.com/docs/api-reference/email/pause-one-enrollment /api-reference/openapi.json post /email/sequences/enrollments/{enrollmentId}/pause Pause one enrollment. # Permanently delete a sender (or every sender on a domain) from the workspace; re-adding it requires verification from scratch Source: https://dench.com/docs/api-reference/email/permanently-delete-a-sender-or-every-sender-on-a-domain-from-the-workspace;-re-adding-it-requires-verification-from-scratch /api-reference/openapi.json delete /email/sending-identities/{identity} Permanently delete a sender (or every sender on a domain) from the workspace; re-adding it requires verification from scratch. # Preview campaign Source: https://dench.com/docs/api-reference/email/preview-campaign /api-reference/openapi.json post /email/campaigns/{campaignId}/preview Preview rendered messages for a campaign sample. # Preview template Source: https://dench.com/docs/api-reference/email/preview-template /api-reference/openapi.json post /email/templates/{templateId}/preview Preview a managed email campaign template. # Read a bounded page of synced headers using an exact thread handle from inbox search; bodies remain on demand Source: https://dench.com/docs/api-reference/email/read-a-bounded-page-of-synced-headers-using-an-exact-thread-handle-from-inbox-search;-bodies-remain-on-demand /api-reference/openapi.json get /email/inbox/threads/{threadHandle} Read a bounded page of synced headers using an exact thread handle from inbox search; bodies remain on demand. # Read a bounded stored body using an exact message handle from inbox search; rechecks mailbox and record privacy Source: https://dench.com/docs/api-reference/email/read-a-bounded-stored-body-using-an-exact-message-handle-from-inbox-search;-rechecks-mailbox-and-record-privacy /api-reference/openapi.json get /email/inbox/messages/{messageHandle} Read a bounded stored body using an exact message handle from inbox search; rechecks mailbox and record privacy. # Read a sequence with its ordered steps Source: https://dench.com/docs/api-reference/email/read-a-sequence-with-its-ordered-steps /api-reference/openapi.json get /email/sequences/{sequenceId} Read a sequence with its ordered steps. # Read an email draft, eligible senders and provider sync status Source: https://dench.com/docs/api-reference/email/read-an-email-draft-eligible-senders-and-provider-sync-status /api-reference/openapi.json get /email/drafts/{draftId} Read an email draft, eligible senders and provider sync status. # Refresh identity status Source: https://dench.com/docs/api-reference/email/refresh-identity-status /api-reference/openapi.json post /email/sending-identities/{identityId}/status Refresh a Dench Emailing Service sender verification status. # Remove a step from a sequence Source: https://dench.com/docs/api-reference/email/remove-a-step-from-a-sequence /api-reference/openapi.json post /email/sequences/steps/{stepId}/remove Remove a step from a sequence. # Reorder a sequence's steps Source: https://dench.com/docs/api-reference/email/reorder-a-sequences-steps /api-reference/openapi.json post /email/sequences/{sequenceId}/steps/reorder Reorder a sequence's steps. # Restore sender Source: https://dench.com/docs/api-reference/email/restore-sender /api-reference/openapi.json post /email/sending-identities/{identity}/restore Restore a previously disabled sender for the workspace. # Resume campaign Source: https://dench.com/docs/api-reference/email/resume-campaign /api-reference/openapi.json post /email/campaigns/{campaignId}/resume Resume a paused email campaign. # Resume one paused enrollment Source: https://dench.com/docs/api-reference/email/resume-one-paused-enrollment /api-reference/openapi.json post /email/sequences/enrollments/{enrollmentId}/resume Resume one paused enrollment. # Save draft content using expectedRevision; sender changes require a new draft after provider binding Source: https://dench.com/docs/api-reference/email/save-draft-content-using-expectedrevision;-sender-changes-require-a-new-draft-after-provider-binding /api-reference/openapi.json patch /email/drafts/{draftId} Save draft content using expectedRevision; sender changes require a new draft after provider binding. # Search authorized synced mailbox headers with bounded cursor pagination. isDone covers stored records, not provider completeness Source: https://dench.com/docs/api-reference/email/search-authorized-synced-mailbox-headers-with-bounded-cursor-pagination-isdone-covers-stored-records-not-provider-completeness /api-reference/openapi.json get /email/inbox/search Search authorized synced mailbox headers with bounded cursor pagination. isDone covers stored records, not provider completeness. # Send email Source: https://dench.com/docs/api-reference/email/send-email /api-reference/openapi.json post /email/send Send one raw email (no campaign): to/cc/bcc, custom from-name and reply-to, optional reply threading via replyToMessageId. # Send the current Dench draft revision through its native mailbox. Repeated requests share a durable receipt Source: https://dench.com/docs/api-reference/email/send-the-current-dench-draft-revision-through-its-native-mailbox-repeated-requests-share-a-durable-receipt /api-reference/openapi.json post /email/drafts/{draftId}/send Send the current Dench draft revision through its native mailbox. Repeated requests share a durable receipt. # Send through a native Gmail or Outlook mailbox with a durable request receipt. Only use for an explicit send request Source: https://dench.com/docs/api-reference/email/send-through-a-native-gmail-or-outlook-mailbox-with-a-durable-request-receipt-only-use-for-an-explicit-send-request /api-reference/openapi.json post /email/native/send Send through a native Gmail or Outlook mailbox with a durable request receipt. Only use for an explicit send request. # Sender status Source: https://dench.com/docs/api-reference/email/sender-status /api-reference/openapi.json get /email/identities/{identity}/status Read Dench Emailing Service sender verification status. # Stop one enrollment (no further steps send) Source: https://dench.com/docs/api-reference/email/stop-one-enrollment-no-further-steps-send /api-reference/openapi.json post /email/sequences/enrollments/{enrollmentId}/stop Stop one enrollment (no further steps send). # Submit campaign Source: https://dench.com/docs/api-reference/email/submit-campaign /api-reference/openapi.json post /email/campaigns/{campaignId}/submit Submit a campaign for approval or sending. # Update a sequence step's subject, body, or delay Source: https://dench.com/docs/api-reference/email/update-a-sequence-steps-subject-body-or-delay /api-reference/openapi.json post /email/sequences/steps/{stepId} Update a sequence step's subject, body, or delay. # Update a sequence's name, sender, or reply/stop settings Source: https://dench.com/docs/api-reference/email/update-a-sequences-name-sender-or-replystop-settings /api-reference/openapi.json post /email/sequences/{sequenceId} Update a sequence's name, sender, or reply/stop settings. # Upload attachment bytes authorized against this draft before adding its storage reference Source: https://dench.com/docs/api-reference/email/upload-attachment-bytes-authorized-against-this-draft-before-adding-its-storage-reference /api-reference/openapi.json post /email/drafts/{draftId}/attachments Upload attachment bytes authorized against this draft before adding its storage reference. # Verify sender Source: https://dench.com/docs/api-reference/email/verify-sender /api-reference/openapi.json post /email/identities/verify Start Dench Emailing Service sender verification. # Inspect a saved setup, its manifest, and an optional immutable revision Source: https://dench.com/docs/api-reference/environments/inspect-a-saved-setup-its-manifest-and-an-optional-immutable-revision /api-reference/openapi.json get /environments/{name} Inspect a saved setup, its manifest, and an optional immutable revision. # List workspace-shared reusable setups and ready revisions (metadata only) Source: https://dench.com/docs/api-reference/environments/list-workspace-shared-reusable-setups-and-ready-revisions-metadata-only /api-reference/openapi.json get /environments List workspace-shared reusable setups and ready revisions (metadata only). # Publish an explicitly saved source and manifest for one-time preparation. Returns pending/building until verified; does not run the task Source: https://dench.com/docs/api-reference/environments/publish-an-explicitly-saved-source-and-manifest-for-one-time-preparation-returns-pendingbuilding-until-verified;-does-not-run-the-task /api-reference/openapi.json post /environments/{name} Publish an explicitly saved source and manifest for one-time preparation. Returns pending/building until verified; does not run the task. # Reserve an owner-bound source upload. Prefix the uploaded bytes with the returned proof before saving Source: https://dench.com/docs/api-reference/environments/reserve-an-owner-bound-source-upload-prefix-the-uploaded-bytes-with-the-returned-proof-before-saving /api-reference/openapi.json post /environments/uploads Reserve an owner-bound source upload. Prefix the uploaded bytes with the returned proof before saving. # Retire a saved setup from new selection; retain immutable revisions and active job evidence Source: https://dench.com/docs/api-reference/environments/retire-a-saved-setup-from-new-selection;-retain-immutable-revisions-and-active-job-evidence /api-reference/openapi.json delete /environments/{name} Retire a saved setup from new selection; retain immutable revisions and active job evidence. # Run a command with prepared dependencies and declared credentials, saving declared state with a revision check Source: https://dench.com/docs/api-reference/environments/run-a-command-with-prepared-dependencies-and-declared-credentials-saving-declared-state-with-a-revision-check /api-reference/openapi.json post /local/environments/run Run a command with prepared dependencies and declared credentials, saving declared state with a revision check. # Create a workspace directory (and any missing parents). Idempotent Source: https://dench.com/docs/api-reference/files/create-a-workspace-directory-and-any-missing-parents-idempotent /api-reference/openapi.json post /files/mkdir Create a workspace directory (and any missing parents). Idempotent. # Delete file Source: https://dench.com/docs/api-reference/files/delete-file /api-reference/openapi.json delete /files Remove a workspace file or directory. # Download URL Source: https://dench.com/docs/api-reference/files/download-url /api-reference/openapi.json get /files/download-url Get a signed file download URL. # List files Source: https://dench.com/docs/api-reference/files/list-files /api-reference/openapi.json get /files List workspace files. # Move file Source: https://dench.com/docs/api-reference/files/move-file /api-reference/openapi.json post /files/move Move a workspace file or directory. # Read a workspace file's text Source: https://dench.com/docs/api-reference/files/read-a-workspace-files-text /api-reference/openapi.json get /files/content Read a workspace file's text. # Stage files Source: https://dench.com/docs/api-reference/files/stage-files /api-reference/openapi.json post /files/stage Stage uploaded content into the workspace. # Write a workspace file's text Source: https://dench.com/docs/api-reference/files/write-a-workspace-files-text /api-reference/openapi.json put /files/content Write a workspace file's text. # Answer question Source: https://dench.com/docs/api-reference/gateway/answer-question /api-reference/openapi.json post /search/answer Answer a question with web search. # Classify brand Source: https://dench.com/docs/api-reference/gateway/classify-brand /api-reference/openapi.json post /context/classify-naics Classify a domain with NAICS or SIC. # Connect tool Source: https://dench.com/docs/api-reference/gateway/connect-tool /api-reference/openapi.json post /tools/connections Create a tool OAuth connection link. Slack is in-house, never a third-party connection: for toolkit slack the CLI prints the first-party install URL (/api/slack/install?slug=, org admin) instead of calling this endpoint. # Crawl site Source: https://dench.com/docs/api-reference/gateway/crawl-site /api-reference/openapi.json post /context/web-crawl Crawl a site to Markdown (capped). # Disconnect tool Source: https://dench.com/docs/api-reference/gateway/disconnect-tool /api-reference/openapi.json delete /tools/connections/{connectionId} Disconnect an external tool account. # Edit image Source: https://dench.com/docs/api-reference/gateway/edit-image /api-reference/openapi.json post /images/edits Edit an image through the Dench gateway. # Extract page Source: https://dench.com/docs/api-reference/gateway/extract-page /api-reference/openapi.json post /context/web-extract Extract typed fields from a page using a JSON Schema. # Extract product Source: https://dench.com/docs/api-reference/gateway/extract-product /api-reference/openapi.json post /context/web-product Extract a product listing from a URL. # Find competitors Source: https://dench.com/docs/api-reference/gateway/find-competitors /api-reference/openapi.json post /context/web-competitors Find competitors of a domain. # Generate image Source: https://dench.com/docs/api-reference/gateway/generate-image /api-reference/openapi.json post /images/generations Generate an image through the Dench gateway. # List every connected integration — connected apps plus the Gmail, Outlook, Calendar, LinkedIn and Slack connections Dench provides itself (Slack rows report source: dench) Source: https://dench.com/docs/api-reference/gateway/list-every-connected-integration-—-connected-apps-plus-the-gmail-outlook-calendar-linkedin-and-slack-connections-dench-provides-itself-slack-rows-report-source:-dench /api-reference/openapi.json get /integrations List every connected integration — connected apps plus the Gmail, Outlook, Calendar, LinkedIn and Slack connections Dench provides itself (Slack rows report source: dench). # List human names given to connected accounts Source: https://dench.com/docs/api-reference/gateway/list-human-names-given-to-connected-accounts /api-reference/openapi.json get /tools/labels List human names given to connected accounts. # List site pages Source: https://dench.com/docs/api-reference/gateway/list-site-pages /api-reference/openapi.json post /context/web-sitemap List sitemap URLs for a domain. # Look up brand Source: https://dench.com/docs/api-reference/gateway/look-up-brand /api-reference/openapi.json post /context/brand-retrieve Look up a brand kit from a domain or email. # Name a connected account, or clear its name with an empty string Source: https://dench.com/docs/api-reference/gateway/name-a-connected-account-or-clear-its-name-with-an-empty-string /api-reference/openapi.json put /tools/connections/{connectionId}/label Name a connected account, or clear its name with an empty string. # Page contents Source: https://dench.com/docs/api-reference/gateway/page-contents /api-reference/openapi.json post /search/contents Fetch page contents through the Dench gateway. # Read fonts Source: https://dench.com/docs/api-reference/gateway/read-fonts /api-reference/openapi.json post /context/brand-fonts Read site fonts from a domain. # Read page Source: https://dench.com/docs/api-reference/gateway/read-page /api-reference/openapi.json post /context/web-scrape-markdown Read a page as clean Markdown through Dench web. # Read styleguide Source: https://dench.com/docs/api-reference/gateway/read-styleguide /api-reference/openapi.json post /context/brand-styleguide Read a brand styleguide from a domain. # Run tool Source: https://dench.com/docs/api-reference/gateway/run-tool /api-reference/openapi.json post /tools/run Run an external tool action. SLACK_* slugs (SLACK_SEND_MESSAGE with Block Kit blocks/buttons, SLACK_FETCH_HISTORY, SLACK_LIST_CHANNELS, …) run through Dench's in-house Slack app install — any channel in the connected workspace — and are always preferred over any third-party Slack connection. # Screenshot page Source: https://dench.com/docs/api-reference/gateway/screenshot-page /api-reference/openapi.json post /context/web-screenshot Capture a rendered page screenshot. # Search brands Source: https://dench.com/docs/api-reference/gateway/search-brands /api-reference/openapi.json post /context/brand-search Autocomplete brand names. # Search tools Source: https://dench.com/docs/api-reference/gateway/search-tools /api-reference/openapi.json post /tools/search Search for external tool actions. # Tool status Source: https://dench.com/docs/api-reference/gateway/tool-status /api-reference/openapi.json get /tools/status List connected tool accounts. # Web search Source: https://dench.com/docs/api-reference/gateway/web-search /api-reference/openapi.json post /search Search the web through the Dench gateway. # Buy contact details for 1–100 saved profiles and save them to the list. Skips fields already found, looked up empty, or in flight. Requires a signed-in member or their personal agent Source: https://dench.com/docs/api-reference/lists/buy-contact-details-for-1–100-saved-profiles-and-save-them-to-the-list-skips-fields-already-found-looked-up-empty-or-in-flight-requires-a-signed-in-member-or-their-personal-agent /api-reference/openapi.json post /lists/{artifactId}/enrich Buy contact details for 1–100 saved profiles and save them to the list. Skips fields already found, looked up empty, or in flight. Requires a signed-in member or their personal agent. # Delete list Source: https://dench.com/docs/api-reference/lists/delete-list /api-reference/openapi.json delete /lists/{artifactId} Delete a saved search / list, its exported CSV/JSONL files, and any linked watch. # Explicitly import selected saved profiles, optionally filtered by enrichment, with a configured Lead status. Reuses CRM records; never sends outreach or triggers conversion Source: https://dench.com/docs/api-reference/lists/explicitly-import-selected-saved-profiles-optionally-filtered-by-enrichment-with-a-configured-lead-status-reuses-crm-records;-never-sends-outreach-or-triggers-conversion /api-reference/openapi.json post /lists/{artifactId}/import Explicitly import selected saved profiles, optionally filtered by enrichment, with a configured Lead status. Reuses CRM records; never sends outreach or triggers conversion. # Get list Source: https://dench.com/docs/api-reference/lists/get-list /api-reference/openapi.json get /lists/{artifactId} Get one saved search / list by artifact id. # List lists Source: https://dench.com/docs/api-reference/lists/list-lists /api-reference/openapi.json get /lists List saved searches (find-result lists) in the workspace, newest first. # Read durable enrichment activity (legacy review metadata remains readable). Use lists rows for current saved profiles and contacts Source: https://dench.com/docs/api-reference/lists/read-durable-enrichment-activity-legacy-review-metadata-remains-readable-use-lists-rows-for-current-saved-profiles-and-contacts /api-reference/openapi.json get /lists/{artifactId}/reviews Read durable enrichment activity (legacy review metadata remains readable). Use lists rows for current saved profiles and contacts. # Read saved rows with current enrichment results and original indices; cursor-paged, without repeating a search Source: https://dench.com/docs/api-reference/lists/read-saved-rows-with-current-enrichment-results-and-original-indices;-cursor-paged-without-repeating-a-search /api-reference/openapi.json get /lists/{artifactId}/rows Read saved rows with current enrichment results and original indices; cursor-paged, without repeating a search. # Rename list Source: https://dench.com/docs/api-reference/lists/rename-list /api-reference/openapi.json post /lists/{artifactId}/rename Rename a saved search / list. # Save list Source: https://dench.com/docs/api-reference/lists/save-list /api-reference/openapi.json post /lists Save find results as a named list (rows + filters become a workspace artifact). # Suggest ICP fit for one profile. Never changes a human review decision Source: https://dench.com/docs/api-reference/lists/suggest-icp-fit-for-one-profile-never-changes-a-human-review-decision /api-reference/openapi.json post /lists/{artifactId}/assess Suggest ICP fit for one profile. Never changes a human review decision. # Update list Source: https://dench.com/docs/api-reference/lists/update-list /api-reference/openapi.json patch /lists/{artifactId} Update a saved list in place (title, filters, and/or replacement rows). # Configure CLI backend Source: https://dench.com/docs/api-reference/local/configure-cli-backend /api-reference/openapi.json post /local/backend Configure the CLI backend target. # Export CSV Source: https://dench.com/docs/api-reference/local/export-csv /api-reference/openapi.json post /local/crm/export Export a CRM object to a local CSV. # File sync daemon Source: https://dench.com/docs/api-reference/local/file-sync-daemon /api-reference/openapi.json post /local/fs Run the local file sync daemon. # Import calls from a local CSV/JSONL: meeting fields plus transcript, action items and attendees per row Source: https://dench.com/docs/api-reference/local/import-calls-from-a-local-csvjsonl:-meeting-fields-plus-transcript-action-items-and-attendees-per-row /api-reference/openapi.json post /local/meetings/import Import calls from a local CSV/JSONL: meeting fields plus transcript, action items and attendees per row. # Import CSV Source: https://dench.com/docs/api-reference/local/import-csv /api-reference/openapi.json post /local/crm/import Import a local CSV into a CRM object. # List local sessions Source: https://dench.com/docs/api-reference/local/list-local-sessions /api-reference/openapi.json get /local/sessions List local CLI sessions. # Remove local sessions Source: https://dench.com/docs/api-reference/local/remove-local-sessions /api-reference/openapi.json post /local/logout Remove local CLI sessions. # Use local session Source: https://dench.com/docs/api-reference/local/use-local-session /api-reference/openapi.json post /local/sessions/use Select a local CLI session. # Add action items to a meeting; `replace: true` swaps the whole list Source: https://dench.com/docs/api-reference/meetings/add-action-items-to-a-meeting;-`replace:-true`-swaps-the-whole-list /api-reference/openapi.json post /meetings/{meetingEntryId}/action-items Add action items to a meeting; `replace: true` swaps the whole list. # Append up to 500 transcript segments to a meeting (speakers with an email link to existing people) Source: https://dench.com/docs/api-reference/meetings/append-up-to-500-transcript-segments-to-a-meeting-speakers-with-an-email-link-to-existing-people /api-reference/openapi.json post /meetings/{meetingEntryId}/transcript Append up to 500 transcript segments to a meeting (speakers with an email link to existing people). # Delete a batch of a meeting's transcript segments; repeat until `done` before re-appending Source: https://dench.com/docs/api-reference/meetings/delete-a-batch-of-a-meetings-transcript-segments;-repeat-until-`done`-before-re-appending /api-reference/openapi.json delete /meetings/{meetingEntryId}/transcript Delete a batch of a meeting's transcript segments; repeat until `done` before re-appending. # Delete one action item Source: https://dench.com/docs/api-reference/meetings/delete-one-action-item /api-reference/openapi.json delete /meetings/action-items/{itemId} Delete one action item. # List a meeting's action items Source: https://dench.com/docs/api-reference/meetings/list-a-meetings-action-items /api-reference/openapi.json get /meetings/{meetingEntryId}/action-items List a meeting's action items. # List meetings, newest first, with status and participants Source: https://dench.com/docs/api-reference/meetings/list-meetings-newest-first-with-status-and-participants /api-reference/openapi.json get /meetings List meetings, newest first, with status and participants. # Read a meeting's transcript, in order, one page at a time Source: https://dench.com/docs/api-reference/meetings/read-a-meetings-transcript-in-order-one-page-at-a-time /api-reference/openapi.json get /meetings/{meetingEntryId}/transcript Read a meeting's transcript, in order, one page at a time. # Record attendees by name/email; known members and existing people are linked, nobody is created Source: https://dench.com/docs/api-reference/meetings/record-attendees-by-nameemail;-known-members-and-existing-people-are-linked-nobody-is-created /api-reference/openapi.json put /meetings/{meetingEntryId}/participants Record attendees by name/email; known members and existing people are linked, nobody is created. # Share one meeting with the workspace, or take it back to owner + invitees Source: https://dench.com/docs/api-reference/meetings/share-one-meeting-with-the-workspace-or-take-it-back-to-owner-+-invitees /api-reference/openapi.json put /meetings/{meetingEntryId}/sharing Share one meeting with the workspace, or take it back to owner + invitees. # Tick or untick one action item Source: https://dench.com/docs/api-reference/meetings/tick-or-untick-one-action-item /api-reference/openapi.json patch /meetings/action-items/{itemId} Tick or untick one action item. # Whether a meeting is shared with the whole workspace, and whether you may change that Source: https://dench.com/docs/api-reference/meetings/whether-a-meeting-is-shared-with-the-whole-workspace-and-whether-you-may-change-that /api-reference/openapi.json get /meetings/{meetingEntryId}/sharing Whether a meeting is shared with the whole workspace, and whether you may change that. # Who was in the meeting, merged with the linked calendar invite Source: https://dench.com/docs/api-reference/meetings/who-was-in-the-meeting-merged-with-the-linked-calendar-invite /api-reference/openapi.json get /meetings/{meetingEntryId}/participants Who was in the meeting, merged with the linked calendar invite. # A member's profile: name, email, tagline, role, timezone, presence, open task count Source: https://dench.com/docs/api-reference/members/a-members-profile:-name-email-tagline-role-timezone-presence-open-task-count /api-reference/openapi.json get /members/{userId} A member's profile: name, email, tagline, role, timezone, presence, open task count. # A member's recent comments and record changes across the CRM, newest first Source: https://dench.com/docs/api-reference/members/a-members-recent-comments-and-record-changes-across-the-crm-newest-first /api-reference/openapi.json get /members/{userId}/activity A member's recent comments and record changes across the CRM, newest first. # Get a one-time URL to POST an avatar image to; then PUT /me/avatar with the returned storageId Source: https://dench.com/docs/api-reference/members/get-a-one-time-url-to-post-an-avatar-image-to;-then-put-meavatar-with-the-returned-storageid /api-reference/openapi.json post /me/avatar/upload-url Get a one-time URL to POST an avatar image to; then PUT /me/avatar with the returned storageId. # Live presence (online / away / offline) for workspace members Source: https://dench.com/docs/api-reference/members/live-presence-online-away-offline-for-workspace-members /api-reference/openapi.json get /members/presence Live presence (online / away / offline) for workspace members. # Open tasks assigned to a member (plus ones completed today) Source: https://dench.com/docs/api-reference/members/open-tasks-assigned-to-a-member-plus-ones-completed-today /api-reference/openapi.json get /members/{userId}/tasks Open tasks assigned to a member (plus ones completed today). # Remove your avatar Source: https://dench.com/docs/api-reference/members/remove-your-avatar /api-reference/openapi.json delete /me/avatar Remove your avatar. # Set your avatar from an uploaded storageId Source: https://dench.com/docs/api-reference/members/set-your-avatar-from-an-uploaded-storageid /api-reference/openapi.json put /me/avatar Set your avatar from an uploaded storageId. # Update your name, tagline, avatar URL, or timezone Source: https://dench.com/docs/api-reference/members/update-your-name-tagline-avatar-url-or-timezone /api-reference/openapi.json patch /me/profile Update your name, tagline, avatar URL, or timezone. # Your own member profile Source: https://dench.com/docs/api-reference/members/your-own-member-profile /api-reference/openapi.json get /me/profile Your own member profile. # Save memory Source: https://dench.com/docs/api-reference/memory/save-memory /api-reference/openapi.json post /memory Save a durable workspace memory fact. # Search memory Source: https://dench.com/docs/api-reference/memory/search-memory /api-reference/openapi.json get /memory/search Search durable workspace memory. # List operations Source: https://dench.com/docs/api-reference/meta/list-operations /api-reference/openapi.json get /commands List all CLI/API operations and parity classifications. # Archive a notification Source: https://dench.com/docs/api-reference/notifications/archive-a-notification /api-reference/openapi.json post /notifications/{notificationId}/archive Archive a notification. # How many unread notifications you have Source: https://dench.com/docs/api-reference/notifications/how-many-unread-notifications-you-have /api-reference/openapi.json get /notifications/unread-count How many unread notifications you have. # List your notifications (inbox, unread, archived, or all) Source: https://dench.com/docs/api-reference/notifications/list-your-notifications-inbox-unread-archived-or-all /api-reference/openapi.json get /notifications List your notifications (inbox, unread, archived, or all). # Mark a notification read (or unread) Source: https://dench.com/docs/api-reference/notifications/mark-a-notification-read-or-unread /api-reference/openapi.json patch /notifications/{notificationId} Mark a notification read (or unread). # Mark every inbox notification read Source: https://dench.com/docs/api-reference/notifications/mark-every-inbox-notification-read /api-reference/openapi.json post /notifications/read-all Mark every inbox notification read. # Read your notification preferences Source: https://dench.com/docs/api-reference/notifications/read-your-notification-preferences /api-reference/openapi.json get /notifications/preferences Read your notification preferences. # Update your notification preferences Source: https://dench.com/docs/api-reference/notifications/update-your-notification-preferences /api-reference/openapi.json patch /notifications/preferences Update your notification preferences. # Create routine Source: https://dench.com/docs/api-reference/routines/create-routine /api-reference/openapi.json post /routines Create a routine. # Delete routine Source: https://dench.com/docs/api-reference/routines/delete-routine /api-reference/openapi.json delete /routines/{jobId} Delete a routine. # Disable routine Source: https://dench.com/docs/api-reference/routines/disable-routine /api-reference/openapi.json post /routines/{jobId}/disable Disable a routine. # Enable routine Source: https://dench.com/docs/api-reference/routines/enable-routine /api-reference/openapi.json post /routines/{jobId}/enable Enable a routine. # Get routine Source: https://dench.com/docs/api-reference/routines/get-routine /api-reference/openapi.json get /routines/{jobId} Get a routine. # List routines Source: https://dench.com/docs/api-reference/routines/list-routines /api-reference/openapi.json get /routines List routines. # List runs Source: https://dench.com/docs/api-reference/routines/list-runs /api-reference/openapi.json get /routines/{jobId}/runs List runs for a routine. # Run history Source: https://dench.com/docs/api-reference/routines/run-history /api-reference/openapi.json get /routines/history List routine run history. # Run routine Source: https://dench.com/docs/api-reference/routines/run-routine /api-reference/openapi.json post /routines/{jobId}/run Run a routine now. # Update routine Source: https://dench.com/docs/api-reference/routines/update-routine /api-reference/openapi.json patch /routines/{jobId} Update a routine. # Encrypt a workspace credential. Use CLI stdin or the secure chat form; return metadata only. Do not put values in chat, manifests or scripts Source: https://dench.com/docs/api-reference/secrets/encrypt-a-workspace-credential-use-cli-stdin-or-the-secure-chat-form;-return-metadata-only-do-not-put-values-in-chat-manifests-or-scripts /api-reference/openapi.json put /secrets/{name} Encrypt a workspace credential. Use CLI stdin or the secure chat form; return metadata only. Do not put values in chat, manifests or scripts. # List workspace-shared credential names, kinds and versions; never values Source: https://dench.com/docs/api-reference/secrets/list-workspace-shared-credential-names-kinds-and-versions;-never-values /api-reference/openapi.json get /secrets List workspace-shared credential names, kinds and versions; never values. # Revoke a workspace credential for future resolution, optionally checking its version Source: https://dench.com/docs/api-reference/secrets/revoke-a-workspace-credential-for-future-resolution-optionally-checking-its-version /api-reference/openapi.json delete /secrets/{name} Revoke a workspace credential for future resolution, optionally checking its version. # Flip Sync switches (admin). Partial patch: only the keys sent change. Off stops new work; nothing already created is removed Source: https://dench.com/docs/api-reference/settings/flip-sync-switches-admin-partial-patch:-only-the-keys-sent-change-off-stops-new-work;-nothing-already-created-is-removed /api-reference/openapi.json patch /settings/sync Flip Sync switches (admin). Partial patch: only the keys sent change. Off stops new work; nothing already created is removed. # Read the workspace's Sync switches (accounts from email, contacts from LinkedIn, Slack Connect, calendar, dossier, tasks from email, lead auto-qualify, summaries and Brief). All on by default Source: https://dench.com/docs/api-reference/settings/read-the-workspaces-sync-switches-accounts-from-email-contacts-from-linkedin-slack-connect-calendar-dossier-tasks-from-email-lead-auto-qualify-summaries-and-brief-all-on-by-default /api-reference/openapi.json get /settings/sync Read the workspace's Sync switches (accounts from email, contacts from LinkedIn, Slack Connect, calendar, dossier, tasks from email, lead auto-qualify, summaries and Brief). All on by default. # List agents Source: https://dench.com/docs/api-reference/workspace/list-agents /api-reference/openapi.json get /agents List agents visible in the workspace status payload. # List artifacts Source: https://dench.com/docs/api-reference/workspace/list-artifacts /api-reference/openapi.json get /artifacts List artifacts for the authenticated workspace. # Read selected scoped workspace documents and a compact context index without writes Source: https://dench.com/docs/api-reference/workspace/read-selected-scoped-workspace-documents-and-a-compact-context-index-without-writes /api-reference/openapi.json get /context/sections Read selected scoped workspace documents and a compact context index without writes. # Suggested work Source: https://dench.com/docs/api-reference/workspace/suggested-work /api-reference/openapi.json get /suggested-work List draft suggested-work artifacts. # Update standing workspace rules; credentials belong in secrets and runnable setup in environments Source: https://dench.com/docs/api-reference/workspace/update-standing-workspace-rules;-credentials-belong-in-secrets-and-runnable-setup-in-environments /api-reference/openapi.json put /context/rules Update standing workspace rules; credentials belong in secrets and runnable setup in environments. # Workspace context Source: https://dench.com/docs/api-reference/workspace/workspace-context /api-reference/openapi.json get /context Return the current Dench workspace context for the bearer. # Workspace instructions Source: https://dench.com/docs/api-reference/workspace/workspace-instructions /api-reference/openapi.json get /context/instructions Return the current workspace's standing instructions for external agents. # Workspace status Source: https://dench.com/docs/api-reference/workspace/workspace-status /api-reference/openapi.json get /status Return workspace and agent status. # Authenticate to the Dench API Source: https://dench.com/docs/api/authentication Send a bearer token on every Dench API request using a workspace API key for services or an agent session token from dench signin. Send a bearer token on every request: ```http theme={null} Authorization: Bearer ``` Workspace-scoped key from settings, ideal for CI and services. The same key is exposed to sandboxes as `DENCH_API_KEY`. ```bash theme={null} curl -sS https://www.dench.com/api/v1/status \ -H "Authorization: Bearer $DENCH_API_KEY" ``` A token from `dench signin` (starts with `dch_agent_`). Gateway-backed routes exchange it for the workspace gateway key automatically. ```bash theme={null} curl -sS https://www.dench.com/api/v1/context \ -H "Authorization: Bearer $DENCH_AGENT_SESSION" ``` Authentication is wired into the **API Reference** playground, enter your token once and every "Try it" request uses it. ## Run attribution When an API-key caller acts from inside a running agent turn, include the run id so Dench attributes the action to the right user: ```http theme={null} x-dench-run-id: ``` Local session commands (`dench sessions`, `dench use`, `dench logout`, `dench backend`, `dench fs`) stay on the CLI, they change the caller's machine and have no server endpoint. # Dench HTTP API: endpoints, auth, and usage Source: https://dench.com/docs/api/overview Use the Dench v1 HTTP API for CRM, chat, memory, approvals, billing, integrations, and agent endpoints when the CLI is not an option. Use the API when the CLI cannot run or when a backend service needs direct HTTP access. ```txt theme={null} https://www.dench.com/api/v1 ``` The API mirrors server-backed CLI operations. Local session commands remain CLI only because they modify the caller's machine. ## Interactive playground Open the **API Reference** tab to try any endpoint live: enter your bearer token once, fill in path/query/body parameters, send the request, and inspect the response and schema. Every CRM (including comments and tasks), members and `/me` profile, notifications, chat, routine, file, integration, search, image, memory, approval, billing, and agent-config endpoint has its own page. ## Spec ```bash theme={null} curl -sS https://www.dench.com/api/v1/openapi.json ``` ## Fallback Guide ```bash theme={null} curl -sL https://dench.com/references/API.md ``` ## Example ```bash theme={null} curl -sS https://www.dench.com/api/v1/context \ -H "Authorization: Bearer $DENCH_API_KEY" ``` # Human approvals for agent actions Source: https://dench.com/docs/approvals Require human approval before risky agent actions: request approval, capture an explicit yes or no in chat, and record evidence in Dench. Approval rule: humans decide. Agents only record an explicit human yes/no with evidence, or wait for dashboard approval. Agents never approve their own requests. ## The loop ```bash theme={null} dench approval request "Deploy the new API branch?" \ --reason "Production deploy changes public behavior." \ --risk high --json ``` Ask in chat, or point them at the approvals page from `dench context --json` (`approvalsUrl`). ```bash Approve theme={null} dench approval approve --evidence "User said yes in chat" --json ``` ```bash Reject theme={null} dench approval reject --evidence "User said no in chat" --json ``` ## Actions you can submit for review Merging a PR, deploying, or changing production data. Spending money or issuing refunds. Sending external email or messages. Creating or modifying infrastructure, or accessing secrets. Read-only tool actions don't need approval. Connected-app actions with their own approval policy use this loop. See [Integrations](/docs/integrations). Dench's organization policy is always **Full access (`yolo`)**; there is no Approvals setting, and older saved ask preferences no longer apply. Dench-brokered Slack, Gmail, Outlook, Calendar, and LinkedIn tools proceed without an organization approval gate. Authentication and connection access checks still apply. Explicit approval requests and per-run approval rules remain separate, and existing approval records are unchanged. Agents must not record a human decision just to make a Full access tool call run. # Billing, AI credits, and plan tiers Source: https://dench.com/docs/billing Check AI credit balance, top up credits through Stripe Checkout, and upgrade a Dench workspace between the Free, Plus, and Max plan tiers. New workspaces start free with full CRM. Chat, file sync, enrichment, and image generation are paid. Full CRM: objects, fields, entries, relations, queries, and aggregates. Adds chat, file sync, enrichment, image generation, and integration usage. Higher limits for teams running many autonomous agents. ## Manage billing ```bash theme={null} dench billing status --json ``` ```bash theme={null} dench billing topup --amount 10 --json ``` Share the returned Stripe Checkout link with the human. ```bash theme={null} dench upgrade --tier pro --json ``` Don't claim a top-up or upgrade succeeded until Stripe confirms or `dench billing status --json` shows the new balance or tier. Hitting `402 upgrade_required` on chat or enrichment means the workspace is on the free plan. Run `dench upgrade --tier pro` and share the link. # Control a cloud browser from the Dench CLI Source: https://dench.com/docs/cli/browser Drive a cloud browser with dench browser: run interactive open, click, type, and screenshot steps, or open durable Playwright sessions over CDP. `dench browser` controls a cloud browser without opening dench.com or installing Chrome locally. The browser provider stays server-side: the CLI only sends bearer-authenticated JSON, and your per-workspace browser profile (cookies, logins) is resolved automatically. You never see or pass provider credentials. Both auth modes work: an approved `dench signin` session and a workspace `DENCH_API_KEY`. Sandboxes authenticate with `DENCH_API_KEY` automatically. ## Two ways to use it One step per call: open, inspect, click, type, screenshot, stop. Best for quick logins and ad-hoc steps. Open a CDP session and drive it with a full Playwright script. Best for longer, durable automations run from the sandbox. ## Interactive actions ```bash theme={null} dench browser open https://example.com --json dench browser inspect --json dench browser click --text "Sign in" dench browser fill --label "Email" --value "me@example.com" dench browser type "search query" dench browser key Enter dench browser scroll down --pixels 600 dench browser wait --text "Done" --timeout-ms 15000 dench browser screenshot --output page.jpg --full-page dench browser stop ``` The CLI remembers the latest browser thread per host/session, so follow-up actions reuse it. Pass `--thread ` to target a specific one, or `dench browser reset` to forget it. ## Playwright sessions (CDP) Create a session, connect with Playwright over CDP, then stop it. The live view and replay appear in the Dench chat panel the same way as interactive runs. ```bash theme={null} dench browser session create --json # -> { "sessionId": "...", "connectUrl": "wss://.../cdp?relay_token=...", "liveViewUrl": "..." } dench browser session status --json dench browser session stop --json ``` Connect from a script with `chromium.connectOverCDP(session.connectUrl)`: ```js theme={null} import { chromium } from "playwright-core"; import { execFileSync } from "node:child_process"; const session = JSON.parse( execFileSync("dench", ["browser", "session", "create", "--json"], { encoding: "utf8", }), ); const browser = await chromium.connectOverCDP(session.connectUrl); const context = browser.contexts()[0]; const page = context.pages()[0] ?? (await context.newPage()); await page.goto("https://example.com"); console.log(await page.title()); await browser.close(); execFileSync("dench", ["browser", "session", "stop", session.sessionId, "--json"]); ``` The optional `--context-id` flag overrides the resolved profile for manual testing; normally you should omit it and let the workspace profile apply. See the full agent playbook at [references/BROWSER.md](https://www.dench.com/references/BROWSER.md) and the HTTP equivalents under the [API reference](/docs/api/overview). # Dench CLI command reference Source: https://dench.com/docs/cli/commands Full reference for dench CLI commands covering sign in, context, CRM, outreach campaigns, integrations, approvals, memory, billing, files, routines, and chat. Run any command with `npx -y -p @dench.com/cli dench `, or `dench ` if installed globally. objects, fields, entries, cells, query apps, tool status/connect/run request, approve, reject search, save actions, Playwright sessions status, topup, upgrade the HTTP equivalent Add `--json` to almost any command for machine-readable output. ## Sign In ```bash theme={null} dench signin --kind cursor --name "Cursor Agent - Project" dench signin --new-workspace --org-name "Example" --kind cursor --name "Cursor Agent - Project" dench signin --email user@example.com --kind cursor --name "Cursor Agent - Project" ``` ## Context ```bash theme={null} dench context --json dench status --mine --json dench agents --json dench approvals --json ``` ## CRM ```bash theme={null} dench crm objects list --json dench crm objects get --json dench crm objects create --icon database --json dench crm objects update --visibility workspace|owner_only|owner_plus_members --json dench crm fields list --json dench crm entries list --json dench crm entries list --mine --json # personal scope: assigned to me dench crm views entries --assigned-to --json dench crm entries create --data '{"Name":"Example"}' --json dench crm entries update --data '{"Status":"Done"}' --json dench crm cells set '"value"' --json dench crm query --where '{"Status":"Open"}' --json dench crm aggregate --field Amount --json dench crm batch --file ops.jsonl --json ``` Tasks are CRM entries on the protected `task` object, with shortcuts: ```bash theme={null} dench crm entries list task --json # Field names are validated on write (unknown fields are rejected). Check # them first with `dench crm fields list task`. dench crm entries create task --data '{"Name":"Follow up","Status":"To Do"}' --json dench crm tasks mine [--priority high] --json dench crm tasks list --json dench crm tasks create --name "Follow up" --assignee --due 2026-09-05 --priority high dench crm tasks priority dench crm tasks subtasks --json dench crm tasks create-subtask --name "Write runbook" [--assignee ] [--due YYYY-MM-DD] [--priority low] dench crm tasks parent dench crm tasks repeat [daily|weekdays|weekly|monthly|yearly] [--on mon,wed] [--every N] [--day 17|last] [--nth 2 --on tue] [--ends-after N | --until YYYY-MM-DD] [--on-schedule] [--skip-weekends] dench crm tasks repeat --rrule "FREQ=WEEKLY;BYDAY=MO" dench crm tasks repeat --skip | --pause | --resume | --off dench crm tasks series [--status active|paused|ended] dench crm tasks series --occurrences dench crm tasks complete dench crm tasks reopen dench crm tasks delete [--keep-subtasks] ``` ## Comments Threaded comments on a record; `[@Name](/?member=)` mentions notify, `--dench` summons the agent into the thread. ```bash theme={null} dench crm comments list --json dench crm comments replies --json dench crm comments create --body "…" [--reply-to ] [--dench] dench crm comments update --body "…" dench crm comments delete dench crm comments react 👍 dench crm watch [--off] ``` ## Analytics The dashboard above every object table — same math the UI draws. See [Analytics](/docs/analytics). ```bash theme={null} dench crm analytics get [--view ] --json dench crm analytics compute [--view ] [--period this_month] [--panel …] [--panels ''] [--filters ''] --json dench crm analytics save --panel '' [--view ] dench crm analytics delete [--view ] dench crm analytics reorder … [--view ] dench crm analytics roles --roles '' dench crm analytics collapse | expand dench crm analytics scope --mode own|shared ``` ## Meetings Meetings are `meeting` CRM records (create/update/delete with `dench crm entries … meeting`). These verbs reach the transcript, action items and attendance beside the record, and import many calls at once. A meeting is private by default. You can read one if you own it, if you were on the invite, or if it has been shared with the workspace — and that is the same rule for the record, its transcript, its action items and its roster. `dench meetings share` is how a meeting is opened to the team; the default for new recordings is a workspace setting (Settings → Notetaker). ```bash theme={null} dench meetings list [--shared] --json dench meetings get --json dench meetings share # who can read it today dench meetings share --workspace # open it to every member dench meetings share --private # back to owner + invitees dench meetings transcript get [--json|--text] dench meetings transcript set --text transcript.txt | --jsonl segments.jsonl [--append] dench meetings action-items list|add|set|done|undone|delete … dench meetings participants list --json dench meetings participants set --people 'Hank ; ada@acme.com' [--replace] dench meetings import --csv calls.csv | --jsonl calls.jsonl [--map '{…}'] [--dedupe-key ] [--on-conflict skip|update|error] --json ``` ## Members Profiles, presence, and what each teammate is doing. `` accepts either. ```bash theme={null} dench members list --json dench members get --json dench members activity [--limit 30] [--kinds comments,changes] dench members tasks dench members presence [...] dench members me [--name "…"] [--tagline "…"] [--timezone ] [--avatar ./me.png] ``` ## Notifications ```bash theme={null} dench notifications list [--filter inbox|unread|archived|all|mentions] --json dench notifications count dench notifications read [--unread] dench notifications read-all dench notifications archive dench notifications prefs [--set emailEnabled=false] [--set .email=false] ``` ## Approval Commands ```bash theme={null} dench approval request "Deploy to production?" --risk high --json dench approval approve --evidence "User said yes in chat" --json dench approval reject --evidence "User said no in chat" --json ``` ## Dench Integrations `dench integrations` lists every connected app: apps from the catalog plus the Gmail, Outlook, Calendar and LinkedIn accounts Dench connects itself. Each row carries `source` (`app` or `dench`) — only `app` rows have a `connectedAccountId` to pass to `dench tool run --account`. (For the App Store — installing and publishing apps — see `dench apps`.) ```bash theme={null} dench integrations --json dench tool status --json dench tool status github --json dench tool connect github --json dench tool search "create github issue" --toolkit github --json dench tool run --args '{"key":"value"}' --json dench tool disconnect --json ``` ## Memory ```bash theme={null} dench memory search "deployment policy" --json dench memory save deployment-policy "Never deploy without approval." --kind decision --json ``` ## Browser ```bash theme={null} dench browser open https://example.com --json dench browser inspect --json dench browser click --text "Sign in" dench browser screenshot --output page.jpg --json dench browser session create --json dench browser session status --json dench browser session stop --json ``` Interactive actions and Playwright/CDP sessions are covered in [Browser](/docs/cli/browser). ## Chat ```bash theme={null} dench chat list --json dench chat search "pricing" --json dench chat read --json dench chat new "Research the latest CRM changes" --json dench chat send "Continue" --json dench chat follow dench agent new "Run the same chat agent loop" --json ``` ## Routines ```bash theme={null} dench cron list --json dench cron create "Daily digest" --prompt "Summarize open CRM tasks" --every 1d --json dench cron update --name "New name" --json dench cron enable --json dench cron disable --json dench cron run --json dench cron history --json ``` `dench routine` and `dench routines` are aliases for `dench cron`. ## Outreach Campaigns Email and LinkedIn steps sent to a list of people on one schedule, from a brief to a launch. `` is an id or an exact name. Confirm `dench campaign help` lists `draft`, `search`, `add`, `steps`, `person` and `preview`. Needs a workspace member's credentials (`dench signin`), a paid workspace for searches and connected sender accounts. ```bash theme={null} dench campaign accounts --json dench campaign draft --name "Founder outreach" --request-id founders-q4 --timezone America/Los_Angeles --window "Mon-Fri 9-18" --daily-cap 30 --email-mailboxes , --linkedin-accounts --json dench campaign create --name "Founder outreach" --timezone America/Los_Angeles --window "Mon-Fri 9-18" --daily-cap 30 --json dench campaign search --filters '{"titles":["Founder"],"locations":["United States"]}' --not-industries "Staffing and Recruiting" --limit 25 --out audience.json dench campaign add --people-file audience.json --json dench campaign add --search '{"titles":["Founder"]}' --limit 50 --json dench campaign add --csv people.csv --preview dench campaign add --list --json dench campaign add --object lead --view "Q3 targets" --json dench campaign add --object people --entries , --json dench campaign add --name "Ada Lovelace" --email ada@example.com --json dench campaign steps get --with-ids > steps.json dench campaign steps set --file steps.json --json dench campaign steps edit --file steps.json --json dench campaign personalize set --file lines.json dench campaign preview --person "Ada Lovelace" --step 1 dench campaign launch --check --json dench campaign launch --ack-linkedin-risk --json dench campaign get --json dench campaign list --all --json dench campaign people --status paused --json dench campaign events --max-pages 2 --json dench campaign replies --since 7d --json dench campaign person show --person --json dench campaign pipeline --json dench campaign where --json dench campaign set --window "Mon-Fri 9-18" --window "Sat 10-12" --no-stop-on-reply --start 2026-09-03 --json dench campaign set --email-mailboxes , --linkedin-accounts none --json dench campaign duplicate --name "Founder outreach 2" --json dench campaign remove --person --json dench campaign person set --person --field "Company=Acme" --json dench campaign sync --json dench campaign stop --person --json dench campaign resume-person --person --json dench campaign pause --json dench campaign resume --json dench campaign archive --json dench campaign delete --json dench campaign builder profile --json dench campaign builder lookalike --linkedin-url --json dench campaign builder save --file draft.json --json dench campaign builder build --json dench campaign builder sequence --goal "Book a demo" --help-with "..." --json dench campaign builder outreach --file outreach.json --approval manual --json dench campaign builder create --name "Hiring teams" --paused --json dench campaign builder drafts --json dench campaign sources get --json dench campaign sources overview --json dench campaign sources run --json dench campaign sources pending --json dench campaign sources approve --people , --json dench campaign queue --json ``` `builder` is the app's New campaign flow for signal and lookalike campaigns: save the source, audience, signals and terms, build the first people, write the sequence, choose senders, schedule and approval, then create the campaign. `sources` manages a live campaign's signals: `run` searches now (Run now), `pending`, `approve` and `reject` handle people waiting for approval, and `queue` shows who goes out today. A search costs 1 cent per person returned and prints the most a call can cost before it runs. `add --people-file` adds the searched people without searching again (up to 300 per file, in batches of 50); `--not-industries`, `--not-titles`, `--not-domains` and the other `--not-` flags leave values out of a search. A campaign holds at most 300 people: `duplicate` copies the steps, schedule and senders into a new draft with no people, and the next page of the search goes into the copy. `steps.json` is a JSON array of steps (`email`, `wait`, `linkedin_visit`, `linkedin_connection`, `linkedin_message`). `steps set` replaces every step and works while the campaign is a draft; it refuses a field the step would drop and `{TOKEN}` with single braces (write `{{TOKEN}}`). `steps edit` changes the text and waits of a launched campaign in place and keeps every step's type and order. `--window` takes `" -"`, e.g. `"Mon-Fri 9-18"` or `"Mon,Wed,Fri 10-16"`, and may repeat. A bare `--start` / `--end` date is midnight in the campaign's timezone. `launch --check` never launches: it prints each blocker in plain words with the command that fixes it and exits 1 when the campaign is blocked; `launch` runs the same check and then launches. `get` shows the funnel, what is being sent now, what comes next and why anything is holding. `personalize` sets up to 5 AI-written lines (about 3 cents a person) used as `{{key}}` in steps; `preview` shows the exact messages one person gets. Outreach needs a workspace member's credentials; an organization-only API key cannot run it. Sender pools are configured once with `--email-mailboxes` and `--linkedin-accounts` (up to 50 ids per channel, comma-separated or a JSON array). Omit to preserve existing settings; `none` or `'[]'` clears a pool. These map to `emailMailboxAccountIds` / `linkedinAccountIds` in the API. Steps in a pool campaign omit sender ids; legacy step senders are kept until conversion. Only accessible accounts may be selected, launch validates availability, and existing conversations keep their assigned sender. `dench campaign accounts --json` lists email and LinkedIn senders with local ids and display labels, never provider credentials. Discovery follows the acting member's permissions: their private accounts plus teammates' shared connections. LinkedIn rows include `linkedinAccountId`, availability, `remainingToday` (invites/messages/profiles) and `remainingInvitesThisWeek`. Today's invites also respect the weekly cap. Counts are account-local usage snapshots before queued work and campaign limits; launch/dispatch revalidate. For API clients, `GET $DENCH_API_BASE/campaigns/accounts/linkedin` returns the same LinkedIn summaries using a member-bound API key or agent session. ## Files ```bash theme={null} dench files ls / --json dench files mv /old.txt /new.txt --json dench files rm /old.txt --json dench stage /tmp/output /workspace/output --json ``` ## Search And Images ```bash theme={null} dench search "latest AI CRM workflows" --json dench search "senior ML engineers at fintech companies" --category people --json dench search "Swiss fintech founded after 2020" --category company --json dench search contents https://example.com --json dench search answer "What changed?" --json dench image generate "simple app icon" --json dench image edit "make it blue" --input ./icon.png --json ``` `--category people` and `--category company` return structured entity data. They do not return email addresses or phone numbers. Domain filters work for company search but are refused for people search. Published-date filters are refused for both entity categories because the search does not apply them reliably. ## Dench Web Page reads, brand kits, sitemaps, crawls, screenshots, and structured extracts. Prefer these over writing your own scraper. Search stays `dench search`. `dench context` is workspace orientation, not this. ```bash theme={null} dench web scrape https://example.com --json dench web brand stripe.com --json dench web sitemap example.com --limit 1000 --json dench web crawl https://example.com --max-pages 15 --json dench web screenshot https://example.com --full-page --json dench web extract https://example.com --schema '{"type":"object","properties":{"title":{"type":"string"}}}' --json dench web product https://example.com/product --json dench web competitors stripe.com --json dench web styleguide stripe.com --json dench web classify stripe.com --scheme naics --json ``` Crawl defaults to 15 pages and is hard-capped at 50. ## Billing ```bash theme={null} dench billing status --json dench billing topup --amount 10 --json dench upgrade --tier pro --json ``` ## Sessions ```bash theme={null} dench sessions --json dench use --json dench logout --json ``` Session commands operate on the caller's local machine. ## Agent Config ```bash theme={null} dench context --sections identity,organisation,user,memory,rules,tools --json dench context set organisation --stdin < organisation.md dench model default dench.instant ``` ## Reusable setups and credentials `dench memory` stores knowledge. It does not persist installed dependencies or API keys. ```bash theme={null} dench env save report --path ./report --wait 10 --json dench env show report --json dench secrets set REPORT_TOKEN --stdin < /private/path/token.txt dench env run report -- node report.mjs dench chat new "Run the saved report." --environment report --follow dench cron create "Daily report" --prompt "Run the report." --every 1d --environment report ``` Only explicitly saved setups are reused. Package installation happens during preparation; ready jobs reuse the snapshot or prepared bundle. Credentials are workspace-shared, encrypted separately and refreshed at execution. The secure question form keeps values out of chat history. See [the environment reference](https://dench.com/references/ENVIRONMENTS.md) for the manifest, private state, rotating credentials and local preparation. The generated [CLI index](https://dench.com/references/CLI.md) and [API reference](https://dench.com/references/API.md) track the released parser and registry. # Dench CLI: drive your workspace from the terminal Source: https://dench.com/docs/cli/overview Drive Dench from the terminal: sign in once, then run CRM, chat, integrations, memory, file, and routine commands through the dench CLI. The CLI is how agents drive Dench from a terminal. One sign-in, then CRM, chat, tools, memory, files, and routines. ```bash theme={null} npx -y -p @dench.com/cli dench ``` The package is `@dench.com/cli` and the binary is `dench`. The `-p` flag is required with `npx` because the bin name differs from the package name. ## Authentication Saves a session to `~/.dench/config.json` after browser approval. ```bash theme={null} dench signin --kind cursor --name "Cursor Agent - Project" ``` Use a workspace API key, no browser needed. ```bash theme={null} export DENCH_API_KEY="" ``` ## Everyday commands `dench context --json` · `dench status --mine --json` `dench crm objects list` · `dench crm entries list task` `dench apps` · `dench tool run --args '{…}'` `dench memory search` · `dench memory save` Every command, grouped by domain. ## When the CLI can't run Use the HTTP API instead, it mirrors every server-backed command. Same auth, interactive playground, one endpoint per command. ## Saved setup is separate from memory Use `dench env` for explicitly saved scripts, packages and configuration, and `dench secrets` for encrypted workspace credentials. Facts and preferences stay in `dench memory`; a note is not proof that a key or dependency has been saved. See [Reusable environments](https://dench.com/references/ENVIRONMENTS.md) and the [generated CLI index](https://dench.com/references/CLI.md). # Threaded CRM comments and activity feed Source: https://dench.com/docs/comments Add threaded comments on any Dench CRM record, mention teammates or Dench, react, follow records, and read the merged change-history activity feed. Every record has a conversation. Open an entry and the **Activity** feed sits under Notes: comments (threaded, with reactions) interleaved with who changed what, newest first. Consecutive edits by one person collapse into a single line; click it to see the field diffs. Reply to any comment, at any depth. Deep threads flatten after three levels. `@` a teammate to notify them. `@Dench` to bring the agent into the thread. Commenting, being mentioned, creating, or being assigned follows the record. ## In the app The comment box is the same editor as Notes: slash commands, images, tables, and the `@` picker for files, records, meeting moments, people, and Dench. `↵` posts, `Shift+↵` adds a line. Hover a comment for reactions, **Reply**, and `⋯` (edit, copy link, delete). The **Follow** toggle in the section header controls whether you hear about activity on the record. ## Mentions are links A mention is a markdown link, so comments and notes round-trip as plain markdown: ```md theme={null} [@Kelly Go](/?member=) # a teammate — notifies them [@Dench](/?member=dench) # the agent — replies in the thread ``` Member ids come from `dench members list`. Plain `@Kelly` text notifies nobody. ## CLI ```bash theme={null} dench crm comments list --json # roots newest first + preview replies dench crm comments replies --json # a whole thread, oldest first dench crm comments create --body "…" # markdown; --body-file or stdin also work dench crm comments create --reply-to --body "…" dench crm comments create --dench --body "what's the ARR here?" dench crm comments update --body "…" dench crm comments delete dench crm comments react 👍 # toggles dench crm watch [--off] # follow / unfollow dench crm watch status ``` `--dench` is fire-and-forget: the command returns the comment id and Dench's answer lands as a threaded reply shortly after. Poll `comments list` or read your notifications. ## API ```bash theme={null} curl -sS "$DENCH_API_BASE/crm/objects/company/entries//comments?limit=20" \ -H "Authorization: Bearer $DENCH_API_KEY" curl -sS -X POST "$DENCH_API_BASE/crm/objects/company/entries//comments" \ -H "Authorization: Bearer $DENCH_API_KEY" -H "Content-Type: application/json" \ --data '{"body":"Kickoff went well — [@Bob](/?member=) can you send the proposal?","mentionDench":true}' curl -sS -X PUT "$DENCH_API_BASE/crm/comments//reactions/%F0%9F%91%8D" \ -H "Authorization: Bearer $DENCH_API_KEY" ``` Every comment link is deep-linkable: `/?entry=:&comment=` opens the record scrolled to that comment. Comments are also searchable from `⌘K`. ## @Dench Mentioning Dench runs the same agent that answers in Slack. It reads the thread it was mentioned in, replies as a comment, and delegates record work (field changes, research, tasks) to a worker. Changes the worker makes appear in the same feed with Dench as the actor, so the reply summarizes rather than narrates. A comment written by Dench never re-summons Dench. Dench's own replies can't be edited; workspace admins can delete them. ## Notifications | Event | Kind | Who | | - | - | - | | Mentioned in a comment | `mention` | the mentioned member | | Reply to your comment | `comment_reply` | the parent author | | Reaction on your comment | `comment_reaction` | the comment author (in-app only) | | Comment or change on a record you follow | `entry_activity` | followers (coalesced per actor, 10 min) | | Dench answered you | `dench_reply` | whoever summoned Dench | Each person is notified once per comment (mention wins over reply, reply over activity), never for their own actions. See [Notifications](/docs/notifications). # Dench CRM: objects, fields, and queries Source: https://dench.com/docs/crm Model people, companies, tasks, and custom objects in the Dench CRM with typed fields, relations, statuses, batch writes, queries, and aggregates. The Dench CRM is the shared database for agents and humans. Every list-shaped thing lives here, not in ad-hoc files. Tables like `people`, `company`, `task`, or any custom object. Typed columns: text, enum, relation, user, date, and more. Rows, written one at a time or in batches up to 200. Individual values, set, appended, or read per field. Filter, sort, paginate, search, and aggregate. Kanban columns with colors for any object. `people`, `company`, and `task` are protected and cannot be deleted. Tasks are CRM entries on the `task` object; `dench crm tasks …` adds shortcuts over it (see [Tasks](#tasks)). ## Create an object ```bash theme={null} dench crm objects list --json ``` ```bash theme={null} dench crm objects create lead --description "Sales leads" --default-view kanban --icon target --json ``` ```bash theme={null} dench crm fields create lead "Name" --type text --required dench crm fields create lead "Email" --type email --indexed dench crm fields create lead "Company" --type relation --related-object company --relationship many_to_one --indexed dench crm fields create lead "Status" --type enum --enum-values '["New","Working","Qualified","Lost"]' ``` ```bash theme={null} dench crm statuses set lead --statuses '[{"name":"New","color":"#94a3b8"},{"name":"Qualified","color":"#22c55e"}]' --json ``` ## Field types `text`, `email`, `phone`, `url`, `number`, `boolean`, `date`, `file`, `tags`. ```bash theme={null} dench crm fields create deal "Amount" --type number dench crm fields create deal "Close Date" --type date ``` Options with optional colors. Add `--enum-multiple` for multi-select. ```bash theme={null} dench crm fields create lead "Status" --type enum \ --enum-values '["New","Working","Qualified","Lost"]' dench crm fields enum-set-color lead Status Qualified "#22c55e" ``` Link to another object instead of flattening foreign keys to text. ```bash theme={null} dench crm fields create people "Company" --type relation \ --related-object company --relationship many_to_one --indexed ``` Stores one workspace member `userId` or an array of member IDs. The default `task` user field is `Assignee`; writes also accept `Owner` (any case) for it, but confirm the schema first. Preserve every assignee from the source instead of choosing only one. ```bash theme={null} dench members list --json dench crm fields list task --json # One assignee: the positional value is a JSON string. dench crm cells set task Assignee '""' --json # Multiple assignees: pass every member ID in a JSON array. dench crm cells set task Assignee \ '["",""]' --json ``` Field **type** is immutable. To change a field's type, create a new field and migrate. `dench crm fields update` changes name, options, indexing, and enrichment, but not the type. ## The protected `Notes` field Every object ships a protected `Notes` (richtext) field for free-form prose, meeting notes, summaries, task details. It is hidden from list views and shown only when an entry is opened. Do not invent parallel `Description`/`Summary` columns, write Markdown to `Notes`. ## Write data ```bash One entry theme={null} dench crm entries create people --data '{"Name":"Ada Lovelace","Email":"ada@example.com"}' --json ``` ```bash Many (≤200) theme={null} dench crm entries create-many people --data '[{"Name":"Jane"},{"Name":"Bob"}]' --json ``` ```bash Set a cell theme={null} dench crm cells set task Status '"In progress"' --json ``` ```bash Batch ops theme={null} dench crm batch --file ops.jsonl --idempotency-key import-2026-06-01 --json ``` ## Read data ```bash Query theme={null} dench crm query lead --where '{"Status":"Qualified"}' --sort '-Score' --limit 100 --json ``` ```bash Search theme={null} dench crm search --object people "jane" --json ``` ```bash Aggregate theme={null} dench crm aggregate deal --field Stage --json ``` ```bash Mine theme={null} dench crm views entries task "Board" --mine --json dench crm entries list deal --assigned-to priya@acme.com --json dench crm query lead --where '{"Status":"New"}' --mine --json ``` Over the API, operator filters (`$gt`, `$in`, `$contains`, `$and`, `$or`) go in `dslJson` because the wire format rejects `$`-prefixed keys in nested objects. See the [API playground](/docs/api/overview). ### Assigned to me `--assigned-to me|unassigned|` (alias `--mine`) narrows any of these reads to rows whose people field includes that member, exactly like the avatar pill next to Filter in the app. It is a personal scope, not a view filter: nothing is saved onto the view. `--assignee-field ` picks the `user` field when an object has several; by default the analytics owner role, then the task `Assignee`, then a field named like owner/assignee, then the first user field. Over the API pass `assignedTo` / `assigneeField`. Counts, kanban column sums and `dench crm analytics compute --mine` follow the same scope. ## Tasks Tasks are rows on the protected `task` object, so every entries/cells command works on them. The shortcuts below wrap the same functions the To-Do(s) view and the record panel use, and notify assignees. ```bash theme={null} dench crm tasks mine --json # my open tasks (+ done today) dench crm tasks mine --priority high --json # only one priority dench crm tasks list --json # tasks linked to a record dench crm tasks create --name "Send proposal" --assignee --due 2026-09-05 --priority high dench crm tasks priority medium # or --none to clear dench crm tasks complete dench crm tasks reopen ``` ### Priority Every `task` object ships a `Priority` enum — `Low`, `Medium`, `High` — with no default; a task without one sorts last. Priority drives the order of every task surface: To-Do(s) (High → Medium → Low → unset, most recently active within a level), the home rail, a record's task strip, and the Tasks table and kanban (whose default sort is `Priority desc, Due Date asc`). Enum sorts follow **option order, not spelling** — `Priority desc` walks the scale, and a Status sort follows the kanban columns. Lists that begin with an obviously-top word (`Urgent`, `High`, `P0`) are read highest-first, so a workspace that already modelled priority its own way ranks correctly too. Priority accepts the option in any casing (`"high"` → `"High"`); an unknown value is rejected with the valid options. In composers, `Ship it !high` (or `!h`, `!!!`) sets it from the keyboard. ### Subtasks A subtask is an ordinary task whose `Parent Task` relation points at another task — same object, same table, same kanban, one level deep. The relation is created the first time a workspace nests a task, so workspaces that never do never see the column. ```bash theme={null} dench crm tasks subtasks --json # a task's subtasks dench crm tasks create-subtask --name "Write the runbook" --priority low dench crm tasks parent # nest an existing task dench crm tasks parent --none # promote it dench crm tasks delete [--keep-subtasks] # cascade by default ``` * A new subtask inherits the parent's **record** relations (Account, Contact, Opportunity …) so it groups under the same record on To-Do(s); it does not inherit Assignee, Due Date, Priority or Notes. * Subtasks show as rows everywhere with a `↳ Parent` chip; parents show a `2/5` progress ring. Completing the last subtask does nothing to the parent. **View settings → Rows → Show subtasks** hides them by writing a `Parent Task is empty` filter rule (saveable into a view). * `POST /crm/tasks/{entryId}/subtasks`, `PUT /crm/tasks/{entryId}/parent` (`{ "parentEntryId": "" | null }`) and `DELETE /crm/tasks/{entryId}` (`{ "subtasks": "delete" | "keep" }`) are the API forms. Linking a task to a task through `POST /crm/objects/task/entries/{id}/tasks` also creates a subtask. ### Repeating tasks A repeat is a property of the task's **Due Date** — set it from the `↻ Repeat` control under the date (beside `Remind`). If the task has no due date yet, picking a repeat sets one: the first day the rule matches from today (*Weekly on Mon* chosen on a Thursday → due next Monday). Every state reads as one sentence: *"Repeats every 2 weeks on Mon · next Sep 22"*. Presets come from the due date (Daily · Every weekday · Weekly on Wed · Every 2 weeks · Monthly on the 17th · Yearly); **Custom** opens interval / weekdays / month day or "2nd Tuesday" / ends; **Advanced** holds the trigger and what carries over. * **A new task per occurrence.** The finished one stays Done with its own comments and history; occurrences are linked through a hidden `_Series` field (filter `_Series is ` lists them; `dench crm tasks series --occurrences` does the same). * **Trigger.** *When this one is done* (default): completing the current occurrence — from To-Do(s), the kanban, `dench crm cells set task Status Done`, or the API — creates the next one. *On schedule*: the next one is created at 00:05 local on its due date whether or not the current one is done. * **Never overdue.** If a late completion would land in the past, the next due date skips forward to the first occurrence from today. Month-end rules keep their intent (Jan 31 → Feb 28 → Mar 31); *Skip weekends* rolls Saturday/Sunday to Monday. * **What carries over:** every field except Status and Due Date; Notes, Assignee and subtasks are on by default and toggleable; comments never. The assignee isn't pinged when they just completed it themselves. * **Ends** never, after N times, or on a date. Clearing the live task's due date pauses the series ("set a due date"); setting one resumes it. The task page's `↻` line offers Skip this one · Pause / Resume · View all occurrences · Stop repeating; deleting the live occurrence asks *This occurrence* (the next is created now) or *All future occurrences*. * Subtasks can't repeat on their own — set repeat on the parent (its subtasks copy to each occurrence). ```bash theme={null} dench crm tasks repeat # show dench crm tasks repeat weekly --on mon,wed --every 2 # set / replace dench crm tasks repeat monthly --day last --ends-after 6 dench crm tasks repeat monthly --nth 2 --on tue --on-schedule dench crm tasks repeat --rrule "FREQ=WEEKLY;BYDAY=MO;COUNT=10" dench crm tasks repeat --skip | --pause | --resume | --off dench crm tasks create --name "Send report" --due 2026-09-17 --repeat weekly dench crm tasks series [--status active|paused|ended] dench crm tasks series --occurrences ``` ```bash theme={null} # API: JSON rule… curl -X PUT "$DENCH_API_BASE/crm/tasks//repeat" -H "Authorization: Bearer $DENCH_API_KEY" \ -H "Content-Type: application/json" \ -d '{"rule":{"freq":"weekly","interval":2,"byWeekday":["mo","we"]},"ends":{"kind":"count","count":10}}' # …or RRULE (FREQ, INTERVAL, BYDAY incl. 2TU / -1FR, BYMONTHDAY, BYMONTH, COUNT, UNTIL) curl -X PUT "$DENCH_API_BASE/crm/tasks//repeat" -H "Authorization: Bearer $DENCH_API_KEY" \ -H "Content-Type: application/json" -d '{"rrule":"FREQ=MONTHLY;BYMONTHDAY=-1","trigger":"on_schedule"}' ``` The response always carries both `rule` and `rrule`, plus `summary` (the sentence) and `nextDueKey`. ## Activity and comments Every record has an Activity feed under Notes: threaded comments merged with its change history. `dench crm history` reads the audit trail; `dench crm comments` reads and writes the conversation. See [Comments](/docs/comments). ## Relation-first modeling If a field name matches or aliases an existing object (Company, Client, Deal, Owner), use a `relation` (or `user`) field, not text. `people → company`, `deal → people/company`, `task → people/project`, `invoice → company/deal`. Create the target object if it should exist. Use `entries create-many`, `entries update-many`, `cells set-many`, or `batch --file` for three or more writes. ## Who can see a record Every object has a `visibility` that decides who can read its records. It is a property of the object, and the same rule applies everywhere a record can appear: lists, the table, search, the picker, aggregates, the API and the agent's tools. | Visibility | Who reads a record | | - | - | | `workspace` (default) | Everyone in the workspace. | | `owner_only` | Only the member stored in the record's `Owner User ID`. | | `owner_plus_members` | The owner plus the members listed in the record's `Access Members`. | `meeting` ships as `owner_plus_members` (the person who recorded it plus everyone whose calendar held the same call) and `calendar_event` as `owner_only`. Records on a non-workspace object are stamped with their creator as owner, and only the owner can edit or delete them. Switching an object that already has records to `owner_only` or `owner_plus_members` hides every record that has no owner — including from the admin who made the change — until an owner is set. Switch back to `workspace` to see them again. Only workspace admins can change it, including on protected objects (an org-scoped API key cannot; a signed-in admin is required): ```bash theme={null} dench crm objects update meeting --visibility workspace --json ``` An org-scoped API key or an agent run with no signed-in person reads only `workspace` objects. Sign in as a member (or bind the key to one) to read meetings and calendar events. ## Meetings A meeting is a CRM record on the protected `meeting` object. Create, update and delete it like any other entry; the Meetings page reads the same rows. ```bash theme={null} dench crm entries create meeting --data '{"Title":"Globex kickoff","Started At":"2026-08-12T10:00:00Z","Overview":"…"}' dench meetings transcript set --text transcript.txt dench meetings action-items set --items '- [x] Send the deck (Hank)' dench meetings participants set --people 'Hank ; ada@acme.com' ``` `dench meetings import --csv calls.csv | --jsonl calls.jsonl` brings in many calls at once: meeting fields per row plus optional `transcript`, `actionItems` and `attendees` columns. Same `--map`, `--dedupe-key` and `--on-conflict` flags as `dench crm import`. Attendees are linked to existing people and members by email, never created. Run it signed in — meetings are owner-scoped. API: `/v1/meetings`, `/v1/meetings/{id}/transcript`, `…/action-items`, `…/participants`. ## Records Dench writes for you Some objects are filled by Dench itself and cannot be created by hand. They are ordinary CRM records otherwise: `dench crm entries list `, `dench crm query`, the API and the agent all read them. | Object | One record per | Where you see it | | - | - | - | | `campaign` | outreach campaign or newsletter | Outreach → Campaigns (leads carry a `Campaign` relation) | | `email_thread` / `email_message` | synced email thread / message | Inbox, and the record's Inbox tab | | `linkedin_message` | LinkedIn message sent or received | the record's Inbox tab (hidden from tables and search, like `email_message`) | | `interaction` | email, meeting or LinkedIn message with a contact | the record's Activity and its Score | A LinkedIn message files an `interaction` with Type `LinkedIn` only when the other person is a linked `people` record. Messages from a private LinkedIn account keep their text out of the CRM until a viewer-aware read rule exists for inbox rows. # Dench: the AI workspace for AI agents Source: https://dench.com/docs/index Dench is the shared workspace for AI agents: one CRM, memory, approvals desk, integrations, and routines, with an API and CLI your agents drive. Dench is a workspace for the AI agents you already use. Connect Cursor, Claude Code, Codex, or any custom agent and they share one CRM, memory, approval desk, and toolset, reachable from the terminal, the web, and your phone. ## Connect an agent ```bash Cursor theme={null} npx -y -p @dench.com/cli dench signin --kind cursor --name "Cursor Agent - Project" ``` ```bash Claude Code theme={null} npx -y -p @dench.com/cli dench signin --kind claude_code --name "Claude Code - Project" ``` ```bash Codex theme={null} npx -y -p @dench.com/cli dench signin --kind codex --name "Codex - Project" ``` ```bash Custom theme={null} npx -y -p @dench.com/cli dench signin --kind other --name "AI Agent - Project" ``` Approve the printed link, then verify: ```bash theme={null} npx -y -p @dench.com/cli dench context --json npx -y -p @dench.com/cli dench crm entries list task --json ``` ## What's inside People, companies, tasks, and any custom object. Relations, enums, batch writes, queries, and aggregates. GitHub, Gmail, Stripe, Linear, Slack, and more, brokered through Dench with policy and approvals. Humans decide. Agents request, record evidence, and wait for a yes before risky actions. Durable facts, decisions, and preferences your agents can search across sessions. Schedule recurring agent runs with cron, intervals, or one-shot timers. Spawn chat-turn workflows, follow live streams, and nest agents from the CLI or API. ## Three ways to drive it Connect Claude, Cursor, or any MCP client at `https://mcp.dench.com/mcp`. Sign in, pick a workspace, and approve permissions. The agent-facing interface. `dench signin` once, then CRM, chat, tools, memory, files, and routines from the terminal. Every server-backed command has a `/api/v1` endpoint with an interactive playground. Use it from CI, services, or any HTTP client. ## Start here Connect your first agent in under five minutes. The instructions agents read to set Dench up themselves. # Connect external tools and integrations Source: https://dench.com/docs/integrations Connect GitHub, Gmail, Stripe, Linear, Slack, Notion, and Calendar to Dench, then run brokered tool calls with policy, logs, and approvals. Dench brokers external tools through `dench tool`. Agents never run a provider CLI directly, Dench mediates so sessions, gateway keys, logs, and approvals are enforced. ## Connect a tool ```bash theme={null} dench integrations --json dench tool status github --json ``` `dench integrations` lists every connected app. Gmail, Outlook, Calendar and LinkedIn connect through Dench itself, so they appear with `source: "dench"`; apps you connect from the catalog appear with `source: "app"`. Check them with `dench tool status gmail --json` (or `outlook`, `linkedin`, `calendar`). `calendar` shows both Google and Microsoft calendars; `google-calendar` and `outlook-calendar` filter by provider. If `nativeAvailable` is false, the lookup failed; that does not mean the account is disconnected. ```bash theme={null} dench tool connect github --json ``` For Gmail, Outlook, LinkedIn, or Calendar, use the same command with `gmail`, `outlook`, `linkedin`, or `calendar`. These return a Dench sign-in link using the web app's configuration and managed callback. Sign in as a workspace member or use a member-owned Dench API key. Share the returned `redirectUrl` as Markdown, e.g. `[Connect Gmail]()`, ask the human to authorize the account, then run the matching status command again. Slack keeps its in-house install URL (`dench tool connect slack`, org admin); other toolkits connect as connected apps. `--callback-url` is only supported for connected apps. ```bash theme={null} dench tool search "create an issue" --toolkit github ``` ```bash theme={null} dench tool run GITHUB_LIST_REPOSITORIES --args '{"per_page":10}' --json ``` ## Read-only vs gated Slugs containing `FETCH`, `GET`, `LIST`, `SEARCH`, `READ`, or `FIND` are read-only and run without a separate approval. Connected-app actions with their own approval policy return an `approvalId`. Get a human yes/no, then rerun with `--approval `. See [Approvals](/docs/approvals). Dench-brokered Slack, Gmail, Outlook, Calendar, and LinkedIn tools use the fixed workspace **Full access (`yolo`)** policy: no approval request or `--approval` is needed, including for workspaces with older saved ask preferences. There is no Approvals setting. Authentication and connection access checks still apply. Explicit approval APIs and existing approval records are unchanged. For email tools, never repeat OTP codes, passwords, tokens, or secrets from message bodies. Prefer sender, subject, date, and short snippets. Connected-app tool operations are also available over the API under `/tools`. People and company search use `/crm/people/search` and `/crm/companies/search`. Try them in the [API playground](/docs/api/overview). # MCP connector for Claude, Cursor, and AI apps Source: https://dench.com/docs/mcp-server Connect Claude, Cursor, or any MCP client to your Dench workspace: sign in with OAuth, pick a workspace and permissions, and use CRM, task, inbox, and campaign tools. Dench is the AI revenue engine and CRM. The Dench MCP connector brings your workspace into the AI apps you already use. Claude, Cursor, or any MCP client can then do what the [Dench CLI](/docs/cli/overview) does: read and update your CRM, views, analytics, comments, tasks, meetings, and files, read your inbox, campaigns, and memory, search the web and Dench's people and company data, and run actions in the apps you connected to Dench. Server URL: `https://mcp.dench.com/mcp`. You sign in with OAuth, choose one workspace, and approve the permissions the app gets. Connected-app actions that aren't read-only wait for your approval in Dench before they run. ## Connect If Dench is listed in Claude's connector directory, open it and click **Connect**. Otherwise, open **Settings → Connectors**, choose **Add custom connector**, and enter: ```text theme={null} https://mcp.dench.com/mcp ``` On Team and Enterprise plans, an owner may need to add the connector for the organization first. Claude opens Dench in your browser. Sign in, choose a workspace and permissions, and click **Approve**. See [Sign in and choose a workspace](#sign-in-and-choose-a-workspace). Turn Dench on for a chat, then ask something like "What are my open tasks in Dench?" For Claude Code, add the server, then run `/mcp` and choose `dench` to sign in: ```bash theme={null} claude mcp add --transport http dench https://mcp.dench.com/mcp ``` Add Dench to `~/.cursor/mcp.json` for all projects, or to `.cursor/mcp.json` in one project: ```json theme={null} { "mcpServers": { "dench": { "url": "https://mcp.dench.com/mcp" } } } ``` Cursor's MCP settings then show that `dench` needs sign-in. Start it there, and Cursor opens Dench in your browser to approve the connection. Any client that supports remote MCP servers over Streamable HTTP with OAuth can connect. Most take a JSON config like this: ```json theme={null} { "mcpServers": { "dench": { "type": "http", "url": "https://mcp.dench.com/mcp" } } } ``` Key names vary by client (some use `servers` or `serverUrl`), so check your client's docs. If your client only runs local (stdio) servers, bridge to Dench with `mcp-remote`: ```json theme={null} { "mcpServers": { "dench": { "command": "npx", "args": ["-y", "mcp-remote", "https://mcp.dench.com/mcp"] } } } ``` Clients sign in with the OAuth authorization-code flow and PKCE (S256). Dench supports dynamic client registration and client ID metadata documents, and publishes discovery metadata at `https://mcp.dench.com/.well-known/oauth-protected-resource/mcp`. The server only accepts access tokens issued through this flow. Dench API keys and `dench signin` sessions don't work here; use them with the [CLI](/docs/cli/overview) or [API](/docs/api/overview). ## Sign in and choose a workspace When you connect, your AI app opens Dench in your browser. Click **Continue with Google**, or enter your email and type the 6-digit code Dench sends you. If you're already signed in, you skip this step. Pick one workspace from the list of every workspace you belong to. The one you're currently in is selected. The app works only in that workspace and acts as you. Review the app's name and where it redirects. Apps that Dench hasn't verified are marked **unverified**. Tick the permissions you want to grant, then click **Approve**. You return to your AI app, connected. To use another workspace or change permissions, disconnect and connect again. ## Permissions The consent screen lists four permissions. The app only sees the tools for the permissions you approve, and Dench checks them again on every call. | Permission | On the consent screen | What it allows | | - | - | - | | **Read your workspace** | Always included | Workspace context and rules, CRM records, views, analytics, history, comments, and tasks, meetings, members, notifications, files, saved lists, Dench chats, routines, memory, inbox and campaign reads, and approvals. | | **Create and update workspace data** | Optional | Create and edit CRM records, objects, fields, views, statuses, and analytics, add notes and comments, manage tasks, meetings, files, saved lists, and routines, start Dench chats, save memories, edit workspace rules and agent context, and request approvals. | | **Act in your connected apps** | Optional | Connect apps and find and run actions, as you, in the apps you connected to Dench, such as sending an email or posting to Slack. Also web search and Dench's people, company, and job data, which use credits. | | **Manage and send outreach** | Optional, always starts unticked | Create and edit campaigns, email campaigns, sequences, and drafts, add recipients, launch and resume campaigns, and send email. See [Outreach permission](#outreach-permission). | For a read-only connection, untick **Create and update workspace data** and **Act in your connected apps**. ## Tools The connector offers the same actions as the [Dench CLI](/docs/cli/overview): both run the same Dench operations, and a check in Dench's build fails when a CLI command has no MCP tool and no recorded reason for leaving it out. With the first three permissions it offers 235 tools; the [outreach permission](#outreach-permission) adds 60 more. In the **Permission** column, Read, Write, and Connected apps stand for **Read your workspace**, **Create and update workspace data**, and **Act in your connected apps**. No tool can approve or reject a request. Signing in, billing, saved setups and secrets, and approving or rejecting stay with the CLI and the app. Deletes have their own tools ([Deletes](#deletes)), which AI apps mark as destructive. ### CRM records | Tool | Permission | What it does | | - | - | - | | `list_records` | Read | List an object's records, newest first: a bounded preview of up to 200 that local cursors page. | | `search_records` | Read | Search records by text, optionally within one object, best match first: an exact or phrase title match ranks above matches elsewhere, and records matching only some words of the query are left out when others match them all. | | `query_records` | Read | Filter an object's records by field (`$eq`, `$gte`, `$in`, `$contains`, `$and`, `$or`, and more) and choose which fields to return. Results page in index order; sorting isn't supported. Each call keeps reading until it has `limit` matches or reaches the end. `assigned_to` scopes it to one person's records. | | `find_records` | Read | Run a sorted query over an object: filters, selected fields, sort (e.g. "-Score,Name"; - is descending) and up to 200 rows. `query` narrows it to records whose text holds every word of the query. | | `get_record` | Read | Read one record, optionally with its current Brief. | | `get_record_field` | Read | Read one field of one record in full (long text and file values included). | | `aggregate_records` | Read | Count an object's records by the values of one field, optionally totalling a number field per bucket (e.g. Amount by Stage). | | `generate_report` | Read | Build a chart-ready report: records grouped by one field with a count, sum, average, minimum or maximum. | | `create_record` | Write | Create a record with field values that match the object's fields. | | `create_records` | Write | Create up to 200 records in one object in a single call. | | `update_record` | Write | Update fields on a record. `null` clears a field. | | `update_records` | Write | Update up to 200 records of one object in a single call; each update names a record and the fields to change. | | `batch_records` | Write | Apply up to 200 record creates and updates across objects together. | | `set_record_field` | Write | Set one field of one record, or with append: true add to it (text is appended, list values are added) instead of replacing it. | | `set_record_fields` | Write | Set up to 200 individual fields across any records in one call. | | `enrich_field` | Write | Fill an enrichment field (e.g. a work email or company size) from Dench's data providers: for one record with entry\_id, or for every record of the object (missing\_only skips records that already have a value). | | `list_detections` | Read | List what Dench decided about people and companies it saw in email and LinkedIn: records created, skipped, or failed. | Field names in record data must match the object's fields (`list_fields`); Dench also accepts common aliases in any case, such as `name` for a task's title field and `Owner` for its `Assignee`, exactly as the CLI does. `query_records` pages through a whole object in index order; `find_records` sorts and returns up to 200 rows; `list_records` previews the newest 200 and says `truncated: true` when there are older records. `assigned_to` (`me`, `unassigned`, or a member) scopes a read to one person's records without changing any view. Tools that take an `object_name` also accept it as `object` (for example `"people"`, `"company"`, or a label such as `"Contacts"`), tools that take a record's `entry_id` also accept it as `record_id`, and campaign tools accept `sequence_id` for `sequenceId`. `list_records`, `query_records`, and `get_record` leave empty fields out of each record, so a field you don't see has no value. An id that isn't a record of that object, including a malformed one, answers `not_found`. ### Objects, fields, and statuses | Tool | Permission | What it does | | - | - | - | | `list_objects` | Read | List the workspace's CRM objects, such as people, companies, and custom objects. `full: true` returns each object's whole definition. | | `get_object` | Read | Read one object's settings: description, icon, default view, who can see its records, record count, and saved views. | | `create_object` | Write | Create an object (a table) and up to 30 fields in one call. The object and its fields are created together or not at all. | | `update_object` | Write | Change an object's description, icon, default view, or who can see its records. Changing who can see records needs your approval. | | `rename_object` | Write | Rename a CRM object. | | `archive_object` | Write | Archive a CRM object (hide it from the sidebar, keeping every record) or restore it with archived: false. | | `set_object_visibility` | Write | Change who can see an object's records: workspace (every member), owner\_only, or owner\_plus\_members (the owner plus members listed on the record). | | `list_fields` | Read | List an object's fields and their constraints. `full: true` adds enrichment, calculation, and index settings. | | `create_field` | Write | Add a field to an object: text, rich text, number, true/false, date, email, phone, URL, select, multi-select, tags, workspace member, file, or a relation to another object. | | `update_field` | Write | Rename a field, change its description or whether it's required, or add options to a select field. | | `update_field_options` | Write | Change a select field's options: rename one (records holding it move to the new name), recolor one, or put them in a new order (an exact permutation). | | `reorder_fields` | Write | Set the column order of an object's fields. | | `list_statuses` | Read | List an object's status options with colors and order. | | `set_statuses` | Write | Add or update an object's statuses by name (color, order, which one is the default). | | `list_crm_templates` | Read | List CRM templates (ready-made objects, fields and views, e.g. sales or recruiting) and which are installed. | | `install_crm_template` | Write | Install a CRM template: adds its objects, fields, views and sample records to the workspace. | | `list_crm_automations` | Read | List the workspace's built-in CRM automations (what each does when a record changes) and whether each is on. | | `set_crm_automation_enabled` | Write | Turn one CRM automation on or off. | For example, ask "Create a Content table in Dench with Name, Type, Channel, and Status selects, a Publish date, a Link, and Notes." The app calls `create_object` with one entry per field: ```json theme={null} { "name": "content", "fields": [ { "name": "Name", "type": "text" }, { "name": "Type", "type": "select", "options": ["Blog post", "Video", "Podcast"] }, { "name": "Channel", "type": "select", "options": ["Website", "LinkedIn", "YouTube"] }, { "name": "Status", "type": "select", "options": ["Idea", "Drafting", "Published"] }, { "name": "Publish date", "type": "date" }, { "name": "Link", "type": "url" }, { "name": "Notes", "type": "text" } ] } ``` * Every object already has a rich-text **Notes** field, so a requested Notes text field is reported as existing rather than created twice. * Dench creates the object and its fields together. If any field is rejected, such as a relation to an object that doesn't exist, nothing is created and the error names the field, so the app can fix it and call again. * `update_field` only adds select options; `update_field_options` renames, recolors, or reorders them. No tool removes an option, a field, or an object. * Changing who can see an object's records is for workspace admins. Narrowing an object to its owners hides every record without an owner from everyone. `set_object_visibility` waits for your approval in Dench before it narrows, and `update_object` waits for it before any visibility change. ### Views and sidebar | Tool | Permission | What it does | | - | - | - | | `list_views` | Read | List an object's saved views (filters, sort, columns). | | `get_view` | Read | Read one saved view's definition. | | `list_view_records` | Read | Read the records a saved view shows, with its filters and sort applied, one numbered page at a time (25 rows unless `page_size` or `limit` says otherwise). | | `create_view` | Write | Save a view on an object: name, view type, filters, sort, columns and settings. | | `update_view` | Write | Replace a saved view's definition (filters, sort, columns, settings). | | `rename_view` | Write | Rename a saved view. | | `archive_view` | Write | Archive a saved view (hide it from the view list) or restore it with archived: false. | | `get_sidebar` | Read | Read your sidebar: objects and pages in order, groups, and pins, with the nav ids update\_sidebar takes. | | `update_sidebar` | Write | Arrange your sidebar: move an item (position top, bottom, or a 1-based row), create or rename a group, put an item in a group (group\_id null takes it out), or pin an item to the top level. | ### Analytics | Tool | Permission | What it does | | - | - | - | | `get_analytics` | Read | Read an object's dashboard: its panels, field roles (amount, stage, close date, owner) and layout. | | `compute_analytics` | Read | Compute dashboard numbers: saved panels by panel\_ids, or ad-hoc panels (type, metric, groupBy, dateField, ...), over a period, with extra filters and a personal assigned\_to scope. | | `save_analytics_panel` | Write | Add a dashboard panel, or replace the one with this panel\_id, e.g. a stat of open pipeline or a bar chart of deals by stage. | | `update_analytics_panel` | Write | Change one dashboard panel: a patch of its settings, hidden to hide or show it, or span to resize it (2, 3, 4 or 6 columns; null resets). | | `reorder_analytics_panels` | Write | Set the order of a dashboard's panels. | | `set_analytics_roles` | Write | Tell the dashboard which fields mean what: amount, stage, won/lost/converted values, close date, owner, location, recurrence, stage probabilities. | | `set_analytics_collapsed` | Write | Collapse the dashboard strip above an object's table, or expand it with collapsed: false. | | `set_view_analytics_scope` | Write | Give a saved view its own dashboard (own) or show the object's shared one (shared). | ### Record details, comments, and notes | Tool | Permission | What it does | | - | - | - | | `list_record_activity` | Read | Read a record's activity timeline, newest or oldest first, filtered by kind or time. `count_only: true` counts it instead. | | `list_record_history` | Read | List the field changes made to a record, newest first, with who made each. | | `get_record_details` | Read | Read one part of what Dench knows about a record: brief (the AI summary), dossier (researched background), context (what the agent sees and why), privacy (whether your messages with it are hidden), email\_sync (email history import status), or watch (whether you follow it). | | `regenerate_record_summary` | Write | Have Dench rewrite a record's brief (the AI summary of its activity) or dossier (researched background) now. | | `set_record_privacy` | Write | Hide (hidden: true) or show your own emails and messages with this record to the workspace. | | `sync_record_email_history` | Write | Import past email with this record's addresses from connected mailboxes. | | `watch_record` | Write | Follow a record to be notified of its comments and changes, or stop with watching: false. | | `list_record_notes` | Read | List the titled notes on a record. | | `add_note` | Write | Add a titled Markdown note to a record. | | `list_record_comments` | Read | List the comment threads on a record, newest first, each with a preview of its replies. | | `list_comment_replies` | Read | List every reply in one comment thread. | | `get_comment` | Read | Read one comment with its reactions. | | `add_comment` | Write | Comment on a record, or reply in a thread with reply\_to. | | `update_comment` | Write | Edit the text of a comment you wrote. | | `react_to_comment` | Write | Add an emoji reaction to a comment; reacting again with the same emoji removes it. | | `list_documents` | Read | List workspace documents and the records they are linked to. | | `create_document` | Write | Create a document page backed by a workspace file (write the file first with write\_file), optionally nested under another document or linked to a record. | | `link_document` | Write | Link a workspace file as a document on a record or object. | | `list_record_actions` | Read | List the action buttons available on a record, with the action\_id and field\_id run\_record\_action takes. | | `run_record_action` | Write | Press an action button on up to 50 records. | ### Tasks and subtasks | Tool | Permission | What it does | | - | - | - | | `list_tasks` | Read | List open tasks assigned to you, up to 50. | | `list_record_tasks` | Read | List the tasks linked to a CRM record, open and done. | | `create_task` | Write | Create a task linked to a record, with an optional assignee, due date, and priority. | | `complete_task` | Write | Mark a task complete. | | `reopen_task` | Write | Reopen a completed task. | | `set_task_priority` | Write | Set or clear a task's priority. | | `create_subtask` | Write | Add a subtask to a task, with an optional assignee and due date. | | `list_subtasks` | Read | List a task's subtasks. | | `set_task_parent` | Write | Make a task a subtask of another task, or a top-level task again with parent\_entry\_id null. | | `get_task_repeat` | Read | Read how a task repeats: its rule, what triggers the next one, when it ends, and the next due dates. | | `set_task_repeat` | Write | Make a task repeat (daily, weekly, monthly, yearly, or an RRULE), or turn a repeat off, skip the next occurrence, pause it, or resume it. | | `list_task_series` | Read | List repeating task series (filter by status), or with series\_id the tasks one series has created. | ### Meetings A meeting is private to its owner and invitees until it is shared with the workspace. Create and update the meeting record itself with the record tools. | Tool | Permission | What it does | | - | - | - | | `list_meetings` | Read | List the meetings you can read, newest first, with status and participants. | | `get_meeting_transcript` | Read | Read a meeting's transcript in order (speaker, time, text), one page at a time. | | `get_meeting_details` | Read | Read a meeting's action\_items, participants (the roster with linked CRM people), or sharing (who can read it). | | `add_meeting_transcript` | Write | Append up to 500 transcript segments (text, with optional speaker and times) to a meeting. | | `add_meeting_action_items` | Write | Add action items to a meeting; replace: true swaps out the existing list instead. | | `set_meeting_action_item_done` | Write | Mark a meeting action item done, or not done. | | `set_meeting_participants` | Write | Add people (name, email, host) to a meeting's roster, linking them to CRM people; replace: true swaps out the existing roster. | | `set_meeting_sharing` | Write | Share a meeting (record, transcript, action items, roster) with every workspace member, or make it private to its owner and invitees again with shared: false. | ### Members, notifications, and settings | Tool | Permission | What it does | | - | - | - | | `list_members` | Read | List the workspace's members with their user ids, names, emails and roles. | | `get_member` | Read | Read a member's profile: name, role, tagline, time zone. | | `list_member_activity` | Read | List what a member has done recently: comments they wrote and record changes they made. | | `list_member_tasks` | Read | List a member's open tasks, soonest due first. | | `get_member_presence` | Read | Who is online and what they are looking at; pass user\_ids to ask about particular members. | | `get_my_profile` | Read | Read the connected user's own profile in this workspace: name, tagline, time zone, avatar, presence and open-task count. | | `update_my_profile` | Write | Change the connected user's name, tagline or time zone (IANA, e.g. America/New\_York; null clears it). | | `list_notifications` | Read | List the connected user's notifications: inbox (default), unread, archived or all — mentions, assignments, replies and record activity they follow. | | `count_unread_notifications` | Read | How many unread notifications the connected user has. | | `mark_notifications_read` | Write | Mark one notification read (unread: true marks it unread again), or every inbox notification read with all: true. | | `archive_notification` | Write | Move a notification out of the inbox into the archive. | | `get_notification_preferences` | Read | Read the connected user's notification settings: in-app and email, per kind, digest window and daily email cap. | | `update_notification_preferences` | Write | Change notification settings; only the keys sent change. | | `get_sync_settings` | Read | Read the workspace's Sync switches: what Dench does on its own with email, calendar, Slack and LinkedIn (accounts from email, LinkedIn contacts, Slack Connect, calendar contacts, dossiers, tasks from email, lead auto-qualify, summaries and Brief). | | `update_sync_settings` | Write | Turn Sync switches on or off (workspace admins only). | ### Files and saved lists | Tool | Permission | What it does | | - | - | - | | `list_files` | Read | List the files and folders under a workspace folder. | | `read_file` | Read | Read a text file from the workspace, with the contentHash write\_file takes to avoid overwriting someone else's change. | | `get_file_download_url` | Read | Get a short-lived download link for a workspace file (any type, e.g. an image or PDF). | | `write_file` | Write | Create or replace a text file (UTF-8, up to 400 KB). | | `upload_files` | Write | Write up to 20 files at once, each as text or base64 bytes (for images, PDFs and other binary files). | | `move_file` | Write | Move or rename a workspace file or folder. | | `create_folder` | Write | Create a folder in the workspace files. | | `list_saved_lists` | Read | List the saved lists of people, companies and jobs from Find; search filters by title. | | `get_saved_list` | Read | Read a saved list: title, kind, filters and row counts. An id that names no saved list answers `not_found`. | | `list_saved_list_rows` | Read | Read a saved list's rows, filtered by contact enrichment state, one page at a time. | | `save_list` | Write | Save people, companies or jobs (whole records from find\_people / find\_companies / find\_jobs) as a list. | | `update_saved_list` | Write | Rename a saved list or replace its filters or rows. An id that names no saved list answers `not_found`. | | `import_saved_list` | Write | Add a saved list's rows to the CRM as lead, company or job\_posting records (all rows, chosen row\_indexes, or by enrichment state), optionally with a status and a pinned view. | | `enrich_saved_list` | Write | Buy contact details (work email, phone, personal email) for up to 100 rows of a saved list. | | `list_prospect_reviews` | Read | List the fit assessments recorded for a saved list's rows against the workspace's ideal customer. | | `assess_prospect` | Write | Record a fit assessment for one row of a saved list: likely\_fit, unlikely\_fit or unknown, a 0-100 relevance score, and the reason. | ### Dench chats, routines, and apps `start_chat` hands a task to Dench's own agent; it never skips Dench's approvals. Chats and routine runs use AI credits. | Tool | Permission | What it does | | - | - | - | | `list_chats` | Read | List the connected user's Dench chat threads, newest first; title\_query filters by title. | | `search_chats` | Read | Full-text search across the connected user's past Dench chats. | | `read_chat` | Read | Read the messages of one Dench chat thread as you saw them, without the assistant's internal reasoning or tool calls. | | `start_chat` | Write | Hand a task to Dench's own agent in a new chat. | | `send_chat_message` | Write | Send a follow-up message in a Dench chat; the agent continues in the background. | | `rename_chats` | Write | Retitle up to 50 Dench chat threads. | | `set_chat_model` | Write | Set the model Dench chats use: the workspace default, or with thread\_id one chat's override. | | `list_routines` | Read | List routines: Dench agent prompts that run on a schedule, a webhook, or a CRM change. Each comes back as a summary unless `full: true`. | | `get_routine` | Read | Read one routine: prompt, schedule, trigger and status. An id that names no routine answers `not_found`. | | `list_routine_runs` | Read | List recent runs of one routine (job\_id), or of every routine in the workspace. | | `create_routine` | Write | Create a routine that runs a Dench agent prompt every interval, on a cron schedule, or once at a set time. With `enabled: false` it starts paused, with no next run, until `set_routine_enabled` turns it on. | | `update_routine` | Write | Change a routine's name, prompt, schedule, description or overlap policy. An id that names no routine answers `not_found`. | | `set_routine_enabled` | Write | Turn a routine on or off. | | `run_routine` | Write | Run a routine once now, outside its schedule. An id that names no routine answers `not_found`. | | `list_artifacts` | Read | List what Dench agents produced in this workspace (reports, lists, files) and suggested follow-up work. | | `list_apps` | Read | List the Dench apps installed in this workspace. | | `list_app_gallery` | Read | List the apps available to install, with the listing ids install\_app takes. | | `install_app` | Write | Install an app from the gallery into this workspace. | | `set_app_enabled` | Write | Turn an installed app on or off. | | `pin_app` | Write | Pin an installed app to the sidebar, or unpin it. | ### Workspace context, rules, and memory | Tool | Permission | What it does | | - | - | - | | `get_workspace_context` | Read | Get a compact orientation to the workspace. | | `get_workspace_rules` | Read | Read the workspace's standing rules. | | `set_workspace_rules` | Write | Replace the workspace's standing rules. | | `get_context_sections` | Read | Read the workspace's agent profile: identity, organisation, user, memory, rules and tools notes (all, or the sections named). | | `update_context_section` | Write | Replace one section of the agent profile: identity (who the agent is), organisation (the company), user (the connected user) or tools (notes on how to use tools). | | `search_memory` | Read | Search the memories visible to you. | | `save_memory` | Write | Save a durable fact, preference, decision, or other memory, for you or for the whole workspace. | ### Approval requests | Tool | Permission | What it does | | - | - | - | | `list_approvals` | Read | List the workspace's approval requests, optionally by status (pending, approved, rejected, or canceled). | | `get_approval` | Read | Read one approval request. | | `request_approval` | Write | Ask a person to approve something, with a title, reason, and risk level (low, medium, or high). | ### Connected apps | Tool | Permission | What it does | | - | - | - | | `list_connected_apps` | Connected apps | List the apps connected to your Dench workspace. | | `search_actions` | Connected apps | Find the actions those apps offer, optionally within one app. | | `run_action` | Connected apps | Run an action by its slug. Read-only actions run directly; everything else needs your approval. See [Approval flow](#approval-flow). | | `connect_app` | Connected apps | Start connecting an external app (e.g. github, gmail, hubspot, linkedin) to the workspace. | | `disconnect_app` | Connected apps | Disconnect a connected app account (connection\_id from list\_connected\_apps). | | `list_connection_labels` | Connected apps | List the names given to connected app accounts (e.g. Work Gmail, Personal Gmail). | | `set_connection_label` | Connected apps | Name a connected app account so it can be told apart from others of the same app; an empty name clears it. | `connect_app` returns a link: you open it and sign in to the app before the connection exists. `disconnect_app` waits for your approval in Dench. ### Web, people, and company data These reach outside Dench and use credits, like the same CLI commands. They change nothing in your workspace; save results with `save_list` or the record tools. | Tool | Permission | What it does | | - | - | - | | `web_search` | Connected apps | Search the web. | | `web_fetch` | Connected apps | Read the text of up to 10 web pages, optionally with a summary focused on a question. | | `web_answer` | Connected apps | Answer a question from a live web search, with citations; output\_schema shapes the answer as JSON. | | `web_lookup` | Connected apps | Read structured data from a website. | | `find_people` | Connected apps | Search Dench's people data by title, seniority, company, location, industry and more (accepted values: [https://dench.com/references/find-filter-options.json](https://dench.com/references/find-filter-options.json)). | | `find_companies` | Connected apps | Search Dench's company data by domain, name, industry, location, headcount and keywords. | | `find_jobs` | Connected apps | Search open job postings by title, location, company and posting date. | | `preview_find` | Connected apps | Count how many people, companies or jobs a Find search would return, with a sample, before paying for the full search. | | `enrich_person` | Connected apps | Look up one person's full profile by LinkedIn URL, LinkedIn id or email. | | `enrich_company` | Connected apps | Look up one company's full profile by website, LinkedIn URL or LinkedIn id. | | `lookup_profiles` | Connected apps | Look up to 100 people (by LinkedIn URL or email) or companies (by domain or LinkedIn URL) at once, in input order. | | `find_contact_details` | Connected apps | Buy work emails and phone numbers for people (each contact by linkedinUrl, or name plus company). | | `list_company_related` | Connected apps | List a company's employees, founders, funding rounds, investors, acquisitions or investments, by domain or LinkedIn URL. | | `campaigns_audience_search` | Connected apps | Search for people to add to a campaign (titles, locations, industries, ...; not-filters leave values out). | ### Campaigns These tools only read. With the first three permissions, an AI app can't create, edit, launch, pause, or resume a campaign. | Tool | Permission | What it does | | - | - | - | | `campaigns_list` | Read | List up to 200 campaigns, optionally including archived ones, with how many archived ones were left out. | | `campaigns_get` | Read | Read a campaign and its steps. | | `campaigns_analytics` | Read | Read a campaign's analytics. | | `campaigns_events` | Read | Page through a campaign's events. | | `campaigns_live` | Read | Read a campaign's current sender and activity status. | | `campaigns_launch_preview` | Read | Check whether a campaign is ready to launch. It doesn't launch anything. | | `campaigns_accounts_linkedin` | Read | List the LinkedIn sender accounts available to campaigns. | | `campaigns_accounts_email` | Read | List the email mailboxes the user may send campaigns from (their own plus teammates' shared ones), with ids for sender pools. | | `campaigns_pipeline` | Read | Count a campaign's people by lead status (contacted, replied, interested, ...). | | `campaigns_queue` | Read | Read who a campaign contacts today, on which step. | | `campaigns_preview` | Read | Show the exact message one person gets at a step, with their personalization filled in. | | `campaigns_sources` | Read | Read a signal campaign's lead sources: settings (targeting, signals, cadence, approval mode), signals (what each signal found), overview (counts), or pending (people waiting for the user's review). | | `campaigns_personalization_get` | Read | Read a campaign's AI-written personalization lines and how many people have them. | | `campaigns_for_record` | Read | List the campaigns a CRM record is enrolled in, and where. | | `campaigns_people_timeline` | Read | Read one person's campaign timeline: every step sent, scheduled or skipped, and replies. | | `campaigns_builder_read` | Read | Read the New campaign builder: profile (the company it targets for), drafts (saved builder drafts), draft (one draft with its people), or setup (where a draft left off). | ### Email and LinkedIn These tools only read. With the first three permissions, an AI app can't send email through them. | Tool | Permission | What it does | | - | - | - | | `list_email_threads` | Read | Page through synced email threads. | | `list_email_messages` | Read | Page through synced email messages. | | `list_linkedin_messages` | Read | Page through LinkedIn messages. | | `email_inbox_search` | Read | Search the user's connected mailboxes by free text, sender, recipient, subject, date and direction, newest first. | | `email_inbox_thread` | Read | Read one email thread from a connected mailbox, in order. | | `email_inbox_message` | Read | Read one message from a connected mailbox as text or HTML. | | `email_messages_list` | Read | Preview up to 100 recently sent emails with delivery status and open and click counts, optionally by status. | | `email_message_get` | Read | Read one email with its delivery status and open and click counts, by message id, inbox handle, or `email_message` record id. | | `email_sequences_list` | Read | List up to 200 email sequences, optionally including archived ones. | | `email_sequence_get` | Read | Read one email sequence. | | `email_sequence_enrollments_list` | Read | List a sequence's enrolled people and where each one is. | | `email_identities_list` | Read | List the workspace's email sending identities, optionally by domain. | | `email_identity_status` | Read | Check a sending identity's verification: with identityId, refresh its status (dns: true also returns the DNS records to add); with identity (domain or address), ask the provider directly. | | `email_draft_senders` | Read | List the mailboxes the user can write drafts from. | | `email_draft_get` | Read | Read a draft, with the revision email\_draft\_update and email\_draft\_send take. | | `email_draft_signature` | Read | Load the sending mailbox's signature for a draft. | | `email_template_preview` | Read | Render a template with sample values for its placeholders. | | `email_campaigns_list` | Read | List bulk email campaigns, newest first, filtered by status. | | `email_campaign_get` | Read | Read a bulk email campaign with its delivery counts. | | `email_campaign_recipients_list` | Read | List a bulk email campaign's recipients and their delivery status. | | `email_campaign_preview` | Read | Render a bulk email campaign for a sample of its recipients. | If no inbox or LinkedIn account is connected yet, the inbox tools return an empty page with a note instead of an error. ### Deletes Each delete runs the same operation as the CLI's delete command and is marked destructive, so AI apps can ask before calling it. Archive, pause or disable instead when the data should come back. | Tool | Permission | What it does | | - | - | - | | `delete_record` | Write | Permanently delete one CRM record. | | `delete_records` | Write | Permanently delete up to 200 records of one CRM object. | | `delete_task` | Write | Delete a task. Its subtasks are deleted too unless subtasks is keep, which makes them top-level tasks. | | `delete_comment` | Write | Delete a comment or note; one with replies is kept as a tombstone so the thread stays readable. | | `undo_detections` | Write | Admin: delete the records Dench's ingestion created since a time (from email, LinkedIn, or auto-created tasks). Only rows nobody has touched are deleted, and they are never re-created; `dry_run` lists what would go. | | `delete_object` | Write | Permanently delete a CRM object with its fields, views and every record. `archive_object` hides it instead. | | `delete_field` | Write | Permanently delete a field and the values every record holds in it. | | `delete_field_option` | Write | Remove one option from a select field; records holding it are left empty. | | `delete_view` | Write | Delete a saved view by name. `archive_view` hides it instead. | | `delete_analytics_panel` | Write | Delete one analytics panel from an object or a view. | | `delete_sidebar_group` | Write | Dissolve a sidebar group; its items return to the top level where the group was. | | `delete_record_action` | Write | Delete an action button from its field, and optionally the field once it holds no buttons. | | `remove_crm_template_sample_data` | Write | Delete the sample records a CRM template installed; its objects, views and automations stay. | | `delete_meeting_action_item` | Write | Delete one action item from a meeting. | | `clear_meeting_transcript` | Write | Delete a batch of a meeting's transcript segments; call again until done before adding a new transcript. | | `delete_document` | Write | Delete a document page by the id `create_document` returned. Its workspace file stays and nested pages move up to its parent. An id that names no document answers `not_found`. | | `delete_file` | Write | Delete a workspace file, or a folder with everything in it. | | `delete_saved_list` | Write | Delete a saved list with its exported files and any watch linked to it. | | `delete_chats` | Write | Delete up to 25 chat threads. Threads a routine started are skipped unless `include_automated` is true. | | `delete_routine` | Write | Delete a routine and its schedule or webhook. `set_routine_enabled` pauses it instead. | | `uninstall_app` | Write | Uninstall an app from the workspace. `set_app_enabled` turns it off instead. | | `delete_app_webhook` | Write | Delete an app's webhook and every event it stored. | The outreach permission adds four more: `campaigns_builder_discard`, `campaigns_people_remove`, `email_identity_delete` and `email_sequence_step_remove` (see [Outreach permission](#outreach-permission)). ### Search and fetch For AI apps that use the standard `search` and `fetch` tools for company knowledge. | Tool | Permission | What it does | | - | - | - | | `search` | Read | Search CRM records and return each with a title, text, and a link to open it in Dench. | | `fetch` | Read | Fetch the full record for an `id` that `search` returned. | ## Approval flow Sending and other sensitive actions don't run until a person approves them in Dench. This applies to `run_action` for any connected-app action that isn't read-only, `run_record_action`, `disconnect_app`, changing who can see an object's records with `update_object`, narrowing an object with `set_object_visibility`, and the sending and launching tools under the [outreach permission](#outreach-permission). The first call runs nothing. It returns `approval_required` with an `approvalId` and a link to approvals in Dench. Open [Approvals](https://www.dench.com/approvals) in Dench, review which app asked and what it wants to do, and approve or reject it. After you approve, the app repeats the call with the same arguments and the `approval_id`. The action runs once. Connected-app actions whose slug contains `FETCH`, `GET`, `LIST`, `SEARCH`, `READ`, or `FIND`, and no write verb. Every other connected-app action, including anything that sends, creates, updates, or deletes, or that Dench can't classify. * Each approval covers one call with those exact arguments, from the connection that asked. If the arguments change or the call fails, the app needs a new approval. * AI apps can't approve their own requests. There is no tool that decides an approval. * These approvals always apply to AI apps connected over MCP, even though the workspace runs Dench's own agents with **Full access**. ## Outreach permission **Manage and send outreach** is off unless you tick it on the consent screen. It always starts unticked, even when the app asks for it. With it, the app gets 60 more tools. Their arguments keep the API's own names, such as `sequenceId` and `emailMailboxAccountIds`. | Tool | What it does | Approval | | - | - | - | | `campaigns_create` | Create a campaign draft. | Not needed | | `campaigns_update` | Update a campaign's settings. | Not needed | | `campaigns_steps_replace` | Replace a campaign's full list of steps. | Not needed | | `campaigns_people_add_from_crm` | Add CRM records to a campaign. | Required | | `campaigns_people_add` | Add one person to a campaign. | Required | | `campaigns_launch` | Launch a campaign, using the fingerprint from `campaigns_launch_preview`. | Required | | `campaigns_pause` | Pause a running campaign. | Not needed | | `campaigns_resume` | Resume a paused campaign. | Required | | `email_send` | Send an email from a connected identity. | Required | | `campaigns_draft_create` | Create a plain campaign draft with its sender pools. | Not needed | | `campaigns_people_add_from_search` | Run an audience search and add the people found to a campaign. | Required | | `campaigns_people_add_batch` | Add up to 50 people (email and/or LinkedIn URL, name, personalization) to a campaign, creating CRM records for new ones. | Required | | `campaigns_sources_update` | Change a campaign's lead sources: targeting, signals and their terms, cadence, find-more-matching, status (active/paused) and approval mode (auto adds found people without review). | To activate sources or auto-approve | | `campaigns_sources_preview` | Preview the people one signal (with its terms) would find for a campaign, without adding anyone. | Not needed | | `campaigns_sources_run` | Search a campaign's sources now instead of waiting for its cadence. | Required | | `campaigns_duplicate` | Copy a campaign's steps, schedule and senders into a new draft with no people (e.g. for the next 300 people of a search). | Not needed | | `campaigns_steps_update` | Change the text and waits of a launched campaign's steps in place (each step by stepId with its expectedUpdatedAt); step types and order are kept. | Unless the campaign is paused | | `campaigns_personalization_set` | Define up to 5 AI-written lines a campaign's steps use as placeholders, or remove them. | Not needed | | `campaigns_personalization_write` | Have AI write the personalization lines for a campaign's people: the missing ones, or all. | Not needed | | `campaigns_personalization_edit` | Set one person's personalization line by hand. | Not needed | | `campaigns_personalization_rewrite` | Have AI rewrite one person's personalization lines (or just one key). | Not needed | | `campaigns_archive` | Archive a campaign; it stops and leaves the campaign list. | Not needed | | `campaigns_people_stop` | Stop contacting one person in a campaign. | Not needed | | `campaigns_people_remove` | Remove a person who was never contacted from a draft campaign (delete). | Not needed | | `campaigns_people_resume` | Resume a paused or stopped person in a campaign; outreach to them restarts. | Required | | `campaigns_people_resume_all` | Resume every paused person in a campaign; outreach to them restarts. | Required | | `campaigns_people_update` | Correct one person in a campaign: their email, their LinkedIn URL, or one merge field. | Not needed | | `campaigns_people_sync` | Refresh a campaign's people from their CRM records (emails, LinkedIn URLs, merge fields). | Not needed | | `campaigns_builder_save` | Save a signal or lookalike campaign draft: targeting, signals and their terms, source and step. | Not needed | | `campaigns_builder_discard` | Delete a builder draft that never became a campaign. | Not needed | | `campaigns_builder_assist` | Builder helpers: find people like a best customer, suggest LinkedIn voices to watch, draft targeting from a description, or estimate audience size and weekly volume. | Not needed | | `campaigns_builder_build` | Find the first people for a builder draft from its targeting and signals. | Not needed | | `campaigns_builder_sequence` | Have AI write a builder draft's sequence and openers from a brief (goal, what you help with, tone, channels). | Not needed | | `campaigns_builder_outreach` | Save a builder draft's outreach: AI or manual mode, brief, steps, senders and approval mode. | Not needed | | `campaigns_builder_opener` | Change the opening line written for one person in a builder draft. | Not needed | | `campaigns_builder_create` | Turn a builder draft into a campaign. | Unless created paused | | `email_identity_create` | Add a sending identity: a whole domain (type domain) or one address (type email). | Not needed | | `email_identity_verify` | Start verifying a sending identity: with identityId, send the verification for a saved identity; with type and identity (a domain or address), request verification directly. | Not needed | | `email_identity_set_enabled` | Stop sending from an identity (enabled: false) or restore it. | Not needed | | `email_identity_delete` | Permanently delete a sender, or every sender on a domain; adding it back needs verification from scratch. | Not needed | | `email_draft_create` | Write a draft in one of the user's connected mailboxes (to, cc, bcc, subject, body). | Not needed | | `email_draft_update` | Change a draft's recipients, subject, body, attachments or mailbox; expectedRevision refuses the change if the draft moved on. | Not needed | | `email_draft_attach` | Attach a file (base64) to a draft. | Not needed | | `email_draft_send` | Send a draft from the user's mailbox. | Required | | `email_native_send` | Send an email from one of the user's connected mailboxes (Gmail, Outlook) in one step. | Required | | `email_template_create` | Save an email template with placeholders for bulk email campaigns. | Not needed | | `email_campaign_create` | Create a bulk email campaign draft from a template and a sender. | Not needed | | `email_campaign_recipients_add` | Add recipients to a bulk email campaign: a recipients list, or objectName with entryIds to pick CRM records. | Required | | `email_campaign_submit` | Submit a bulk email campaign: it sends now, or at its scheduled time. | Required | | `email_campaign_set_state` | Pause a sending campaign, resume a paused one (sending restarts), or cancel it for good. | To resume | | `email_sequence_create` | Create an email sequence (a multi-step follow-up cadence) from a verified identity or connected mailboxes. | Not needed | | `email_sequence_update` | Change a sequence's name, sender, reply and stop settings, sending window, schedule or daily cap. | Not needed | | `email_sequence_set_active` | Turn a sequence on (it starts emailing its enrolled people) or off. | To activate | | `email_sequence_archive` | Archive a sequence; it stops sending and leaves the list. | Not needed | | `email_sequence_step_add` | Add an email step to a sequence, sent delayHours after the previous one. | Not needed | | `email_sequence_step_update` | Change an email step's subject, body or delay. | Not needed | | `email_sequence_step_remove` | Remove a step from an email sequence (delete). | Not needed | | `email_sequence_steps_reorder` | Put a sequence's steps in a new order (every step id). | Not needed | | `email_sequence_enroll` | Enroll people in a sequence: a recipients list (email, name, personalization), or objectName with entryIds to pick CRM records. | Required | | `email_sequence_enrollment_set_state` | Pause, resume (emails restart) or stop one person's sequence. | To resume | Adding people to a campaign that is already running starts outreach to them right away. Approval is in addition to Dench's usual checks. Sending still enforces sender ownership and suppression rules. Launching still needs a current readiness fingerprint and, when required, your acknowledgement of the LinkedIn risk. ## Disconnect In Dench, open **Settings → API keys**. Under **Connected AI apps**, click **Disconnect** next to the app to revoke its access. Removing the connector in your AI app stops that app from calling Dench, but only disconnecting in Dench revokes the connection itself. ## Limits * A list tool returns at most 50 items per page. `limit` takes 1 to 50 (20 if you leave it out); any other value, such as `0` or `-5`, answers `validation_failed` instead of being reduced. Pass the returned `nextCursor`, unchanged, as `cursor` to get the next page; a cursor the tool didn't hand out answers `invalid_cursor`. A few tools page their own way: `list_view_records` by page number, and the web and data tools by the page token they return. * Every tool that takes a `cursor` returns its rows as `items`, with `nextCursor` beside them (`null` on the last page), plus any fields of its own such as `total` or `message`. The one exception is `search`, which returns `results` as AI apps' company-knowledge search expects. Tools that used to return `continueCursor` and `isDone` still do, for older clients: `continueCursor` equals `nextCursor`, and `isDone` is true when `nextCursor` is `null`. Rows that used to come back as `page` now come back as `items`. * Each tool call has 25 seconds. If a write runs out of time, it returns `outcome_unknown` because it may still finish. Check the result before trying again. * Each connection can make 300 requests and 60 writes per minute. ## Troubleshooting Your Dench account isn't a member of any workspace yet. Create or join one at [dench.com](https://dench.com/login), then connect again. The tool needs a permission you didn't grant. Disconnect, connect again, and tick that permission on the consent screen. Approve the request in [Approvals](https://www.dench.com/approvals), then let the app call again with the `approval_id` it was given. An argument doesn't match the tool's schema, such as a `limit` above 50, or a required argument is missing (`job_id: Required`). The error names each argument to fix and why, all in one answer, and nothing runs until they're fixed. Dench never quietly changes the value. The `cursor` isn't one this tool handed out: it was edited, cut short, or came from another tool. Pass `nextCursor` from the tool's previous page exactly as returned, or leave `cursor` out to start from the first page. The id doesn't name anything in this workspace: it was mistyped, the item was deleted, or it belongs to another workspace. `get_record`, `get_routine`, `list_routine_runs`, `update_routine`, `run_routine`, `get_saved_list`, `update_saved_list` and `delete_document` answer `not_found` for it, and the writes change nothing. List the items again, for example with `list_routines`, `list_saved_lists` or `list_documents`, and use an id from the result. The error lists every object in the workspace, starting with `people`, `company`, and `task`, with display labels in brackets. `availableObjects` holds the same list. Call again with one of those names as `object_name`. No email inbox or LinkedIn account is connected to the workspace. Connect one in Dench. See [Integrations](/docs/integrations). ## Support and privacy For help, email [support@dench.com](mailto:support@dench.com). To learn how Dench handles your data, read the [privacy policy](https://www.dench.com/privacy). # Workspace members, profiles, and presence Source: https://dench.com/docs/members Open a Dench teammate's profile for presence, local time, tagline, open tasks, and their CRM activity feed, from the app, CLI, or API. Click a teammate anywhere — a comment, an `@mention`, an Assignee or Owner pill, a meeting participant, the members list, a `⌘K` result, a notification — and their profile slides in from the right. Photo, name, tagline, role, email, and their local time relative to yours. Online, away, or offline with a last-seen time, from a heartbeat while the app is open. Open tasks assigned to them, and a feed of their comments and record changes across the CRM. ## Presence | State | Meaning | | - | - | | **Online** | The app was in a visible tab within the last 3 minutes | | **Away** | Within the last 30 minutes | | **Offline** | Longer, with "last seen …" when we've ever seen them | Only the web app heartbeats. CLI runs and API calls never count as presence, so an agent working on someone's behalf doesn't make them look online. ## Editing your own profile Open your own profile (the rail's account menu → **My profile**, or click your name anywhere) and click the photo, name, or tagline to change them in place. **Settings → Personal → My profile** has the same fields plus your timezone. Timezone also drives the agent's sense of "today" and "tomorrow". ## Assignee pills In record sidebars and tables, clicking an Assignee/Owner pill opens that person. To reassign, use the chevron that appears on hover (or click the empty part of the cell). ## Deep links `/?member=` opens a profile. The panel's link button copies it. Mentions in notes and comments are `[@Name](/?member=)`, so the same link works inside markdown. ## CLI ```bash theme={null} dench members list --json # roster + presence + timezone dench members get --json # one profile dench members activity [--limit 30] [--kinds comments,changes] dench members tasks # their open tasks dench members presence [...] # online / away / offline dench members me # your profile dench members me --name "Ada Lovelace" --tagline "Head of Ops" --timezone Europe/London dench members me --avatar ./me.png # png/jpeg/webp/gif/avif ≤ 2 MB dench members me --image-url https://…/me.jpg | --clear-avatar | --auto-timezone ``` Emails resolve against the roster, so scripts can pass `jane@acme.com`. ## API ```bash theme={null} curl -sS "$DENCH_API_BASE/members" -H "Authorization: Bearer $DENCH_API_KEY" curl -sS "$DENCH_API_BASE/members/" -H "Authorization: Bearer $DENCH_API_KEY" curl -sS "$DENCH_API_BASE/members//activity?limit=20&kinds=comments" -H "Authorization: Bearer $DENCH_API_KEY" curl -sS "$DENCH_API_BASE/members//tasks" -H "Authorization: Bearer $DENCH_API_KEY" curl -sS "$DENCH_API_BASE/members/presence?userIds=," -H "Authorization: Bearer $DENCH_API_KEY" curl -sS "$DENCH_API_BASE/me/profile" -H "Authorization: Bearer $DENCH_API_KEY" curl -sS -X PATCH "$DENCH_API_BASE/me/profile" -H "Authorization: Bearer $DENCH_API_KEY" \ -H "Content-Type: application/json" --data '{"tagline":"Head of Ops","timezone":"Europe/London"}' # Avatar: get a one-time upload URL, POST the bytes, then set the storageId. UPLOAD_URL=$(curl -sS -X POST "$DENCH_API_BASE/me/avatar/upload-url" -H "Authorization: Bearer $DENCH_API_KEY" | jq -r .) STORAGE_ID=$(curl -sS -X POST "$UPLOAD_URL" -H "Content-Type: image/png" --data-binary @me.png | jq -r .storageId) curl -sS -X PUT "$DENCH_API_BASE/me/avatar" -H "Authorization: Bearer $DENCH_API_KEY" \ -H "Content-Type: application/json" --data "{\"storageId\":\"$STORAGE_ID\"}" ``` `/me/*` needs a person behind the token: an agent session acts as its owner; an organization API key with no bound member is refused. ## For agents The chat agent has `get_member_profile({ userIdOrEmail })`, which returns the profile, presence, open tasks, and recent activity in one call — use it for "what is X working on", "is X around", or to check someone's timezone before scheduling. Activity excludes edits Dench or automations made on the person's behalf; it is what they did themselves. # Agent memory for durable knowledge Source: https://dench.com/docs/memory Save and search durable workspace facts, decisions, preferences, and conventions so Dench agents reuse stable knowledge across sessions. Memory is for stable knowledge that should outlive a single run, not scratch notes and not secrets. ## Save and search ```bash Save theme={null} dench memory save deployment-policy \ "Never deploy without human approval." \ --kind decision --tags deployment,policy --json ``` ```bash Search theme={null} dench memory search "deployment policy" --json ``` ## What belongs here Facts, decisions, preferences, recurring goals, conventions, and tool notes. Passwords, tokens, private keys, one-time codes, raw secret-bearing email, or one-off scratch notes. Entry-specific prose belongs in the CRM `Notes` field. Memory is for durable, workspace-wide knowledge. Sensitive memories are held for human review. ## Kinds `fact`, `decision`, `preference`, `goal`, `tool_note`, `convention`, `project_context`, `agent_lesson`, `docs_knowledge`, `open_goal`, `other`. ## Saved setup is separate from memory Use `dench env` for explicitly saved scripts, packages and configuration, and `dench secrets` for encrypted workspace credentials. Facts and preferences stay in `dench memory`; a note is not proof that a key or dependency has been saved. See [Reusable environments](https://dench.com/references/ENVIRONMENTS.md) and the [generated CLI index](https://dench.com/references/CLI.md). # Notifications, mentions, and email digests Source: https://dench.com/docs/notifications Read Dench notifications for mentions, replies, reactions, followed records, and reminders from the workspace bell, email digests, CLI, and API. The bell next to Search in the workspace rail holds everything addressed to you: mentions (including assignment), replies, reactions, activity on records you follow, reminders, and Dench replies. Clicking a row opens the record — comment notifications scroll straight to the comment. ## Kinds | Kind | Fires when | | - | - | | `mention` | someone `@`-mentions you, or a record is assigned to you | | `comment_reply` | someone replies to your comment | | `comment_reaction` | someone reacts to your comment (in-app only) | | `entry_activity` | a record you follow gets a comment or field change | | `dench_reply` | Dench answers a comment you left for it | | `task_completed` | a task assigned to you is marked done | | `date_reminder` | a date-field reminder you set fires | | `automation` / `system` | automation output and workspace notices | `task_assigned` is a legacy kind for older assignment rows. New assignments are `mention` and show under the Mentions tab. The list filter `mentions` includes both. ## Following records You follow a record automatically when you create it, comment on it, are mentioned on it, or are assigned to it. The **Follow** toggle in a record's Activity header (or `dench crm watch … --off`) unfollows; an explicit unfollow wins over later automatic follows. Followers get `entry_activity` notifications for other people's comments and edits, coalesced to one per actor every ten minutes. ## Email Email is a digest by default — one message per window (12 hours) with a daily cap — so a busy record never floods an inbox. Direct mentions and replies still respect the same window. Adjust frequency, the daily cap, and per-kind delivery in **Settings → Notifications**. ## CLI ```bash theme={null} dench notifications list [--filter inbox|unread|archived|all|mentions] [--limit N] --json dench notifications count dench notifications read [--unread] dench notifications read-all dench notifications archive dench notifications prefs dench notifications prefs --set emailEnabled=false --set entry_activity.email=false ``` Agent sessions (`dench signin`) read their owner's inbox. An organization API key has no person behind it and is refused. ## API ```bash theme={null} curl -sS "$DENCH_API_BASE/notifications?filter=mentions" -H "Authorization: Bearer $DENCH_API_KEY" curl -sS "$DENCH_API_BASE/notifications/unread-count" -H "Authorization: Bearer $DENCH_API_KEY" curl -sS -X PATCH "$DENCH_API_BASE/notifications/" -H "Authorization: Bearer $DENCH_API_KEY" \ -H "Content-Type: application/json" --data '{"read":true}' curl -sS -X POST "$DENCH_API_BASE/notifications/read-all" -H "Authorization: Bearer $DENCH_API_KEY" curl -sS -X PATCH "$DENCH_API_BASE/notifications/preferences" -H "Authorization: Bearer $DENCH_API_KEY" \ -H "Content-Type: application/json" --data '{"perKind":{"entry_activity":{"email":false}}}' ``` Notification `link`s are workspace-relative: `/?entry=:[&comment=]`. # Quickstart: connect an agent to Dench Source: https://dench.com/docs/quickstart Connect Cursor, Claude Code, Codex, or a custom AI agent to a Dench workspace in under five minutes using the dench CLI sign in flow. The published package is `@dench.com/cli` and the binary is `dench`. Run it with `npx -y -p @dench.com/cli dench ` or install it globally. Start the approval flow. Pick the command for your agent: ```bash Cursor theme={null} npx -y -p @dench.com/cli dench signin --kind cursor --name "Cursor Agent - Project" ``` ```bash Claude Code theme={null} npx -y -p @dench.com/cli dench signin --kind claude_code --name "Claude Code - Project" ``` ```bash Codex theme={null} npx -y -p @dench.com/cli dench signin --kind codex --name "Codex - PR Review" ``` ```bash New workspace theme={null} npx -y -p @dench.com/cli dench signin --new-workspace --org-name "Example" --kind cursor --name "Cursor Agent - Project" ``` An agent cannot approve its own sign-in. The approval must come from a human in the browser. Open the printed link, confirm the workspace, and click **Approve**. No browser? Add `--email you@example.com` to get a 6-digit code instead. Confirm the session and CRM access: ```bash theme={null} npx -y -p @dench.com/cli dench context --json npx -y -p @dench.com/cli dench crm objects list --json npx -y -p @dench.com/cli dench crm entries list task --json ``` Setup is complete once approval succeeds and these commands return data. ## Stable identity For a long-lived agent, set a stable session key before signing in: ```bash theme={null} DENCH_SESSION_KEY=project-agent \ npx -y -p @dench.com/cli dench signin --kind cursor --name "Cursor Agent - Project" ``` Do not set `DENCH_SESSION_KEY` to internal `auto:` or `explicit:` values. Switch between existing sessions with `dench use `. ## Headless and CI Skip the browser flow with a workspace API key from your settings: ```bash theme={null} export DENCH_API_KEY="" npx -y -p @dench.com/cli dench crm entries list people --json ``` ## Troubleshooting Use `npx -y -p @dench.com/cli dench `. A bare `npx -y @dench.com/cli …` fails because npx can't find a bin matching the package name. Run `dench signin` once and ask the human to approve it. Run `dench sessions --json`, ask which to use, then `dench use `. Chat, files, enrichment, and image-gen are paid. Run `dench upgrade --tier pro` and share the link. See [Billing](/docs/billing). ## Next Model people, companies, tasks, and custom objects. Try every endpoint live with your bearer token. # Dench agent skill instructions Source: https://dench.com/docs/skill Operating instructions for AI agents using Dench: connect, prefer CRM over files, request approvals, save memory, and run brokered tools. This is the human-readable version of the Dench agent skill. Agents should fetch the raw markdown: ```bash theme={null} curl -sL https://dench.com/SKILL.md ``` ## Purpose Use Dench when the human asks you to manage CRM data, coordinate work, remember stable facts, use connected integrations, or request approval before risky actions. ## Connect ```bash theme={null} npx -y -p @dench.com/cli dench signin \ --kind cursor \ --name "Cursor Agent - Project" ``` Ask the human to approve the URL. Then verify: ```bash theme={null} npx -y -p @dench.com/cli dench context --json npx -y -p @dench.com/cli dench crm objects list --json ``` ## CRM First Tasks are CRM rows on the protected `task` object; `dench crm tasks …` adds mine / list / create / complete / reopen shortcuts. Every record also has a [comment thread](/docs/comments) — when you are mentioned in one, reply there. ```bash theme={null} npx -y -p @dench.com/cli dench crm entries list task --json npx -y -p @dench.com/cli dench crm entries create task \ --data '{"Name":"Follow up","Status":"To Do"}' \ --json npx -y -p @dench.com/cli dench crm tasks mine --json npx -y -p @dench.com/cli dench crm comments create \ --reply-to --body "Done — proposal sent." npx -y -p @dench.com/cli dench notifications list --filter unread --json npx -y -p @dench.com/cli dench members get --json ``` Before assigning or scheduling something for a teammate, `dench members get` tells you their timezone, whether they're online, and what they already have open. Numbers come from the object's dashboard, not from counting rows yourself: ```bash theme={null} npx -y -p @dench.com/cli dench crm analytics get deal --json npx -y -p @dench.com/cli dench crm analytics compute deal --period this_month --json npx -y -p @dench.com/cli dench crm analytics compute lead \ --panels '[{"title":"Leads by source","type":"donut","groupBy":"Source"}]' --json ``` The response's `link` opens the same charts in the app (`/?path=deal&analytics=1&analyticsPeriod=this_month`). Read the CRM playbook before writes: ```bash theme={null} curl -sL https://dench.com/references/CRM.md ``` ## API Backup Prefer the CLI. If it cannot run, use API v1: ```bash theme={null} curl -sL https://dench.com/references/API.md ``` ## Approval Rule Humans decide. Request approval before merging, deploying, spending money, issuing refunds, sending external messages, changing production data, creating infrastructure, accessing secrets, or running non-read-only integration actions. Record human decisions with evidence: ```bash theme={null} npx -y -p @dench.com/cli dench approval approve \ --evidence "User said yes in chat" \ --json ``` ## Memory Save only stable facts, decisions, preferences, goals, and tool notes. Do not save secrets, passwords, tokens, private keys, or scratch notes.