>_
automate_this
Г
Это демо
Потыкай, посмотри как устроено — а чтобы начать, заведи аккаунт: M0 бесплатно.

M0-05Мой первый API

тренажёрfree
Представь: тебя попросили дать партнёру или мобильному приложению актуальный список товаров твоего магазина. Самый чистый способ — поднять API, который отдаёт каталог в JSON: партнёр шлёт запрос на твой адрес, получает в ответ массив с товарами. Соберём такой мини-API из трёх нод n8n: Webhook принимает GET-запрос, Data table читает каталог из встроенной БД, Respond to Webhook возвращает массив в JSON. Тестируется прямо в адресной строке браузера — никаких внешних клиентов.
#webhook#api#data-table#data-storage

Что собираем

Соберём учебный API из трёх нод. Принимает GET-запрос, читает каталог товаров из встроенной таблицы n8n и возвращает его клиенту в JSON.

Архитектура линейная: Webhook ловит входящий GET-запрос, Data table достаёт все строки из таблицы каталога, Respond to Webhook упаковывает их в массив и отдаёт обратно.

Тестировать будем прямо в адресной строке браузера. GET-запрос — это то, что браузер делает каждый раз, когда ты открываешь любой URL. Значит, чтобы проверить API, достаточно вставить его адрес в строку браузера и нажать Enter — в окне браузера появится JSON-каталог.

В итоге получится полный цикл: запрос из браузера → твой API → данные из БД → JSON-ответ обратно в окне браузера.

Готовый воркфлоу: Webhook ловит GET-запрос, Data table читает каталог из встроенной БД, Respond to Webhook возвращает JSON-массив
Итоговый воркфлоу

Шаги выполнения

1Создай Data table под каталог товаров

Начнём с хранилища — куда будем складывать товары. Data table это встроенная в n8n таблица: ей задают имя и колонки с типами, после чего любая нода на canvas может писать в неё новые строки.

🗄Data table в n8n: что это и когда использовать вместо базы данныхстатья · ~3 мин

Data table хранит данные внутри n8n

Data table — это встроенное хранилище, которое живёт прямо в n8n. Таблица не требует отдельного сервера или подключения к внешней базе. Она принадлежит проекту и доступна всем воркфлоу внутри него.

Каждая таблица состоит из колонок с именем и типом и строк с данными. Доступ к таблицам идёт через ноду Data table с ресурсом Row или Table.

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

Нода Data table находится в Sidebar через + Add node → Data table. В Parameters выбирают Resource (Row или Table) и Operation (Get, Insert, Update, Delete, Upsert).

Типы колонок ограничены четырьмя вариантами:

  • String
  • Number
  • Boolean
  • Date

Тип json отсутствует. Если нужно хранить сложные объекты, их записывают как String и разбирают позже в ноде Code.

Правило выбора
Data table или Postgres

До нескольких сотен строк и при необходимости ручной правки выбирай Data table. При тысячах строк, аналитике или частых параллельных записях переходи на Postgres.

Data table не поддерживает транзакции, JOIN между таблицами и индексы. Параллельные записи из разных триггеров могут перезаписывать друг друга или падать.

Типичные ошибки

  • Ожидают тип json в колонке → его нет → хранят JSON как String и парсят в Code при чтении.
  • Пишут счётчики и журналы из нескольких триггеров одновременно → конкурентная запись смешивается → переносят таблицу в Postgres.
  • Заводят Data table под тысячи строк и отчёты → отсутствие индексов и агрегаций тормозит → используют Postgres.
  • Рассчитывают на JOIN между таблицами → его нет → денормализуют данные в одну таблицу или переходят на Postgres.
1.1
Создай новую таблицу Data tables

Создай новую таблицу Data tables под названием m0-05-products

1.2
Создай в Data tables 3 колонки

В таблице нужно создать 3 колонки: name, price, description. Типы — смотри таблицу ниже.

Параметры Data table
ПараметрЗначение
Имя таблицыm0-05-products (или любое другое в kebab-case)
Колонка 1name — String
Колонка 2price — Number
Колонка 3description — String
Автоколонки n8nid, createdAt, updatedAt (создаются автоматически, руками не добавляются)
🗄Как создать DataTable в n8nстатья · ~1 мин

