mmDial API

Schnittstellenbeschreibung · Stand Oktober 2026 · English · zurück zur Hauptseite

Allgemeines

Die mmDial API bindet externe Software an einen mmDial-Zugang an: Aufnahmen suchen und herunterladen, Daten exportieren, die Sperrliste pflegen, Leads lesen, anlegen und ändern.

Adressehttps://login.mmdial.de/api/index.php
AufrufDie Aktion steht immer als action in der Abfragezeichenfolge, zum Beispiel ?action=dnccheck&number=024192789880.
VerfahrenWelche Angaben per GET und welche per POST erwartet werden, steht bei jeder Aktion. Wo GET oder POST steht, geht beides.
AntwortJSON, Zeichensatz UTF-8. Zwei Ausnahmen: dncget antwortet mit Klartext, und ein Datei-Abruf liefert die Datei selbst.
AnmeldungBei jedem Aufruf. Ohne gültigen Token antwortet die Schnittstelle mit 401 Unauthorized – siehe Anmeldung.

Nicht jede Schnittstelle von mmDial steht hier. Wenn Sie eine weitere benötigen, wenden Sie sich an unseren Support – vieles ist vorhanden und nur noch nicht beschrieben.

Zu den Fehlerantworten. Die Aktionen sind unterschiedlich alt und antworten darum nicht einheitlich: die Statuswerte heissen je nach Aktion ok, found, exists oder notfound, und der Fehlertext steht in msg, message oder reason. Was eine Aktion schickt, steht bei ihr. Verlassen Sie sich im Zweifel auf den HTTP-Status und auf status.

Anmeldung per Token

Jeder Aufruf weist sich mit einem Token aus. Den Token legen Sie selbst in der Kundenverwaltung an, unter API-Token.

Der Token im Aufruf

Bevorzugt im Authorization-Kopf:

curl -H "Authorization: Bearer <TOKEN>" \
     "https://login.mmdial.de/api/index.php?action=dncget"

Wo das nicht geht, auch als HTTP-Basic-Anmeldung – Benutzername xmlrpc_user, Kennwort ist der Token:

curl -u "xmlrpc_user:<TOKEN>" \
     "https://login.mmdial.de/api/index.php?action=dncget"

Dem Benutzernamen darf Ihre Dialer-Kennung angehängt werden, getrennt durch - oder _, also etwa xmlrpc_user-1098. Das ändert an der Prüfung nichts, die Kennung landet aber im Zugriffsprotokoll des Webservers und hilft uns bei der Fehlersuche. Stimmt sie nicht zum Token, ist der Aufruf abgewiesen.

Ob der Token trägt

Mit 401 Unauthorized antwortet die Schnittstelle, wenn der Token unbekannt, abgeschaltet oder für diese Aktion nicht freigegeben ist. Bei einem 401 prüfen Sie also beides: den Token selbst und seine Aktionsbegrenzung.

Der alte Zugang ist abgekündigt. Früher meldete sich die Schnittstelle mit einem Benutzerkonto mit Adminrechten an. Das wird nicht mehr beschrieben und soll nicht mehr benutzt werden: ein Token lässt sich einzeln abschalten und auf Aktionen begrenzen, ein Benutzerkonto nicht. Stellen Sie bestehende Anbindungen um.

authtestGET

Die Probeaktion: Sie antwortet nur, wenn die Anmeldung gilt. Keine Parameter.

curl -H "Authorization: Bearer <TOKEN>" \
     "https://login.mmdial.de/api/index.php?action=authtest"

{"status":"ok","login":"token","customer":1098,"time":"2026-10-26 11:04:12"}
FeldBedeutung
statusimmer ok – dass hier überhaupt etwas antwortet, ist die Auskunft
loginder Weg, auf dem Sie angemeldet sind: token
customerdie Kundennummer, zu der der Token gehört
dialeridnur, wenn Sie die Kennung im Benutzernamen mitgeschickt haben. Sie steht hier, wenn sie angekommen und geprüft ist.
timedie Uhrzeit des Servers

Auch ein begrenzter Token darf das. authtest ist von der Aktionsbegrenzung ausgenommen – sonst bekämen Sie gerade bei den Token, bei denen sich das Nachsehen am meisten lohnt, ein 401 und hielten einen gültigen Token für kaputt. Für eine Überwachung genügt der HTTP-Status: 200 heisst, die Zugangsdaten tragen.

Dateien abholenGET

Aufnahmen und Exportdateien holen Sie mit action=getfile. Die fertige Adresse steht in der Antwort der Aktion, die die Datei erzeugt oder gefunden hat – im Feld url. Nehmen Sie sie von dort, statt sie selbst zusammenzusetzen.

Parameter

NamePflichtBedeutung
typejavoices für eine Aufnahme, temp für eine Exportdatei
filejabei voices die voiceid aus der Aufnahmensuche, bei temp die file_id aus dem Export

Antwort

