get_account
read-onlyReturns the connected Instagram account, plan and this month’s usage against the plan limits (active contacts, AI replies, automations, campaigns, seats). Call this first to orient yourself.
Every DMowl feature is an MCP tool and a REST endpoint — generated from one registry, so docs, API and app never drift. Connect Claude or ChatGPT in 30 seconds.
claude mcp add --transport http dmowl https://dmowl.com/mcp \
--header "Authorization: Bearer pk_live_…" Bearer API key (pk_live_…) from Settings → API & MCP. Keys are hashed; you see them once.
Automations are created as drafts. Tools that message real people are annotated destructiveHint so clients ask before running them.
24h messaging window, verified follows, opt-outs — enforced server-side, explained in tool descriptions.
Returns the connected Instagram account, plan and this month’s usage against the plan limits (active contacts, AI replies, automations, campaigns, seats). Call this first to orient yourself.
Aggregated performance for the last N days: inbound/outbound messages, activated contacts, link clicks (conversions), and the top automations by conversions.
| days | integer | Window in days (1–365). Default 30. |
Attribute a sale to the DM that caused it. DMowl links forward with a `dmo` URL parameter (Stripe Payment Links: client_reference_id "dmo_<id>") — pass that value as `ref`. Idempotent per order_id. Sales without a DMowl ref are ignored.
| ref* | string | The dmo value from the landing URL (or client_reference_id) |
| order_id* | string | Your order or payment id (used to avoid duplicates) |
| amount* | number | Order value in major units, e.g. 49.90 |
| currency* | string | ISO currency code, e.g. EUR |
Search the CRM. Filter by text (name, @handle, email), folder, follower status or having an email. Returns at most `limit` contacts, newest activity first.
| query | string | Free-text search |
| folder_id | string | Only contacts in this folder |
| follows_you | boolean | Only followers |
| has_email | boolean | Only contacts with an email |
| limit | integer | Max results (1–500). Default 50. |
One contact with folders, custom properties and their latest 20 messages.
| contact_id* | string | Contact id |
Set email/phone, merge custom properties, and add or remove folders. Properties are merged, not replaced; set a property to null to delete it.
| contact_id* | string | Contact id |
| string | Email address | |
| phone | string | Phone number |
| properties | object | Key/value pairs to merge |
| add_folders | array | Folder ids to add |
| remove_folders | array | Folder ids to remove |
Folders (segments/tags) with contact counts. Use folder ids for filtering, campaign audiences and automation steps.
Create a folder to segment contacts.
| name* | string | Folder name |
Send a direct message to a contact as the account owner. Instagram only delivers business messages within 24 hours of the contact’s last message. Sending pauses automations and AI for that contact (a human took over) unless keep_automation is true.
| contact_id* | string | Contact id |
| text* | string | Message text (max 1000 chars) |
| keep_automation | boolean | Do not switch the conversation to human handling |
Decide who handles a conversation: "human" (you; automations pause), "agent" (AI agent replies) or "none" (automations decide).
| contact_id* | string | Contact id |
| handled_by* | string · human | agent | none |
All automations (scenarios) with trigger, steps, status and performance.
| status | string · active | paused | draft | Filter by status |
One automation with its full trigger and steps.
| automation_id* | string | Automation id |
Create an automation as a draft. trigger.type: comment | dm | story_reply | mention | live_comment. trigger.match: "keywords" (with trigger.keywords) or "any". For comment triggers set commentReplies (public reply variants) and optionally posts="selected" + postIds. Activate it afterwards with set_automation_status. Prefer create_automation_from_prompt or create_automation_from_template when you don’t need full control.
| name* | string | Name |
| trigger* | object | Trigger config (see description) |
| steps* | array | Ordered steps. Types: message {text, buttons[]}, question {text, buttons[], property}, link {text, title, url, button, followUp, followUpMinutes}, ask_email {text}, ask_follow {text, button, failText?}, check {conditions[], failText, retryButton}, delay {minutes}, folder {folderId}, giveaway {giveawayId, text}, agent {note}. Use {{first_name}} to personalise. |
Describe a comment-to-DM automation in plain language (e.g. "send my PDF to everyone who comments GUIDE"). DMowl drafts keywords, replies, DM and link. Returns the draft — review, then activate.
| prompt* | string | What should happen |
| language | string · en | de |
Proven automation and campaign templates. Use a slug with create_automation_from_template.
| language | string · en | de |
Copy a template into a new draft automation, optionally overriding the trigger keywords.
| slug* | string | Template slug |
| keywords | array | |
| language | string · en | de |
Replace name, trigger and/or steps of an automation. Omitted fields stay unchanged. Trigger fields are merged.
| automation_id* | string | Automation id |
| name | string | Name |
| trigger | object | |
| steps | array | Ordered steps. Types: message {text, buttons[]}, question {text, buttons[], property}, link {text, title, url, button, followUp, followUpMinutes}, ask_email {text}, ask_follow {text, button, failText?}, check {conditions[], failText, retryButton}, delay {minutes}, folder {folderId}, giveaway {giveawayId, text}, agent {note}. Use {{first_name}} to personalise. |
Set status to "active" (starts reacting to real comments/DMs) or "paused". Activation validates keywords and steps and respects plan limits.
| automation_id* | string | Automation id |
| status* | string · active | paused |
Manually start an automation’s steps for one contact (skips the trigger).
| automation_id* | string | Automation id |
| contact_id* | string | Contact id |
Permanently delete an automation. Its past messages stay in the inbox.
| automation_id* | string | Automation id |
DM campaigns with status and results (sent, replied, conversions).
Create a draft campaign. audience.type: "active" (wrote in last 24h — safest under Instagram rules), "all", "followers" or "folder" (+ folder_id). Send it with send_campaign.
| name* | string | Name |
| audience* | object | { type, folder_id? } |
| steps* | array | Ordered steps. Types: message {text, buttons[]}, question {text, buttons[], property}, link {text, title, url, button, followUp, followUpMinutes}, ask_email {text}, ask_follow {text, button, failText?}, check {conditions[], failText, retryButton}, delay {minutes}, folder {folderId}, giveaway {giveawayId, text}, agent {note}. Use {{first_name}} to personalise. |
Send a draft campaign now, or schedule it with an ISO timestamp in `at`. This messages real people — confirm with the user before calling.
| campaign_id* | string | Campaign id |
| at | string | Optional ISO 8601 time to schedule |
Giveaways with entry counts, status and winners (if drawn).
Create a giveaway. Then create an entry automation with a "giveaway" step (or ask the user to click “Create entry automation” in the app).
| name* | string | Name |
| prize | string | Prize |
| winners | integer | Number of winners |
| require_follow | boolean | Verify the follow (default true) |
Draw winners at random (follow re-verified), optionally DM them, and return the auditable draw record. Irreversible — confirm with the user first.
| giveaway_id* | string | Giveaway id |
| notify_winners | boolean |
The AI agent’s activation mode and full configuration (voice, goals, knowledge base, links, handoff rules).
Change mode ("all" | "intents" | "automation" | "off") and/or merge config fields: role, length, styleRules, examples, description, goals, audience, instructions, knowledge, collect[], handoffKeywords, links[{label,url}], excludedFolders[], intents. Tip: append to `knowledge` rather than replacing it.
| mode | string · all | intents | automation | off | |
| config | object |