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

Add Properties to Campaign

Add properties to a campaign that is ready, active, or paused. Each property you add starts at step 1 of the campaign's steps on its own schedule, starting now. Properties already in the campaign keep their current step and schedule.
Check the campaign's can_add_properties field, or list campaigns with accepting_properties=true, to find campaigns you can add to. A draft or ended campaign, or a campaign created before October 14, 2026, returns 409 campaign_not_accepting_properties and nothing is added.
Cost: Pieces that go out today are charged when you add the properties. Later pieces are charged as they go out. Call Estimate Adding Properties first to see the charge due today. If the wallet cannot cover today's charge, nothing is added. Auto-reload must be on when the campaign has more than one step, a step that repeats, or any delay or repeat interval, because later pieces are charged as they go out.
Paused campaigns: Properties added to a paused campaign wait at step 1. No mail goes out and nothing is charged for them until you resume the campaign; each piece is then charged as it goes out.
Permission: The API key's owner needs permission to send mail.
path idstringrequired
Campaign ID (UUID)
body property_idsstring[]required
Property IDs to add, 1 to 5,000. Each ID can be a number or a string of digits. Repeated IDs in the request are added once.
body recipientstringrequired
Who receives the mail for every property in this request: owner (the property owner, at their mailing address) or resident (the current resident, at the property address).
Request example
curl -X POST https://api.v2.dealmachine.com/v1/mail/campaigns/a1b2c3d4/properties \ -H "Authorization: Bearer dm_sk_live_xxx" \ -H "Content-Type: application/json" \ -d '{ "property_ids": ["123456", "789012", "345678"], "recipient": "owner" }'

Response

FieldDescription
campaign_idThe campaign the properties were added to
statusThe campaign's status after the add, usually active (or paused if it was paused)
added_countHow many properties were added
skippedProperties that were not added, each with property_id and reason
enqueued_countPieces queued to go out now
scheduled_countPieces scheduled for later steps
Skip reasons:
ReasonMeaning
already_in_campaignThe property is already in this campaign
do_not_contactThe property is marked Do Not Contact
no_mailing_addressNo complete mailing address for the chosen recipient
duplicate_mailing_addressAnother property in the campaign has the same mailing address
archived_prospectThe prospect is archived
not_foundThe property was not found
Sending the same request again is safe: properties already added come back as already_in_campaign.

Errors

StatusCodeWhen
400validation_errorproperty_ids is missing, empty, or has more than 5,000 IDs, or recipient is not owner or resident
400auto_reload_requiredAuto-reload is off and the campaign has more than one step, a step that repeats, or any delay or repeat interval
402insufficient_creditsThe wallet cannot cover the charge due today. details has required_cents, available_cents, and shortfall_cents
403subscription_requiredThe workspace has no active subscription
404campaign_not_foundNo campaign with this ID in your workspace
409campaign_not_accepting_propertiesThe campaign is draft or ended, or was created before campaigns accepted new properties. details.status has its status
409campaign_has_no_stepsA step in the campaign has no design
409portrait_orientation_unavailableA step uses a portrait design, which is temporarily unavailable. details.step_id names the step
Response example
{ "data": { "campaign_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "status": "active", "added_count": 2, "skipped": [ { "property_id": "345678", "reason": "already_in_campaign" } ], "enqueued_count": 2, "scheduled_count": 4 } }