Die Datei selbst, kein JSON. Die Anmeldung gehört auch hier dazu: die Adresse allein gibt nichts heraus.

curl -H "Authorization: Bearer <TOKEN>" -o aufnahme.mp3 \
  "https://login.mmdial.de/api/index.php?action=getfile&type=voices&file=9912837"

Exportdateien sind für den Abruf gedacht, nicht für die Aufbewahrung – holen Sie sie zeitnah ab.

Feldnamen

Drei Aktionen arbeiten mit Leadfeldern: exportbystatus, addlead und editlead. Sie benutzen dieselben Namen.

NameBedeutung
titleAnrede oder Titel
phoneTelefonnummer. In der Ausgabe immer mit der Ländervorwahl davor.
alt_phonezweite Telefonnummer
first_nameVorname
last_nameNachname
company_nameFirmenname
streetStrasse
streetnrHausnummer
addraddAdresszusatz. In der Ausgabe heisst dasselbe Feld streetadd.
plzPostleitzahl
ortOrt
countryLänderkürzel, zum Beispiel DE
noticesHinweise, Kommentarfeld
leadid_externalIhre eigene Lead-Nummer
statusStatus des Leads (nur editlead und die Ausgabe)
rotationyes = der Lead ist wieder telefonierbar (nur editlead und die Ausgabe)
xtra_…Ihre eigenen Zusatzfelder, soweit für den Zugang angelegt

Das Geburtsdatum. Beim Schreiben (addlead, editlead) heisst das Feld birthdate. Der alte Name bithdate – ein Schreibfehler aus früheren Jahren – bleibt gültig; wer beide schickt, bekommt den Wert von bithdate. Im Export heisst das Feld birthday. Erwartet wird TT.MM.JJJJ.

Im Export sind zusätzlich diese Namen möglich, die es beim Schreiben nicht gibt: agentid (Agent des letzten Anrufs), imported_date (angelegt am), last_edit (zuletzt geändert), last_phone (letzter Anruf). Jede andere Spalte der Leadtabelle lässt sich ebenfalls mit ihrem eigenen Namen exportieren.

searchvoicebyleadidGET

Sucht die Aufnahmen zu einem Lead.

Parameter

NamePflichtBedeutung
leadidjadie Lead-Nummer

Antwort

FeldBedeutung
statusok oder error
msgnur bei error, zum Beispiel no lead found
voicesListe der Aufnahmen, die neueste zuerst
  recidNummer der Aufnahme
  agentidAgent, der das Gespräch geführt hat
  timestampBeginn der Aufnahme
  availableyes, wenn die Datei abrufbar ist, sonst no
  voiceidNummer der Datei (nur bei yes)
  urlAbrufadresse der Datei (nur bei yes)
  lengthLänge in Sekunden (nur bei yes)
  sizeGrösse in Bytes (nur bei yes)
{
  "status": "ok",
  "voices": [
    {
      "recid": "4815162",
      "agentid": "1098-204",
      "timestamp": "2026-10-20 11:32:07",
      "available": "yes",
      "voiceid": "9912837",
      "url": "http://api.mmdial.de/index.php?action=get&type=voices&file=9912837",
      "length": "184",
      "size": "1472000"
    }
  ]
}

Zur Abrufadresse. Sie zeigt auf denselben Host, unter dem Sie die Schnittstelle gerade angesprochen haben, und spricht https. Schicken Sie beim Abruf dieselbe Anmeldung mit wie beim Aufruf selbst – die Adresse allein gibt keine Datei heraus. Siehe Dateien abholen.

Ist available gleich no, ist die Aufnahme noch nicht fertig übertragen oder nach Ablauf der Aufbewahrungszeit gelöscht. Die übrigen Angaben stehen trotzdem da.

searchvoicebyphonenumberGET

Sucht Aufnahmen über die Rufnummer des Kunden.

Parameter

NamePflichtBedeutung
phonejadie Rufnummer, so wie sie gewählt wurde (national, mit der Null)
dateneinnur Aufnahmen dieses Tages, JJJJ-MM-TT
timestampneingenau diese Aufnahme, JJJJ-MM-TT HH:MM:SS

Antwort

Wie bei searchvoicebyleadid, und jeder Eintrag nennt zusätzlich leadid – die Rufnummer kann in mehreren Leads stehen.

Höchstens 1000 Aufnahmen je Aufruf, die neuesten zuerst. Grenzen Sie mit date ein, wenn Sie mehr erwarten.

searchvoicebyagentGET

Sucht Aufnahmen über den Agenten.

Parameter

NamePflichtBedeutung
agentidjadie Agentenkennung, so wie sie in der Verwaltung steht
dateneinnur Aufnahmen dieses Tages, JJJJ-MM-TT
timestampneingenau diese Aufnahme, JJJJ-MM-TT HH:MM:SS

Antwort

Wie bei searchvoicebyphonenumber, ebenfalls höchstens 1000 Aufnahmen je Aufruf. Für einen ganzen Tag eines Agenten reicht das meistens nicht – fragen Sie dann je Tag ab.

