Skip to main content
Beta. Automations API перебуває в бета-версії, і ми активно збираємо відгуки. Ендпоінти, payload’и та ліміти можуть змінюватися в міру ітерацій. Будь ласка, надсилайте відгуки та звіти про помилки в підтримку, щоб ми могли пріоритизувати правильні покращення.
Ендпоінти Automations дозволяють визначати правила, які автоматично реагують на вхідну engagement-активність в Instagram і на DM, надіслані сторінкам Facebook. Кожна автоматизація поєднує один або кілька тригерів (подія, що спрацьовує) з однією чи кількома діями (що відбувається при спрацюванні). Одне правило може прослуховувати кілька тригерів і виконувати кілька дій — викликати webhook у ваш аналітичний конвеєр І надсилати DM з тієї самої взаємодії. Двигун реагує лише на engagement-активність, яку користувач спрямовує до вас (коментар, відповідь на історію, DM або реакція) — він ніколи не надсилає DM за підпискою, перших DM незнайомцям чи масової вихідної розсилки — і успадковує обмеження швидкості Ayrshare на акаунт, дедуплікацію на отримувача та ідемпотентне приймання webhook’ів.
sent означає, що Meta прийняла повідомлення, а не те, що отримувач його отримав. В Instagram доставка зрештою визначається параметром Message requests отримувача: якщо він не дозволяє запити повідомлень від усіх, Meta повертає успішну відповідь і тихо відкидає повідомлення, і це невидимо на кожному рівні API. Навіть доставлений DM, спричинений коментарем, надходить як запит повідомлення, який отримувач має прийняти (якщо між двома акаунтами вже не існує розмови). Див. Automation DM Sent but Not Delivered для повного пояснення.

Як це працює

1

Створіть автоматизацію

POST /automations з бажаними тригерами й діями. Автоматизація активується миттєво.
2

Кінцевий користувач взаємодіє

Хтось коментує ваш допис, відповідає на вашу історію, надсилає DM або реагує на DM. Meta доставляє webhook в Ayrshare.
3

Ayrshare зіставляє та диспетчеризує

До взаємодії застосовується jitter 20–60 секунд, щоб залишатися в межах антиспам-евристик Instagram. Після цього двигун знаходить кожне правило, що відповідає події, перевіряє дедуплікацію на дію та ваш добовий ліміт DM і виконує кожну дію.
4

Перегляньте, що спрацювало

GET /automations/:id/activity повертає журнал аудиту — кожну спробу диспетчеризації, результати кожної дії та будь-які помилки.

Тригери

До однієї автоматизації можна приєднати до 50 тригерів. Кожен тригер є discriminated union по полю type; поля, специфічні для типу, розташовані на тому ж рівні. У стовпці Платформи вказано, де доступний кожен тригер; що потрібно для Facebook, див. у розділі Сторінки Facebook. Зіставлення ключових слів — регістронезалежне та по цілому слову. Подія задовольняє тригер із фільтром ключових слів, якщо містить будь-яке з налаштованих ключових слів.

Постійно чинні правила з "all"

Установіть postId (або storyId) у дослівний рядок "all" у нижньому регістрі, щоб правило спрацьовувало на кожен допис, reel чи історію підключеного акаунта, а не на один конкретний елемент контенту. Саме це потрібно для правила, яке має продовжувати працювати в міру публікації нового контенту, без API-виклику на кожен допис:
Значення має бути точно "all". Варіант на кшталт "ALL" або " all" відхиляється з помилкою валідації, а не зберігається як ID допису, який ніколи не збіжиться. "all" ніколи не поширюється за межі підключеного акаунта — правило одного профілю не може спрацювати на контенті іншого профілю. Ваш добовий ліміт DM і правила надсилання, прив’язані до взаємодії, застосовуються точно так само, як і для правила з одним дописом.
Дедуплікація рахується на автоматизацію та отримувача, а не на допис. У правилі з "all" користувач, який коментує ключове слово під двома різними дописами в межах вікна дедуплікації (типово 7 днів), отримує DM лише один раз; друга активність фіксується як deduplicated. Менше значення dedupWindowMinutes лише скорочує це вікно; воно не робить дедуплікацію окремою для кожного допису. Установлення 0 вимикає дедуплікацію, тож кожен відповідний коментар надсилає DM, включно з повторними коментарями під тим самим дописом.
У тригерах історій пропуск storyId поводиться так само, як "all". Віддавайте перевагу "all" — воно явно висловлює намір, а пропуск буде виведено з ужитку в майбутньому релізі із завчасним анонсом на сторінці Upcoming API Changes.

