n8n API: створення реєстру робочих процесів і порівняння локальних знімків
Зберіть доступні робочі процеси через n8n API з курсорною пагінацією, збережіть локальний реєстр ID і назв та знайдіть додані, відсутні й перейменовані записи.

Перевірено за наведеними джерелами .
Мета й передумови створення реєстру через n8n API
У цьому посібнику ми використаємо n8n API, щоб зібрати всі повернуті сторінки робочих процесів і порівняти локальний знімок відповідностей ID і назв із попереднім. Вам потрібні доступ до API, дозвіл на створення ключа та локальне середовище Python. У документації n8n API зазначено, що доступ до API підтримують Cloud Starter, Pro й Enterprise та всі редакції для самостійного розгортання; безкоштовний пробний період його не передбачає. Ця інформація відповідає переглянутій документації, яка не вказує версію розгорнутого продукту.
Результат охоплює робочі процеси, доступні обліковому запису та ключу, які виконують збір, і не доводить повноту охоплення всього інстансу. Він виявляє зміни складу й назв, але не зміни визначень робочих процесів, поведінки виконання чи стану публікації. Немає гарантії, що сторінки утворюють знімок на один момент часу: зміни під час збору можуть вплинути на результат.
На нашу думку, невеликий реєстр — корисна відправна точка, адже питання для перевірки залишається чітким: які ID та назви робочих процесів змінилися?
Sources: n8n-docs/docs/connect/n8n-api/api-reference.md at main · n8n-io/n8n-docs · GitHub, Workflow | Connect | n8n Docs
1. Підготуйте ключ і кореневу адресу API
У Settings > n8n API створіть ключ із міткою та строком дії. Enterprise підтримує ключі з обмеженими правами: виберіть workflow:list для доступу до колекції. Ключі поза Enterprise мають повний доступ до ресурсів і можливостей облікового запису; обмеження цього скрипту запитами GET не робить такі облікові дані доступом лише для читання.
Задайте N8N_API_ROOT у локальному середовищі: HTTPS-адресу вашого інстансу з /api/v1 у кінці. Для Cloud використовуйте хост app.n8n.cloud вашого робочого простору; для самостійного розгортання — хост вашого інстансу зі збереженням базового шляху, специфічного для розгортання. Окремо задайте N8N_API_KEY. Не додавайте ключ до знімків і прикладів, якими ділитеся.
Sources: n8n-docs/docs/connect/n8n-api/authentication.md at main · n8n-io/n8n-docs · GitHub, Authentication | Connect | n8n Docs
2. Зберіть усі сторінки та збережіть реєстр

Задокументований запит до колекції — GET /api/v1/workflows. Передавайте X-N8N-API-KEY у кожному запиті. Задокументований розмір сторінки за замовчуванням — 100, максимальний — 250; цей приклад запитує 100. Не застосовуйте фільтри active, name, tags і проєкту. Дотримуйтеся такої послідовності:
- Запитайте колекцію робочих процесів без фільтрів, які звужують реєстр.
- Накопичуйте data з кожної сторінки, відхиляючи повторювані ID робочих процесів.
- Передавайте nextCursor без змін як наступний параметр cursor.
- Завершуйте збір, коли nextCursor дорівнює null; відхиляйте повторювані курсори або некоректні відповіді.
- Збережіть повне відображення ID у назви з відсортованими ключами.
Нижче наведено запропонований редакційний приклад коду, а не перевірений інструмент n8n. Збережіть наступні два абзаци коду послідовно у файлі inventory.py. Він використовує стандартну бібліотеку Python. Задавши змінні середовища, запустіть його командою python3 inventory.py. Відомості про структуру відповіді частково взято з довідкового матеріалу супровідників n8n у гілці, що оновлюється, а не з гарантій для клієнта конкретного релізу.
import json, os from pathlib import Path from urllib.parse import urlencode from urllib.request import Request, urlopen root = os.environ['N8N_API_ROOT'].rstrip('/') key = os.environ['N8N_API_KEY'] items, seen, cursor = {}, set(), None while True: params = {'limit': 100} if cursor is not None: params['cursor'] = cursor request = Request(root + '/workflows?' + urlencode(params), headers={'X-N8N-API-KEY': key}, method='GET') with urlopen(request, timeout=30) as response: page = json.load(response) if not isinstance(page, dict) or not isinstance(page.get('data'), list) or 'nextCursor' not in page: raise ValueError('Incomplete collection: malformed page')
for workflow in page['data']: identifier, name = workflow['id'], workflow['name'] if not isinstance(identifier, str) or not isinstance(name, str) or identifier in items: raise ValueError('Incomplete collection: invalid or duplicate ID/name') items[identifier] = name cursor = page['nextCursor'] if cursor is None: break if not isinstance(cursor, str) or not cursor or cursor in seen: raise ValueError('Incomplete collection: invalid or repeated cursor') seen.add(cursor) with open('inventory.candidate.json', 'w', encoding='utf-8') as output: json.dump(items, output, sort_keys=True, ensure_ascii=False, indent=2) print('Complete collection saved as inventory.candidate.json')
Скрипт записує файл лише після завершення збору. Після невдалого запуску не порівнюйте старий файл кандидата. Зберігайте попередній повний еталон окремо. Сортування ключів робить відображення з ID як ключами відтворюваним незалежно від порядку даних API. Метадані збору зберігайте окремо.
Sources: Authentication | Connect | n8n Docs, Workflow | Connect | n8n Docs, Pagination | Connect | n8n Docs, n8n-docs/docs/connect/n8n-api/pagination.md at main · n8n-io/n8n-docs · GitHub, n8n/.agents/skills/public-api/reference.md at master · n8n-io/n8n · GitHub, json — JSON encoder and decoder — Python 3.13.16 documentation
3. Порівняйте знімки та перевірте результат