getfieldsbycampaignGET

Nennt die Auftragsformularfelder einer Kampagne. Damit erfahren Sie die Namen, die exportbystatus und editlead erwarten.

Parameter

NamePflichtBedeutung
campaign_idjadie Kampagnennummer
allfieldsneinyes nennt zusätzlich die Felder, zu denen in dieser Kampagne schon Daten gespeichert wurden – auch solche aus Formularen, die inzwischen abgelöst sind.

Antwort

{
  "fields": [
    { "name": "Kundennummer", "GUID": "41" },
    { "name": "Tarif",        "GUID": "41" }
  ]
}

GUID ist die Nummer des Formulars. Ein Feld desselben Namens kann in mehreren Formularen einer Kampagne vorkommen; erst Name und GUID zusammen bezeichnen es eindeutig. Die Einträge aus allfields=yes haben keine GUID.

getfieldsbyguidGET

Dasselbe für ein einzelnes Formular, über dessen Nummer. Nützlich, wenn eine Kampagne mehrere Formulare hat und Sie nur die Felder von einem brauchen.

Parameter

NamePflichtBedeutung
GUIDjadie Nummer des Formulars – gross geschrieben
allfieldsneinyes nennt zusätzlich die Felder, zu denen unter dieser Nummer schon Daten gespeichert wurden

Antwort

Wie bei getfieldsbycampaign: eine Liste fields mit name und GUID.

exportbystatusGETPOST

Erstellt eine CSV-Datei mit den Leads einer Kampagne und gibt die Abrufadresse zurück. Die Auswahl der Felder bestimmen Sie selbst.

Parameter

NamePflichtBedeutung
campaign_idjadie Kampagnennummer
selectedfieldsjaDie Felder der Datei, durch Komma getrennt, in der Reihenfolge der Spalten. Leadfelder mit dem Vorsatz customerfield_, Auftragsformularfelder mit webformfield_<GUID>_. GET oder POST.
list_idneinnur diese eine Liste. Ohne Angabe alle Listen der Kampagne.
statusneinnur diese Status – als Feld mehrfach angeben: status[]=NEW&status[]=SALE. Ohne Angabe alle.
datetypeneinworauf sich der Zeitraum bezieht: last_phone (letzter Anruf, Vorgabe), last_edit (letzte Änderung) oder imported_date (angelegt am)
fromdate, fromtimeneinBeginn des Zeitraums, TT.MM.JJJJ und HH:MM:SS. Beide Angaben zusammen, sonst wirkt keine.
todate, totimeneinEnde des Zeitraums, ebenso
encodingneinZeichensatz der Datei: ISO-8859-1 (Vorgabe), Windows-1252 oder UTF-8

Antwort

FeldBedeutung
statusok oder error
messagenur bei error, etwa Keine Kampagne angegeben oder Nichts zu exportieren
file_idKennung der erzeugten Datei
sizeGrösse in Bytes
urlAbrufadresse
broken_data_countZahl der Zeilen, die sich nicht in den gewählten Zeichensatz übertragen liessen. Grösser als 0 heisst: in der Datei steht an diesen Stellen ein Hinweis anstelle der Daten. Mit encoding=UTF-8 kommt das nicht vor.
curl -H "Authorization: Bearer <TOKEN>" \
  "https://login.mmdial.de/api/index.php?action=exportbystatus\
&campaign_id=3000&status[]=SALE&datetype=last_edit\
&fromdate=01.10.2026&fromtime=00:00:00\
&selectedfields=customerfield_leadid_external,customerfield_company_name,customerfield_phone,webformfield_41_Tarif\
&encoding=UTF-8"

{"status":"ok","file_id":"6f1c0b9e4a2d8d31b7a05c9e3d8f7a21",
 "size":182344,
 "url":"http://login.mmdial.de/api/index.php?action=getfile&type=temp&file=6f1c0b9e4a2d8d31b7a05c9e3d8f7a21",
 "broken_data_count":0}

Die Datei holen Sie anschliessend unter dieser Adresse ab – wieder mit Ihrem Token, und bitte über https:

curl -H "Authorization: Bearer <TOKEN>" -o export.csv \
  "https://login.mmdial.de/api/index.php?action=getfile&type=temp&file=<file_id>"

Zur Datei

getcampaignsGET

Nennt alle Kampagnen des Zugangs. Keine Parameter.

Antwort

{
  "campaigns": [
    { "id": "3000", "name": "Vertrieb Nord", "callerid": "4924194580649",
      "active": "Y", "ki_enabled": "Y" },
    { "id": "3500", "name": "Verkauf", "callerid": "4924194580649",
      "active": "N", "ki_enabled": "N" }
  ]
}
FeldBedeutung
iddie Kampagnennummer, mit der Sie alle anderen Aufrufe bedienen
nameder Name aus der Verwaltung
calleriddie ausgehende Rufnummer der Kampagne
activeY oder N
ki_enabledY, wenn die Kampagne mit der KI telefoniert

