API и вебхуки — подключите Craft к своей CRM или сайту
Как на тарифе Agency управлять Craft запросами с ключом и получать события о новых контактах, нажатиях кнопок, оплатах и постах на свой сервер.
На тарифе 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 и вебхуки») → Новый ключ.
- Назовите ключ так, чтобы узнать его потом: «amoCRM», «Сайт клиента».
- Отметьте, что ключу можно. Новый ключ по умолчанию умеет только читать. Остальное включается галочками: воронки, контакты, рассылки, посты, контент, Контент-завод, аккаунты. Галочка «Всё» открывает всё, включая возможности, которые появятся позже.
- Выберите, как ключ публикует посты и рассылки: - Только черновики — всё сохраняется черновиком, отправляете вы сами в Craft; - По расписанию — не раньше чем через 10 минут, чтобы успеть отменить; - Сразу — публикует и отправляет в момент запроса.
- Задайте потолок трат на картинки в сутки и сколько рассылок в сутки ключ может отправить с одного бота.
- Нажмите Создать ключ и сразу скопируйте его.
🔴 Ключ показывается один раз. 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» для чужих приложений: ключ даёт доступ только к вашему аккаунту.