Після першого успішного збору збережіть кандидата як inventory.previous.json. Після наступного успішного запуску збережіть цей запропонований код порівняння як compare.py та виконайте python3 compare.py. Він завантажує обидва JSON-відображення та порівнює спочатку ID, а потім назви.
import json with open('inventory.previous.json', encoding='utf-8') as source: before = json.load(source) with open('inventory.candidate.json', encoding='utf-8') as source: after = json.load(source) report = { 'added': {k: after[k] for k in sorted(after.keys() - before.keys())}, 'missing': {k: before[k] for k in sorted(before.keys() - after.keys())}, 'renamed': {k: {'before': before[k], 'after': after[k]} for k in sorted(before.keys() & after.keys()) if before[k] != after[k]} } print(json.dumps(report, sort_keys=True, ensure_ascii=False, indent=2))
Ці умовні приклади ілюструють очікувані результати порівняння, а не фактичні результати тестування. Відсутній запис означає, що його більше не виявлено; перевірте доступ та умови збору, перш ніж тлумачити це як видалення.
| Попередній знімок | Кандидат | Звіт |
|---|---|---|
| a: Замовлення | a: Замовлення | Усі категорії порожні |
| a: Замовлення | a: Замовлення; b: Потенційні клієнти | Додано b |
| a: Замовлення; b: Потенційні клієнти | a: Замовлення | Відсутній b |
| a: Замовлення | a: Приймання замовлень | Перейменовано a |
Ми б призначили відповідального за перевірку перед заміною еталона: звіт про відмінності найкорисніший тоді, коли хтось визначає значення кожної зміни.
Sources: Workflow | Connect | n8n Docs, json — JSON encoder and decoder — Python 3.13.16 documentation
4. Усуньте проблеми перед прийняттям знімка
Довідник робочих процесів n8n API документує наведені нижче значення відповідей. Використовуйте запропоновані перевірки для дослідження проблеми, а не сприймайте кожен статус як вичерпний діагноз.
| Статус | Значення | Запропонована перевірка |
|---|---|---|
| 400 | Недійсний або некоректно сформований запит | Перевірте параметри та незмінність курсора |
| 401 | Неавторизовано | Перевірте ключ і заголовок автентифікації |
| 403 | Доступ заборонено | Перегляньте доступ облікового запису та права Enterprise |
Sources: Workflow | Connect | n8n Docs, n8n-docs/docs/connect/n8n-api/authentication.md at main · n8n-io/n8n-docs · GitHub, Authentication | Connect | n8n Docs, n8n-docs/docs/connect/n8n-api/pagination.md at main · n8n-io/n8n-docs · GitHub


