Über die alfima REST-API kannst du externe Tools wie Zapier, n8n oder Make mit alfima verbinden und automatisiert mit deinem Konto arbeiten: Kontakte anlegen, Produktzugänge vergeben, Produkte und Links pflegen, Newsletter vorbereiten, Verkäufe auslesen und mehr.
Du arbeitest mit Claude Code? Dann verbinde alfima statt über die REST-API lieber direkt über unseren MCP-Server — das ist deutlich komfortabler.
Voraussetzungen
Ein alfima-Account mit aktivem Abo (bzw. laufender Testphase)
Ein API-Key (siehe nächster Abschnitt)
Grundverständnis von HTTP-Requests (dein Automations-Tool übernimmt das meiste)
API-Key erstellen
Logge dich bei alfima ein.
Gehe zu Einstellungen → API-Keys.
Klicke auf API-Key erstellen, vergib einen Namen (z. B. „Zapier Integration") und optional ein Ablaufdatum.
Wähle das Zugriffslevel:
Full access – darf lesen und schreiben (anlegen, ändern, löschen).
Read-only – darf ausschließlich lesen. Jeder Schreibversuch wird mit
403abgelehnt. Nimm das, wenn dein Tool nur Daten abholen soll.
Wichtig: Der Key wird nur einmalig angezeigt. Kopiere ihn sofort und bewahre ihn sicher auf. Geht er verloren, erstelle einen neuen oder nutze „Rotieren".
Du kannst bis zu 10 Keys gleichzeitig haben. Rotieren erzeugt einen neuen Key und macht den alten sofort ungültig, Widerrufen löscht ihn.
Authentifizierung
Sende deinen API-Key bei jeder Anfrage im Authorization-Header als Bearer-Token:
Authorization: Bearer alf_dein_api_key_hier
Alle API-Keys beginnen mit dem Präfix alf_.
Base-URL
https://app.alfima.com/api/v1/
Alle Endpunkte unten sind relativ zu dieser Base-URL.
Rate-Limits
300 Anfragen pro Minute pro API-Key über alle Endpunkte hinweg.
POST /grants: zusätzlich 20 pro Minute – jeder Grant kann eine E-Mail auslösen.KI-Produktbild erzeugen: zusätzlich 10 pro Minute.
Die engeren Limits gelten zusätzlich zum allgemeinen Limit – es greift immer das strengere. Wird ein Limit überschritten, antwortet die API mit 429.
Antwortformat
Erfolgreiche Antworten enthalten immer ein data- und ein meta-Objekt:
{ "data": { … }, "meta": { "request_id": "01J8…" } }Bei Listen kommt in meta zusätzlich die Seiteninfo dazu:
{ "data": [ … ], "meta": { "pagination": { "page": 1, "per_page": 50, "total": 137 }, "request_id": "01J8…" } }Listen liefern standardmäßig 50 Einträge; mit den Query-Parametern per_page (max. 100) und page blätterst du durch. Die request_id hilft unserem Support bei der Fehlersuche – schick sie einfach mit.
Fehlerformat
Fehler kommen im Standardformat „Problem Details" (Content-Type: application/problem+json):
{ "type": "https://app.alfima.com/problems/validation-error", "title": "Validation failed", "status": 422, "detail": "One or more fields are invalid.", "code": "VALIDATION_ERROR", "request_id": "01J8…", "errors": { "email": ["The email field is required."] } }Die für dich wichtigen Felder sind code (maschinenlesbar) und detail (Klartext). errors gibt es nur bei Validierungsfehlern. Wichtig: Prüfe in deinem Tool auf detail, nicht auf ein message-Feld – ein solches gibt es nicht.
Endpunkte im Überblick
Die drei am häufigsten genutzten Endpunkte sind weiter unten ausführlich beschrieben:
GET /products– Produkte auflisten (um dieproduct_idzu finden)POST /contacts– Kontakt anlegen oder aktualisieren (Upsert per E-Mail)POST /grants– einem Kontakt Zugang zu einem Produkt gewähren
Darüber hinaus deckt die API inzwischen fast dein ganzes Konto ab:
Kontakte:
GET/POST /contactssowieGET/PUT/DELETE /contacts/{id}Produkte:
GET/POST /products,GET/PUT /products/{id}, Produktbild setzen oder per KI erzeugenKursinhalte: Module und (Text-)Lektionen unter
/products/{id}/modulesanlegen, ändern, löschenLinks:
/links– auflisten, anlegen, ändern, löschenSeiten:
/pages– auflisten, HTML importieren, löschenNewsletter (Pro für Schreibzugriff):
/newsletters– Entwürfe verwalten, senden, abbrechenAutomationen (Pro für Schreibzugriff):
/automations– inkl. Schritte, Aktivierung und StatistikenInstagram-Auto-DMs (Pro für Schreibzugriff):
/instagram/auto-dmsVerkäufe:
/transactions(nur lesend) und CSV-Exporte unter/transactions/exportsAnalytics:
/analytics/revenue,/analytics/views,/analytics/conversionTermin-Verfügbarkeiten:
/availability– Buchungszeiten lesen und setzenEinstellungen:
/tax-settings(Rechnungsadresse, Steuern) und/legal-texts(Impressum, AGB, Datenschutz)Uploads:
POST /uploads– Datei hochladen und die zurückgegebenefile_idan einem Produkt verwenden
Alle Endpunkte folgen denselben Regeln: Bearer-Token, data/meta im Erfolgsfall, Problem-Details im Fehlerfall. Du brauchst Details zu einem Bereich, der hier nicht ausgeschrieben ist? Melde dich beim Support – wir schicken dir die passenden Felder.
Anfragen aus No-Code-Tools senden (Zapier, Make, n8n)
Alle gängigen Automations-Tools haben ein generisches „HTTP-Request"-Modul:
Zapier: App „Webhooks by Zapier" → Aktion „Custom Request" (benötigt einen bezahlten Zapier-Plan)
Make: Modul „HTTP" → „Make a request"
n8n: Node „HTTP Request"
Egal welches Tool – du füllst immer dieselben vier Dinge aus:
Methode:
GET(Daten abrufen) oderPOST(Daten senden) – steht bei jedem Endpunkt dabei.URL: Base-URL + Endpunkt, z. B.
https://app.alfima.com/api/v1/contactsHeader:
Authorizationmit dem WertBearer alf_dein_api_key_hier. Bei POST zusätzlichContent-Typemit dem Wertapplication/json(manche Tools setzen das automatisch, sobald du JSON als Body-Typ wählst).Body (nur bei POST): JSON mit den Feldern des jeweiligen Endpunkts.
Tipp – dynamische Werte: Felder wie email oder product_id kannst du aus dem vorherigen Schritt deines Workflows übernehmen, statt sie fest einzutragen.
GET /products
Listet deine Produkte auf. Nützlich, um die product_id für einen Grant zu finden. Unterstützt page und per_page (Standard 50, max. 100).
Anfrage:
GET https://app.alfima.com/api/v1/products Authorization: Bearer alf_dein_api_key_hier
Antwort (200):
{ "data": [ { "id": 123, "name": "Mein Onlinekurs", "price": 49.90, "type": "course_product", "productable_type": "course_product", "created_at": "2026-06-20T10:00:00+00:00" } ], "meta": { "pagination": { "page": 1, "per_page": 50, "total": 1 }, "request_id": "01J8…" } }Ein einzelnes Produkt holst du dir mit GET /products/{id} – die Antwort enthält dann alle Details inklusive Beschreibung, Bild-URL, Ratenplänen und wiederkehrenden Preisen.
POST /contacts
Legt einen Kontakt an oder aktualisiert ihn. Der Abgleich erfolgt über die E-Mail-Adresse (Upsert). Existiert bereits ein Kontakt mit dieser E-Mail, wird er aktualisiert.
Felder (nur email ist Pflicht):
email– gültige E-Mail-Adresse (max. 255)first_name,last_name– Vor- und Nachname (je max. 255)phone_number– Telefonnummer (max. 50)type–privateoderbusinesscompany_name– Firmenname (max. 255)address_line_1,address_line_2– Adresszeilen (je max. 255)address_city,address_state– Stadt / Bundesland (je max. 100)address_postal_code– Postleitzahl (max. 20)address_country– 2-stelliger Ländercode, z. B.DEvat_number– USt-IdNr. (max. 50)double_opt_in–true/false, setzt den Double-Opt-in-Zeitpunktlist_ids– Array von Listen-IDs, denen der Kontakt hinzugefügt wird (müssen dir gehören)
Anfrage:
POST https://app.alfima.com/api/v1/contacts Authorization: Bearer alf_dein_api_key_hier Content-Type: application/json { "email": "[email protected]", "first_name": "Max", "last_name": "Mustermann", "double_opt_in": true, "list_ids": [12] }Antwort: Statuscode 201, wenn der Kontakt neu angelegt wurde, und 200, wenn ein vorhandener aktualisiert wurde. Am Statuscode – nicht am Inhalt – erkennst du, welcher Fall eingetreten ist.
{ "data": { "id": 456, "email": "[email protected]", "name": "Max Mustermann", "type": "private", "double_opt_in_at": "2026-06-20T10:00:00+00:00", "created_at": "2026-06-20T10:00:00+00:00", "updated_at": "2026-06-20T10:00:00+00:00" } }Hinweis: Ein als business markierter Kontakt wird nicht automatisch auf private zurückgestuft – der in alfima gespeicherte Stand bleibt führend.
POST /grants
Gewährt einem Kontakt Zugang zu einem deiner Produkte (entspricht einer manuellen, kostenlosen Freigabe). Existiert der Kontakt noch nicht, wird er anhand der E-Mail angelegt.
Felder:
email(Pflicht) – E-Mail des Kontakts (max. 255)product_id(Pflicht) – ID eines deiner Produkte (sieheGET /products)first_name,last_name– werden nur gesetzt, wenn beim Kontakt noch nichts hinterlegt ist; vorhandene Werte bleiben unangetastetsend_access_email–true/false, Zugangs-E-Mail an den Kontakt senden. Standard: false.
Anfrage:
POST https://app.alfima.com/api/v1/grants Authorization: Bearer alf_dein_api_key_hier Content-Type: application/json { "email": "[email protected]", "product_id": 123, "send_access_email": true }Antwort (201):
{ "data": { "purchase_id": 789, "customer_id": 456, "product_id": 123, "access_expires_at": null, "access_email_sent": true }, "meta": { "request_id": "01J8…" } }Hat der Kontakt bereits Zugang zu diesem Produkt, antwortet die API mit
409.Gehört das Produkt nicht zu deinem Konto, antwortet die API mit
422.Beachte das engere Limit von 20 Anfragen pro Minute für diesen Endpunkt.
Fehler-Codes
401·UNAUTHENTICATED– kein, ungültiger oder abgelaufener API-Key403·FORBIDDEN– Abo inaktiv, oder du hast mit einem Read-only-Key zu schreiben versucht. Der genaue Grund steht indetail.404·NOT_FOUND– Ressource nicht gefunden (oder sie gehört nicht zu deinem Konto)409·CONFLICT– Konflikt, z. B. Kontakt hat bereits Produktzugang422·VALIDATION_ERROR– Validierungsfehler, Details imerrors-Objekt429·TOO_MANY_REQUESTS– Rate-Limit überschritten, kurz warten und erneut versuchen500·INTERNAL_ERROR– unerwarteter Fehler bei uns; schick uns dierequest_id
Bei Fragen oder Problemen: kontaktiere den alfima-Support – wir helfen dir gern bei der Einrichtung.
