Menu

Reference

API reference

Every operation of the API by resource, generated from the API's own contracts.

Every operation of the API, generated from the same contracts that produce the OpenAPI document (OpenAPI 3.1, 123 operations today). Base URL: https://api.dmhero.ai. Every request needs an API key in Authorization: Bearer except the OpenAPI document itself.

Operations appear here as they ship. The changelog records each addition; additions never change the API version.

Me

OperationMethod and pathSummaryScopes
me.getGET /v1/meWho this API key is: its workspace, scopes, reps and limits.any key

Leads

OperationMethod and pathSummaryScopes
leads.listGET /v1/leadsList the workspace's leads, newest first, with filters.leads:read
leads.upsertPOST /v1/leadsCreate or update one lead, or a batch of up to 100.leads:write
leads.getGET /v1/leads/{lead_id}One lead. The ETag header is the version PATCH accepts as If-Match.leads:read
leads.updatePATCH /v1/leads/{lead_id}Change a lead's fields. Send If-Match with the ETag you read to refuse a concurrent change.leads:write
leads.deleteDELETE /v1/leads/{lead_id}Delete a lead, its tags and its enrollments.leads:delete
leads.tags.addPOST /v1/leads/{lead_id}/tagsAdd tags to a lead. Tags it already has are left as they are.leads:write
leads.tags.removeDELETE /v1/leads/{lead_id}/tags/{tag}Remove one tag from a lead (URL-encode the tag). Removing a tag the lead does not have is not an error.leads:write
leads.lookupGET /v1/leads/lookupWhere the lead with this Instagram handle stands: status, setter stage, tags, campaign.leads:read
tags.listGET /v1/tagsEvery tag used on the workspace's leads, alphabetical.leads:read

Folders

OperationMethod and pathSummaryScopes
folders.listGET /v1/foldersThe workspace's lead folders with their lead counts, and how many leads are in none.leads:read
folders.createPOST /v1/foldersCreate a lead folder.leads:write
folders.updatePATCH /v1/folders/{folder_id}Rename a lead folder.leads:write
folders.deleteDELETE /v1/folders/{folder_id}Delete a lead folder. Its leads are kept and end up in no folder.leads:write

Custom fields

OperationMethod and pathSummaryScopes
custom_fields.listGET /v1/custom-fieldsThe workspace's custom fields (at most 5) and how many leads carry each.leads:read
custom_fields.createPOST /v1/custom-fieldsDefine a custom field. The key is derived from the label unless given, and never changes.leads:write
custom_fields.updatePATCH /v1/custom-fields/{key}Rename a custom field's label. The key stays.leads:write
custom_fields.deleteDELETE /v1/custom-fields/{key}Delete a custom field and strip its value from every lead of the workspace. Needs confirm=true.leads:delete

Suppressions

OperationMethod and pathSummaryScopes
suppressions.listGET /v1/suppressionsLeads marked not_interested: outreach never contacts them.leads:read
suppressions.addPOST /v1/suppressionsSuppress Instagram handles: every lead with the handle becomes not_interested, and an unknown handle becomes a suppressed lead.leads:write
suppressions.removeDELETE /v1/suppressions/{ig_handle}Lift a suppression: the handle's not_interested leads go back to new.leads:write

Jobs

OperationMethod and pathSummaryScopes
jobs.listGET /v1/jobsThe workspace's jobs, newest first.leads:read
jobs.getGET /v1/jobs/{job_id}One job: its status, progress and result counts.leads:read
jobs.cancelPOST /v1/jobs/{job_id}/cancelCancel a job. A running job stops at its next slice; work already done stays done.leads:write
jobs.resultGET /v1/jobs/{job_id}/resultThe CSV file an export job built (text/csv), for 24 hours after it finished.leads:read
leads.bulk.previewPOST /v1/leads/bulk-actionsPreview a bulk action on up to 30 000 leads; the target is frozen until you confirm.leads:write
leads.bulk.confirmPOST /v1/leads/bulk-actions/{job_id}/confirmConfirm a previewed bulk action: the job is queued and runs on the frozen target.leads:write
leads.exports.createPOST /v1/leads/exportsExport the leads a filter selects as a CSV file, built by a job.leads:read
leads.imports.createPOST /v1/leads/importsImport up to 30 000 leads as a job, from JSON or a CSV body.leads:write

