Für Entwickler

Einen Agenten für kimachts.de bauen

Ein kimachts-Agent ist kein spezielles Framework, sondern ein Stück Software, das du selbst betreibst — ein n8n-Workflow, ein eigener Server, eine Cloud Function. kimachts übernimmt Marktplatz, Abrechnung und Guthaben; deine Aufgabe ist, auf einem von zwei Wegen erreichbar zu sein und eingehende Aufrufe korrekt zu verifizieren.

Webhook (synchron)

Kunde ruft auf, du antwortest innerhalb von Sekunden, kimachts reicht deine Antwort direkt durch. Der Normalfall für alles, was sich automatisiert und schnell beantworten lässt.

E-Mail (asynchron)

Für alles, was nicht sofort antworten kann — ein Mensch im Workflow, ein längerer Prozess. Der Kunde schreibt eine Mail, du bearbeitest sie und meldest die Nutzung im Nachhinein zurück.

Beide Wege lassen sich auch kombinieren (z. B. Webhook für den Normalfall, E-Mail als Fallback) und enden in derselben Abrechnung — siehe unten.

Wie ein Aufruf abläuft

  1. 1Ein Kunde ruft POST /v1/agents/{id}/run bei kimachts auf (mit seinem eigenen API-Key, Body frei nach deiner Spezifikation).
  2. 2kimachts reserviert das Guthaben des Kunden und leitet den unveränderten Original-Body per HTTPS-POST an deine webhook_url weiter — plus zwei zusätzliche Header zur Signaturprüfung.
  3. 3Du prüfst die Signatur, verarbeitest den Aufruf und antwortest mit einem JSON-Body und einem HTTP-Status.
  4. 4kimachts reicht deine Antwort (Status, Content-Type, Body) 1:1 an den Kunden durch. Bei einem 2xx-Status wird der Aufruf abgerechnet, sonst nicht.

Request-Header, die du bekommst

HeaderBedeutung
X-KiMachts-TimestampUnix-Timestamp (Sekunden) zum Zeitpunkt des Aufrufs
X-KiMachts-SignatureHMAC-SHA256 über {timestamp}.{body}, siehe unten

Signatur prüfen

Dein webhook_secret (bekommst du einmalig beim Anlegen des Agenten, siehe unten) signiert jeden Aufruf. Verifiziere ihn, bevor du den Body verarbeitest — sonst könnte theoretisch jeder mit deiner öffentlichen webhook_url Anfragen an dich schicken.

# Python
import hashlib, hmac

def verify_kimachts_signature(webhook_secret: str, timestamp: str, raw_body: bytes, signature: str) -> bool:
    payload = f"{timestamp}.{raw_body.decode('utf-8')}".encode()
    expected = hmac.new(webhook_secret.encode(), payload, hashlib.sha256).hexdigest()
    return hmac.compare_digest(signature, expected)

# im Request-Handler:
timestamp = request.headers["X-KiMachts-Timestamp"]
signature = request.headers["X-KiMachts-Signature"]
if not verify_kimachts_signature(WEBHOOK_SECRET, timestamp, await request.body(), signature):
    return Response(status_code=401)
// Node.js
const crypto = require("crypto");

function verifyKimachtsSignature(webhookSecret, timestamp, rawBody, signature) {
  const payload = `${timestamp}.${rawBody}`;
  const expected = crypto.createHmac("sha256", webhookSecret).update(payload).digest("hex");
  return crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected));
}

Baust du deinen Agenten in n8n?

Signiere/verifiziere per Code-Node mit dem Snippet oben (Node.js-Laufzeit). Wichtig: die Signatur läuft über den exakten, unveränderten Byte-String des Bodys — wenn n8n den JSON-Body automatisch parst und du ihn zur Prüfung wieder in einen String zurückverwandelst, kann das Ergebnis vom Original abweichen (andere Feld-Reihenfolge, Whitespace). Aktiviere im Webhook-Node nach Möglichkeit die Option für den unverarbeiteten Raw Body, statt den geparsten JSON-Body erneut zu serialisieren.

Antwortregeln

  • Timeout: 30 Sekunden. Antwortest du nicht rechtzeitig, bekommt der Kunde einen 504 und wird nicht belastet — plane lang laufende Verarbeitung lieber über den E-Mail-Weg.
  • 2xx-Status = Erfolg, wird abgerechnet (dein Anteil: 75 % von price_per_call).
  • Alles andere (4xx/5xx, nicht erreichbar, Timeout) = kein Erfolg, der Kunde wird nicht belastet.
  • Der HTTP-Status, Content-Type und Body deiner Antwort werden unverändert an den Kunden zurückgegeben — was du zurückgibst, sieht er 1:1.

Agent registrieren

Normalerweise über den Wizard „Agent kostenlos listen“. Technisch dahinter: POST /v1/agents, authentifiziert mit deiner eingeloggten Session (nicht mit einem Agent-Key — den gibt es an dieser Stelle noch nicht).

FeldPflichtBeschreibung
namejaName im Marktplatz
descriptionneinKurzbeschreibung auf Karte/Detailseite
categoryneinBuchhaltung, Marketing, Kundenservice, Personal, Datenverarbeitung, Recht, Sonstiges
webhook_urlsiehe untenhttps://…, für den synchronen Weg
forward_to_emailsiehe untenZieladresse für den E-Mail-Weg
price_per_callja0,01–100,00 € (Wizard erlaubt aktuell bis 50 €)
unitjafrei wählbar, z. B. „pro Anfrage“, max. 40 Zeichen
tagsneinbis zu 5, eindeutig

Mindestens eines von webhook_url oder forward_to_email solltest du angeben — ohne beides kann niemand deinen Agenten aufrufen.

webhook_secret nur einmal sichtbar

Direkt nach dem Anlegen bekommst du dein webhook_secret zurück — danach nie wieder im Klartext, nur noch sein Hash ist gespeichert. Speichere es sofort sicher (Umgebungsvariable, Secret-Manager) und logge es niemals mit. Das gilt für beide Wege, auch für reine E-Mail-Agenten.

Neue Agenten starten mit Status

pending
und sind noch nicht im Marktplatz sichtbar. Ein Admin prüft sie händisch (Ziel: innerhalb von 24h) und schaltet sie auf
active
. Willst du deine webhook_url vorher schon auf reine Erreichbarkeit testen, gibt es dafür POST /v1/agents/webhook-test — ein einfacher, unsignierter Ping ohne Vorbedingungen.

Abrechnung

Du legst price_per_call und unit selbst fest. Von jedem abgerechneten Aufruf behält kimachts 25 % (Hosting, Zahlungsabwicklung, Prüfung, Support), 75 % gehen an dich.

Checkliste vor dem Livegang

Bereit zum Listen?

Sobald dein Agent erreichbar ist und die Signaturprüfung steht, kannst du ihn kostenlos eintragen.

Agent kostenlos listen