Публічний API + n8n
Для авторів і адміністраторів клубів, які ведуть контент через автоматизації: надсилайте пости в Amator з n8n, скрипта або будь-якого інструмента, що вміє робити HTTP-запити.
Що це дає
Один ендпоінт публікує текстовий пост від вашого імені — в одне з двох місць:
- У вашу особисту стрічку — просто не передавайте
club_id. - У клуб, яким ви керуєте, — передайте його
club_id. Ви маєте бути власником або адміністратором клубу — те саме правило, що й для публікацій від імені клубу в застосунку.
Як отримати API-ключ
- Відкрийте застосунок Amator і перейдіть у Налаштування › API-ключі.
- Натисніть Створити й назвіть ключ так, щоб потім його впізнати, наприклад «n8n».
- Одразу скопіюйте ключ — його показують лише один раз. Якщо загубите, відкличте його й створіть новий.
Бережіть ключ як пароль: будь-хто, у кого він є, може публікувати від вашого імені. Будь-який ключ можна відкликати будь-коли на тому самому екрані — після цього запити з ним відхилятимуться.
Ендпоінт
POST https://api.amator.app/api/v1/public/posts
Надішліть тіло запиту в JSON, а ключ передайте в заголовку X-API-KEY (не Authorization: Bearer).
contentstring — текст поста, від 1 до 2000 символів. Обовʼязкове поле.club_iduuid | null — клуб, від імені якого публікуєте. Необовʼязкове — без нього пост зʼявиться у вашій стрічці.
Пост у вашу стрічку
curl -X POST https://api.amator.app/api/v1/public/posts \
-H "X-API-KEY: YOUR_API_KEY_HERE" \
-H "Content-Type: application/json" \
-d '{"content":"Training moved to 19:00 tonight"}'Пост від імені клубу
curl -X POST https://api.amator.app/api/v1/public/posts \
-H "X-API-KEY: YOUR_API_KEY_HERE" \
-H "Content-Type: application/json" \
-d '{"content":"Match day! Kick-off at 18:00","club_id":"00000000-0000-0000-0000-000000000000"}'Успішна публікація повертає 201 і посилання на пост:
HTTP/1.1 201 Created
{
"success": true,
"data": {
"id": "…",
"destination": "club",
"club_id": "00000000-0000-0000-0000-000000000000",
"created_at": "2026-10-05T18:00:00.000Z",
"url": "https://web.amator.app/posts/…"
},
"requestId": "…"
}Один пост на годину — окремо для кожного місця
Кожне місце публікації має власний погодинний ліміт: ваш профіль — одне місце, кожен клуб — ще одне. Ліміти ніколи не обʼєднуються: пост в одному місці не витрачає ліміт іншого, а вільне місце деінде не допоможе там, де ліміт уже вичерпано.
- OK Ваш профіль і клуб A протягом однієї години
- OK Клуби A, B і C протягом однієї години
- 429 Другий пост у клуб A протягом години — 429, навіть якщо профіль та інші клуби вільні
Коли ліміт вичерпано, приходить 429 із заголовком Retry-After (у секундах) і подробицями в тілі відповіді:
HTTP/1.1 429 Too Many Requests
Retry-After: 2400
{
"success": false,
"error": {
"code": "PUBLIC_API_RATE_LIMITED",
"message": "This club already had its post this hour",
"details": {
"destination": "club",
"club_id": "00000000-0000-0000-0000-000000000000",
"retry_after_seconds": 2400,
"next_allowed_at": "2026-10-05T19:00:00.000Z"
}
},
"requestId": "…"
}Перш ніж знову публікувати в це місце, зачекайте щонайменше Retry-After секунд або до next_allowed_at. Не повторюйте запити в циклі.
Інші відповіді
- 400 FEED_POST_EMPTYТекст поста порожній або задовгий.
- 401 PUBLIC_API_KEY_INVALIDКлюча немає, він невідомий або відкликаний.
- 403 FEED_NOT_A_CAPTAINВи не власник і не адміністратор цього клубу.
- 404 FEED_TEAM_NOT_FOUNDКлубу з таким
club_idне існує. - 429 PUBLIC_API_RATE_LIMITEDУ це місце вже публікували цієї години.
- 429 FEED_DAILY_LIMIT_REACHEDВичерпано денний ліміт стрічки — 40 постів на день.
Готовий workflow для n8n
Пʼять вузлів: ручний старт, вузол Edit Fields із полями content і club_id, вузол If, що перевіряє, чи порожнє club_id, і два вузли HTTP Request — один публікує у ваш профіль, другий у клуб.
Workflow починається з ручного тригера, щоб його можна було перевірити одразу після імпорту. Коли все запрацює, замініть Start на те, що справді має його запускати, — Schedule, RSS, форму — і передайте його дані в ці два поля.
{
"name": "Amator — publish a post",
"nodes": [
{
"id": "7b0f3a52-1c6e-4d1b-9a43-5e2f8c1d0a01",
"name": "Start",
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [
0,
0
],
"parameters": {}
},
{
"id": "7b0f3a52-1c6e-4d1b-9a43-5e2f8c1d0a02",
"name": "Post content",
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
220,
0
],
"parameters": {
"mode": "manual",
"assignments": {
"assignments": [
{
"id": "7b0f3a52-1c6e-4d1b-9a43-5e2f8c1d0b01",
"name": "content",
"value": "Hello from n8n! Training moved to 19:00 tonight.",
"type": "string"
},
{
"id": "7b0f3a52-1c6e-4d1b-9a43-5e2f8c1d0b02",
"name": "club_id",
"value": "",
"type": "string"
}
]
},
"options": {}
}
},
{
"id": "7b0f3a52-1c6e-4d1b-9a43-5e2f8c1d0a03",
"name": "Club ID empty?",
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
440,
0
],
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "loose",
"version": 2
},
"conditions": [
{
"id": "7b0f3a52-1c6e-4d1b-9a43-5e2f8c1d0c01",
"leftValue": "={{ $json.club_id }}",
"rightValue": "",
"operator": {
"type": "string",
"operation": "empty",
"singleValue": true
}
}
],
"combinator": "and"
},
"looseTypeValidation": true,
"options": {}
}
},
{
"id": "7b0f3a52-1c6e-4d1b-9a43-5e2f8c1d0a04",
"name": "Post to my profile",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
680,
-120
],
"parameters": {
"method": "POST",
"url": "https://api.amator.app/api/v1/public/posts",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "X-API-KEY",
"value": "YOUR_API_KEY_HERE"
}
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={{ JSON.stringify({ content: $json.content }) }}",
"options": {}
}
},
{
"id": "7b0f3a52-1c6e-4d1b-9a43-5e2f8c1d0a05",
"name": "Post to club",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
680,
120
],
"parameters": {
"method": "POST",
"url": "https://api.amator.app/api/v1/public/posts",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "X-API-KEY",
"value": "YOUR_API_KEY_HERE"
}
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={{ JSON.stringify({ content: $json.content, club_id: $json.club_id }) }}",
"options": {}
}
}
],
"connections": {
"Start": {
"main": [
[
{
"node": "Post content",
"type": "main",
"index": 0
}
]
]
},
"Post content": {
"main": [
[
{
"node": "Club ID empty?",
"type": "main",
"index": 0
}
]
]
},
"Club ID empty?": {
"main": [
[
{
"node": "Post to my profile",
"type": "main",
"index": 0
}
],
[
{
"node": "Post to club",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {},
"pinData": {}
}
Імпорт у n8n
- Скопіюйте JSON вище або завантажте файл.
- У n8n відкрийте Workflows, створіть новий workflow і вставте скопійований JSON на порожнє полотно (Ctrl/Cmd+V). Файл можна імпортувати через меню ⋯ › Import from File.
- В обох вузлах HTTP Request замініть
YOUR_API_KEY_HEREна свій ключ. А ще краще — збережіть його як облікові дані n8n (Header Auth, назваX-API-KEY). - У вузлі Post content впишіть текст у
content. Залиштеclub_idпорожнім, щоб опублікувати у своєму профілі, або вставте ID клубу, щоб опублікувати від його імені. - Натисніть Execute workflow. Вузол HTTP покаже відповідь — у разі успіху 201 і
urlпоста.