Сторінки Facebook

Установіть platform у значення facebook, щоб запускати автоматизацію на сторінці Facebook, пов’язаній із профілем. DM надсилаються від сторінки через Messenger.
  • Тригери: dm_keyword і dm_reaction. Тригери коментарів та історій поки що працюють лише для Instagram, і автоматизацію Facebook, яка використовує один із них, буде відхилено з помилкою валідації.
  • Messaging: для профілю має бути активовано Messaging для Facebook, так само як для надсилання DM у Facebook через Messages API.
  • Отримувач: {{recipient_id}} — це Page-scoped ID (PSID) користувача. {{recipient_username}} порожній, оскільки webhook Messenger не містять username.

Дії

До однієї автоматизації можна приєднати до 50 дій. Вони виконуються послідовно; кожен результат записується у рядок активності.

Вікно дедуплікації на дію

Кожна дія — незалежно від типу — додатково приймає необов’язкове поле верхнього рівня dedupWindowMinutes, яке перевизначає типове 7-денне вікно дедуплікації на отримувача лише для цієї дії.
  • Установіть 0, щоб повністю вимкнути дедуплікацію для цієї дії (типово для fire_webhook / send_email, де отримувач очікує кожну подію).
  • Обмеження — 525600 (один рік).
Action with a 24h dedup override

Динамічний вміст повідомлення

Типово send_dm надсилає той самий message кожному, хто спричинив спрацювання правила. Від людини до людини змінюються лише placeholder’и на кшталт {{recipient_username}}. Установіть messageUrl у дії, і тоді DM для кожної людини писатиме ваш власний сервер: щоразу, коли правило збігається, ми запитуємо ваш ендпоінт, що сказати, а потім надсилаємо його відповідь як DM. Приклад. Ваше правило відповідає кожному, хто коментує “LINK” під дописом, а messageUrl вказує на ваш сервер. Коли Ava коментує “LINK please!”:
  1. Ми надсилаємо POST із деталями на ваш messageUrl: хто коментував ("recipientUsername": "ava"), що саме написав і під яким дописом.
  2. Ваш сервер пише відповідь для Ava, наприклад із посиланням для відстеження, створеним саме для неї, і відповідає { "message": "Hi ava, here's your link: https://example.com/r/12345" }.
  3. Ми надсилаємо цей текст Ava як DM — точно так, як ви його написали.
