FEAVI SOAP API

Vollständige SOAP-Schnittstelle für FEAVI CRM. Anfragen und Antworten sind reines XML — kompatibel mit allen SOAP-Clients, SoapUI, Postman, Zapier, Python (zeep), PHP, Java, .NET und mehr.

Endpointhttps://feavi.com/api/soap/service.php
WSDLhttps://feavi.com/api/soap/service.php?wsdl
ProtokollSOAP 1.1 / HTTP POST
Auch als REST verfügbar: Wenn du lieber JSON magst, gibt es parallel die REST API unter /api/v1/. Beide teilen sich die gleichen Daten und API-Keys.

Setup

Schritt 1 — Migration (falls noch nicht gemacht)

https://feavi.com/migrate_api_keys.php

Schritt 2 — API-Key erstellen

Über die REST API einen Key generieren (oder direkt in der DB, wie in der REST-Doku beschrieben):

curl -X POST "https://feavi.com/api/v1/keys" \
     -H "X-API-Key: feavi_DEIN_BOOTSTRAP_KEY" \
     -H "Content-Type: application/json" \
     -d '{"name": "SOAP Client"}'

Schritt 3 — WSDL laden und testen

Öffne die WSDL-URL in SoapUI oder importiere sie in deinen SOAP-Client:

https://feavi.com/api/soap/service.php?wsdl

Authentifizierung

Der API-Key wird als SOAP-Header mitgeschickt. Dieser Header muss in jeder Anfrage enthalten sein.

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
                   xmlns:tns="urn:feavi">
  <soapenv:Header>
    <tns:FeaviAuth>
      <tns:ApiKey>feavi_dein_api_key_hier</tns:ApiKey>
    </tns:FeaviAuth>
  </soapenv:Header>
  <soapenv:Body>
    <!-- Operation hier -->
  </soapenv:Body>
</soapenv:Envelope>
Ohne gültigen Key gibt der Server einen SOAP-Fault zurück (Client.Auth).

XML-Aufbau

Anfrage-Struktur

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
                   xmlns:tns="urn:feavi">
  <soapenv:Header>
    <tns:FeaviAuth><tns:ApiKey>feavi_...</tns:ApiKey></tns:FeaviAuth>
  </soapenv:Header>
  <soapenv:Body>
    <tns:GetContactsRequest>
      <tns:Search>Müller</tns:Search>
      <tns:Status>kunde</tns:Status>
      <tns:Limit>25</tns:Limit>
      <tns:Offset>0</tns:Offset>
    </tns:GetContactsRequest>
  </soapenv:Body>
</soapenv:Envelope>

Antwort-Struktur

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Body>
    <ns1:GetContactsResponse xmlns:ns1="urn:feavi">
      <ns1:Success>true</ns1:Success>
      <ns1:Contacts>
        <ns1:Contact>
          <ns1:Id>42</ns1:Id>
          <ns1:FirstName>Max</ns1:FirstName>
          <ns1:LastName>Mustermann</ns1:LastName>
          <ns1:Email>max@example.com</ns1:Email>
          <!-- ... -->
        </ns1:Contact>
      </ns1:Contacts>
      <ns1:Meta>
        <ns1:Total>247</ns1:Total>
        <ns1:Limit>25</ns1:Limit>
        <ns1:Offset>0</ns1:Offset>
      </ns1:Meta>
    </ns1:GetContactsResponse>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Fehler-Antwort (SOAP Fault)

<SOAP-ENV:Fault>
  <faultcode>Client.Auth</faultcode>
  <faultstring>API-Key ungültig</faultstring>
</SOAP-ENV:Fault>

Empfohlene Tools & Clients

ToolWie importieren
SoapUINew Project → WSDL-URL einfügen → alle Operationen werden automatisch angelegt
PostmanNew → SOAP Request → WSDL-URL → Operation wählen
Python zeepfrom zeep import Client; c = Client('...?wsdl')
PHP SoapClientnew SoapClient('...?wsdl')
.NET / C#Add Service Reference → WSDL-URL eingeben
Java (JAX-WS)wsimport -keep "...?wsdl"

Kontakte

OperationAktionBeschreibung
GetContactsGetContactsRequestListe mit Filtern und Pagination
GetContactGetContactRequestEinzelnen Kontakt abrufen (ID)
CreateContactCreateContactRequestNeuen Kontakt erstellen
UpdateContactUpdateContactRequestKontakt aktualisieren
DeleteContactDeleteContactRequestKontakt löschen

