draft status. Set launch to true to send immediately.property_ids, contact_ids, or list_ids. Mixing audience types in a single campaign is not supported.property_ids, contact_ids, and list_ids to save the campaign as ready with no properties. Nothing is charged. Add properties later with Add Properties to Campaign; each one starts at step 1 on its own schedule. A Ready campaign always accepts properties. Saving as Ready needs a name that does not start with Draft - and a design_id or design_prompt on every step; otherwise the request returns 400 validation_error and nothing is created. launch: true requires an audience, so sending it without one returns 400 validation_error.accepts_properties: true on a campaign with an audience to keep adding properties while it is ready, active, or paused, including after you launch it. Without it, the campaign works as it did before: is_accepting_properties is false, properties cannot be added, and the campaign reads ended once its mail is done.design_id or provide a design_prompt to generate a design on the fly. Since designs are HTML-based, generation is instant — no polling required. The postcard size is determined by the design.launch: true or POST /campaigns/{id}/send).body namestringrequiredbody descriptionstringbody property_idsnumber[]contact_ids and list_ids. Omit all three audience fields to save a Ready campaign with no properties.body contact_idsnumber[]property_ids and list_ids.body list_idsstring[]property_ids and contact_ids.body address_tostringowner (mailing address) or resident (property address). Required when using property_ids and for property-based list_ids. Not needed for contact_ids or people lists.body stepsobject[]requireddesign_id or design_prompt.body design_idstringbody design_promptstringbody delay_daysnumberdefault: 0body interval_daysnumberdefault: 0body repeat_countnumberdefault: 1body skip_if_respondedbooleandefault: falsebody contact_namestringbody contact_phonestringbody contact_emailstringbody qr_code_urlstringbody return_address_idstringbody return_addressobjectreturn_address_id)body namestringrequiredbody address_1stringrequiredbody address_2stringbody citystringrequiredbody statestringrequiredbody zipstringrequiredbody accepts_propertiesbooleandefault: falseready, active, or paused. Defaults to false when you give an audience. A campaign created without an audience is saved as ready and always accepts properties, so false returns 400 validation_error there.body launchbooleandefault: falsefalse, a campaign with an audience is created in draft status and you can launch it later with POST /campaigns/{id}/send. A campaign without an audience is saved as ready.launch is true, campaign creation uses the same guarded sending pipeline as Launch Campaign. A competing or previously claimed launch returns 409 campaign_launch_claimed; inspect the campaign before retrying.12345678910111213141516curl -X POST https://api.v2.dealmachine.com/v1/mail/campaigns \ -H "Authorization: Bearer dm_sk_live_xxx" \ -H "Content-Type: application/json" \ -d '{ "name": "Spring Seller Campaign", "property_ids": [123456, 789012], "address_to": "owner", "steps": [{ "design_id": "design-uuid-123" }], "contact_name": "John Smith", "contact_phone": "555-123-4567", "return_address_id": "42", "accepts_properties": true, "launch": true }'
12345678910111213141516171819202122232425262728{ "data": { "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "organization_id": 42, "name": "Spring Seller Campaign", "status": "active", "type": "one_off", "is_accepting_properties": true, "can_add_properties": true, "audience_kind": "properties", "property_ids": ["123456", "789012"], "contact_ids": [], "list_ids": [], "total_recipients": 2, "total_sent": 0, "total_delivered": 0, "steps": [{ "id": "1", "step_order": 1, "design_id": "design-uuid-123", "delay_days": 0, "interval_days": 0, "repeat_count": 1 }], "created_at": "2026-03-11T14:23:45Z", "launched_at": "2026-03-11T14:23:46Z" } }