Public API + n8n
Für Creator und Vereinsadmins, die ihre Inhalte schon über Automationen steuern: Schick einen Beitrag an Amator aus n8n, einem Skript oder jedem Tool, das einen HTTP-Request senden kann.
Was es macht
Ein Endpoint veröffentlicht in deinem Namen einen Textbeitrag — an einem von zwei Orten:
- In deinem persönlichen Feed — lass
club_ideinfach weg. - In einem Verein, den du verwaltest — gib seine
club_idmit. Du musst Inhaber oder Admin des Vereins sein, dieselbe Regel wie beim Posten als Verein in der App.
API-Schlüssel erstellen
- Öffne die Amator-App und gehe zu Einstellungen › API-Schlüssel.
- Tippe auf Erstellen und gib dem Schlüssel einen Namen, den du später wiedererkennst, z. B. „n8n“.
- Kopiere den Schlüssel sofort — er wird nur einmal angezeigt. Wenn du ihn verlierst, widerrufe ihn und erstelle einen neuen.
Behandle den Schlüssel wie ein Passwort: Wer ihn hat, kann in deinem Namen posten. Du kannst jeden Schlüssel jederzeit auf demselben Bildschirm widerrufen — danach werden Anfragen damit abgelehnt.
Der Endpoint
POST https://api.amator.app/api/v1/public/posts
Sende einen JSON-Body und den Schlüssel im Header X-API-KEY (nicht Authorization: Bearer).
contentstring — der Beitragstext, 1–2000 Zeichen. Pflichtfeld.club_iduuid | null — der Verein, als der du postest. Optional — ohne landet der Beitrag in deinem persönlichen Feed.
In deinen persönlichen Feed posten
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"}'Als Verein posten
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"}'Ein erfolgreicher Beitrag liefert 201 und einen Link darauf:
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": "…"
}Ein Beitrag pro Stunde — pro Ziel
Jedes Ziel hat sein eigenes Stundenkontingent: dein Profil ist eins, jeder Verein ein weiteres. Kontingente werden nie zusammengelegt — ein Beitrag an einem Ort verbraucht nichts an einem anderen, und ein freies Ziel woanders hilft einem belegten nicht.
- OK Dein Profil und Verein A in derselben Stunde
- OK Vereine A, B und C in derselben Stunde
- 429 Ein zweiter Beitrag an Verein A innerhalb der Stunde — 429, auch wenn Profil und andere Vereine frei sind
Ist ein Kontingent belegt, kommt 429 mit dem Header Retry-After (in Sekunden) und Details im Body:
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": "…"
}Warte mindestens Retry-After Sekunden oder bis next_allowed_at, bevor du an dieses Ziel erneut postest. Nicht in einer Schleife wiederholen.
Weitere Antworten
- 400 FEED_POST_EMPTYDer Beitragstext ist leer oder zu lang.
- 401 PUBLIC_API_KEY_INVALIDDer Schlüssel fehlt, ist unbekannt oder widerrufen.
- 403 FEED_NOT_A_CAPTAINDu bist weder Inhaber noch Admin dieses Vereins.
- 404 FEED_TEAM_NOT_FOUNDEs gibt keinen Verein mit dieser
club_id. - 429 PUBLIC_API_RATE_LIMITEDAn dieses Ziel wurde in dieser Stunde schon gepostet.
- 429 FEED_DAILY_LIMIT_REACHEDDas Tageslimit des Feeds von 40 Beiträgen ist erreicht.
Fertiger n8n-Workflow
Fünf Nodes: ein manueller Start, ein Edit-Fields-Node mit content und club_id, ein If-Node, der prüft, ob club_id leer ist, und zwei HTTP-Request-Nodes — einer postet in dein Profil, der andere in den Verein.
Er beginnt mit einem manuellen Trigger, damit du ihn direkt nach dem Import testen kannst. Wenn er läuft, ersetze Start durch das, was ihn wirklich auslösen soll — Schedule, RSS, ein Formular — und ordne dessen Ausgabe den beiden Feldern zu.
{
"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": {}
}
In n8n importieren
- Kopiere das JSON oben oder lade die Datei herunter.
- Gehe in n8n zu Workflows, lege einen neuen Workflow an und füge das JSON auf der leeren Fläche ein (Strg/Cmd+V). Für die Datei: Menü ⋯ › Import from File.
- Ersetze in beiden HTTP-Request-Nodes
YOUR_API_KEY_HEREdurch deinen Schlüssel. Noch besser: speichere ihn als n8n-Credential (Header Auth, NameX-API-KEY). - Schreibe im Node Post content deinen Text in
content. Lassclub_idleer für dein Profil, oder füge die ID des Vereins ein, um als Verein zu posten. - Klicke auf Execute workflow. Der HTTP-Node zeigt die Antwort — bei Erfolg 201 und die
urldes Beitrags.