Templates

OperationMethod and pathSummaryScopes
templates.listGET /v1/templatesList the workspace's message templates, newest first.templates:read
templates.createPOST /v1/templatesCreate a message template.templates:write
templates.getGET /v1/templates/{template_id}Read one template.templates:read
templates.updatePATCH /v1/templates/{template_id}Change a template's name, category, content or variant.templates:write
templates.deleteDELETE /v1/templates/{template_id}Delete a template and its version history.templates:write
templates.statsGET /v1/templates/{template_id}/statsSends and replies of one template.templates:read
templates.versions.listGET /v1/templates/{template_id}/versionsList a template's earlier contents, newest version first.templates:read
templates.spintax.proposePOST /v1/templates/spintax-proposalsPropose version groups for a template body (AI).templates:write
templates.validatePOST /v1/templates/validateCheck a template body before saving it.templates:read

Campaigns

OperationMethod and pathSummaryScopes
campaign_leads.upsert_enrollPOST /v1/campaign-leadsUpsert one lead, then enroll it into a campaign (the Clay add-to-campaign column).leads:write, enrollments:write
campaigns.listGET /v1/campaignsList the workspace's campaigns, newest first.campaigns:read
campaigns.createPOST /v1/campaignsCreate a campaign, optionally with its steps. It starts paused.campaigns:write
campaigns.getGET /v1/campaigns/{campaign_id}Get one campaign with its steps.campaigns:read
campaigns.updatePATCH /v1/campaigns/{campaign_id}Update a campaign's settings.campaigns:write
campaigns.deleteDELETE /v1/campaigns/{campaign_id}Delete a campaign with its steps and enrollments.campaigns:write
campaigns.archivePOST /v1/campaigns/{campaign_id}/archiveArchive a campaign: every enrollment stops sending.campaigns:control
campaigns.clonePOST /v1/campaigns/{campaign_id}/cloneCopy a campaign and its steps, without its enrollments. The copy starts paused.campaigns:write
campaigns.pausePOST /v1/campaigns/{campaign_id}/pausePause an active campaign.campaigns:control
campaigns.resumePOST /v1/campaigns/{campaign_id}/resumeResume a paused campaign.campaigns:control
campaigns.startPOST /v1/campaigns/{campaign_id}/startStart a paused campaign.campaigns:control
campaigns.statsGET /v1/campaigns/{campaign_id}/statsA campaign's funnel and enrollment numbers.campaigns:read
campaigns.steps.replacePUT /v1/campaigns/{campaign_id}/stepsReplace a campaign's whole step sequence.campaigns:write

Enrollments

OperationMethod and pathSummaryScopes
enrollments.listGET /v1/campaigns/{campaign_id}/enrollmentsList a campaign's enrollments, newest first.campaigns:read
enrollments.createPOST /v1/campaigns/{campaign_id}/enrollmentsEnroll leads in a campaign, by id or by filter.enrollments:write
enrollments.removeDELETE /v1/campaigns/{campaign_id}/enrollments/{lead_id}Remove a lead from a campaign: nothing more is sent to it from this campaign.enrollments:write
enrollments.getGET /v1/enrollments/{enrollment_id}Get one enrollment.campaigns:read
enrollments.pausePOST /v1/enrollments/{enrollment_id}/pausePause one enrollment (active -> paused); one already paused is answered as is.enrollments:write
enrollments.resumePOST /v1/enrollments/{enrollment_id}/resumeResume one enrollment (paused -> active); one already active is answered as is.enrollments:write
leads.enrollments.listGET /v1/leads/{lead_id}/enrollmentsEvery campaign enrollment of one lead, newest first.campaigns:read

Reps

OperationMethod and pathSummaryScopes
reps.listGET /v1/repsList the workspace's connected reps with their health and setter mode.reps:read
reps.getGET /v1/reps/{rep_id}Read one rep with its health and setter mode.reps:read
reps.excluded.listGET /v1/reps/{rep_id}/excluded-handlesList the handles a rep's inbound setter never engages and never adds to the CRM.reps:read
reps.excluded.addPOST /v1/reps/{rep_id}/excluded-handlesAdd handles to a rep's inbound exclusion list.reps:write
reps.excluded.removeDELETE /v1/reps/{rep_id}/excluded-handles/{handle}Remove one handle from a rep's inbound exclusion list.reps:write
reps.setter_mode.getGET /v1/reps/{rep_id}/setter-modeRead a rep's AI Setter mode for outbound replies and for inbound DMs.reps:read
reps.setter_mode.setPUT /v1/reps/{rep_id}/setter-modeSet a rep's AI Setter mode for outbound replies, inbound DMs, or both.reps:write

