Agent-readable docs index: /llms.txt. Full docs in one file: /llms-full.txt. Download /docs.zip to grep all markdown files locally.

Command Reference

Free access and checkout

Use dm signup <email> --login or dm login to connect. dm plans --json shows current workspace prices and free capabilities. Counts and supported estimates work before payment and cost no data credits; counts do not award credits.
dm checkout --price-id <id> --quantity 1 --json previews the recurring terms without creating checkout. After the customer approves the exact price, interval and quantity, repeat with --yes. Complete payment on Stripe, then check dm account --json and dm usage before retrying enrichment. A declined purchase must not create checkout.

Authentication

dm login

Authenticate with your DealMachine account using the device authorization flow.
dm login [--no-browser] [--key <api-key>] [--env <environment>]
OptionDescription
--no-browserDon't automatically open the browser
--key <api-key>Login directly with an API key (skips browser flow)
--env <environment>API environment: local, staging, or production (default: production)

dm logout

Remove stored credentials.
dm logout

dm whoami

Show current authentication status.
dm whoami [--verify]
OptionDescription
--verifyVerify credentials against the API

Account

dm account

Show account information from the API.
dm account [--json]
Account ---------------------------------------- Organization: My Company Org ID: 1 Created: Jan 1, 2024 Auth Type: api_key

dm usage

Show credit usage for the current billing period.
dm usage [--json]
Credit Usage ---------------------------------------- Data Credits Used: 150 Data Credits Limit: 1,000 Data Credits Remaining: 850 Period Start: 2024-01-01 Period End: 2024-01-31

Agents

dm agents

Print concise guidance for agents using the CLI.
dm agents [--json]
Use this as the first command when an agent has access to dm but has not loaded the DealMachine Playbook.

dm agents guide

Print the concise agent guide explicitly.
dm agents guide [--json]
The guide tells agents to use JSON output, quiet mode, live filter and field discovery, free counts before searches, and credit confirmation before fetching records or exporting.

dm agents playbook

Print the bundled DealMachine Playbook Markdown for property intelligence workflows.
dm agents playbook [--json] dm agents skill
Agents should load this before translating natural language property, people, contact, enrichment, list, export, comps, or credit-usage requests into CLI commands.

dm agents install claude-code

Install the bundled Playbook as a native Claude Code skill.
dm agents install claude-code dm agents install claude-code --project
Personal installation writes to the Claude configuration directory. Project installation writes to .claude/skills/dealmachine/SKILL.md in the current directory. An existing different skill is not replaced unless --force is supplied.

dm agents permissions

Print the recommended Claude Code allowlist for free DealMachine discovery and count commands. Paid and mutating commands are excluded.
dm agents permissions [--json]

Properties

Search for properties with filters.
# From a JSON file dm properties search -f search.json [--json] dm properties search -f search.json --estimate-cost dm properties search -f search.json --json --yes # Inline JSON body dm properties search --body '{"filters":[...]}' [--json] # From stdin echo '{"filters":[...]}' | dm properties search [--json]
OptionDescription
-f, --file <path>Read request body from a JSON file
--body <json>Inline JSON request body
--estimate-costPreview counts and credit cost for free
--yesConfirm approved credit spend in non-interactive execution
--jsonOutput raw JSON response

dm properties count

Count properties matching filters (no credits consumed).
dm properties count -f search.json [--json] dm properties count --body '{"filters":[...]}' [--json]

dm properties get <id>

Get a single property by ID.
dm properties get prop_12345 [--contact-audience <audience>] [--fields <csv>] [--json]
OptionDescription
--contact-audience <audience>Include contacts: owners, owners_and_family, renters, residents, all, none
--fields <csv>Comma-separated property field IDs from dm fields
--jsonOutput raw JSON response
Use --contact-audience none when you only need property data. This omits contacts and avoids people credits.

dm properties ids [ids...]

