Документация · API и вебхуки

API и вебхуки — подключите Craft к своей CRM или сайту

Как на тарифе Agency управлять Craft запросами с ключом и получать события о новых контактах, нажатиях кнопок, оплатах и постах на свой сервер.

Обновлено: 26 сентября 2026

На тарифе Agency Craft можно подключить к своей CRM, сайту клиента или любому своему сервису. Всё, что умеет MCP-коннектор, доступно обычным HTTPS-запросом с ключом: воронки, контакты, рассылки, посты, карусели, картинки. А вебхуки работают в обратную сторону: Craft сам отправляет на ваш сервер событие, когда появляется новый контакт, человек нажимает кнопку, доходит до цели воронки, платит или выходит пост.

Как это работает#

  • В Craft вы создаёте ключ и отмечаете, что ему можно: только читать, работать с воронками, контактами, рассылками, постами и так далее.
  • Ваш сервер шлёт запрос на адрес https://craftopen.space/api/v1/tools/<метод> с ключом в заголовке. Параметры метода — в теле запроса в формате JSON.
  • Craft выполняет метод в вашем аккаунте — точно так же, как если бы вы сделали это на сайте или попросили своего ИИ через MCP-коннектор, с теми же проверками и лимитами.
  • Для событий вы добавляете вебхук — адрес своего сервера. Craft отправляет туда подписанный запрос и, если сервер не ответил, повторяет попытку.

Что понадобится#

  • Тариф Agency. На других тарифах ключи и вебхуки не создаются.
  • Сервер или сервис, который умеет отправлять и принимать HTTPS-запросы: свой код, Make, n8n, Zapier, Albato или CRM со своими вебхуками.

Шаг 1. Создайте ключ#

Меню профиля → API и вебхуки (или «Настройки» → «API и вебхуки») → Новый ключ.

  1. Назовите ключ так, чтобы узнать его потом: «amoCRM», «Сайт клиента».
  2. Отметьте, что ключу можно. Новый ключ по умолчанию умеет только читать. Остальное включается галочками: воронки, контакты, рассылки, посты, контент, Контент-завод, аккаунты. Галочка «Всё» открывает всё, включая возможности, которые появятся позже.
  3. Выберите, как ключ публикует посты и рассылки: - Только черновики — всё сохраняется черновиком, отправляете вы сами в Craft; - По расписанию — не раньше чем через 10 минут, чтобы успеть отменить; - Сразу — публикует и отправляет в момент запроса.
  4. Задайте потолок трат на картинки в сутки и сколько рассылок в сутки ключ может отправить с одного бота.
  5. Нажмите Создать ключ и сразу скопируйте его.

🔴 Ключ показывается один раз. Craft хранит только его отпечаток и восстановить ключ не может. Потеряли — отзовите его и создайте новый. Не кладите ключ в код страницы сайта или в приложение на телефоне: его увидит любой посетитель. Ключ живёт только на сервере.

Права и настройки ключа можно поменять в любой момент кнопкой «Настроить» — они начинают действовать в течение минуты. «Отозвать» выключает ключ сразу.

Шаг 2. Первый запрос#

curl -X POST https://craftopen.space/api/v1/tools/list_funnels \
  -H "Authorization: Bearer craft_ваш_ключ" \
  -H "Content-Type: application/json" \
  -d '{}'

Успешный ответ всегда выглядит так — сами данные лежат в data:

{"ok": true, "data": {"funnels": [ ... ]}}

Если что-то не так, приходит "ok": false и понятная причина:

{"ok": false, "error": {"code": "funnel_not_found", "message": "Воронка не найдена."}}

Какие есть методы#

Все методы и их параметры с описанием:

  • в Craft: GET https://craftopen.space/api/v1/tools с ключом — список, где у каждого метода сказано, какое право ему нужно и разрешён ли он этому ключу;
  • описание в формате OpenAPI: craftopen.space/api/v1/openapi.json — его понимают Postman, Insomnia и генераторы клиентов.

Методы — те же, что у MCP-коннектора. Самые частые:

Задача Метод Право ключа
Список воронок и их статистика list_funnels, get_funnel_stats чтение
Найти подписчиков бота find_contacts чтение
Карточка подписчика get_contact чтение
Поставить или снять метку tag_contacts контакты
Запустить воронку одному человеку run_funnel_for_contact контакты, режим «Сразу»
Пост по расписанию list_publishing_accounts → schedule_post посты
Рассылка в Telegram save_broadcast_draft → send_broadcast_test → send_broadcast рассылки
Карусель из готового текста create_carousel, render_carousel контент
Картинка за кредиты generate_image контент

GET https://craftopen.space/api/v1/me покажет, какой ключ вы используете, его права и сколько запросов осталось на сегодня.

Повтор запроса без дублей#

Если запрос оборвался и вы не знаете, дошёл ли он, отправьте его ещё раз с тем же заголовком Idempotency-Key. Пост не выйдет дважды, картинка не спишется дважды.

curl -X POST https://craftopen.space/api/v1/tools/schedule_post \
  -H "Authorization: Bearer craft_ваш_ключ" \
  -H "Idempotency-Key: post-2026-09-27-lime-1" \
  -H "Content-Type: application/json" \
  -d '{"account_ids": ["..."], "confirm_usernames": ["@lime_agency"],
       "carousel_id": "...", "caption": "Текст поста",
       "scheduled_at": "2026-09-27T19:00:00+03:00"}'