Как создать DataTable

  1. В личном кабинете n8n зайди в проект → раздел Data tables → кнопка Create data table.
  2. Введи имя таблицы — как назван в задаче (например, students или Заказы).
  3. Добавь колонки: имя + тип. Для каждой колонки тип выбирается из выпадающего списка (String, Number, Boolean, Date).
  4. Сохрани схему. Теперь можно Add row через UI или писать туда из воркфлоу через ноду Data table.
1.3
Заполни таблицу 3-4 строками руками

Вбей в таблицу 3-4 строки — это будет твой тестовый каталог. Заполняй колонки на свой вкус: товары, услуги, курсы — что угодно.

Например:

namepricedescription
Курс по n8n14900Полное освоение n8n за 8 недель
Консультация5000Часовая встреча с разбором процессов
Аудит воркфлоу12000Проверка и оптимизация ваших n8n воркфлоу

Колонка price хранит число, поэтому вводи только цифры — без рублей и знаков.

2Создай и настрой Webhook

Первая нода воркфлоу — Webhook. Она генерирует уникальный URL и ждёт входящий HTTP-запрос на этот адрес. Когда запрос приходит, воркфлоу запускается.

У Webhook есть параметр Respond. По умолчанию он стоит в режиме Immediately: нода отвечает сразу дефолтным сообщением {"message": "Workflow was started"}.

Нам нужно другое поведение: чтобы ответ формировался кастомно в конце цепочки, после того как Data table прочитает каталог. Для этого переключим Respond в режим Using 'Respond to Webhook' Node.

📖Webhook в n8n: как нода ждёт входящий запросстатья · ~2 мин

Webhook в n8n: как нода ждёт входящий запрос

Webhook — это URL-адрес, по которому внешний сервис или браузер может запустить воркфлоу. Нода Webhook создаёт такой адрес автоматически — тебе остаётся только настроить метод и способ ответа.

Два URL: Test и Production

Нода Webhook всегда выдаёт два разных адреса:

  • Test URL — работает только когда ты нажал Execute workflow (нода ждёт один входящий запрос, потом останавливается). Используется при сборке и отладке.
  • Production URL — работает постоянно, пока воркфлоу опубликован и активен. Используется в боевом режиме.

<!-- TODO: добавить ::figure с панелью параметров Webhook — Test URL и Production URL — до публикации задачи -->

Режим ответа: Using 'Respond to Webhook' Node

По умолчанию Webhook отвечает на запрос сразу, как только принял его. Когда выбираешь Using 'Respond to Webhook' Node — ответ откладывается до момента, когда нода Respond to Webhook явно его отправит. Это нужно, чтобы сформировать кастомный JSON-ответ в конце цепочки.

Pin data — зачем фиксировать данные

После первого запроса к Test URL нода получает входящие данные (headers, query, body). Кнопка Pin data фиксирует эти данные: все последующие запуски шагов будут использовать именно их, без повторного открытия браузера. Это ускоряет отладку — не нужно каждый раз отправлять новый запрос.

2.1
Создай новый воркфлоу My First API

В разделе Workflows нажми Create Workflow. Назови воркфлоу My First API — так позже легко найти его в списке.

2.2
Добавь ноду Webhook

На пустом canvas нажми + или иконку поиска нод. В поиске введи webhook → выбери Webhook (нода с пометкой Trigger).

📖Как добавить ноду в n8nстатья · ~2 мин

Добавление ноды на canvas

Чтобы продолжить цепочку, нужно вставить новую ноду после существующей или на пустой canvas. Для этого открывают панель выбора нод тремя способами: кнопка Open nodes panel в центре canvas, кнопка Add node на стрелке соединения и + на output-коннекторе любой ноды.

Панель называется What happens next?. В ней сразу видно категории и поле поиска.

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

  • Клик по Open nodes panel или Add node открывает список.
  • В поле Search nodes... вводят имя ноды или сервиса (например http, slack, schedule). Список фильтруется по мере ввода.
  • Навигация по категориям: AI, Action in an app, Data transformation, Flow, Core, Human review, Add another trigger.
  • Клик по названию ноды ставит её на canvas и сразу открывает панель Parameters.
  • На пустом canvas можно нажать клавишу Tab — откроется та же панель без клика мышью.