getcampaignGET

Die Angaben zu einer Kampagne.

Parameter

NamePflichtBedeutung
campaignidjadie Kampagnennummer. Hier klein geschrieben – andere Aktionen schreiben campaignID.

Antwort

{
  "status": "ok",
  "campaign": {
    "name": "Vertrieb Nord",
    "callerid": "4924194580649",
    "active": "Y",
    "ki_enabled": "Y",
    "dial_timeout": "30"
  }
}

Gibt es die Kampagne nicht, kommt {"status":"notfound"}. dial_timeout ist die Zeit in Sekunden, die der Dialer einen Anruf klingeln lässt.

Diese Aktion kennt weitere Parameter für die Anbindung der KI-Telefonie. Sie gehören zur Dialer-Seite und sind hier nicht beschrieben – fragen Sie den Support, wenn Sie daran arbeiten.

editcampaignGETPOST

Ändert eine Kampagne. Geschrieben wird nur, was Sie mitschicken.

Parameter

NameVerfahrenBedeutung
campaignidGET, Pflichtdie Kampagnennummer
nameGET oder POSTneuer Name
calleridGET oder POSTneue ausgehende Rufnummer
activeGET oder POSTyes schaltet die Kampagne ein, alles andere schaltet sie ab
dial_levelGET oder POSTdie Anrufstufe. Sie setzt zugleich die Obergrenze für die selbstregelnde Stufe – beide bekommen denselben Wert.

Antwort

{ "status": "ok" }
{ "status": "notfound" }

Das wirkt sofort auf den Betrieb. Eine Kampagne einzuschalten heisst, dass telefoniert wird, und die Anrufstufe bestimmt, wie viele Anrufe je Agent gleichzeitig laufen. Prüfen Sie Ihre Werte, bevor Sie sie schicken.

getcampaignlivedataGET

Die laufenden Zahlen einer Kampagne – gedacht für eine eigene Anzeige neben der Oberfläche.

Parameter

NamePflichtBedeutung
campaignidjadie Kampagnennummer
campaign_idneindieselbe Nummer noch einmal. Nur daraus wird das Feld campaign der Antwort gefüllt; ohne diesen Parameter bleibt es leer.

Antwort

{
  "status": "ok",
  "data": {
    "dial_level": 2.5,
    "available_leads": "18342",
    "calls_today": "4211",
    "average_agents": "12",
    "drops": "38",
    "dropcount": "0.90",
    "dropcount_answers": 3.21,
    "campaign": "3000",
    "extrastats": {
      "calls_hour": "612", "answers_hour": "131",
      "drops_hour": "4", "drops_hour_pct": "0.65",
      "calls_halfhour": "...", "calls_fivemin": "...", "calls_onemin": "..."
    }
  }
}
FeldBedeutung
dial_leveldie eingestellte Anrufstufe
available_leadswie viele Leads gerade telefonierbar sind
calls_todayAnrufe heute
average_agentsAgenten im Mittel der letzten Minute
dropsaufgelegte Anrufe heute
dropcountderen Anteil in Prozent, wie der Dialer ihn rechnet
dropcount_answersderen Anteil an den erreichten Anrufen, in Prozent
extrastatsdieselben Zahlen für die letzte Stunde, halbe Stunde, fünf Minuten und Minute

Gibt es zu der Kampagne heute noch keine Zahlen, kommt {"status":"notfound"}. Die Werte stammen aus der laufenden Statistik des Dialers und werden im Minutentakt fortgeschrieben – fragen Sie nicht häufiger ab.

getcampaignstatsGET

Zwei Auswertungen über einen Zeitraum: die mittlere Wartezeit der Agenten und die Zeit je Status.

Parameter

NamePflichtBedeutung
typejaWAITtimeAVG für die mittlere Wartezeit je Agent, STATUStime für die Summe je Status. Gross- und Kleinschreibung genau so.
campaign_idjadie Kampagnennummer. Hier mit Unterstrich.
fromdate, todateneinder Zeitraum, als Datum oder Datum mit Uhrzeit. Ohne Angabe: seit heute 0 Uhr.
agentchosenneinnur diese Agenten, mehrere durch Komma getrennt
only_bigger_zeroneinyes lässt Zeiten von 0 aus der Rechnung heraus

Antwort

{ "waittimes": [ { "user": "1098-204", "length_in_sec": "18" },
                 { "user": "1098-207", "length_in_sec": "24" } ] }

{ "statustimes": [ { "Status": "PAUSE", "length_in_sec": "3120" },
                   { "Status": "READY", "length_in_sec": "8400" } ] }

Die Zeiten stehen in Sekunden, aufsteigend sortiert.

Liegt der Beginn weiter zurück als gestern, wird höchstens ein Tag ab dem Beginn ausgewertet – das Ende wird entsprechend vorgezogen. Für längere Zeiträume fragen Sie also Tag für Tag ab.

