Beta. The Automations API is in beta and we are actively collecting feedback. Endpoints, payloads, and limits may change as we iterate. Please send feedback and bug reports to support so we can prioritize the right improvements.
How it works
1
Create an automation
POST /automations with the triggers and actions you want. The automation activates immediately.2
An end user engages
Someone comments on your post, replies to your story, sends a DM, or reacts to a DM. Meta delivers the webhook to Ayrshare.
3
Ayrshare matches and dispatches
The engine looks up every rule matching the event, checks per-action deduplication and your daily DM cap, then runs each action. A 20–60 second jitter is applied to DM sends to stay inside Instagram’s anti-spam heuristics.
4
Inspect what fired
GET /automations/:id/activity returns the audit log — every dispatch attempt, the per-action results, and any errors.Triggers
You can attach up to 50 triggers to one automation. Each trigger is a discriminated union on thetype field; type-specific fields live at the same level. All triggers are Instagram-only in v1.
Keyword matching is case-insensitive and whole-word. An event satisfies a keyword-filtered trigger if it contains any one of the configured keywords. Omit
storyId on a story trigger to fire on every story for the connected account.
Actions
You can attach up to 50 actions to one automation. They run sequentially; each result is recorded on the activity row.Per-action dedup window
Every action — regardless of type — additionally accepts an optional top-leveldedupWindowMinutes field that overrides the default 7-day per-recipient dedup window for that action only.
- Set to
0to disable dedup entirely for that action (typical forfire_webhook/send_emailwhere the receiver expects every event). - Capped at
525600(one year).
Action with a 24h dedup override
fire_webhook payload
When fire_webhook runs it POSTs a JSON body to your account-level webhook URL:
recipientUsername and keyword are null when the trigger doesn’t populate them (e.g. dm_keyword doesn’t carry a username on Meta’s payload; story_reply doesn’t have a keyword).
Template variables
send_dm.message, send_email.subject, and send_email.message support {{placeholder}} substitution. Unknown placeholders are rejected at create/update time (as a 473 validation error) so a typo never silently leaks the literal {{foo}} into a customer-facing message.
No
sender_email / recipient_email. These are deliberately not exposed — your billing email has no legitimate place in a DM to a stranger, and Meta does not provide the recipient’s email on any IG webhook. Avoiding the placeholders prevents accidental disclosure.Rate limits and caps
The active-automation cap is counted per User Profile, not per parent account. Each profile under your account gets its own Business 10 / Enterprise 50, so an account with many profiles can run that many automations on each. It counts active automations and is enforced on both
POST (create) and PUT re-activation (active: false → true), each surfacing error code 470. Need a higher per-profile limit? Contact support to have it raised for your account.
The daily DM cap applies per parent Ayrshare account, shared across all your profiles, with a per-profile sub-cap so one busy profile cannot drain the whole account’s quota. When a DM cap is hit, the activity row records status rate_limited and no DM is sent.
Structural caps on a single automation: 1–50 triggers, 1–50 actions.
Instagram itself caps DMs at roughly 200/hour per account. The engine paces dispatch with a 20–60 second jitter to stay safely under this.
Activity statuses
A row inGET /automations/:id/activity carries a top-level status plus a per-action status inside actionResults[]:
pending and in_flight are transient; everything else is terminal.
Error codes
The API returns two shapes of error:- Business-rule errors carry a numbered automation
code(e.g.{ "action": "automation", "code": 469, ... }). - Validation errors — any malformed request body (missing or invalid fields, unknown template variables, unrecognized keys) — are returned as a single
473response with adetailsobject that lists the offending fields.detailsis the validator’s output (formErrorsplusfieldErrors). Branch ondetails, not on a per-condition code. InfieldErrors, keys are the top-level request fields (triggers,actions): a problem inside a specific entry, such as a trigger missing itskeywords, is reported under that field (e.g.triggers), whileformErrorsholds object-level issues such as unrecognized keys.
What Meta does NOT allow
A few commonly-requested capabilities are not supported because Meta doesn’t permit them on the public Instagram API:- Auto-DM on new followers. Instagram does not publish a follow webhook.
- First-message DMs to strangers. Meta requires the recipient to initiate contact (comment, reply, DM, reaction) before a business account can message them — which is exactly what every supported trigger here represents.
- Bulk outbound campaigns. Hourly DM caps and anti-abuse heuristics apply at the platform level.
Multi-profile usage
The endpoints respect theprofileKey header. Pass a child profile’s key and the automation is created/managed under that profile. Rate limits split across profiles via a per-profile sub-cap so one chatty profile doesn’t drain the parent account’s quota.
FAQ
Can I trigger on a new follower?
Can I trigger on a new follower?
No. Instagram does not publish a follow webhook, and Meta does not allow third-party apps to send a DM to a user who has not initiated a conversation. Every supported trigger (
comment_keyword, story_reply, dm_reaction, dm_keyword) satisfies the “user contacted you first” requirement.What happens if my access token is invalid when an automation fires?
What happens if my access token is invalid when an automation fires?
The activity row records status
auth_error and the DM is not retried. Relink the account, then the next matching engagement will fire normally.Why is there a delay before the DM is sent?
Why is there a delay before the DM is sent?
Each
send_dm dispatch is scheduled 20–60 seconds after the engagement to look organic to Instagram’s anti-spam systems. fire_webhook and send_email actions do NOT have jitter. The activity row’s created timestamp is when the trigger matched; completedAt is when dispatch finished.Are activity rows kept forever?
Are activity rows kept forever?
Activity rows are retained indefinitely for trace and analytics. The
GET /automations/:id/activity endpoint returns rows from the last 30 days for performance. (The dedup guard uses its own per-action window — defaulting to 7 days — which is unrelated to the activity lookback.)Does deleting an automation remove its activity history?
Does deleting an automation remove its activity history?
No. Delete is a soft-delete: the master row is flagged
deleted, no new dispatches occur, but historical activity rows remain readable via the activity endpoint.Endpoints
POST /automations— create a new automationGET /automations— list your automationsGET /automations/:id— fetch one automation with its triggers and actionsPUT /automations/:id— partial update; pause viaactive: falseDELETE /automations/:id— soft-deleteGET /automations/:id/activity— cursor-paginated dispatch audit log
