Reference
Changelog
Every change a client can notice, dated, newest first.
Every change a client can notice, newest first. Additive changes ship without a new version date; see Versioning.
2026-10-28: A campaign step's message_mode
- Every campaign step now carries a read only
message_mode:templatesends the step'stemplate_id;aisends a first message written for each lead, andtemplate_idis its fallback. The mode is set in the app. PUT /v1/campaigns/{campaign_id}/stepskeeps each step's mode by its position; a step added at a new position istemplate. No version change: the field is additive to2026-10-08.
2026-10-28: lead.updated names every field the lead serves
lead.updatednow also namesniche,bio,fb_handleandassigned_rep_idinchanged_fieldswhen they change, whoever changed them: a person in the app, the API, or a profile enrichment filling the niche and bio. Before, a change of only these fields sent no event.- No version change: the names are additive to
2026-10-08.
2026-10-28: The onboarding refusal, and revoked keys' endpoints
- An organization that has not finished setting up its DM Hero account answers 403
ONBOARDING_REQUIRED_403on every operation, the five original Clay endpoints and MCP included. It is now listed with the errors every operation can return. Finish the setup in the app, then retry. - Revoking a key switches off the webhook endpoints it, or a key it was rotated from, created through the API: they show
is_active: falsewithdisabled_reason: "key_revoked"and their queued deliveries are cancelled. See Authentication.
2026-10-28: lead.status_changed on every status change
lead.status_changednow follows every change of a lead's status, not only the ones made by hand or through the API: the first campaign DM, a reply, an opt out and its undo, a booking and its undo, a bulk action, and an Instagram account found missing each send one, beside the event they already sent (lead.contacted,lead.replied,lead.opted_out,lead.booked), which are unchanged.- A new field,
cause, says what made the change:operator,api,bulk,dm_sent,reply,opt_out,bookingorautomation. One event per change; a status set to the value it already had sends none. lead.status_changedis now listed as a high volume event. No version change: the field is additive to2026-10-08.
2026-10-27: Text that cannot be stored, and the campaign-leads replay
- Every operation, the five original Clay endpoints included, answers 400
VALIDATION_FAILED_400with the reasontext_invalidfor a string or object key holding U+0000 (the NUL character) or an unpaired UTF-16 surrogate. Before, such text failed with a 500 or was stored with the character replaced. Nothing is written. - A replay of
POST /v1/campaign-leadsunder the sameIdempotency-Keynow carries the first answer'srep_ig_usernameandupdated_fieldsinstead ofnulland an empty list.lead_statusis still read fresh.
2026-10-23: Custom fields across the leads API
- Every lead the API returns carries
custom_fieldswith every field the workspace defines, in display order,nullwhen the lead has no value. Keys only a Clay compatible key wrote follow as stored. GET /v1/leadsfilters on custom fields:cf.<key>=<text>,cf.<key>.contains=<text>,cf.<key>.present=trueandcf.<key>.missing=true, at most 5, ANDed. A key the workspace has not defined answers 400CUSTOM_FIELD_UNKNOWN_400.- Lead filters in bulk actions and exports take the same conditions as
filter.custom_fields: [{ key, op, value }]. - A new bulk action,
set_custom_fields, sets or clears values on many leads through preview and confirm. - The API's export adds one
custom_fields.<key>column per field, whichPOST /v1/leads/importsreads back unchanged. lead.updatednames a changed custom field inchanged_fieldsascustom_fields.<key>, whoever changed it.- The MCP tools
search_leadsandbulk_update_leadstake custom field conditions andset_custom_fields. - A new guide, Custom fields. No version change: everything is additive to
2026-10-08.
2026-10-21: The developer API
- The API moves to its own host,
https://api.dmhero.ai/v1. The original paths onapp.dmhero.ai/api/v1keep answering. - Resources for leads, tags, folders, custom fields, suppressions, import, export and bulk jobs, templates, campaigns and enrollments, reps and the AI Setter mode, analytics, conversations (metadata), webhook endpoints and deliveries, and discovery.
- Developer keys with scopes per resource, rep restriction, IP allowlists, and rotation with a grace period.
- Every error carries
request_idanddoc_url(additive for the five original endpoints, whoseerrorandcodevalues are unchanged). Idempotency-Keyon writes, cursor pagination on every list,RateLimit-*headers on every response.- New webhook events, including
lead.created,lead.updated,lead.status_changed,lead.deleted,lead.enrolled,enrollment.removed,enrollment.completed,dm.sent,campaign.status_changed,campaign.completed,rep.attention_required,job.completed,discovery.run.progressanddiscovery.run.completed. - An MCP server at
https://api.dmhero.ai/mcpwith task-shaped tools and two step confirmation. - The OpenAPI 3.1 document at
https://api.dmhero.ai/v1/openapi.json, and these docs. - No version change: everything is additive to
2026-10-08.
2026-10-08: Integrations: the first API and outbound webhooks
- Five endpoints for Clay and scripts:
GET /v1/me,GET /v1/campaigns,POST /v1/leads,GET /v1/leads/lookupandPOST /v1/campaign-leads, with API keys scoped toleads:read,leads:write,campaigns:readandcampaigns:enroll. - Signed outbound webhooks (
x-dmhero-signature) with schema version2026-10-08:lead.replied,lead.booked,booking.unattributed,lead.opted_out,lead.opt_out_reverted,setter.needs_human,lead.contacted,lead.booking_canceled,lead.reply_classifiedandtest.ping. - Clay and generic endpoint presets, retries with backoff, and a delivery log.