sent означає, що Meta прийняла повідомлення, а не те, що отримувач його отримав. В Instagram доставка зрештою визначається параметром Message requests отримувача: якщо він не дозволяє запити повідомлень від усіх, Meta повертає успішну відповідь і тихо відкидає повідомлення, і це невидимо на кожному рівні API. Навіть доставлений DM, спричинений коментарем, надходить як запит повідомлення, який отримувач має прийняти (якщо між двома акаунтами вже не існує розмови). Див. Automation DM Sent but Not Delivered для повного пояснення.Як це працює
Створіть автоматизацію
POST /automations з бажаними тригерами й діями. Автоматизація активується миттєво.Кінцевий користувач взаємодіє
Ayrshare зіставляє та диспетчеризує
Перегляньте, що спрацювало
GET /automations/:id/activity повертає журнал аудиту — кожну спробу диспетчеризації, результати кожної дії та будь-які помилки.Тригери
До однієї автоматизації можна приєднати до 50 тригерів. Кожен тригер є discriminated union по полюtype; поля, специфічні для типу, розташовані на тому ж рівні. У стовпці Платформи вказано, де доступний кожен тригер; що потрібно для Facebook, див. у розділі Сторінки Facebook.
Постійно чинні правила з "all"
Установіть postId (або storyId) у дослівний рядок "all" у нижньому регістрі, щоб правило спрацьовувало на кожен допис, reel чи історію підключеного акаунта, а не на один конкретний елемент контенту. Саме це потрібно для правила, яке має продовжувати працювати в міру публікації нового контенту, без API-виклику на кожен допис:
"all". Варіант на кшталт "ALL" або " all" відхиляється з помилкою валідації, а не зберігається як ID допису, який ніколи не збіжиться.
"all" ніколи не поширюється за межі підключеного акаунта — правило одного профілю не може спрацювати на контенті іншого профілю. Ваш добовий ліміт 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(один рік).
Динамічний вміст повідомлення
Типовоsend_dm надсилає той самий message кожному, хто спричинив спрацювання правила. Від людини до людини змінюються лише placeholder’и на кшталт {{recipient_username}}. Установіть messageUrl у дії, і тоді DM для кожної людини писатиме ваш власний сервер: щоразу, коли правило збігається, ми запитуємо ваш ендпоінт, що сказати, а потім надсилаємо його відповідь як DM.
Приклад. Ваше правило відповідає кожному, хто коментує “LINK” під дописом, а messageUrl вказує на ваш сервер. Коли Ava коментує “LINK please!”:
- Ми надсилаємо
POSTіз деталями на вашmessageUrl: хто коментував ("recipientUsername": "ava"), що саме написав і під яким дописом. - Ваш сервер пише відповідь для Ava, наприклад із посиланням для відстеження, створеним саме для неї, і відповідає
{ "message": "Hi ava, here's your link: https://example.com/r/12345" }. - Ми надсилаємо цей текст Ava як DM — точно так, як ви його написали.
timeoutMs, повертає помилку або повертає щось, чого ми не можемо використати, ми натомість надсилаємо Ava звичайний message дії, тож вона все одно отримає відповідь.
Додайте його до дії send_dm так:
messageUrl — це адреса, за якою ми запитуємо текст. message, як і раніше, обов’язковий і слугує запасним варіантом: він ніколи не надсилається на ваш сервер, а ми надсилаємо його як DM щоразу, коли ваш сервер не відповідає вчасно, повертає помилку або повертає щось, чого ми не можемо використати (див. попередження нижче). timeoutMs необов’язковий (типово 3000, максимум 5000).
Що ми надсилаємо на ваш ендпоінт. POST з таким JSON-тілом:
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}} до нього не застосовується, тож дослівний {{ у згенерованому вами тексті дійде до отримувача саме так, як написано.
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:
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’ів запобігає випадковому розкриттю.Обмеження швидкості та ліміти
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містить проблеми рівня об’єкта, як-от нерозпізнані ключі.
468 повертається лише для планів, які не
включають автоматизації.Що Meta НЕ дозволяє
Кілька часто запитуваних можливостей не підтримуються, оскільки Meta не дозволяє їх у публічному Instagram API:- Автоматичне DM новим підписникам. Instagram не публікує webhook на підписку.
- Перше DM-повідомлення незнайомцям. Meta вимагає, щоб отримувач попередньо взаємодіяв (коментар, відповідь, DM, реакція), перш ніж бізнес-акаунт зможе надіслати йому повідомлення. Кожен підтримуваний тригер прив’язаний саме до такої взаємодії — але зверніть увагу, що дозвіл надіслати не є тим самим, що й доставка повідомлення: параметр Message requests в Instagram отримувача все одно може змусити Meta прийняти та потім тихо відкинути повідомлення (див. Automation DM Sent but Not Delivered).
- Масові вихідні кампанії. Погодинні ліміти DM та антифрод-евристики застосовуються на рівні платформи.
Використання з кількома профілями
Ендпоінти враховують заголовокprofileKey. Передайте ключ дочірнього профілю — і автоматизація буде створена/керована в межах цього профілю. Обмеження швидкості поділяються між профілями через підліміт на профіль, щоб один активний профіль не вичерпав квоту батьківського акаунта.
FAQ
Чи можу я налаштувати тригер на нового підписника?
Чи можу я налаштувати тригер на нового підписника?
comment_keyword, story_reply, dm_reaction, dm_keyword) прив’язаний саме до такої взаємодії, що й робить надсилання допустимим.Чому в активності зазначено sent, але отримувач так і не отримав DM?
Чому в активності зазначено sent, але отримувач так і не отримав DM?
sent означає, що Meta прийняла повідомлення, а не те, що воно було доставлене. Це стосується і Instagram, і Facebook (Messenger від вашої сторінки): автоматизація фіксує лише прийняття й не відстежує доставку. В Instagram доставка залежить від параметра Message requests отримувача в Instagram — якщо він не дозволяє запити повідомлень від усіх, Meta повертає успішну відповідь і тихо відкидає повідомлення, без помилки, webhook чи іншого сигналу на жодному рівні API. Успішний DM, спричинений коментарем, також надходить як запит повідомлення, який отримувач має прийняти (якщо розмова вже не існує). Це постійне обмеження платформи Instagram. Див. Automation DM Sent but Not Delivered.Що станеться, якщо мій access-токен буде недійсним, коли автоматизація спрацює?
Що станеться, якщо мій access-токен буде недійсним, коли автоматизація спрацює?
auth_error, і DM не повторюється. Виправлення стану акаунта (перепідключення, вибір Page або активація Messaging) дозволить наступній відповідній взаємодії спрацювати нормально. Це стосується лише справжніх проблем з обліковими даними та дозволами: якщо конкретний DM не вдалося доставити з іншої причини — наприклад, не вдалося знайти отримувача або взаємодія, що спричинила спрацювання, надійшла від акаунта, який мав би надіслати DM, — рядок фіксується як failed або skipped із причиною в actionResults[].errorDetails, і перепідключення не змінить результату.Чому є затримка перед надсиланням DM?
Чому є затримка перед надсиланням DM?
fire_webhook і send_email, — ваш webhook надійде через 20–60 секунд після коментаря, а не одразу. Timestamp created у рядку активності — це коли тригер збігся; completedAt — коли диспетчеризація завершилася.Чи зберігаються рядки активності назавжди?
Чи зберігаються рядки активності назавжди?
GET /automations/:id/activity повертає рядки за останні 30 днів для продуктивності. (Захист від дедуплікації використовує власне вікно на дію — типово 7 днів — яке не пов’язане з періодом перегляду активності.)Чи видалення автоматизації прибирає її історію активності?
Чи видалення автоматизації прибирає її історію активності?
deleted, нові диспетчеризації не виконуються, але історичні рядки активності залишаються доступними для читання через ендпоінт активності.Ендпоінти
POST /automations— створити нову автоматизаціюGET /automations— переглянути список ваших автоматизаційGET /automations/:id— отримати одну автоматизацію з її тригерами та діямиPUT /automations/:id— часткове оновлення; призупиніть за допомогоюactive: falseDELETE /automations/:id— soft-deleteGET /automations/:id/activity— журнал аудиту диспетчеризацій із пагінацією через курсор