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.dm login1dm login [--no-browser] [--key <api-key>] [--env <environment>]
| Option | Description |
--no-browser | Don'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 logout1dm logout
dm whoami1dm whoami [--verify]
| Option | Description |
--verify | Verify credentials against the API |
dm account1dm account [--json]
123456Account ---------------------------------------- Organization: My Company Org ID: 1 Created: Jan 1, 2024 Auth Type: api_key
dm usage1dm usage [--json]
1234567Credit Usage ---------------------------------------- Data Credits Used: 150 Data Credits Limit: 1,000 Data Credits Remaining: 850 Period Start: 2024-01-01 Period End: 2024-01-31
dm agents1dm agents [--json]
dm but has not loaded the DealMachine Playbook.dm agents guide1dm agents guide [--json]
dm agents playbook12dm agents playbook [--json] dm agents skill
dm agents install claude-code12dm agents install claude-code dm agents install claude-code --project
.claude/skills/dealmachine/SKILL.md in the current directory. An existing different skill is not
replaced unless --force is supplied.dm agents permissions1dm agents permissions [--json]
dm properties search12345678910# 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]
| Option | Description |
-f, --file <path> | Read request body from a JSON file |
--body <json> | Inline JSON request body |
--estimate-cost | Preview counts and credit cost for free |
--yes | Confirm approved credit spend in non-interactive execution |
--json | Output raw JSON response |
dm properties count12dm properties count -f search.json [--json] dm properties count --body '{"filters":[...]}' [--json]
dm properties get <id>1dm properties get prop_12345 [--contact-audience <audience>] [--fields <csv>] [--json]
| Option | Description |
--contact-audience <audience> | Include contacts: owners, owners_and_family, renters, residents, all, none |
--fields <csv> | Comma-separated property field IDs from dm fields |
--json | Output raw JSON response |
--contact-audience none when you only need property data. This omits contacts and avoids
people credits.dm properties ids [ids...]12345# 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]
| Option | Description |
--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 |
--json | Output raw JSON response |
dm people search1234dm 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
| Option | Description |
-f, --file <path> | Read request body from a JSON file |
--body <json> | Inline JSON request body |
--estimate-cost | Preview counts and credit cost for free |
--yes | Confirm approved credit spend in non-interactive execution |
--json | Output raw JSON response |
dm enrich name.dm people count1dm people count -f search.json [--json]
dm people get <id>1dm people get per_12345 [--include-properties] [--property-limit 20] [--fields <csv>] [--json]
| Option | Description |
--include-properties | Include associated properties |
--property-limit <n> | Maximum associated properties to return, max 100 |
--fields <csv> | Comma-separated people or property field IDs |
--json | Output raw JSON response |
dm people ids [ids...]12345# 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]
| Option | Description |
--body <json> | Request body as JSON string |
-f, --file <path> | Read request body from a JSON file |
--include-properties | Include associated properties |
--property-limit <n> | Maximum associated properties per person, max 100 |
--fields <csv> | Comma-separated people or property field IDs |
--json | Output raw JSON response |
dm enrich address [address]1dm enrich address "123 Main St, Austin, TX 78704" [--json]
| Option | Description |
--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 |
--json | Output raw JSON response |
dm enrich latlng [coords]1dm enrich latlng "30.2672,-97.7431" [--json]
| Option | Description |
--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 |
--json | Output raw JSON response |
lat,lngdm enrich apn [apn]1dm enrich apn "12345678" [--json]
| Option | Description |
--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 |
--json | Output raw JSON response |
--body to pass the full request: dm enrich apn --body '{"apns":[{"apn":"12345678","fips":"48453"}]}'dm enrich email [email]1dm enrich email "john@example.com" [--json]
| Option | Description |
--include-properties | Include 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 |
--json | Output raw JSON response |
dm enrich phone [phone]1dm enrich phone "5551234567" [--json]
| Option | Description |
--include-properties | Include 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 |
--json | Output raw JSON response |
dm enrich name [name]123dm 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
| Option | Description |
--state <code> | Two-letter state code to narrow results |
--zip <code> | ZIP code to narrow results |
--include-properties | Include associated properties |
--fields <csv> | Comma-separated people or property field IDs |
--estimate-cost | Preview people and property counts and credits for free |
--yes | Confirm 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 |
--json | Output raw JSON response |
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.--yes is supplied. Review estimated_credits, get approval from
the user, then rerun the same command with --yes.dm filters1dm filters [--source-type <type>] [--json]
| Option | Description |
--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 |
--json | Output raw JSON response |
dm fields1dm fields [--source-type <type>] [--json]
| Option | Description |
--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 |
--json | Output raw JSON response |
dm locations1234dm 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]
| Option | Description |
-q, --query | Search by name, code, state abbreviation, or state name |
--type | Filter by state, county, city, or zip_code |
--state | Filter by two-letter state abbreviation |
--page | Page number |
--per-page | Results per page, max 100 |
--json | Output raw JSON response |
dm locations autocomplete remains available as a deprecated alias for dm addresses autocomplete.dm activity search123dm activity search [--json] dm activity search -t search_properties enrich_address [--json] dm activity search -q "123 Main St" [--json]
| Option | Description |
-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 |
--json | Output raw JSON response |
dm activity get <id>1dm activity get abc123 [--json]
dm addresses autocomplete <query>12dm addresses autocomplete "1200 Barton Springs" --state TX dm addresses autocomplete "46 Joyce St" --limit 5 --json
| Option | Description |
--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 |
--json | Output raw JSON response |
property_id. Autocomplete does not request fields, perform
enrichment, or consume data credits.dm addresses validate [address]123456# 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]
dm config get [key]12dm config get dm config get apiEnvironment
dm config set <key> <value>123dm config set apiEnvironment local dm config set apiEnvironment staging dm config set apiEnvironment production
dm config path1dm config path
| Option | Description |
--version | Show CLI version |
--help | Show help for any command |
--json | Output raw JSON (available on most commands) |
--quiet | Suppress spinners for agents and scripts |
1234dm --version dm --help dm enrich --help dm properties search --help
1234dm 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.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.dm mail campaigns --help for every campaign Command.
Campaign status is draft, ready, active, paused, or ended.1234dm 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.dm prospects command sends X-DealMachine-Source: cli, so the activity feed says the change came from the CLI.dm prospects list1234dm 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"
| Option | Description |
--record-type <type> | property (default) or person |
--lifecycle <state> | active (default), opportunity, archived |
--source <source> | Filter by how the Prospect was added, including driving |
--favorites | Only 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 add12dm prospects add --ids prop_12345,prop_67890 dm prospects add --ids person_777 --record-type person --favorite
123456789dm 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.--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>123dm 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 notes12345dm 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 files1234dm 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 photos1234dm 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
--url.dm prospects tags1234dm 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
status now, not tags; it shows on each prospect.123456dm 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
| Option | Description |
--color <variant> | default, secondary, info, warning, or destructive |
--archive | Hide the tag without removing it from prospects |
--force | On delete: remove the tag from every prospect first |
123456789101112dm 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
create and on rotate-secret.--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.1dm people export -f search.json --active-phones-only --json