dncaddGET

Nimmt eine oder mehrere Rufnummern in die Sperrliste des Zugangs auf.

Parameter

NamePflichtBedeutung
numberjadie Rufnummer. Mehrere durch Komma getrennt.
reasonneinGrund der Sperre. Wird zur Nummer vermerkt und ist später in der Verwaltung zu sehen – sehr zu empfehlen.

Antwort

FeldBedeutung
statusok, doublet (die Nummer stand schon drin) oder error
messagenur bei error
numbersdas Ergebnis je Nummer: eine Liste aus number (in der Schreibweise, in der die Nummer eingetragen wurde) und status
{
  "status": "ok",
  "numbers": [
    { "number": "24192789880",   "status": "ok" },
    { "number": "4924192789880", "status": "doublet" },
    { "number": "17012345678",   "status": "ok" }
  ]
}

Der äussere status fasst zusammen: ok, sobald mindestens eine Nummer neu eingetragen wurde, doublet, wenn alle schon dastanden, und error, wenn es einen echten Fehler gab. Bei einem Fehler bricht die Verarbeitung an dieser Stelle ab; message nennt die Position der Nummer (von 0 an gezählt), und in numbers sehen Sie, was bis dahin eingetragen wurde. Eine schon vorhandene Nummer ist kein Fehler und hält die Liste nicht auf.

Die Schreibweise der Nummer

Vor dem Eintragen wird die Nummer auf ihre Ziffern reduziert, und führende Nullen fallen weg: aus 0241 / 92789880 wird 24192789880, aus 0049 241 92789880 dagegen 4924192789880. Beides sind damit verschiedene Einträge.

Schicken Sie Nummern deshalb immer in derselben Form, in der auch Ihre Leads gespeichert sind – sonst steht die Nummer in der Sperrliste, ohne dass die Sperre beim Anruf greift. dnccheck nimmt dieselbe Umformung vor und zeigt Ihnen, was angekommen ist.

dncdelGET

Nimmt eine oder mehrere Rufnummern aus der Sperrliste heraus.

Parameter

NamePflichtBedeutung
numberjadie Rufnummer. Mehrere durch Komma getrennt.
reasonneinGrund der Freigabe, wird zur Nummer vermerkt

Antwort

status ist ok oder error, bei error dazu message. ok heisst, dass der Auftrag ausgeführt wurde – auch dann, wenn die Nummer gar nicht in der Liste stand. Ob eine Nummer gesperrt ist, sagt dnccheck.

dncgetGET

Gibt die ganze Sperrliste des Zugangs aus. Keine Parameter.

Antwort

Klartext, eine Rufnummer je Zeile, Zeilenende CRLF. Kein JSON. Die Nummern stehen so da, wie sie eingetragen wurden – siehe die Schreibweise bei dncadd.

24192789880
4924192789880
17012345678
...

dnccheckGET

Sucht eine Rufnummer in der Sperrliste.

Parameter

NamePflichtBedeutung
numberjadie Rufnummer
fuzzyneinyes sucht auch nach Teilnummern

Antwort

Ohne fuzzy:

{ "status": "exists" }      // die Nummer ist gesperrt
{ "status": "notfound" }    // sie ist es nicht

Mit fuzzy=yes antwortet die Aktion ohne status und nennt alle Treffer. Gesucht wird die Nummer selbst und jede kürzere Form davon bis hinunter zu sechs Stellen – so finden Sie auch eine gesperrte Vorwahl oder einen gesperrten Rufnummernblock:

{ "results": [ "241927", "24192789880" ] }

Eine leere results-Liste heisst: nichts gesperrt.

camp_dncadd, camp_dncdel, camp_dncget, camp_dnccheckGET

Neben der Sperrliste des ganzen Zugangs gibt es eine je Kampagne. Die vier Aktionen arbeiten genau wie dncadd, dncdel, dncget und dnccheck – mit demselben number, demselben reason, demselben fuzzy und denselben Antworten. Dazu kommt ein Parameter:

NamePflichtBedeutung
campaignIDjadie Kampagne, deren Sperrliste gemeint ist. Gross geschriebenes ID.
curl -H "Authorization: Bearer <TOKEN>" \
  "https://login.mmdial.de/api/index.php?action=camp_dncadd\
&campaignID=3000&number=024192789880&reason=Widerspruch+per+Mail"

Wirksam wird die Liste nur, wenn die Kampagne sie benutzt. In der Kampagne selbst steht, ob die eigene Sperrliste geprüft wird; ohne diese Einstellung können Sie Nummern eintragen, ohne dass es beim Anrufen etwas ändert. Die Sperrliste des ganzen Zugangs (dncadd) ist davon unabhängig.

camp_dncadd nennt das Ergebnis nicht je Nummer – das Feld numbers gibt es nur bei dncadd. Schicken Sie hier mehrere Nummern, bricht die Verarbeitung bei einer schon vorhandenen ab.