Analytics

OperationMethod and pathSummaryScopes
analytics.ab_comparisonGET /v1/analytics/ab-comparisonReply performance compared across campaigns, templates or niches, with comparability findings.analytics:read
analytics.funnelGET /v1/analytics/funnelThe lead status funnel and the daily cohort series of first DMs.analytics:read
analytics.overviewGET /v1/analytics/overviewHeadline numbers: leads, reach, replies and conversions, plus the reps' threads and today's sends.analytics:read
analytics.setterGET /v1/analytics/setterThe AI Setter report for one rep: variants, funnel, turns, follow-ups, silence, segments, objections.analytics:read

Conversations

OperationMethod and pathSummaryScopes
conversations.listGET /v1/conversationsList conversations, newest activity first.conversations:read
conversations.getGET /v1/conversations/{conversation_id}Read one conversation.conversations:read
conversations.archivePOST /v1/conversations/{conversation_id}/archiveArchive a conversation.conversations:state
conversations.drafts.listGET /v1/conversations/{conversation_id}/draftsList the AI Setter's pending draft of a conversation.setter:read
conversations.drafts.approvePOST /v1/conversations/{conversation_id}/drafts/{draft_id}/approveApprove the AI Setter's draft: send it unchanged.setter:write
conversations.drafts.dismissPOST /v1/conversations/{conversation_id}/drafts/{draft_id}/dismissDismiss the AI Setter's draft without sending it.setter:write
conversations.mark_readPOST /v1/conversations/{conversation_id}/readMark a conversation read.conversations:state
conversations.setter.handPOST /v1/conversations/{conversation_id}/setter/handHand a conversation to the AI Setter.setter:write
conversations.setter.resumePOST /v1/conversations/{conversation_id}/setter/resumeResume the AI Setter on a conversation handed to a person.setter:write
conversations.starPOST /v1/conversations/{conversation_id}/starStar a conversation.conversations:state
conversations.unarchivePOST /v1/conversations/{conversation_id}/unarchiveMove a conversation back to active.conversations:state
conversations.unstarPOST /v1/conversations/{conversation_id}/unstarRemove the star from a conversation.conversations:state

Webhooks

OperationMethod and pathSummaryScopes
webhooks.deliveries.redeliverPOST /v1/webhook-deliveries/{delivery_id}/redeliverSend a finished delivery again: the same delivery id, event id and payload.webhooks:manage
webhooks.endpoints.listGET /v1/webhook-endpointsThe workspace's webhook endpoints (at most 15).webhooks:manage
webhooks.endpoints.createPOST /v1/webhook-endpointsCreate a webhook endpoint. The signing secret is returned once, in this response.webhooks:manage
webhooks.endpoints.getGET /v1/webhook-endpoints/{endpoint_id}One webhook endpoint.webhooks:manage
webhooks.endpoints.updatePATCH /v1/webhook-endpoints/{endpoint_id}Change a webhook endpoint. Only the fields sent change.webhooks:manage
webhooks.endpoints.deleteDELETE /v1/webhook-endpoints/{endpoint_id}Delete a webhook endpoint and its delivery log.webhooks:manage
webhooks.deliveries.listGET /v1/webhook-endpoints/{endpoint_id}/deliveriesOne endpoint's deliveries, newest first. No payloads.webhooks:manage
webhooks.endpoints.rotate_secretPOST /v1/webhook-endpoints/{endpoint_id}/rotate-secretA new signing secret, returned once. The previous one keeps co-signing for 24 hours.webhooks:manage
webhooks.endpoints.testPOST /v1/webhook-endpoints/{endpoint_id}/testQueue one test.ping to this endpoint, whatever it subscribes to.webhooks:manage
webhooks.events.listGET /v1/webhook-eventsEvery event type an endpoint can subscribe to.webhooks:manage

Discovery

