API-Referenz

Alles, was in Sales Engine steht, auch woanders.

Kontakte, Deals, Gespräche, Notizen, Wiedervorlagen und Dateien lesen und schreiben. Für Zapier, Make, n8n oder eigene Skripte. Ein Schlüssel, ein Header, JSON.

Zugang

Schlüssel unter Einstellungen → Zapier / API-Integration → Aktivieren. Jeder Aufruf schickt ihn als Header. Alles läuft mit den Rechten des Schlüssel-Inhabers.

GET https://api.sales-engine.com/api/se/zapier/me
x-api-key: DEIN-SCHLÜSSEL

→ { "eMail": "…", "userID": 63, "fullName": "…", "companyName": "…", "apiVersion": 2 }

Antworten sind JSON mit Feldnamen in camelCase, Datumsangaben nach ISO 8601. Unbekannte oder fremde Datensätze antworten mit 404, Eingabefehler mit 400 und einer Erklärung im Feld error.

Zapier

In Zapier die App Sales Engine wählen und beim Verbinden den Schlüssel eintragen. Danach stehen diese Bausteine bereit:

Trigger (sofort) Neuer Kontakt · Kontakt geändert · Kontakt gelöscht · Wiedervorlage gesetzt · Neuer Deal · Deal geändert · Deal hat Phase gewechselt · Deal gewonnen · Deal gelöscht · Neues Gespräch · Neue Notiz · Neue Datei · Selly: Kundendialog vollständig · Dokument abgelegt · Kunde hat sich gemeldet · Angaben gespeichert

Aktionen Kontakt finden · anlegen · ändern · finden oder anlegen · zuweisen · Deal anlegen · ändern · verschieben · finden · Gespräch eintragen · Notiz · Wiedervorlage · Datei in die Akte

Die Trigger kommen per Webhook in Sekunden. Für Make, n8n oder eigene Skripte gelten dieselben Endpunkte, siehe Sofort-Trigger.

Konto und Auswahllisten

AufrufLiefert
GET meKonto des Schlüssels, Verbindungstest
GET meta/funnelsFunnels mit Phasen: id, name, tabs[{id, name, index, color}]
GET meta/funnels/{funnelId}/tabsPhasen eines Funnels
GET meta/usersBenutzer des Kontos
GET meta/communication-methodsKommunikationsarten (Telefon, WhatsApp, E-Mail, Termin …)
GET meta/communication-goalsGesprächsziele
GET meta/communication-outcomesGesprächsergebnisse
GET meta/fieldsEigene Kontaktfelder: fieldId, name, card, dataType

Kontakte

AufrufBeschreibung
GET contactsListe, neueste zuerst. Parameter updatedSince, createdSince, page, pageSize (max. 100), orderBy=updated|created, includeCustomFields
GET contact/{id}Kontakt mit eigenen Feldern, Wiedervorlage, Zeitstempeln und url in die Web-App
POST contact/find{ email, phone, firstName, lastName, companyName } → bis zu 10 Treffer
POST contactAnlegen. Pflicht: eines von firstName, lastName, email, companyName
PUT contact/{id}Ändern. Nur mitgeschickte Werte werden gesetzt
POST contact/upsertFinden oder anlegen. match: email (Standard), phone, name
DELETE contact/{id}Deaktivieren, nichts geht verloren
POST contact/{id}/assign{ userId } – Kontakt einem Benutzer des Kontos übergeben
GET contact/{id}/dealsDeals des Kontakts

Felder

salutationId titleId firstName lastName secondName companyName birthday placeOfBirth street postalCode city country email mobile phonePrivate phoneWork fax website workAt bankName iban bic optIn note legalSubjectId reminderDate reminderNote customFields

Ausgabe zusätzlich id, displayName, reminderDue, createdAt, updatedAt, url. Unbekannte Namen in customFields legt die API als Textfeld auf der Karte „Zapier“ an.

POST /api/se/zapier/contact/upsert
{ "match": "email", "email": "max@example.com", "firstName": "Max", "lastName": "Mustermann",
  "mobile": "+49 170 1234567",
  "customFields": { "Quelle": "Website-Formular", "Kreditwunsch": "25.000" },
  "reminderDate": "2026-09-10T09:00:00", "reminderNote": "Erstgespräch vereinbaren" }

→ { "id": 1882, "created": true, "message": "Contact created" }

Gespräche, Notizen, Wiedervorlagen, Dateien

AufrufBeschreibung
GET contact/{id}/communicationsGespräche des Kontakts, neueste zuerst
POST contact/{id}/communication{ method|methodId, date, durationMinutes, note, reached, goalId, outcomeId, dealId }. method als Name („Telefon“, „WhatsApp“, „E-Mail“, „Termin“); ohne date gilt jetzt
POST communicationWie oben, Kontakt oder Deal im Body (contactId oder dealId)
POST contact/{id}/note{ text }
PUT contact/{id}/reminder{ date, note }; ohne date wird die Wiedervorlage gelöscht
DELETE contact/{id}/reminderWiedervorlage löschen
GET contact/{id}/filesDateien in der Akte
POST contact/{id}/file{ fileName, contentBase64 | url, description }, max. 25 MB, url öffentlich per HTTPS
GET contact/{id}/files/{fileId}/downloadDatei herunterladen, z. B. nach Google Drive sichern