Get multiple properties by IDs.
# IDs as arguments dm properties ids prop_12345 prop_67890 [--json] # Or from JSON body dm properties ids --body '{"ids":["prop_12345","prop_67890"]}' [--json]
OptionDescription
--body <json>Request body as JSON string
-f, --file <path>Read request body from a JSON file
--contact-audience <audience>Include contacts: owners, owners_and_family, renters, residents, all, none
--jsonOutput raw JSON response

People

Search for people/contacts with filters.
dm people search -f search.json [--json] dm people search --body '{"filters":[...]}' [--json] dm people search -f search.json --estimate-cost dm people search -f search.json --json --yes
OptionDescription
-f, --file <path>Read request body from a JSON file
--body <json>Inline JSON request body
--estimate-costPreview counts and credit cost for free
--yesConfirm approved credit spend in non-interactive execution
--jsonOutput raw JSON response
Looking up a specific person by name is not a People Search filter. Use dm enrich name.

dm people count

Count people matching filters (no credits consumed).
dm people count -f search.json [--json]

dm people get <id>

Get a single person by ID.
dm people get per_12345 [--include-properties] [--property-limit 20] [--fields <csv>] [--json]
OptionDescription
--include-propertiesInclude associated properties
--property-limit <n>Maximum associated properties to return, max 100
--fields <csv>Comma-separated people or property field IDs
--jsonOutput raw JSON response

dm people ids [ids...]

Get multiple people by IDs.
# IDs as arguments dm people ids per_12345 per_67890 [--json] # Or from JSON body dm people ids --body '{"ids":["per_12345","per_67890"]}' [--json]
OptionDescription
--body <json>Request body as JSON string
-f, --file <path>Read request body from a JSON file
--include-propertiesInclude associated properties
--property-limit <n>Maximum associated properties per person, max 100
--fields <csv>Comma-separated people or property field IDs
--jsonOutput raw JSON response

Enrichment

dm enrich address [address]

Enrich a property by street address.
dm enrich address "123 Main St, Austin, TX 78704" [--json]
OptionDescription
--contact-audience <audience>Include contacts: owners, owners_and_family, renters, residents, none
--fields <csv>Comma-separated property or people field IDs
--body <json>Request body as JSON string
-f, --file <path>Read request body from a JSON file
--jsonOutput raw JSON response

dm enrich latlng [coords]

Enrich a property by latitude/longitude.
dm enrich latlng "30.2672,-97.7431" [--json]
OptionDescription
--contact-audience <audience>Include contacts: owners, owners_and_family, renters, residents, none
--fields <csv>Comma-separated property or people field IDs
--body <json>Request body as JSON string
-f, --file <path>Read request body from a JSON file
--jsonOutput raw JSON response
Coordinates are passed as a single comma-separated string: lat,lng

dm enrich apn [apn]

Enrich a property by Assessor's Parcel Number.
dm enrich apn "12345678" [--json]
OptionDescription
--contact-audience <audience>Include contacts: owners, owners_and_family, renters, residents, none
--fields <csv>Comma-separated property or people field IDs
--body <json>Request body as JSON string
-f, --file <path>Read request body from a JSON file
--jsonOutput raw JSON response
For APNs that require a FIPS code, use --body to pass the full request: dm enrich apn --body '{"apns":[{"apn":"12345678","fips":"48453"}]}'

dm enrich email [email]

Enrich by email address.
dm enrich email "john@example.com" [--json]
OptionDescription
--include-propertiesInclude associated properties
--fields <csv>Comma-separated people or property field IDs
--body <json>Request body as JSON string
-f, --file <path>Read request body from a JSON file
--jsonOutput raw JSON response

dm enrich phone [phone]

Enrich by phone number.
dm enrich phone "5551234567" [--json]
OptionDescription
--include-propertiesInclude associated properties
--fields <csv>Comma-separated people or property field IDs
--body <json>Request body as JSON string
-f, --file <path>Read request body from a JSON file
--jsonOutput raw JSON response