Первая нода любого воркфлоу должна быть триггером (Schedule Trigger, Webhook, Manual и подобные). Обычные ноды-действия в начало ставить нельзя.

Правило одной строкой
Первая нода — всегда триггер

Если первой стоит обычная нода-действие, воркфлоу не запустится. Начинай всегда с триггера.

Типичные ошибки

  • Поставил обычную ноду первой → воркфлоу не из чего стартовать → замени первую ноду на триггер из категории Core или через поиск.
  • Ищут ноду по русскому названию → список остаётся пустым → вводи английское имя сервиса в поле Search nodes....
  • Целятся мышью в мелкий + на стрелке → промахиваются → нажми Tab прямо на canvas.
  • Открывают категорию Add another trigger после уже существующей ноды → добавляют лишний триггер → для обычного шага используй поиск или категории Action in an app и Data transformation.
2.3
Проверь HTTP Method GET

Открой ноду двойным кликом. В поле HTTP Method проверь, что стоит значение GET — браузер шлёт именно GET-запрос, когда ты вводишь URL в адресную строку.

📖Способы общения клиента и сервера: от GET до event-drivenОткрыть
2.4
Замени Path на 'm0-05-test'

В поле Path стоит автоматически сгенерированный идентификатор — длинная строка из букв и цифр. Это часть публичного URL твоего API.

Замени его на m0-05-test — короткий читаемый идентификатор, который позже легко найдёшь в логах и в адресной строке браузера.

2.5
Переключи Respond на Using Respond to Webhook Node

Найди параметр Respond. Открой выпадающий список и выбери Using 'Respond to Webhook' Node.

Эта настройка говорит: «не отвечай сейчас, подожди — ответ соберёт следующая нода».

2.6
Проверь параметры ноды

Проверь, чтобы параметры ноды соответствовали таблице ниже.

Параметры Webhook
ПараметрЗначение
HTTP MethodGET
Pathm0-05-test
RespondUsing 'Respond to Webhook' Node

Нода Webhook готова. Сейчас она просто ждёт запрос и ничего сама не отвечает — ответ соберут следующие ноды.

Воркфлоу после шага 2: одна нода Webhook на canvas
Воркфлоу после шага 2
3Подключи Data table в режиме чтения

Вторая нода — Data table в режиме Get Row(s). Она открывает таблицу m0-05-products и возвращает все её строки. Никакого фильтра — нам нужен весь каталог.

3.1
Добавь ноду `Data table`

На canvas нажми + справа от ноды Webhook. В поиске нод введи data table → выбери Data table → в открывшемся подменю в разделе Actions выбери Get Row(s). Нода автоматически подключится к Webhook.

3.2
Выбери таблицу каталога

Открой ноду двойным кликом. В поле Data table оставь режим From list и выбери из выпадающего списка таблицу m0-05-products, которую создал в шаге 1.

3.3
Включи Return All

Найди переключатель Return All и включи его (станет зелёным).

По умолчанию нода вернёт максимум 50 строк — нам нужны все, что лежат в таблице. Фильтры (Conditions) оставь пустыми — мы возвращаем весь каталог без условий.

3.4
Проверь параметры ноды

Убедись, что параметры соответствуют таблице ниже.

Параметры Data table
ПараметрЗначение
ResourceRow
OperationGet
Data tableFrom list + m0-05-products
Conditionsпусто (без фильтра)
Return Allon
Воркфлоу после шага 3: Webhook → Data table
Воркфлоу после шага 3
4Подключи Respond to Webhook

Третья нода — Respond to Webhook. Она получает на вход все строки от Data table и упаковывает их в JSON-массив, который браузер увидит в окне.

В режиме All Incoming Items нода берёт массив items, который ей пришёл от предыдущей ноды, и возвращает его как JSON-массив. Никаких выражений писать не нужно — n8n сам сериализует входящие items.

📖Нода Respond to Webhook: что вернуть внешнему сервисустатья · ~3 мин

Нода Respond to Webhook: что вернуть внешнему сервису