GetContacts — Filter-Parameter

ElementTypBeschreibung
SearchstringFreitext in Name, E-Mail, Firma, Telefon
Statusstringneu · kontaktiert · qualifiziert · kunde · inaktiv
AssignedTointUser-ID
CitystringStadt (Teilsuche)
CompanystringFirmenname (Teilsuche)
LimitintMax. Ergebnisse (Standard 50, max. 200)
OffsetintStartpunkt für Pagination
OrderBystringcreated_at · last_name · first_name · company
OrderDirstringASC oder DESC

CreateContact — XML-Beispiel

<tns:CreateContactRequest>
  <tns:Contact>
    <tns:FirstName>Anna</tns:FirstName>
    <tns:LastName>Müller</tns:LastName>
    <tns:Email>anna@example.com</tns:Email>
    <tns:Phone>+49 89 123456</tns:Phone>
    <tns:Company>Muster GmbH</tns:Company>
    <tns:Status>neu</tns:Status>
    <tns:Source>Website</tns:Source>
    <tns:City>München</tns:City>
  </tns:Contact>
</tns:CreateContactRequest>

UpdateContact — nur geänderte Felder schicken

<tns:UpdateContactRequest>
  <tns:Id>42</tns:Id>
  <tns:Contact>
    <tns:Status>kunde</tns:Status>
    <tns:Notes>Vertrag unterschrieben am 15.06.2025</tns:Notes>
  </tns:Contact>
</tns:UpdateContactRequest>

Deals

OperationAktionBeschreibung
GetDealsGetDealsRequestListe mit Filtern
GetDealGetDealRequestEinzelnen Deal abrufen
CreateDealCreateDealRequestDeal erstellen
UpdateDealUpdateDealRequestDeal bearbeiten (inkl. Stage verschieben)
DeleteDealDeleteDealRequestDeal löschen
MarkDealWonMarkDealWonRequestAls gewonnen markieren
MarkDealLostMarkDealLostRequestAls verloren markieren

GetDeals — Filter-Parameter

ElementTypBeschreibung
Statusstringopen (Standard) · won · lost · all
PipelineIdintFiltere nach Pipeline
StageIdintFiltere nach Stage
ContactIdintAlle Deals eines Kontakts
ValueMin / ValueMaxdecimalWert-Filter in €
Limit / OffsetintPagination

CreateDeal — XML-Beispiel

<tns:CreateDealRequest>
  <tns:Deal>
    <tns:Title>Enterprise-Paket Muster GmbH</tns:Title>
    <tns:PipelineId>1</tns:PipelineId>
    <tns:StageId>3</tns:StageId>
    <tns:Value>12000</tns:Value>
    <tns:ContactId>42</tns:ContactId>
  </tns:Deal>
</tns:CreateDealRequest>

MarkDealWon

<tns:MarkDealWonRequest>
  <tns:Id>7</tns:Id>
</tns:MarkDealWonRequest>

Termine

OperationBeschreibung
GetAppointmentsListe mit Datumsfilter, Typ, Mitarbeiter, Status
GetAppointmentEinzelnen Termin abrufen
CreateAppointmentTermin manuell buchen
UpdateAppointmentGast-Daten aktualisieren
CancelAppointmentTermin stornieren (cancelled=1)

CreateAppointment — XML-Beispiel

<tns:CreateAppointmentRequest>
  <tns:Appointment>
    <tns:TypeId>1</tns:TypeId>
    <tns:StaffUserId>3</tns:StaffUserId>
    <tns:StartAt>2025-06-15 10:00:00</tns:StartAt>
    <tns:GuestName>Max Mustermann</tns:GuestName>
    <tns:GuestEmail>max@example.com</tns:GuestEmail>
    <tns:GuestPhone>+49 89 123456</tns:GuestPhone>
  </tns:Appointment>
</tns:CreateAppointmentRequest>

Projekte & Aufgaben

OperationBeschreibung
GetProjectsListe mit Status/Priorität-Filter
GetProjectProjekt inkl. aller Aufgaben
CreateProjectNeues Projekt
UpdateProjectProjekt bearbeiten
DeleteProjectProjekt + Aufgaben + Kommentare löschen
GetTasksAufgaben eines Projekts (optional Status-Filter)
CreateTaskAufgabe erstellen
UpdateTaskAufgabe bearbeiten / Status setzen
DeleteTaskAufgabe löschen

CreateTask — Aufgabe als erledigt anlegen