dm enrich name [name]

Enrich by person name.
dm enrich name "David Oster" [--state MO] [--zip 63101] [--json] dm enrich name "David Oster" --state MO --estimate-cost dm enrich name "David Oster" --state MO --json --yes
OptionDescription
--state <code>Two-letter state code to narrow results
--zip <code>ZIP code to narrow results
--include-propertiesInclude associated properties
--fields <csv>Comma-separated people or property field IDs
--estimate-costPreview people and property counts and credits for free
--yesConfirm approved credit spend in non-interactive execution
--page <n>Page number
--per-page <n>Results per page
--body <json>Request body as JSON string
-f, --file <path>Read request body from a JSON file
--jsonOutput raw JSON response
Email, phone, and name enrichment include property_count for each matched person at no extra cost. Phone types in JSON output use wireless, landline, voip, or unknown. For name enrichment, combine --estimate-cost with --include-properties to include associated property totals and page-aware property credits in the free estimate.
Property search, people search, and name enrichment return a free estimate automatically in non-interactive execution unless --yes is supplied. Review estimated_credits, get approval from the user, then rerun the same command with --yes.

Discovery

dm filters

List available search filters.
dm filters [--source-type <type>] [--json]
OptionDescription
--source-type <type>Filter by source type (properties or people)
--group-id <id>Filter by group ID
--search <term>Search filters by name
--page <n>Page number
--per-page <n>Results per page
--jsonOutput raw JSON response

dm fields

List available data fields.
dm fields [--source-type <type>] [--json]
OptionDescription
--source-type <type>Filter by source type
--group-id <id>Filter by group ID
--search <term>Search fields by name
--page <n>Page number
--per-page <n>Results per page
--jsonOutput raw JSON response

dm locations

Search and look up US locations, including states, counties, cities, and ZIP codes.
dm locations search -q "Harris" [--type county] [--state TX] [--json] dm locations search -q "saint louis" --type city --state MO --json dm locations search -q "MO" --type state --json dm locations get loc_city_48106 [--json]
OptionDescription
-q, --querySearch by name, code, state abbreviation, or state name
--typeFilter by state, county, city, or zip_code
--stateFilter by two-letter state abbreviation
--pagePage number
--per-pageResults per page, max 100
--jsonOutput raw JSON response
dm locations autocomplete remains available as a deprecated alias for dm addresses autocomplete.

Activity

Search your API activity/history.
dm activity search [--json] dm activity search -t search_properties enrich_address [--json] dm activity search -q "123 Main St" [--json]
OptionDescription
-t, --types <types...>Filter by activity types (e.g., search_properties, enrich_address)
-q, --query <text>Free-text search across activity
--page <n>Page number
--per-page <n>Results per page
--body <json>Request body as JSON string
-f, --file <path>Read request body from a JSON file
--jsonOutput raw JSON response

dm activity get <id>

Get a specific activity record by ID.
dm activity get abc123 [--json]

Addresses

dm addresses autocomplete <query>

Return free, bounded DealMachine property-address suggestions with property IDs.
dm addresses autocomplete "1200 Barton Springs" --state TX dm addresses autocomplete "46 Joyce St" --limit 5 --json
OptionDescription
--state <code>Narrow to a two-letter state abbreviation
--limit <n>Maximum suggestions, default 5 and max 10
--latitude <number>Latitude for nearby ranking, requires longitude
--longitude <number>Longitude for nearby ranking, requires latitude
--jsonOutput raw JSON response
Each suggestion includes a DealMachine property_id. Autocomplete does not request fields, perform enrichment, or consume data credits.

dm addresses validate [address]

Validate and standardize addresses via USPS.
# Single address dm addresses validate "123 Main St, Austin, TX" [--json] # Multiple addresses via JSON dm addresses validate --body '{"addresses":["123 Main St, Austin, TX","456 Oak Ave, Dallas, TX"]}' [--json] dm addresses validate -f addresses.json [--json]