getleadbyidGET

Liest einen Lead über seine Lead-Nummer.

Parameter

NamePflichtBedeutung
leadidjadie Lead-Nummer
getxtratables_fieldsneinFelder aus Ihren Zusatztabellen, als Feld mehrfach angeben: getxtratables_fields[]=xtra_table_<Tabelle>__<Feld>. Die Namen nennt Ihnen der Support.

Antwort

FeldBedeutung
statusfound oder notfound
is_archivedtrue, wenn der Lead nur noch im Archiv steht. Fehlt sonst.
lead_datadie Daten des Leads, siehe unten
formdatadie Auftragsformulare des Leads: je Formular (GUID) der zuletzt gespeicherte Stand
xtra_tables_datanur mit getxtratables_fields: die angefragten Werte, mit dem angefragten Namen als Schlüssel

In lead_data stehen die Feldnamen und zusätzlich:

lead_iddie Lead-Nummer
listidListe, in der der Lead liegt
agentidAgent des letzten Anrufs, leer bei einem Anruf ohne Agenten
last_contactletzter Anruf, in Ihrer Zeitzone
called_countZahl der Anrufversuche
{
  "status": "found",
  "lead_data": {
    "lead_id": "45611659",
    "title": "Frau",
    "phone": "4924192789880",
    "alt_phone": "",
    "first_name": "Erika",
    "last_name": "Mustermann",
    "street": "Theaterstr.",
    "streetnr": "70-74",
    "streetadd": "",
    "plz": "52062",
    "ort": "Aachen",
    "country": "DE",
    "notices": "",
    "company_name": "Musterfirma GmbH",
    "rotation": "no",
    "status": "SALE",
    "agentid": "1098-204",
    "listid": "202610181",
    "last_contact": "2026-10-20 11:32:07",
    "called_count": "2",
    "leadid_external": "A-55912"
  },
  "formdata": {
    "41": { "Kundennummer": "A-55912", "Tarif": "Komfort" },
    "42": { "Zaehlernummer": "12345" }
  }
}

Nicht gesetzte Felder kommen als leere Zeichenkette, nicht als null. Ihre eigenen Zusatzfelder stehen als xtra_<Name> mit in lead_data.

Wird der Lead in der laufenden Datenbank nicht gefunden, sucht die Aktion von selbst im Archiv weiter und setzt dann is_archived.

Zu formdata. Der Schlüssel ist die Nummer des Formulars (GUID), wie sie getfieldsbycampaign nennt. Je Formular steht dort nur der letzte gespeicherte Stand; ältere Stände bleiben in der Historie und kommen hier nicht mit. Hat der Lead kein Formular, ist formdata leer.

getleadbyphonenumberGET

Liest Leads über die Rufnummer. Dieselbe Nummer kann in mehreren Leads stehen, darum ist lead_data hier eine Liste.

Parameter

NamePflichtBedeutung
numberjadie Rufnummer. Die Schreibweise wird selbst umgeformt.
archiveneinyes sucht zusätzlich im Archiv

Antwort

{
  "status": "found",
  "lead_data": [
    { "lead_id": "45611659", "phone": "4924192789880", "...": "..." },
    { "lead_id": "39811204", "phone": "4924192789880", "...": "...",
      "archived": true }
  ],
  "formdata": [
    { "41": { "Kundennummer": "A-55912", "Tarif": "Komfort" } }
  ]
}

Die Felder je Eintrag sind dieselben wie bei getleadbyid, ohne called_count. Einträge aus dem Archiv tragen archived: true. Wird nichts gefunden, kommt {"status":"notfound"}.

Die Formulardaten stehen zweimal da. Einmal bei jedem Lead selbst, als formdata innerhalb seines Eintrags in lead_data – nur dort ist zu sehen, welcher Stand zu welchem Lead gehört. Und einmal, wie seit jeher, als flache Liste formdata neben lead_data. Finden Sie mehrere Leads, benutzen Sie die Angabe am Lead.

getleadbyexternalidGET

Liest Leads über Ihre eigene Lead-Nummer (leadid_external).

In der alten Beschreibung hiess diese Aktion getleadbypexternalid, mit einem p zu viel. Richtig ist getleadbyexternalid.

Parameter

NamePflichtBedeutung
leadidjaIhre eigene Lead-Nummer
archiveneinyes sucht zusätzlich im Archiv

Antwort

Wie bei getleadbyphonenumber: lead_data ist eine Liste, denn Ihre Nummer kann in mehreren Leads stehen – die Schnittstelle verlangt sie nicht als eindeutig.

getleadbyextrafieldGET

Liest Leads über eines Ihrer Zusatzfelder.

Parameter

NamePflichtBedeutung
fieldnamejader Name des Zusatzfeldes – ohne den Vorsatz xtra_
fieldvaluejader gesuchte Wert. Gesucht wird auf Gleichheit, nicht auf Teiltreffer.
archiveneinyes sucht zusätzlich im Archiv