⚠️ Подтверждения — часть запроса. Там, где на сайте Craft переспрашивает, API ждёт подтверждение в параметрах: @ники аккаунтов для поста (confirm_usernames), точное число получателей для рассылки (confirm_recipients), название включённой воронки для её правки, цену для блока оплаты. Если подтверждение не сходится с тем, что видит Craft, ничего не отправляется — ответ подскажет правильное значение.

Ошибки и что с ними делать#

Ориентируйтесь на error.code — он не меняется. Текст в error.message написан для человека и может уточняться.

Статус Что значит
400 Ошибка в параметрах — в message сказано, какая
401 Нет ключа, ключ неверный или отозван
403 Тариф без API (plan_required), у ключа нет нужного права (scope_required) или режим публикаций не разрешает действие
404 Не найдено: воронка, контакт, пост или метод
409 Данные изменились с тех пор, как вы их прочитали, или подтверждение не сошлось — прочитайте заново
429 Лимит запросов — подождите столько секунд, сколько указано в заголовке Retry-After
500, 503 Временный сбой — повторите через минуту с тем же Idempotency-Key

Лимиты#

  • 60 запросов в минуту и 10 000 в сутки на аккаунт — на все ключи вместе. Сутки считаются по Москве. Нужно больше — напишите в поддержку, лимит поднимается без переезда на другой тариф.
  • Вебхуки в лимит не входят.
  • Картинки тратят кредиты по тем же ценам, что на сайте, и не больше потолка, который вы задали ключу.
  • Рассылки: не больше выбранного числа в сутки с одного бота. Перед отправкой обязательна проверка себе через send_broadcast_test — того же самого текста.

Вебхуки#

«API и вебхуки» → Добавить вебхук: укажите адрес своего сервера (только https://) и отметьте события. Сразу после создания Craft покажет секрет подписи — сохраните его, второй раз он не показывается (можно выпустить новый кнопкой «Новый секрет»).

Кнопка Проверить отправляет тестовое событие ping и показывает, что ответил ваш сервер. Журнал — последние доставки: что ушло, дошло ли, с каким ответом, и кнопка «Повторить».

События#

Событие Когда приходит
contact.created Человек подписался на бота или впервые написал в Директ Instagram
funnel.button_clicked Человек нажал кнопку в воронке
funnel.goal_reached Человек дошёл до цели воронки
payment.succeeded Прошла оплата через блок оплаты в воронке
post.published Публикация вышла в соцсети

Пример тела запроса:

{
  "id": "6f1c…",
  "type": "contact.created",
  "created_at": "2026-09-26T12:04:11+03:00",
  "data": {
    "platform": "telegram",
    "contact_id": "…",
    "bot_username": "shop_bot",
    "first_name": "Анна",
    "username": "anna",
    "source": {"type": "link", "ref": "promo"}
  }
}

id события одинаковый при повторах — по нему удобно отсекать дубли.

Как проверить, что запрос пришёл от Craft#

В каждом запросе есть заголовок Craft-Signature: t=<время>,v1=<подпись>. Подпись — HMAC-SHA256 от строки <время>.<тело запроса> с вашим секретом. Посчитайте её у себя и сравните:

import hmac, hashlib, time

def craft_signature_ok(header: str, body: bytes, secret: str) -> bool:
    parts = dict(p.split("=", 1) for p in header.split(","))
    if abs(time.time() - int(parts["t"])) > 300:   # старше 5 минут — не принимаем
        return False
    expected = hmac.new(secret.encode(), f"{parts['t']}.".encode() + body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, parts["v1"])
const crypto = require("crypto");

function craftSignatureOk(header, rawBody, secret) {
  const parts = Object.fromEntries(header.split(",").map((p) => p.split("=")));
  if (Math.abs(Date.now() / 1000 - Number(parts.t)) > 300) return false;
  const expected = crypto.createHmac("sha256", secret).update(`${parts.t}.${rawBody}`).digest("hex");
  return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1));
}

⚠️ Подпись считается от сырого тела запроса — ровно тех байтов, что пришли. Если ваш фреймворк сначала разобрал JSON и собрал его заново, подпись не сойдётся.

Повторы#

Craft ждёт ответ до 10 секунд. Любой ответ 2xx — доставлено. Иначе Craft повторит попытку через 1 минуту, 5 минут, 30 минут, 2, 6, 12 и 24 часа — всего 8 попыток, потом событие помечается «не дошло» (его можно отправить ещё раз из журнала).

🔴 После 50 неудачных доставок подряд вебхук выключается, чтобы не долбить мёртвый адрес. Почините сервер и нажмите «Включить» — счётчик обнулится. События, случившиеся, пока вебхук был выключен, не отправляются.

Отвечайте быстро, а долгую работу делайте после ответа: если сервер думает дольше 10 секунд, Craft считает попытку неудачной и пришлёт событие повторно.

Если у вас был Agency, а потом нет#

Ключи перестают работать в течение минуты после смены тарифа, вебхуки перестают отправляться. Сами ключи и вебхуки не удаляются: вернётесь на Agency — всё заработает с прежними настройками.

Чего пока нет#

  • Готовых библиотек для языков программирования — пользуйтесь описанием OpenAPI.
  • Создания ключей и вебхуков через сам API — только на странице «API и вебхуки».
  • Входа «от имени Craft» для чужих приложений: ключ даёт доступ только к вашему аккаунту.
Не нашли ответ?Напишите — ответим и допишем статью.
Написать в Telegram