Configuration

dm config get [key]

Get a configuration value, or all values if no key specified.
dm config get dm config get apiEnvironment

dm config set <key> <value>

Set a configuration value.
dm config set apiEnvironment local dm config set apiEnvironment staging dm config set apiEnvironment production

dm config path

Show the config file path.
dm config path

Global Options

OptionDescription
--versionShow CLI version
--helpShow help for any command
--jsonOutput raw JSON (available on most commands)
--quietSuppress spinners for agents and scripts
dm --version dm --help dm enrich --help dm properties search --help

Driving

Driving Commands are read-only. List recorded drives, then inspect one to see its route, visits, events, and linked Prospects.
dm driving list dm driving list --mode free_drive --started-after 2026-08-01 --json dm driving get drive_session_501 dm driving get drive_route_7 --json
dm driving list accepts --driver-user-id, --mode, --started-after, --started-before, --page, and --per-page.
Use dm prospects list --source driving to find the current Prospect records, then use dm prospects notes and dm prospects tags for their shared notes and tags.

Mail Campaigns

Mail Commands require the Direct Mail app. Run dm mail campaigns --help for every campaign Command. Campaign status is draft, ready, active, paused, or ended.
dm mail campaigns list [--status ready] [--accepting-properties] [--search "Austin"] [--json] dm mail campaigns estimate-add camp_abc123 --count 25 [--json] dm mail campaigns add-properties camp_abc123 --property-ids 123456,789012 --recipient owner [--yes] [--json] dm mail campaigns end camp_abc123 [--yes]
  • list --accepting-properties shows only campaigns that properties can be added to now. --status also accepts the older completed and cancelled values.
  • estimate-add prints the charge due today and the amount charged later for adding that many properties.
  • add-properties adds properties to a Ready, Active, or Paused campaign that accepts them. --recipient is owner (the owner's mailing address) or resident (the current resident at the property). It prints the estimate and asks for confirmation unless you pass --yes. Run by an agent or script without --yes, it prints the estimate (with "confirmation_required": true in --json output), adds nothing and exits with code 1. Each property starts at step 1 on its own schedule; the output lists skipped properties with their reason.
  • end ends a Ready, Active, or Paused campaign permanently and stops its unsent mail. It asks for confirmation unless you pass --yes. An ended campaign cannot be resumed or added to. A draft cannot be ended; cancel it with delete.
  • create with no audience saves a Ready campaign that accepts properties. With an audience, include "accepts_properties": true in the body to keep adding properties after it starts.
See Add Properties to Campaign and End Campaign for the matching Endpoints.

Prospects

Prospects are the records your team is working. Every dm prospects command sends X-DealMachine-Source: cli, so the activity feed says the change came from the CLI.

dm prospects list

dm prospects list [--lifecycle active|opportunity|archived] [--record-type property|person] [--json] dm prospects list --source driving dm prospects list --tag tag_31 --favorites dm prospects list --list <listId> --search "austin"
OptionDescription
--record-type <type>property (default) or person
--lifecycle <state>active (default), opportunity, archived
--source <source>Filter by how the Prospect was added, including driving
--favoritesOnly starred prospects
--list <listId>Only members of this list
--tag <tagId>Only prospects with this tag
--search <term>Address words for properties; name for people
--sort <order>newest (default) or oldest
-p, --page <n>Page number
--per-page <n>Results per page (max 100)

dm prospects add

dm prospects add --ids prop_12345,prop_67890 dm prospects add --ids person_777 --record-type person --favorite
Records that are prospects already are left alone; archived ones come back to active. If the add would pass the workspace's prospect limit, the command reports the limit, current usage, and requested count.

Get, update, and remove prospects

dm prospects get prospect_8812 dm prospects get-by-record prop_12345 [--record-type property] dm prospects archive prospect_8812 [--no-cascade] dm prospects archive --ids prop_12345,prop_67890 [--record-type property] [--no-cascade] dm prospects remove prospect_8812 [--no-cascade] dm prospects reactivate prospect_8812 dm prospects reactivate --ids prop_12345,prop_67890 [--record-type property] dm prospects opportunity prospect_8812 dm prospects favorite prospect_8812 --off
archive always ends the prospect's mail. It also removes the prospect from lists and closes open opportunities unless --no-cascade is passed.
With --ids, archive and reactivate move the prospects for up to 1,000 records in one call (PATCH /v1/prospects), the same bulk move the app's selection action bar runs. Records that are not prospects, and prospects already in that lifecycle, are skipped; the summary reports how many were moved, were already there, and were not prospects.

dm prospects check · counts · activity <id>

dm prospects check --ids prop_12345,prop_67890 dm prospects counts [--list <listId>] dm prospects activity prospect_8812 [--category note] [--since 2026-08-01T00:00:00Z]

dm prospects notes

dm prospects notes list prospect_8812 dm prospects notes get prospect_8812 note_9 dm prospects notes add prospect_8812 "Owner wants an offer by Friday" dm prospects notes edit prospect_8812 note_9 "Owner wants an offer by Monday" dm prospects notes remove prospect_8812 note_9

dm prospects files

dm prospects files list prospect_8812 dm prospects files upload prospect_8812 ./inspection.pdf --content-type application/pdf dm prospects files download prospect_8812 file_2 -o inspection.pdf dm prospects files remove prospect_8812 file_2
upload asks the API for a presigned URL, PUTs the bytes directly to storage, then attaches the file. Files up to 25 MB.

dm prospects photos

dm prospects photos list prospect_8812 dm prospects photos add prospect_8812 --file ./front.jpg --type property_front --caption "New roof" dm prospects photos add prospect_8812 --url https://example.com/front.jpg dm prospects photos remove prospect_8812 photo_44
Property prospects only. Local files must be under 700 KB; larger images go through --url.

dm prospects tags

dm prospects tags list prospect_8812 dm prospects tags set prospect_8812 --ids tag_31,tag_32 dm prospects tags add prospect_8812 tag_31 dm prospects tags remove prospect_8812 tag_31

Tags

The prospect tag catalog: the workspace's own tags, up to 200. Hot, Warm, Cold, Follow up and Do Not Contact are a prospect's status now, not tags; it shows on each prospect.
dm tags list [--include-inactive] [--json] dm tags get tag_212 dm tags create --name Probate --color info [--description "..."] [--order 30] dm tags update tag_212 --name "Probate lead" [--color warning] [--archive|--restore] dm tags delete tag_212 [--force] dm tags reorder --ids tag_212,tag_213
OptionDescription
--color <variant>default, secondary, info, warning, or destructive
--archiveHide the tag without removing it from prospects
--forceOn delete: remove the tag from every prospect first

Webhooks

Receive prospect and list events at your own URL. See the Webhooks guide.
dm webhooks list [--include-zapier] dm webhooks create --url https://example.com/hooks/dm --events prospect.added,prospect.tags_changed [--batch-max 10] [--include-contacts] dm webhooks get whk_12 dm webhooks update whk_12 --events "prospect.*" [--enable|--disable] dm webhooks test whk_12 dm webhooks rotate-secret whk_12 dm webhooks deliveries whk_12 [--status failed] [--since 2026-08-26T00:00:00Z] dm webhooks delivery whk_12 dlv_9001 dm webhooks redeliver whk_12 dlv_9001 dm webhooks redeliver whk_12 --since 2026-08-26T00:00:00Z dm webhooks events [--example prospect.added] dm webhooks delete whk_12
The signing secret is printed once, on create and on rotate-secret.

Active phone exports

Use --active-phones-only with dm properties export or dm people export to exclude inactive and unknown-activity phone numbers. The option combines with the existing phone-type and Do Not Call filters.
dm people export -f search.json --active-phones-only --json