Antwort

Wie bei getleadbyphonenumber: status und lead_data als Liste.

getleadbycustomdataGET

Die Suche mit mehreren Merkmalen zugleich. Alle Angaben, die Sie mitschicken, müssen zutreffen.

Parameter

NamePflichtBedeutung
extleadidmindestens eine AngabeIhre eigene Lead-Nummer
numberdie Rufnummer; die Schreibweise wird selbst umgeformt
extra_fieldname und extra_fieldvalueein Zusatzfeld und sein Wert, der Name ohne xtra_
listideine Liste, oder mehrere als Feld: listid[]=202610181&listid[]=202610182. Mehrere gelten als "eine davon".
campaignIDalle Listen dieser Kampagne
archiveyes sucht zusätzlich im Archiv

Antwort

Wie bei getleadbyphonenumber. Schicken Sie gar kein Merkmal, kommt {"status":"noarguments"} – die Aktion gibt also nicht versehentlich alle Leads heraus.

curl -H "Authorization: Bearer <TOKEN>" \
  "https://login.mmdial.de/api/index.php?action=getleadbycustomdata\
&campaignID=3000&extra_fieldname=Vertragsnummer&extra_fieldvalue=V-4711"

addlistGET

Legt eine neue Liste in einer Kampagne an.

Parameter

NamePflichtBedeutung
campaignIDjadie Kampagnennummer. Achtung auf die Schreibweise mit grossem ID.
descriptionjaName der Liste

Antwort

FeldBedeutung
statusok oder error
listiddie Nummer der neuen Liste (nur bei ok)
reasonFehlergrund (nur bei error)
{ "status": "ok", "listid": "202610261" }

Die neue Liste ist abgeschaltet. Sie wird mit inaktiv angelegt, damit nicht sofort telefoniert wird, während Sie noch Leads einstellen. Einschalten können Sie sie in der Verwaltung. Die Listennummer bildet sich aus dem Datum und einem Zähler.

getlistsGET

Nennt die Listen – alle, oder die einer Kampagne.

Parameter

NamePflichtBedeutung
campaignIDneinnur die Listen dieser Kampagne. Ohne Angabe alle des Zugangs.

Antwort

{
  "lists": [
    { "listid": "202610261", "name": "Import 26.10.",
      "campaignID": "3000", "status": "inactive" }
  ]
}

status ist active oder inactive: aus einer abgeschalteten Liste wird nicht telefoniert.

editlistGETPOST

Ändert eine Liste – und schaltet sie ein. Das ist der Schritt nach addlist: eine neu angelegte Liste ist abgeschaltet.

Parameter

NameVerfahrenBedeutung
listidGET, Pflichtdie Listennummer
descriptionGET oder POSTneuer Name der Liste
campaignIDGET oder POSTverschiebt die Liste in eine andere Kampagne
activeGET oder POSTyes schaltet die Liste ein, alles andere schaltet sie ab

Antwort

{ "status": "ok" }
{ "status": "notfound" }
curl -H "Authorization: Bearer <TOKEN>" \
  "https://login.mmdial.de/api/index.php?action=editlist\
&listid=202610261&active=yes"

addleadPOST

Legt einen Lead an – einen je Aufruf. Die Prüfungen auf Doubletten und ungültige Nummern schalten Sie selbst zu.

Parameter

NamePflichtBedeutung
campaign_idjadie Kampagnennummer
list_idjadie Liste, in die der Lead soll
country_phone_codejaLändervorwahl der Rufnummer, zum Beispiel 49. 00 bedeutet: die Nummer bringt ihre Vorwahl selbst mit.
leaddatajadie Daten des Leads als Feld: leaddata[first_name], leaddata[phone] und so weiter. Erlaubt sind die Feldnamen ohne status und rotation, dazu Ihre xtra_-Felder.
invalidcheckneinyes weist Nummern ab, die anderswo schon als ungültig erkannt wurden
doubletcheck_globalneinyes weist den Lead ab, wenn die Nummer im ganzen Zugang schon vorkommt
doubletcheck_campaignneinyes prüft nur innerhalb dieser Kampagne. Wirkt nur, wenn doubletcheck_global nicht yes ist.
doubletcheck_search_archivedneinno lässt das Archiv bei der Doublettenprüfung aus. Vorgabe ist, es mitzuprüfen.
importstatusneinStatus des neuen Leads. Vorgabe NEW.
importfilterneinNummer eines in der Verwaltung angelegten Importfilters, der auf den Lead angewandt wird

Antwort