Когда Webhook-триггер получает запрос, по умолчанию n8n сам отвечает вызывающему сервису — отдаёт результат последней ноды как JSON и код 200. Это поведение подходит не всегда: иногда нужен свой формат ответа, свой HTTP-код, редирект или вообще пустой ответ. Тогда в работу включается отдельная нода Respond to Webhook — она формирует тот ответ, который увидит вызывающий.

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

Чтобы Respond to Webhook сработала, в самом Webhook-триггере поле Respond нужно переключить на Using 'Respond to Webhook' Node. После этого триггер перестаёт отвечать сам и ждёт, пока workflow дойдёт до этой ноды. Когда дойдёт — n8n возьмёт её настройки и отправит ответ обратно вызвавшему сервису.

Основные параметры ноды:

Что положить в тело ответа: JSON, текст, бинарный файл, все входящие items, первый входящий, JWT-токен, редирект (HTTP 3xx) или ничего (No Data).

Само содержимое ответа. Для JSON — объект или ссылка через выражение. Для текста — строка. Для бинарника — имя поля с файлом.

HTTP-код ответа. По умолчанию 200. Меняй, когда хочешь явно сказать «создано» (201), «нет содержимого» (204) или вернуть ошибку (4xx/5xx).

Дополнительные заголовки: Content-Type, Location для редиректа, любые свои.

Когда это пригодится
Внешний сервис ждёт конкретный формат ответа

Чат-бот ждёт ответ в виде { "text": "..." }, платёжная система — строку «OK», браузерная форма — редирект на страницу благодарности. Без Respond to Webhook вернётся техническая структура n8n, которую внешний сервис не поймёт.

Типичные ошибки

  • Ноду добавили, но в Webhook-триггере оставили Respond: Immediately → ответ уходит сразу же при получении запроса, а Respond to Webhook никогда не срабатывает. Переключи Webhook на Using 'Respond to Webhook' Node.
  • В Response Body указали выражение $json, но на входе несколько items → вернётся только первый, остальные молча отброшены. Если нужно отдать массив целиком — выбери Respond With: All Incoming Items.
  • В одном workflow несколько Respond to Webhook на разные ветви (после If/Switch). Сработает та, до которой workflow дошёл первым; остальные просто проигнорируются — это нормально.
4.1
Добавь ноду Respond to Webhook

На canvas нажми + справа от ноды Data table. В поиске нод введи respond → выбери Respond to Webhook. Нода добавится на canvas и автоматически соединится с Data table.

4.2
Открой ноду и выбери Respond With = All Incoming Items

Двойным кликом по ноде Respond to Webhook открой её. В поле Respond With выбери значение All Incoming Items.

Это значит: «верни в ответе всё, что пришло на вход — все строки таблицы в виде JSON-массива».

4.3
Проверь параметры ноды

Проверь, чтобы параметры ноды соответствовали таблице ниже.

Параметры Respond to Webhook
ПараметрЗначение
Respond WithAll Incoming Items

Воркфлоу собран. Теперь нужно его протестировать — попросить браузер отправить запрос на твой API.

Воркфлоу после шага 4: Webhook → Data table → Respond to Webhook
Воркфлоу после шага 4 — все три ноды на canvas
5Запусти API и открой его в браузере

Тестирование двухшаговое: сначала переводим Webhook в режим «слушаю», потом открываем Test URL в браузере. Если перепутать порядок — Webhook ещё не активен, и браузер получит 404.

5.1
Нажми Listen for test event в ноде Webhook

Открой ноду Webhook двойным кликом. В верхней части параметров есть кнопка Listen for test event. Нажми её.

Кнопка изменится — теперь там написано Stop Listening, а под Test URL появится надпись Waiting for request…. Это значит, что Test URL активен и ждёт один входящий запрос.

⚡Кнопка «Listen for test event»: как webhook ловит первый запросстатья · ~2 мин

Кнопка «Listen for test event»: как webhook ловит первый запрос