<tns:CreateTaskRequest>
  <tns:ProjectId>5</tns:ProjectId>
  <tns:Task>
    <tns:Title>Design Mockup erstellen</tns:Title>
    <tns:Priority>high</tns:Priority>
    <tns:Deadline>2025-06-30</tns:Deadline>
    <tns:AssignedTo>2</tns:AssignedTo>
  </tns:Task>
</tns:CreateTaskRequest>

UpdateTask — Status auf erledigt setzen

<tns:UpdateTaskRequest>
  <tns:Id>11</tns:Id>
  <tns:Task>
    <tns:Status>done</tns:Status>
  </tns:Task>
</tns:UpdateTaskRequest>

Aktivitäten

OperationBeschreibung
GetActivitiesListe mit Filter (Kontakt, Deal, Typ, Datum)
CreateActivityAktivität loggen
DeleteActivityAktivität löschen

Erlaubte Typen

anruf · email · meeting · notiz · aufgabe

CreateActivity — Anruf loggen

<tns:CreateActivityRequest>
  <tns:Activity>
    <tns:Type>anruf</tns:Type>
    <tns:Subject>Erstgespräch geführt</tns:Subject>
    <tns:Notes>Interesse vorhanden. Rückruf in 2 Wochen.</tns:Notes>
    <tns:ContactId>42</tns:ContactId>
    <tns:DealId>7</tns:DealId>
  </tns:Activity>
</tns:CreateActivityRequest>

Beispiel: curl

# Kontakte suchen
curl -X POST "https://feavi.com/api/soap/service.php" \
     -H "Content-Type: text/xml; charset=utf-8" \
     -H "SOAPAction: urn:feavi#GetContacts" \
     -d '<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tns="urn:feavi">
  <soapenv:Header>
    <tns:FeaviAuth><tns:ApiKey>feavi_DEIN_KEY</tns:ApiKey></tns:FeaviAuth>
  </soapenv:Header>
  <soapenv:Body>
    <tns:GetContactsRequest>
      <tns:Search>Müller</tns:Search>
      <tns:Limit>10</tns:Limit>
    </tns:GetContactsRequest>
  </soapenv:Body>
</soapenv:Envelope>'

Beispiel: PHP SoapClient

$client = new SoapClient(
    'https://feavi.com/api/soap/service.php?wsdl',
    ['trace' => true, 'exceptions' => true]
);

// Auth-Header
$auth = new SoapHeader(
    'urn:feavi',
    'FeaviAuth',
    ['ApiKey' => 'feavi_DEIN_KEY']
);
$client->__setSoapHeaders($auth);

// Kontakte abrufen
$result = $client->GetContacts([
    'Search' => 'Müller',
    'Status' => 'kunde',
    'Limit'  => 25,
]);
print_r($result->Contacts->Contact);

// Neuen Kontakt erstellen
$res = $client->CreateContact([
    'Contact' => [
        'FirstName' => 'Anna',
        'LastName'  => 'Müller',
        'Email'     => 'anna@example.com',
        'Company'   => 'Muster GmbH',
        'Status'    => 'neu',
    ],
]);
echo "Neue ID: " . $res->Id;

// Deal als gewonnen markieren
$client->MarkDealWon(['Id' => 7]);

Beispiel: Python (zeep)

from zeep import Client
from zeep.wsse import UsernameToken  # nicht nötig, wir nutzen custom header
from lxml import etree

# Client mit WSDL
client = Client('https://feavi.com/api/soap/service.php?wsdl')

# Auth-Header manuell zusammenbauen
header_ns = 'urn:feavi'
auth_header = etree.Element('{%s}FeaviAuth' % header_ns)
api_key_el  = etree.SubElement(auth_header, '{%s}ApiKey' % header_ns)
api_key_el.text = 'feavi_DEIN_KEY'

# Anfrage mit Header
with client.settings(extra_http_headers={'SOAPAction': 'urn:feavi#GetContacts'}):
    result = client.service.GetContacts(
        _soapheaders=[auth_header],
        Search='Müller',
        Status='kunde',
        Limit=25
    )

for contact in result.Contacts.Contact:
    print(contact.FirstName, contact.LastName, contact.Email)

# Deal erstellen
deal_result = client.service.CreateDeal(
    _soapheaders=[auth_header],
    Deal={
        'Title':      'Neues Angebot',
        'PipelineId': 1,
        'StageId':    1,
        'Value':      4900,
    }
)
print(f"Neue Deal-ID: {deal_result.Id}")
FEAVI SOAP API · Sandeck Media Fragen? → info@sandeck-media.de