{
  "lead_stats": {
    "success": 1,
    "error": 0,
    "sqlerror": 0,
    "formaterror": 0,
    "doubleterror": 0,
    "invaliderror": 0,
    "formaterror_types": []
  },
  "the_new_leadid": "45611660"
}
FeldBedeutung
success1, wenn der Lead angelegt wurde
error1, wenn nicht. Die Zähler darunter sagen, warum.
sqlerrorSchreiben in die Datenbank fehlgeschlagen
formaterrorein Wert hat das falsche Format; formaterror_types nennt das Feld oder die Art des Fehlers
doubleterrorDoublette, nach der von Ihnen gewählten Prüfung
invaliderrordie Nummer ist als ungültig bekannt
filtererror, filterednur mit importfilter: der Filter lief nicht oder hat den Lead abgewiesen
the_new_leadidLead-Nummer des neuen Leads, oder false
curl -H "Authorization: Bearer <TOKEN>" \
  -d "campaign_id=3000" -d "list_id=202610261" \
  -d "country_phone_code=49" \
  -d "doubletcheck_campaign=yes" \
  -d "leaddata[company_name]=Musterfirma GmbH" \
  -d "leaddata[first_name]=Erika" \
  -d "leaddata[last_name]=Mustermann" \
  -d "leaddata[phone]=024192789880" \
  -d "leaddata[plz]=52062" \
  -d "leaddata[ort]=Aachen" \
  -d "leaddata[leadid_external]=A-55912" \
  "https://login.mmdial.de/api/index.php?action=addlead"

Auftragsformularfelder kann addlead nicht schreiben. Legen Sie den Lead an und schicken Sie die Formularfelder anschliessend mit editlead nach.

editleadGETPOST

Ändert einen vorhandenen Lead. Geschrieben wird nur, was Sie mitschicken; alles andere bleibt, wie es ist.

Parameter

NameVerfahrenBedeutung
leadidGET, Pflichtdie Lead-Nummer
campaign_idGET, Pflichtdie Kampagnennummer
leaddataPOSTdie zu ändernden Felder, hier auch status und rotation. Zusatzfelder als leaddata[extrafields][<Name>].
formfieldsPOSTAuftragsformularfelder, benannt als formfields[webform_<GUID>_<Feldname>]. Die Namen nennt getfieldsbycampaign.
GUIDGETdas Formular, unter dem der neue Stand gespeichert wird – nötig, sobald Sie formfields schicken

leaddata oder formfields muss dabei sein, sonst antwortet die Aktion mit einem Fehler.

Antwort

{ "status": "ok" }
{ "status": "error", "reason": "Fehlende Felder" }

Was dabei zu beachten ist

curl -H "Authorization: Bearer <TOKEN>" \
  -d "leaddata[status]=SALE" \
  -d "leaddata[notices]=Vertrag liegt vor" \
  -d "formfields[webform_41_Tarif]=Komfort" \
  -d "formfields[webform_41_Kundennummer]=A-55912" \
  "https://login.mmdial.de/api/index.php?action=editlead\
&leadid=45611659&campaign_id=3000&GUID=41"

getcallbacksbyleadidGET

Nennt die Rückrufe zu einem Lead.

Parameter

NamePflichtBedeutung
leadidjadie Lead-Nummer

Antwort

{
  "callbacks": [
    {
      "id": "88312",
      "user": "1098-204",
      "global_callback": false,
      "status": "aktiv",
      "created": "2026-10-20 11:35:02",
      "set_time": "2026-10-27 09:00:00",
      "campaign_id": "3000",
      "comments": "Ruft morgens besser an"
    }
  ]
}
FeldBedeutung
iddie Nummer des Rückrufs
userder Agent, der ihn vereinbart hat
global_callbackfalse, wenn nur dieser Agent den Rückruf bekommt, sonst true
statusaktiv, bearbeitet, tot oder unknown
createdwann er vereinbart wurde
set_timewann angerufen werden soll
commentsder Hinweis des Agenten

Gibt es keinen, ist callbacks leer. Ein status dieser Aktion ist nicht dabei.

addcallbackGETPOST

Vereinbart einen Rückruf zu einem Lead.

Parameter

NameVerfahrenBedeutung
lead_idGET, Pflichtdie Lead-Nummer. Hier mit Unterstrich.
callbackPOST, Pflichtwann angerufen werden soll: JJJJ-MM-TT HH:MM:SS
userPOSTder Agent, dem der Rückruf gehört
recipientPOSTuser: nur der genannte Agent bekommt den Rückruf. ANYONE: jeder Agent der Kampagne. Der frühere Wert USERONLY gilt weiterhin und bedeutet dasselbe wie user.
hinweisePOSTder Hinweis zum Rückruf
statusPOSTder Status, den der Lead zum Zeitpunkt des Rückrufs bekommen soll. Ohne Angabe CALLBK.

Antwort

{ "status": "ok" }
{ "status": "error" }

Was dabei geschieht

curl -H "Authorization: Bearer <TOKEN>" \
  -d "callback=2026-10-27 09:00:00" \
  -d "user=1098-204" \
  -d "recipient=user" \
  -d "hinweise=Ruft morgens besser an" \
  "https://login.mmdial.de/api/index.php?action=addcallback&lead_id=45611659"