<!-- TODO: дописать педагогическое описание 200-400 слов. Что объяснить: --> <!-- - Почему у Webhook нет обычной кнопки Execute step. --> <!-- - В чём смысл «слушаю один запрос» — почему именно один. --> <!-- - Что Listen активен только пока открыто это окно ноды и до первого запроса (или до Stop Listening). --> <!-- - Чем отличается от Production URL: Production работает всегда после публикации, Test — только когда нажат Listen. --> <!-- - Типичная ошибка студента: «нажал Execute workflow, ничего не работает» — у Webhook нет такой кнопки в роли триггера, надо именно Listen. -->

5.2
Скопируй Test URL и открой в адресной строке браузера

В верхней части параметров ноды Webhook есть два URL — Test URL и Production URL. Скопируй Test URL (рядом с ним есть иконка копирования).

Test URL выглядит примерно так: https://n8n.school.automate-this.com/webhook-test/m0-05-test.

Открой новую вкладку браузера, вставь Test URL в адресную строку и нажми Enter. Браузер отправит GET-запрос на твой API.

5.3
Посмотри ответ в окне браузера

В окне браузера появится JSON-массив с твоими товарами:

[
  { "id": 1, "name": "Курс по n8n", "price": 14900, "description": "...", "createdAt": "...", "updatedAt": "..." },
  { "id": 2, "name": "Консультация", "price": 5000, "description": "...", "createdAt": "...", "updatedAt": "..." }
]

Это значит, что цикл сработал: браузер → твой API → таблица → JSON-ответ обратно. Твой первый API, который реально читает из базы данных, работает.

📖JSON: формат данных, синтаксис и типыОткрыть
Воркфлоу после успешного теста: Webhook → Data table → Respond to Webhook, все три ноды с зелёной обводкой
Воркфлоу после успешного теста

Все, воркфлоу собран. Можешь потестировать его, а потом выполнить Stretch (задачу со звездочкой).

🚀Stretch

Сейчас твой API на каждый запрос отдаёт весь каталог целиком. В реальности так делают редко: чаще клиент хочет конкретный товар по его идентификатору, а не возить туда-сюда всю базу.

Сделай так, чтобы при запросе с query-параметром ?id=2 API возвращал только одну строку — товар с этим id. Без параметра — пусть остаётся текущее поведение и отдаётся весь каталог. Проверь в браузере на двух разных id, что подмена действительно работает.

Тест-кейсы

ВходОжидаем
В ноде Webhook нажми Listen for test event. Скопируй Test URL и открой его в адресной строке браузера.В окне браузера приходит JSON-массив со всеми строками таблицы m0-05-products — например, [ { id: 1, name: "Курс по n8n", price: 14900, ... }, ... ]. Нода Webhook горит зелёной обводкой с 1 item, нода Data table показывает количество найденных строк, нода Respond to Webhook тоже горит зелёной.
Открой Test URL в адресной строке браузера, не нажимая предварительно Listen for test event в ноде Webhook.Браузер показывает JSON с ошибкой 404 и текстом The requested webhook is not registered — Test URL не активен, потому что Webhook не слушает.
Удали 1-2 строки из таблицы m0-05-products через UI Data tables и повтори запрос в браузере.Браузер возвращает JSON-массив без удалённых строк. API всегда отдаёт актуальное содержимое таблицы — изменения в БД сразу видны клиенту, без перезапуска воркфлоу.
Добавь к Test URL в адресной строке query-параметр ?id=2 (Stretch). Открой URL в браузере.В Output ноды Webhook появляется поле query.id = "2". Если в Data table уже настроено условие фильтра keyName: id, condition: eq, keyValue: {{ $('Webhook').item.json.query.id }} — нода возвращает только одну строку с этим id, и браузер показывает массив из одного товара.
Помощь
Застрял где-то по ходу? Покажи в учебном чате скрин ноды Webhook (с Test URL) и текст ошибки в браузере — разберёмся.
Написать в чат
Собрал воркфлоу? Сдай на ревью
Это демо — задачу можно прочитать целиком. Свой n8n, сдача на ревью и разбор открываются в аккаунте. Заведи аккаунт — модуль M0 бесплатно.

Можно аналитические cookie?

Аналитические cookie ставим только с твоего согласия: они помогают понять, что работает. Откажешься — аналитика обойдётся без них. Подробности — в политике обработки персональных данных.