Якщо ваш сервер не відповідає протягом timeoutMs, повертає помилку або повертає щось, чого ми не можемо використати, ми натомість надсилаємо Ava звичайний message дії, тож вона все одно отримає відповідь. Додайте його до дії send_dm так:
send_dm with messageUrl
messageUrl — це адреса, за якою ми запитуємо текст. message, як і раніше, обов’язковий і слугує запасним варіантом: він ніколи не надсилається на ваш сервер, а ми надсилаємо його як DM щоразу, коли ваш сервер не відповідає вчасно, повертає помилку або повертає щось, чого ми не можемо використати (див. попередження нижче). timeoutMs необов’язковий (типово 3000, максимум 5000). Що ми надсилаємо на ваш ендпоінт. POST з таким JSON-тілом:
Callback request body
Якщо ви зареєстрували секрет webhook’а, тіло підписується тим самим секретом, що й ваші webhook’и automations, і в той самий спосіб: X-Authorization-Content-SHA256 — це HMAC-SHA256 необробленого тіла, а X-Authorization-Timestamp містить timeStamp тіла. Код перевірки, який ви вже використовуєте для наших webhook’ів, працює без змін. Якщо секрет зареєстровано, але в цей момент ми не можемо його прочитати, ми не надсилаємо callback без підпису; натомість ми надсилаємо ваш шаблон message. Куди він може вказувати. messageUrl має бути публічною HTTPS-адресою. URL, що резолвиться в приватну, loopback, link-local адресу або адресу хмарних метаданих, відхиляється, а переспрямування не виконуються — відповідь 3xx вважається невдачею. В обох випадках натомість надсилається шаблон. Що повертає ваш ендпоінт. Поверніть 200 з JSON-тілом розміром не більше 16 KB, що містить рядок message довжиною від 1 до 1000 символів:
Ваш текст надсилається дослівно. Підстановка {{placeholder}} до нього не застосовується, тож дослівний {{ у згенерованому вами тексті дійде до отримувача саме так, як написано.
message залишається обов’язковим, і це не прикраса. Якщо ваш ендпоінт перевищує час очікування, повертає не-2xx, повертає тіло, яке ми не можемо використати, або його тимчасово вимкнув circuit breaker після повторних невдач, ми натомість надсилаємо відрендерений шаблон message. Це надсилання все одно може завершитися невдачею, наприклад якщо шаблон рендериться порожнім (див. нижче) або Instagram його відхиляє. Ми ніколи не повторюємо callback — повтор загрожує тим, що отримувач отримає два повідомлення.
timeoutMs типово дорівнює 3000. Максимум — 5000: більше значення відхиляється з помилкою валідації під час створення або оновлення автоматизації. Він охоплює весь обмін, включно з читанням тіла вашої відповіді. Врахуйте це: DM надсилається після того, як ваш ендпоінт відповість, тож повільний ендпоінт затримує повідомлення. Перевірте, яким шляхом пішло спрацювання, у GET /automations/:id/activity. Запис send_dm в actionResults[] містить messageSource, щойно текст DM визначено, зокрема й тоді, коли надсилання потім завершилося невдачею. Він відсутній, коли дія зупинилася раніше, наприклад DM на ваш власний акаунт зі статусом skipped або дія зі статусом deduplicated: messageSource вказує, з якого тексту було сформовано DM, а не чи його доставлено. Для цього дивіться status запису. Сам по собі запасний варіант не робить дію невдалою: коли DM із шаблоном доставлено, запис має статус sent, а причина, з якої callback не було використано, міститься в errorDetails. Якщо DM із шаблоном потім теж не вдається надіслати, запис має статус failed, а errorDetails містить помилку надсилання, за якою йде причина щодо callback. Стежте за цим: інакше callback, який не спрацьовує при кожному спрацюванні правила, виглядає точнісінько як той, що працює. Подбайте, щоб ваш message можна було надіслати й окремо. Якщо для отримувача він рендериться порожнім, наприклад лише {{recipient_username}} у тригері DM, який не містить username, а текст вашого callback не використано, DM не надсилається, і дія має статус failed із причиною в errorDetails.

Webhook-події

На webhook-дію automations, яку ви реєструєте через POST /hook/webhook, доставляються дві події. Обидві несуть поле type — розгалужуйтеся за ним, перш ніж читати будь-що інше.
automation.completed типово вимкнено. Увімкніть його для автоматизації, встановивши "sendCompletedEvent": true у її дії fire_webhook. Інакше воно залишається вимкненим, тож отримувач, розрахований на один payload на спрацювання, і далі отримує рівно один. automation.triggered не є записом кожного збігу: воно надсилається лише тоді, коли виконується сам fire_webhook, тож збіг, що завершився як rate_limited або deduplicated, породжує лише automation.completed. Жодна з подій не надсилається для автоматизації, яку було деактивовано або видалено до виконання диспетчеризації.

automation.triggered

activityId — це рядок, який повертає GET /automations/:id/activity, тож ви можете точно поєднати їх, замість зіставлення за recipientId + triggerId + keyword — що неоднозначно, коли кілька людей одночасно коментують те саме ключове слово. actionId — це дія fire_webhook, яка надіслала подію, і збігається з actionResults[].actionId; вона розрізняє дві дії fire_webhook в одному правилі. Поля, які тригер не заповнює, мають значення null, а не пропускаються, тож форма стабільна. recipientUsername має значення null для dm_keyword, dm_reaction та story_reply, оскільки payload Meta не містить username. commentId встановлюється лише для comment_keyword і story_comment, postId — лише для comment_keyword, а storyId — лише для тригерів історій. story_reply не має keyword. Для dm_keyword commentText — це текст DM; для dm_reaction і commentText, і keyword є емодзі реакції.

automation.completed

Надсилається лише тоді, коли автоматизація вмикає це у своїй дії fire_webhook:
fire_webhook action with the outcome event on
status і кожен actionResults[].status використовують ті самі значення, що й журнал активності — sent, failed, rate_limited, deduplicated, skipped, auth_error — тож у звичайному випадку ви дізнаєтеся, як завершилася диспетчеризація, без опитування. Втім, доставка цієї події виконується за принципом best-effort: якщо процес зупиниться між записом результату та постановкою події в чергу, її не буде надіслано. Журнал активності є джерелом істини, тож якщо вам потрібен кожен результат, звіряйтеся з GET /automations/:id/activity для будь-якого activityId, який не повідомив результату. Результат send_dm також містить messageSource, як і в журналі активності: template, callback або fallback, тож ви можете помітити messageUrl, який постійно переходить на запасний варіант, без опитування. Зіставляйте результати з вашими налаштованими діями за actionId, а не за позицією — дві дії одного типу можна розрізнити лише так. actionResults порожній у трьох випадках, у кожному з причиною у верхньорівневому errorDetails, коли вона є: rate_limited (досягнуто ваш добовий ліміт), deduplicated (кожна дія була в межах свого вікна дедуплікації) та failed після того, як диспетчеризацію було повторено максимальну кількість разів без завершення. В останньому випадку деякі дії могли вже виконатися, тож DM міг бути надісланий, а automation.triggered могло вже бути надіслано. Доставка webhook’ів виконується за принципом at-least-once, тож та сама подія іноді може надійти двічі, а диспетчеризація, яку повторюють, може надіслати automation.triggered знову з новим hookId. Ніколи не дедуплікуйте за hookId. Ключуйте кожен тип події окремо, щоб обробка однієї ніколи не придушувала іншу: automation.completed — за activityId (кожна активність має один результат), а automation.triggered — за activityId плюс actionId (одна на кожну дію fire_webhook). Дві події доставляються незалежно, тож automation.completed іноді може надійти раніше за automation.triggered.

Якщо webhook не зареєстровано

fire_webhook надсилає POST на дію automations, зареєстровану в профілі, з відкатом на ваш Primary Profile. Відкату на іншу дію, як-от messages, немає. Якщо не існує жодної з цих реєстрацій, automation.triggered не відкидається мовчки: дія фіксується в рядку активності як failed, з причиною в actionResults[].errorDetails. (automation.completed теж нікуди надіслати, і воно не фіксується.) Загальний статус диспетчеризації далі дотримується звичайного пріоритету: auth_error, якщо будь-яка дія спричинила auth-помилку, інакше sent, якщо будь-яку дію було прийнято, інакше failed. Тож відсутній webhook враховується у статистиці невдач автоматизації лише тоді, коли ніщо інше в правилі не надіслалося; коли інша дія таки надіслалася (і жодна не спричинила auth-помилку), диспетчеризація завершується як sent, а невдалий webhook видно лише в actionResults[]. Результат fire_webhook зі значенням sent означає, що подію було поставлено в чергу для доставки на ваш URL, а не те, що ваш ендпоінт її прийняв. Далі доставка повторюється за власним розкладом.

Змінні шаблону

send_dm.message, send_email.subject і send_email.message підтримують підстановку {{placeholder}}. Невідомі placeholder’и відхиляються під час створення/оновлення (як помилка валідації 473), тож помилка друку ніколи мовчки не пропустить дослівний {{foo}} у повідомлення, яке бачить клієнт.
Немає sender_email / recipient_email. Вони навмисно не надаються — вашому email для білінгу немає легітимного місця в DM незнайомій людині, і Meta не надає email отримувача в жодному IG-webhook. Відсутність placeholder’ів запобігає випадковому розкриттю.
Приклад шаблону:

Обмеження швидкості та ліміти

Ліміт активних автоматизацій рахується на User Profile, а не на батьківський акаунт. Кожен профіль вашого акаунта отримує свої Launch/Business 10 або Enterprise 50, тож акаунт із багатьма профілями може запускати відповідну кількість автоматизацій у кожному з них. Він рахує активні автоматизації та застосовується як при POST (створення), так і при повторній активації через PUT (active: false → true), у кожному випадку повертаючи код помилки 470. Потрібен вищий ліміт на профіль? Зв’яжіться з підтримкою, щоб його підвищили для вашого акаунта. Добовий ліміт DM застосовується на батьківський акаунт Ayrshare, спільно для всіх ваших профілів, з підлімітом на профіль, щоб один активний профіль не вичерпав квоту всього акаунта. Коли досягнуто ліміт DM, рядок активності отримує статус rate_limited і DM не надсилається. Ліміт розмов Messaging також застосовується. Для send_dm потрібне доповнення Messaging у профілі, і кожен надісланий ним DM враховується в місячному ліміті розмов цього профілю так само, як DM, який ви надсилаєте самі. Коли ліміт досягнуто, send_dm новому отримувачу не надсилається, а рядок активності отримує статус failed із повідомленням про ліміт в actionResults[].errorDetails. Виняток становлять DM, спричинені коментарем (comment_keyword і story_comment): вони надсилаються навіть після досягнення ліміту й усе одно враховуються. Структурні ліміти на одну автоматизацію: 1–50 тригерів, 1–50 дій. Сам Instagram обмежує DM приблизно 200/годину на акаунт. Двигун виконує диспетчеризацію з jitter 20–60 секунд, щоб залишатися в безпечних межах.

Статуси активності

Рядок у GET /automations/:id/activity має статус верхнього рівня status плюс статус кожної дії всередині actionResults[]: pending і in_flight — перехідні; усі інші — термінальні. Коли автоматизація має більше однієї дії, верхньорівневий status виводиться з результатів окремих дій у такому порядку: auth_error, якщо будь-яка дія спричинила auth-помилку, далі sent, якщо будь-яку дію було прийнято, далі deduplicated, якщо кожну дію було дедупліковано, далі skipped, якщо кожну дію було свідомо придушено (skipped або deduplicated), інакше — failed. Читайте actionResults[] для деталей по кожній дії.
sent — це квитанція про прийняття платформою, а не квитанція про доставку. Дію send_dm позначено як sent у той момент, коли Meta прийме повідомлення, — незалежно від того, чи воно надсилається з вашого акаунта Instagram, чи через Messenger від вашої сторінки Facebook. Автоматизація фіксує лише це прийняття й не відстежує доставку. Instagram не надає доставку повідомлень жодному API, і чи справді його отримає отримувач, залежить від параметра Message requests в Instagram, який Ayrshare не може ані прочитати, ані змінити. Див. Automation DM Sent but Not Delivered.

Коди помилок

API повертає два види помилок:
  • Бізнес-правила несуть номерний code автоматизації (наприклад, { "action": "automation", "code": 469, ... }).
  • Помилки валідації — будь-яке некоректне тіло запиту (відсутні або невалідні поля, невідомі змінні шаблону, нерозпізнані ключі) — повертаються як єдина відповідь 473 з об’єктом details, що містить перелік некоректних полів. details — це вивід валідатора (formErrors плюс fieldErrors). Розгалужуйтеся за details, а не за окремим кодом умови. У fieldErrors ключі — це поля верхнього рівня запиту (triggers, actions): проблема всередині конкретного запису, наприклад відсутність keywords у тригера, повідомляється під відповідним полем (наприклад, triggers), тоді як formErrors містить проблеми рівня об’єкта, як-от нерозпізнані ключі.
Плани Launch також включені. Business Launch відповідає рівню Business, тому автоматизації доступні на планах Launch, Business та Enterprise. 468 повертається лише для планів, які не включають автоматизації.

Що Meta НЕ дозволяє

Кілька часто запитуваних можливостей не підтримуються, оскільки Meta не дозволяє їх у публічному Instagram API:
  • Автоматичне DM новим підписникам. Instagram не публікує webhook на підписку.
  • Перше DM-повідомлення незнайомцям. Meta вимагає, щоб отримувач попередньо взаємодіяв (коментар, відповідь, DM, реакція), перш ніж бізнес-акаунт зможе надіслати йому повідомлення. Кожен підтримуваний тригер прив’язаний саме до такої взаємодії — але зверніть увагу, що дозвіл надіслати не є тим самим, що й доставка повідомлення: параметр Message requests в Instagram отримувача все одно може змусити Meta прийняти та потім тихо відкинути повідомлення (див. Automation DM Sent but Not Delivered).
  • Масові вихідні кампанії. Погодинні ліміти DM та антифрод-евристики застосовуються на рівні платформи.

Використання з кількома профілями

Ендпоінти враховують заголовок profileKey. Передайте ключ дочірнього профілю — і автоматизація буде створена/керована в межах цього профілю. Обмеження швидкості поділяються між профілями через підліміт на профіль, щоб один активний профіль не вичерпав квоту батьківського акаунта.

FAQ

Ні. Instagram не публікує webhook на підписку, і Meta не дозволяє стороннім застосункам надсилати DM користувачеві, який попередньо не взаємодіяв. Кожен підтримуваний тригер (comment_keyword, story_reply, dm_reaction, dm_keyword) прив’язаний саме до такої взаємодії, що й робить надсилання допустимим.
sent означає, що Meta прийняла повідомлення, а не те, що воно було доставлене. Це стосується і Instagram, і Facebook (Messenger від вашої сторінки): автоматизація фіксує лише прийняття й не відстежує доставку. В Instagram доставка залежить від параметра Message requests отримувача в Instagram — якщо він не дозволяє запити повідомлень від усіх, Meta повертає успішну відповідь і тихо відкидає повідомлення, без помилки, webhook чи іншого сигналу на жодному рівні API. Успішний DM, спричинений коментарем, також надходить як запит повідомлення, який отримувач має прийняти (якщо розмова вже не існує). Це постійне обмеження платформи Instagram. Див. Automation DM Sent but Not Delivered.
Якщо облікові дані Instagram чи сторінки Facebook або дозволи на обмін повідомленнями для акаунта дійсно не працюють — наприклад, прострочений або відкликаний access-токен, невибрана Facebook Page або неактивований Messaging для профілю — рядок активності отримує статус auth_error, і DM не повторюється. Виправлення стану акаунта (перепідключення, вибір Page або активація Messaging) дозволить наступній відповідній взаємодії спрацювати нормально. Це стосується лише справжніх проблем з обліковими даними та дозволами: якщо конкретний DM не вдалося доставити з іншої причини — наприклад, не вдалося знайти отримувача або взаємодія, що спричинила спрацювання, надійшла від акаунта, який мав би надіслати DM, — рядок фіксується як failed або skipped із причиною в actionResults[].errorDetails, і перепідключення не змінить результату.
Кожне диспетчерування планується на 20–60 секунд після взаємодії, щоб надсилання DM виглядало органічно для антиспам-систем Instagram. Затримка застосовується до взаємодії до зіставлення будь-якого правила, тому вона стосується кожної дії правила, включно з fire_webhook і send_email, — ваш webhook надійде через 20–60 секунд після коментаря, а не одразу. Timestamp created у рядку активності — це коли тригер збігся; completedAt — коли диспетчеризація завершилася.
Рядки активності зберігаються безстроково для трасування та аналітики. Ендпоінт GET /automations/:id/activity повертає рядки за останні 30 днів для продуктивності. (Захист від дедуплікації використовує власне вікно на дію — типово 7 днів — яке не пов’язане з періодом перегляду активності.)
Ні. Видалення є soft-delete: основний рядок позначається як deleted, нові диспетчеризації не виконуються, але історичні рядки активності залишаються доступними для читання через ендпоінт активності.

Ендпоінти