API & Webhooks – Craft mit Ihrem CRM oder Ihrer Website verbinden
So steuern Sie Craft mit Anfragen per Schlüssel und erhalten auf Ihrem eigenen Server Ereignisse zu neuen Kontakten, Klicks auf Schaltflächen, Zahlungen und Posts.
Sie können Craft mit Ihrem CRM, der Website eines Kunden oder einem beliebigen eigenen Dienst verbinden. Alles, was der MCP-Connector kann, steht als einfache HTTPS-Anfrage mit Schlüssel zur Verfügung: Funnels, Kontakte, Broadcasts, Posts, Karussells, Bilder. Webhooks funktionieren umgekehrt: Craft schickt ein Ereignis an Ihren Server, wenn ein neuer Kontakt erscheint, jemand auf eine Schaltfläche klickt, ein Funnel-Ziel erreicht, bezahlt oder ein Post live geht.
So funktioniert es#
- In Craft erstellen Sie einen Schlüssel und wählen, was er darf: nur lesen oder mit Funnels, Kontakten, Broadcasts, Posts usw. arbeiten.
- Ihr Server sendet eine Anfrage an
https://craftopen.space/api/v1/tools/<method>mit dem Schlüssel in einem Header. Die Methodenparameter stehen im JSON-Body der Anfrage. - Craft führt die Methode in Ihrem Konto aus – genau so, als hätten Sie es auf der Website getan oder Ihre KI über den MCP-Connector gebeten, mit denselben Prüfungen und Limits.
- Für Ereignisse fügen Sie einen Webhook hinzu – die Adresse Ihres Servers. Craft schickt dorthin eine signierte Anfrage und wiederholt sie, wenn Ihr Server nicht antwortet.
Was Sie brauchen#
- Einen beliebigen Tarif: Schlüssel und Webhooks lassen sich in jedem Tarif erstellen, auch im kostenlosen.
- Einen Server oder Dienst, der HTTPS-Anfragen senden und empfangen kann: Ihren eigenen Code, Make, n8n, Zapier oder ein CRM mit eingehenden Webhooks.
Schritt 1. Einen Schlüssel erstellen#
Profilmenü → API & Webhooks (oder Einstellungen → API & Webhooks) → Neuer Schlüssel.
- Geben Sie dem Schlüssel einen Namen, den Sie später wiedererkennen: „HubSpot“, „Kunden-Website“.
- Wählen Sie, was der Schlüssel darf. Ein neuer Schlüssel kann standardmäßig nur lesen. Alles andere schalten Sie mit Kontrollkästchen ein: Funnels, Kontakte, Broadcasts, Posts, Content, Content Factory, Accounts. „Alles“ öffnet alle Fähigkeiten, auch später hinzugefügte.
- Wählen Sie, wie der Schlüssel Posts und Broadcasts veröffentlicht: - Nur Entwürfe – alles wird als Entwurf gespeichert, und Sie senden es selbst in Craft; - Geplant – frühestens in 10 Minuten, damit Zeit zum Abbrechen bleibt; - Sofort – veröffentlicht und sendet im Moment der Anfrage.
- Legen Sie das Tageslimit für Bildausgaben fest und wie viele Broadcasts pro Tag der Schlüssel von einem Bot senden darf.
- Klicken Sie auf Schlüssel erstellen und kopieren Sie ihn sofort.
🔴 Der Schlüssel wird nur einmal angezeigt. Craft speichert nur seinen Fingerabdruck und kann ihn nicht wiederherstellen. Verloren? Widerrufen Sie ihn und erstellen Sie einen neuen. Setzen Sie den Schlüssel nie in den Code einer Webseite oder einer mobilen App – jeder Besucher würde ihn sehen. Der Schlüssel gehört nur auf einen Server.
Berechtigungen und Einstellungen eines Schlüssels können Sie jederzeit über „Einstellungen“ ändern – Änderungen greifen innerhalb einer Minute. „Widerrufen“ schaltet den Schlüssel sofort ab.
Schritt 2. Ihre erste Anfrage#
curl -X POST https://craftopen.space/api/v1/tools/list_funnels \
-H "Authorization: Bearer craft_your_key" \
-H "Content-Type: application/json" \
-d '{}'
Eine erfolgreiche Antwort sieht immer so aus – die Daten selbst stehen in data:
{"ok": true, "data": {"funnels": [ ... ]}}
Stimmt etwas nicht, erhalten Sie "ok": false und einen klaren Grund:
{"ok": false, "error": {"code": "funnel_not_found", "message": "Воронка не найдена."}}
⚠️ Fehlermeldungen sind derzeit auf Russisch. Bauen Sie Ihre Logik auf error.code auf – er
ist stabil und sprachunabhängig.
Verfügbare Methoden#
Alle Methoden und ihre Parameter mit Beschreibungen:
- in Craft:
GET https://craftopen.space/api/v1/toolsmit Ihrem Schlüssel – die Liste sagt, welche Berechtigung jede Methode braucht und ob dieser Schlüssel sie aufrufen darf; - eine OpenAPI-Beschreibung: craftopen.space/api/v1/openapi.json – Postman, Insomnia und Client-Generatoren verstehen sie.
Die Methoden sind dieselben wie beim MCP-Connector. Die häufigsten:
| Aufgabe | Methode | Berechtigung des Schlüssels |
|---|---|---|
| Funnels und ihre Statistik auflisten | list_funnels, get_funnel_stats |
lesen |
| Bot-Abonnenten finden | find_contacts |
lesen |
| Karte eines Abonnenten | get_contact |
lesen |
| Einen Tag hinzufügen oder entfernen | tag_contacts |
Kontakte |
| Einen Funnel für eine Person starten | run_funnel_for_contact |
Kontakte, Modus „Sofort“ |
| Geplanter Post | list_publishing_accounts → schedule_post |
Posts |
| Telegram-Broadcast | save_broadcast_draft → send_broadcast_test → send_broadcast |
Broadcasts |
| Karussell aus Ihrem Text | create_carousel, render_carousel |
Content |
| Bild gegen Credits | generate_image |
Content |
GET https://craftopen.space/api/v1/me zeigt, welchen Schlüssel Sie verwenden, seine Berechtigungen und wie
viele Anfragen heute noch übrig sind.
Wiederholen ohne Duplikate#
Ist eine Anfrage abgebrochen und Sie wissen nicht, ob sie durchging, senden Sie sie erneut mit demselben
Header Idempotency-Key. Der Post geht nicht zweimal raus, und ein Bild wird nicht zweimal berechnet.
curl -X POST https://craftopen.space/api/v1/tools/schedule_post \
-H "Authorization: Bearer craft_your_key" \
-H "Idempotency-Key: post-2026-09-27-lime-1" \
-H "Content-Type: application/json" \
-d '{"account_ids": ["..."], "confirm_usernames": ["@lime_agency"],
"carousel_id": "...", "caption": "Post text",
"scheduled_at": "2026-09-27T19:00:00+03:00"}'
⚠️ Bestätigungen sind Teil der Anfrage. Wo die Website fragen würde „Sind Sie sicher?“,
erwartet die API eine Bestätigung in den Parametern: die @Handles der Accounts für einen Post
(confirm_usernames), die genaue Zahl der Empfänger für einen Broadcast (confirm_recipients),
den Namen eines aktiven Funnels, den Sie bearbeiten, den Preis eines Zahlungsblocks. Passt die
Bestätigung nicht zu dem, was Craft sieht, wird nichts gesendet – die Antwort nennt Ihnen den
richtigen Wert.
Fehler und was zu tun ist#
| Status | Bedeutung |
|---|---|
| 400 | Ungültige Parameter – message sagt, welche |
| 401 | Kein Schlüssel, falscher Schlüssel oder der Schlüssel wurde widerrufen |
| 403 | Tarif ohne API (plan_required), dem Schlüssel fehlt eine Berechtigung (scope_required) oder der Veröffentlichungsmodus erlaubt die Aktion nicht |
| 404 | Nicht gefunden: Funnel, Kontakt, Post oder Methode |
| 409 | Die Daten haben sich seit dem Lesen geändert, oder eine Bestätigung passte nicht – erneut lesen |
| 429 | Ratenlimit – warten Sie so viele Sekunden, wie der Header Retry-After angibt |
| 500, 503 | Vorübergehender Fehler – in einer Minute mit demselben Idempotency-Key wiederholen |
Limits#
- 60 Anfragen pro Minute und 10.000 pro Tag pro Konto – über alle Schlüssel hinweg. Der Tag wird nach Moskauer Zeit (UTC+3) gezählt. Brauchen Sie mehr? Schreiben Sie dem Support; das Limit wird ohne Tarifwechsel angehoben.
- Webhooks zählen nicht zum Limit.
- Bilder verbrauchen Credits zu denselben Preisen wie auf der Website, und nie mehr als das Tageslimit, das Sie für den Schlüssel festgelegt haben.
- Broadcasts: höchstens die gewählte Anzahl pro Tag und Bot. Vor dem Senden ist ein Test an sich selbst mit
send_broadcast_testmit genau demselben Text erforderlich.
Webhooks#
API & Webhooks → Webhook hinzufügen: Geben Sie die Adresse Ihres Servers ein (nur https://) und wählen Sie die
Ereignisse. Direkt nach dem Erstellen zeigt Craft das Signaturgeheimnis – speichern Sie es, es wird nicht erneut angezeigt
(mit „Neues Geheimnis“ können Sie ein neues ausstellen).
Test sendet ein Ereignis ping und zeigt, was Ihr Server geantwortet hat. Protokoll listet die letzten
Zustellungen auf: was gesendet wurde, ob es ankam, die Antwort und eine Schaltfläche „Erneut senden“.
Ereignisse#
| Ereignis | Wann es eintrifft |
|---|---|
contact.created |
Jemand hat einen Bot abonniert oder Ihnen zum ersten Mal in Instagram-Direct geschrieben |
funnel.button_clicked |
Jemand hat in einem Funnel auf eine Schaltfläche geklickt |
funnel.goal_reached |
Jemand hat das Funnel-Ziel erreicht |
payment.succeeded |
Eine Zahlung ist über einen Zahlungsblock im Funnel eingegangen |
post.published |
Ein Post ist im sozialen Netzwerk live gegangen |
agent.message_received |
Die Nachricht eines Kunden hat den KI-Agenten erreicht – in Instagram oder Telegram |
agent.replied |
Der KI-Agent hat dem Kunden geantwortet, und die Antwort wurde gesendet. Die Daten enthalten den Antworttext |
agent.handed_over |
Der KI-Agent hat den Kunden an Mitarbeiter übergeben. Die Daten enthalten die Zusammenfassung und ob und an wen sie zugestellt wurde |
Agenten-Ereignisse enthalten platform (instagram oder telegram), account_id (den Instagram-Account oder Bot), contact_id und einen Zeitstempel, sodass Sie den Gesprächsverlauf des Agenten in Ihrem eigenen CRM oder Dienst führen können.
Beispiel für einen Request-Body:
{
"id": "6f1c…",
"type": "contact.created",
"created_at": "2026-09-26T09:04:11+00:00",
"data": {
"platform": "telegram",
"contact_id": "…",
"bot_username": "shop_bot",
"first_name": "Anna",
"username": "anna",
"source": {"type": "link", "ref": "promo"}
}
}
Die id des Ereignisses bleibt bei Wiederholungen gleich – nutzen Sie sie, um Duplikate zu verwerfen.
Prüfen, dass eine Anfrage von Craft kommt#
Jede Anfrage hat einen Header Craft-Signature: t=<time>,v1=<signature>. Die Signatur ist
HMAC-SHA256 der Zeichenkette <time>.<request body> mit Ihrem Geheimnis. Berechnen Sie sie und vergleichen Sie:
import hmac, hashlib, time
def craft_signature_ok(header: str, body: bytes, secret: str) -> bool:
parts = dict(p.split("=", 1) for p in header.split(","))
if abs(time.time() - int(parts["t"])) > 300: # older than 5 minutes — reject
return False
expected = hmac.new(secret.encode(), f"{parts['t']}.".encode() + body, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, parts["v1"])
const crypto = require("crypto");
function craftSignatureOk(header, rawBody, secret) {
const parts = Object.fromEntries(header.split(",").map((p) => p.split("=")));
if (Math.abs(Date.now() / 1000 - Number(parts.t)) > 300) return false;
const expected = crypto.createHmac("sha256", secret).update(`${parts.t}.${rawBody}`).digest("hex");
return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1));
}
⚠️ Die Signatur wird über den unveränderten Request-Body berechnet – genau die Bytes, die angekommen sind. Parst Ihr Framework das JSON zuerst und serialisiert es neu, stimmt die Signatur nicht.
Wiederholungen#
Craft wartet bis zu 10 Sekunden auf eine Antwort. Jede 2xx-Antwort gilt als zugestellt.
Andernfalls wiederholt Craft nach 1 Minute, 5 Minuten, 30 Minuten, 2, 6, 12 und 24 Stunden – insgesamt 8
Versuche, danach wird das Ereignis als „fehlgeschlagen“ markiert (aus dem Protokoll können Sie es erneut senden).
🔴 Nach 50 fehlgeschlagenen Zustellungen in Folge wird der Webhook abgeschaltet, damit er nicht weiter eine tote Adresse anspricht. Reparieren Sie Ihren Server und klicken Sie auf „Einschalten“ – der Zähler wird zurückgesetzt. Ereignisse, die eintraten, während der Webhook aus war, werden nicht gesendet.
Antworten Sie schnell und erledigen Sie langsame Arbeit nach der Antwort: Braucht Ihr Server länger als 10 Sekunden, wertet Craft den Versuch als fehlgeschlagen und sendet das Ereignis erneut.
Ihr eigener Kanal: Antworten des KI-Agenten#
Schreiben Ihnen Kunden dort, wo Craft nicht verbunden ist (Ihr eigener Messenger, Website-Chat, CRM), kann der KI-Agent auch dort antworten. Ihr System schickt die Nachricht des Kunden – Craft gibt die Antwort des Agenten zurück. Ihr System stellt sie dem Kunden zu.
curl -X POST https://craftopen.space/api/v1/agent/reply \
-H "Authorization: Bearer craft_…" -H "Content-Type: application/json" \
-d '{"ig_user_id": "1784…", "contact_id": "client-42", "text": "How much is JET+?", "name": "Ivan"}'
- Wessen Agent antwortet –
ig_user_ideines Instagram-Accounts odertg_bot_ideines Telegram-Bots mit eingerichtetem Agenten. Seine Regeln, Wissensbasis, sein Modell und seine Übergabe-Einstellungen werden verwendet. contact_id– Ihre stabile Kunden-ID; daran erinnert sich der Agent an das Gespräch.name– optional, für die Übergabe an Mitarbeiter.- Antwort:
reply– Text für den Kunden,handed_over– der Agent hat den Kunden an Mitarbeiter übergeben (der Lead geht dorthin, wohin Instagram-Leads gehen),paused– der Agent schweigt, bis Mitarbeiter ihn zurückgeben,credits_charged– verbrauchte Credits. - Antworten kosten Credits, genau wie in Instagram. Keine Credits mehr – Sie erhalten den Fehler
no_credits. - Die Ereignisse
agent.message_received,agent.repliedundagent.handed_overwerden auch für diesen Kanal ausgelöst.
⚠️ Über diesen Kanal sendet der Agent nur Text – keine Videos oder Dateien aus Funnels.
Noch nicht verfügbar#
- Fertige Client-Bibliotheken – nutzen Sie die OpenAPI-Beschreibung.
- Schlüssel und Webhooks über die API selbst erstellen – nur auf der Seite „API & Webhooks“.
- „Mit Craft anmelden“ für Apps von Drittanbietern: Ein Schlüssel gibt nur Zugriff auf Ihr eigenes Konto.