Deals

AufrufBeschreibung
GET dealsListe, neueste zuerst. Parameter funnelId, funnelTabId, contactId, updatedSince, createdSince, page, pageSize, orderBy
GET deal/{id}Deal mit Funnel, Phase, Kontakt, Wiedervorlage, url
POST deal/find{ name, contactId, funnelId } → bis zu 10 Treffer
POST deal{ name, contactId, funnelTabId } oder funnelId für die erste Phase; optional note, completionDate, revenueAmount, reminderDate, reminderNote
PUT deal/{id}Ändern; ein gesetztes funnelTabId verschiebt in die Phase
POST deal/{id}/move{ funnelTabId }
GET deal/{id}/historyPhasenwechsel mit Zeitpunkt
GET deal/{id}/communicationsGespräche zum Deal
DELETE deal/{id}Deaktivieren

Trigger

Alle liefern die neuesten Einträge zuerst (limit, Standard 25, max. 100). Zapier merkt sich die id und löst nur für neue Ids aus. Bei „geändert“ ist die id aus Datensatz und Änderungszeit zusammengesetzt.

AufrufLöst aus beiBesonderheit
triggers/new-contactneuer Kontakt
triggers/updated-contactgeänderter Kontakt{ id, contact }
triggers/new-deal?funnelId=neuer Dealoptional nur ein Funnel
triggers/updated-deal?funnelId=geänderter Deal{ id, deal }
triggers/deal-stage-changed?toFunnelTabId=Phase gewechseltoptional nur eine Zielphase, enthält deal
triggers/new-communication?methodId=neues Gesprächoptional nur eine Art
triggers/new-noteneue Notizmit contactId
triggers/reminder-dueWiedervorlage heute oder überfälligid = Kontakt und Termin
triggers/reminder-setWiedervorlage gesetzt oder geändertid = Kontakt und Änderungszeit
triggers/deal-won?funnelId=Abschlussdatum gesetzt{ id, wonAt, deal }
triggers/deal-deleted, triggers/contact-deletedDatensatz deaktiviert
triggers/new-fileneue Datei in einer Aktemit downloadPath
triggers/selly-events?type=Sellys Ereignisse (Kundendialog vollständig, Dokument abgelegt, Kunde gemeldet …){ id, event, occurredAt, data }

Idempotenz: Header Idempotency-Key bei POST contact, contact/upsert, deal, communication. Gleicher Schlüssel innerhalb von 24 Stunden liefert die gespeicherte Antwort statt einer zweiten Anlage.

Sofort-Trigger (Webhooks)

Statt zu fragen, lässt du dich benachrichtigen: Ereignis abonnieren, Ziel-URL angeben, fertig. Zapier macht das automatisch; Make, n8n und eigene Systeme nutzen dieselben Endpunkte.

AufrufBeschreibung
GET hooks/eventsAlle Ereignisnamen
POST hooks{ event, targetUrl } (https) → { id }
GET hooksEigene Abonnements mit Zustellstatus
DELETE hooks/{id}Abbestellen. Antwortet dein Ziel mit 410, bestellen wir selbst ab.

Ereignisse: contact.created contact.updated contact.deleted reminder.set deal.created deal.updated deal.stage_changed deal.won deal.deleted communication.created note.created file.created selly.dialog_started selly.dialog_completed selly.document_stored selly.fields_saved selly.token_used selly.contact_created selly.weekly_review

POST https://hooks.zapier.com/… (dein Ziel)
{ "event": "deal.stage_changed", "occurredAt": "2026-09-06T10:01:00Z",
  "data": { "dealId": 22, "name": "Immobilienfinanzierung Lindner", "contactId": 1882,
            "fromPhaseName": "Erstgespräch", "toPhaseName": "Qualifiziert", "url": "https://app.sales-engine.com/deals/all?dealId=22" } }

Zustellung mit drei Wiederholungen (10 s, 60 s, 5 min). Nutzlast data entspricht dem jeweiligen Objekt der API.

Fehler und Grenzen

401 Schlüssel fehlt, ist deaktiviert oder gehört zu einem gesperrten Benutzer. 400 Eingabe unvollständig, Text in error. 404 Datensatz unbekannt oder gehört jemand anderem. 500 unerwarteter Fehler, bitte mit Zeitpunkt an support@sales-engine.com.

Listen liefern höchstens 100 Einträge je Seite. Dateien bis 25 MB. Löschen setzt inaktiv. Der Schlüssel ist personengebunden und lässt sich jederzeit deaktivieren.