OperationMethod and pathSummaryScopes
discovery.balanceGET /v1/discovery/balanceThe organization's discovery token balance.discovery:read
discovery.handles.resolvePOST /v1/discovery/handles/resolveResolve Instagram handles to accounts, to use as a recipe's seeds.discovery:spend
discovery.icp_profiles.listGET /v1/discovery/icp-profilesThe organization's customer profiles (ICP), each at its newest version.discovery:read
discovery.modesGET /v1/discovery/modesThe discovery modes and what this deployment can run.discovery:read
discovery.quotePOST /v1/discovery/quotePrice a recipe in tokens without saving or starting anything.discovery:read
discovery.recipes.createPOST /v1/discovery/recipesSave a search recipe.discovery:spend
discovery.runs.listGET /v1/discovery/runsThe workspace's runs, newest first.discovery:read
discovery.runs.createPOST /v1/discovery/runsStart a discovery run: price the recipe, reserve its tokens and queue it.discovery:spend
discovery.runs.getGET /v1/discovery/runs/{run_id}One run, with its live activity. Poll every 10 seconds while it moves.discovery:read
discovery.runs.cancelPOST /v1/discovery/runs/{run_id}/cancelCancel a run that is still moving and release its unspent tokens.discovery:spend
discovery.candidates.listGET /v1/discovery/runs/{run_id}/candidatesA run's results, in its delivery order.discovery:read
discovery.runs.preview_decisionPOST /v1/discovery/runs/{run_id}/preview-decisionAnswer a run's preview: continue spending its reservation, or stop and release it.discovery:spend
discovery.candidates.promotePOST /v1/discovery/runs/{run_id}/promoteMove a run's results into the CRM as leads.discovery:read, leads:write

AI Setter

OperationMethod and pathSummaryScopes
setter.knowledge.listGET /v1/reps/{rep_id}/setter/knowledgeList a rep's AI Setter knowledge entries, oldest first.setter:read
setter.knowledge.createPOST /v1/reps/{rep_id}/setter/knowledgeAdd a knowledge entry the rep's AI Setter may answer from.setter:write
setter.booking.previewGET /v1/setter/booking-previewThe free meeting times a variant's saved booking rules would offer a new prospect right now.setter:read
setter.connections.getGET /v1/setter/connectionsWhether the workspace's Google Calendar and Calendly are connected, for the setter's booking goal.setter:read
setter.knowledge.updatePATCH /v1/setter/knowledge/{knowledge_id}Change a knowledge entry's title, content, or both.setter:write
setter.knowledge.deleteDELETE /v1/setter/knowledge/{knowledge_id}Delete a knowledge entry.setter:write
setter.persona.getGET /v1/setter/personaRead the persona (name, role, tone, style, language) of one or more reps.setter:read
setter.persona.setPUT /v1/setter/personaWrite persona fields onto the live setter variant of each named rep.setter:write
setter.testPOST /v1/setter/testRun the AI Setter on a typed thread with an inline configuration and get its next reply.setter:write

Setter

OperationMethod and pathSummaryScopes
setter.variants.listGET /v1/reps/{rep_id}/setter/variantsList a rep's AI Setter variants, newest first.setter:read
setter.variants.createPOST /v1/reps/{rep_id}/setter/variantsCreate a draft AI Setter variant for a rep.setter:write
setter.variants.getGET /v1/setter/variants/{variant_id}Read one AI Setter variant, any status.setter:read
setter.variants.updatePATCH /v1/setter/variants/{variant_id}Change any field of an AI Setter variant.setter:write
setter.variants.archivePOST /v1/setter/variants/{variant_id}/archiveRetire a variant, or stop its A/B test.setter:write
setter.variants.promotePOST /v1/setter/variants/{variant_id}/promoteEnd the rep's A/B test with this variant as the winner.setter:write
setter.variants.publishPOST /v1/setter/variants/{variant_id}/publishMake a variant the rep's live variant.setter:write
setter.variants.start_testPOST /v1/setter/variants/{variant_id}/start-testPut a variant into the rep's A/B test as a challenger.setter:write
setter.variants.versions.listGET /v1/setter/variants/{variant_id}/versionsList a variant's earlier contents, newest version first.setter:read

Meta

OperationMethod and pathSummaryScopes
meta.openapiGET /v1/openapi.jsonThe OpenAPI 3.1 document of this API.public
API reference | DM Hero Developers