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.
| Adresse | https://login.mmdial.de/api/index.php |
|---|---|
| Aufruf | Die Aktion steht immer als action in der Abfragezeichenfolge, zum Beispiel ?action=dnccheck&number=024192789880. |
| Verfahren | Welche Angaben per GET und welche per POST erwartet werden, steht bei jeder Aktion. Wo GET oder POST steht, geht beides. |
| Antwort | JSON, Zeichensatz UTF-8. Zwei Ausnahmen: dncget antwortet mit Klartext, und ein Datei-Abruf liefert die Datei selbst. |
| Anmeldung | Bei 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 wird einmal angezeigt. Gespeichert wird nur eine Prüfsumme – danach ist er nicht mehr abrufbar. Notieren Sie ihn sofort.
- Jeder Token trägt einen Namen, damit später erkennbar ist, wer ihn benutzt. Legen Sie lieber je Anwendung einen eigenen an: dann lässt sich einer abschalten, ohne die anderen zu stören.
- Ein Token kann auf einzelne Aktionen begrenzt werden – eine Aktion je Zeile. Leer bedeutet: alle Aktionen sind erlaubt.
- Änderungen am Token (abschalten, löschen, Begrenzung) wirken nach spätestens fünf Minuten. Die Schnittstelle merkt sich eine Anmeldung so lange.
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"}
| Feld | Bedeutung |
|---|---|
status | immer ok – dass hier überhaupt etwas antwortet, ist die Auskunft |
login | der Weg, auf dem Sie angemeldet sind: token |
customer | die Kundennummer, zu der der Token gehört |
dialerid | nur, wenn Sie die Kennung im Benutzernamen mitgeschickt haben. Sie steht hier, wenn sie angekommen und geprüft ist. |
time | die 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
| Name | Pflicht | Bedeutung |
|---|---|---|
type | ja | voices für eine Aufnahme, temp für eine Exportdatei |
file | ja | bei 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.
| Name | Bedeutung |
|---|---|
title | Anrede oder Titel |
phone | Telefonnummer. In der Ausgabe immer mit der Ländervorwahl davor. |
alt_phone | zweite Telefonnummer |
first_name | Vorname |
last_name | Nachname |
company_name | Firmenname |
street | Strasse |
streetnr | Hausnummer |
addradd | Adresszusatz. In der Ausgabe heisst dasselbe Feld streetadd. |
plz | Postleitzahl |
ort | Ort |
country | Länderkürzel, zum Beispiel DE |
notices | Hinweise, Kommentarfeld |
leadid_external | Ihre eigene Lead-Nummer |
status | Status des Leads (nur editlead und die Ausgabe) |
rotation | yes = 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
| Name | Pflicht | Bedeutung |
|---|---|---|
leadid | ja | die Lead-Nummer |
Antwort
| Feld | Bedeutung |
|---|---|
status | ok oder error |
msg | nur bei error, zum Beispiel no lead found |
voices | Liste der Aufnahmen, die neueste zuerst |
recid | Nummer der Aufnahme |
agentid | Agent, der das Gespräch geführt hat |
timestamp | Beginn der Aufnahme |
available | yes, wenn die Datei abrufbar ist, sonst no |
voiceid | Nummer der Datei (nur bei yes) |
url | Abrufadresse der Datei (nur bei yes) |
length | Länge in Sekunden (nur bei yes) |
size | Grö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
| Name | Pflicht | Bedeutung |
|---|---|---|
phone | ja | die Rufnummer, so wie sie gewählt wurde (national, mit der Null) |
date | nein | nur Aufnahmen dieses Tages, JJJJ-MM-TT |
timestamp | nein | genau 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
| Name | Pflicht | Bedeutung |
|---|---|---|
agentid | ja | die Agentenkennung, so wie sie in der Verwaltung steht |
date | nein | nur Aufnahmen dieses Tages, JJJJ-MM-TT |
timestamp | nein | genau 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
| Name | Pflicht | Bedeutung |
|---|---|---|
campaign_id | ja | die Kampagnennummer |
allfields | nein | yes 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
| Name | Pflicht | Bedeutung |
|---|---|---|
GUID | ja | die Nummer des Formulars – gross geschrieben |
allfields | nein | yes 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
| Name | Pflicht | Bedeutung |
|---|---|---|
campaign_id | ja | die Kampagnennummer |
selectedfields | ja | Die Felder der Datei, durch Komma getrennt, in der Reihenfolge der Spalten. Leadfelder mit dem Vorsatz customerfield_, Auftragsformularfelder mit webformfield_<GUID>_. GET oder POST. |
list_id | nein | nur diese eine Liste. Ohne Angabe alle Listen der Kampagne. |
status | nein | nur diese Status – als Feld mehrfach angeben: status[]=NEW&status[]=SALE. Ohne Angabe alle. |
datetype | nein | worauf sich der Zeitraum bezieht: last_phone (letzter Anruf, Vorgabe), last_edit (letzte Änderung) oder imported_date (angelegt am) |
fromdate, fromtime | nein | Beginn des Zeitraums, TT.MM.JJJJ und HH:MM:SS. Beide Angaben zusammen, sonst wirkt keine. |
todate, totime | nein | Ende des Zeitraums, ebenso |
encoding | nein | Zeichensatz der Datei: ISO-8859-1 (Vorgabe), Windows-1252 oder UTF-8 |
Antwort
| Feld | Bedeutung |
|---|---|
status | ok oder error |
message | nur bei error, etwa Keine Kampagne angegeben oder Nichts zu exportieren |
file_id | Kennung der erzeugten Datei |
size | Grösse in Bytes |
url | Abrufadresse |
broken_data_count | Zahl 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
- Trennzeichen
;, Felder in", ZeilenendeCRLF. - Die erste Zeile nennt die Feldnamen ohne den Vorsatz.
- Sortiert nach dem letzten Anruf, der älteste zuerst.
customerfield_phoneenthält die Ländervorwahl und die Rufnummer in einem Stück.- Von den Auftragsformularfeldern steht der letzte gespeicherte Stand je Formular in der Datei.
- Ein grosser Export dauert; die Schnittstelle rechnet bis zu 100 Minuten daran und bricht nicht ab, wenn die Verbindung abreisst. Setzen Sie Ihre eigene Wartezeit entsprechend hoch.
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" }
]
}
| Feld | Bedeutung |
|---|---|
id | die Kampagnennummer, mit der Sie alle anderen Aufrufe bedienen |
name | der Name aus der Verwaltung |
callerid | die ausgehende Rufnummer der Kampagne |
active | Y oder N |
ki_enabled | Y, wenn die Kampagne mit der KI telefoniert |
getcampaignGET
Die Angaben zu einer Kampagne.
Parameter
| Name | Pflicht | Bedeutung |
|---|---|---|
campaignid | ja | die 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
| Name | Verfahren | Bedeutung |
|---|---|---|
campaignid | GET, Pflicht | die Kampagnennummer |
name | GET oder POST | neuer Name |
callerid | GET oder POST | neue ausgehende Rufnummer |
active | GET oder POST | yes schaltet die Kampagne ein, alles andere schaltet sie ab |
dial_level | GET oder POST | die 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
| Name | Pflicht | Bedeutung |
|---|---|---|
campaignid | ja | die Kampagnennummer |
campaign_id | nein | dieselbe 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": "..."
}
}
}
| Feld | Bedeutung |
|---|---|
dial_level | die eingestellte Anrufstufe |
available_leads | wie viele Leads gerade telefonierbar sind |
calls_today | Anrufe heute |
average_agents | Agenten im Mittel der letzten Minute |
drops | aufgelegte Anrufe heute |
dropcount | deren Anteil in Prozent, wie der Dialer ihn rechnet |
dropcount_answers | deren Anteil an den erreichten Anrufen, in Prozent |
extrastats | dieselben 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
| Name | Pflicht | Bedeutung |
|---|---|---|
type | ja | WAITtimeAVG für die mittlere Wartezeit je Agent, STATUStime für die Summe je Status. Gross- und Kleinschreibung genau so. |
campaign_id | ja | die Kampagnennummer. Hier mit Unterstrich. |
fromdate, todate | nein | der Zeitraum, als Datum oder Datum mit Uhrzeit. Ohne Angabe: seit heute 0 Uhr. |
agentchosen | nein | nur diese Agenten, mehrere durch Komma getrennt |
only_bigger_zero | nein | yes 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
| Name | Pflicht | Bedeutung |
|---|---|---|
number | ja | die Rufnummer. Mehrere durch Komma getrennt. |
reason | nein | Grund der Sperre. Wird zur Nummer vermerkt und ist später in der Verwaltung zu sehen – sehr zu empfehlen. |
Antwort
| Feld | Bedeutung |
|---|---|
status | ok, doublet (die Nummer stand schon drin) oder error |
message | nur bei error |
numbers | das 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
| Name | Pflicht | Bedeutung |
|---|---|---|
number | ja | die Rufnummer. Mehrere durch Komma getrennt. |
reason | nein | Grund 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
| Name | Pflicht | Bedeutung |
|---|---|---|
number | ja | die Rufnummer |
fuzzy | nein | yes 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:
| Name | Pflicht | Bedeutung |
|---|---|---|
campaignID | ja | die 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
| Name | Pflicht | Bedeutung |
|---|---|---|
leadid | ja | die Lead-Nummer |
getxtratables_fields | nein | Felder aus Ihren Zusatztabellen, als Feld mehrfach angeben: getxtratables_fields[]=xtra_table_<Tabelle>__<Feld>. Die Namen nennt Ihnen der Support. |
Antwort
| Feld | Bedeutung |
|---|---|
status | found oder notfound |
is_archived | true, wenn der Lead nur noch im Archiv steht. Fehlt sonst. |
lead_data | die Daten des Leads, siehe unten |
formdata | die Auftragsformulare des Leads: je Formular (GUID) der zuletzt gespeicherte Stand |
xtra_tables_data | nur mit getxtratables_fields: die angefragten Werte, mit dem angefragten Namen als Schlüssel |
In lead_data stehen die Feldnamen und
zusätzlich:
lead_id | die Lead-Nummer |
listid | Liste, in der der Lead liegt |
agentid | Agent des letzten Anrufs, leer bei einem Anruf ohne Agenten |
last_contact | letzter Anruf, in Ihrer Zeitzone |
called_count | Zahl 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
| Name | Pflicht | Bedeutung |
|---|---|---|
number | ja | die Rufnummer. Die Schreibweise wird selbst umgeformt. |
archive | nein | yes 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
| Name | Pflicht | Bedeutung |
|---|---|---|
leadid | ja | Ihre eigene Lead-Nummer |
archive | nein | yes 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
| Name | Pflicht | Bedeutung |
|---|---|---|
fieldname | ja | der Name des Zusatzfeldes – ohne den Vorsatz xtra_ |
fieldvalue | ja | der gesuchte Wert. Gesucht wird auf Gleichheit, nicht auf Teiltreffer. |
archive | nein | yes 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
| Name | Pflicht | Bedeutung |
|---|---|---|
extleadid | mindestens eine Angabe | Ihre eigene Lead-Nummer |
number | die Rufnummer; die Schreibweise wird selbst umgeformt | |
extra_fieldname und extra_fieldvalue | ein Zusatzfeld und sein Wert, der Name ohne xtra_ | |
listid | eine Liste, oder mehrere als Feld: listid[]=202610181&listid[]=202610182. Mehrere gelten als "eine davon". | |
campaignID | alle Listen dieser Kampagne | |
archive | yes 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
| Name | Pflicht | Bedeutung |
|---|---|---|
campaignID | ja | die Kampagnennummer. Achtung auf die Schreibweise mit grossem ID. |
description | ja | Name der Liste |
Antwort
| Feld | Bedeutung |
|---|---|
status | ok oder error |
listid | die Nummer der neuen Liste (nur bei ok) |
reason | Fehlergrund (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
| Name | Pflicht | Bedeutung |
|---|---|---|
campaignID | nein | nur 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
| Name | Verfahren | Bedeutung |
|---|---|---|
listid | GET, Pflicht | die Listennummer |
description | GET oder POST | neuer Name der Liste |
campaignID | GET oder POST | verschiebt die Liste in eine andere Kampagne |
active | GET oder POST | yes 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
| Name | Pflicht | Bedeutung |
|---|---|---|
campaign_id | ja | die Kampagnennummer |
list_id | ja | die Liste, in die der Lead soll |
country_phone_code | ja | Ländervorwahl der Rufnummer, zum Beispiel 49. 00 bedeutet: die Nummer bringt ihre Vorwahl selbst mit. |
leaddata | ja | die 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. |
invalidcheck | nein | yes weist Nummern ab, die anderswo schon als ungültig erkannt wurden |
doubletcheck_global | nein | yes weist den Lead ab, wenn die Nummer im ganzen Zugang schon vorkommt |
doubletcheck_campaign | nein | yes prüft nur innerhalb dieser Kampagne. Wirkt nur, wenn doubletcheck_global nicht yes ist. |
doubletcheck_search_archived | nein | no lässt das Archiv bei der Doublettenprüfung aus. Vorgabe ist, es mitzuprüfen. |
importstatus | nein | Status des neuen Leads. Vorgabe NEW. |
importfilter | nein | Nummer 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"
}
| Feld | Bedeutung |
|---|---|
success | 1, wenn der Lead angelegt wurde |
error | 1, wenn nicht. Die Zähler darunter sagen, warum. |
sqlerror | Schreiben in die Datenbank fehlgeschlagen |
formaterror | ein Wert hat das falsche Format; formaterror_types nennt das Feld oder die Art des Fehlers |
doubleterror | Doublette, nach der von Ihnen gewählten Prüfung |
invaliderror | die Nummer ist als ungültig bekannt |
filtererror, filtered | nur mit importfilter: der Filter lief nicht oder hat den Lead abgewiesen |
the_new_leadid | Lead-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
| Name | Verfahren | Bedeutung |
|---|---|---|
leadid | GET, Pflicht | die Lead-Nummer |
campaign_id | GET, Pflicht | die Kampagnennummer |
leaddata | POST | die zu ändernden Felder, hier auch status und rotation. Zusatzfelder als leaddata[extrafields][<Name>]. |
formfields | POST | Auftragsformularfelder, benannt als formfields[webform_<GUID>_<Feldname>]. Die Namen nennt getfieldsbycampaign. |
GUID | GET | das 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
- Formulardaten werden nicht überschrieben. Jeder
Aufruf mit
formfieldslegt einen neuen Stand an; der alte bleibt in der Historie. Mitgeschickt werden sollten darum alle Felder des Formulars, nicht nur das geänderte – sonst stehen in dem neuen Stand nur diese. - Leere Werte sind erlaubt.
leaddata[phone]=löscht die Rufnummer. Ein Feld, das bleiben soll, lassen Sie einfach weg. rotation=yesstellt den Lead wieder auf telefonierbar,nonimmt ihn heraus.- Ein archivierter Lead wird mitgeändert.
- Ändern Sie den
status, können dadurch Benachrichtigungen ausgelöst werden, die für die Kampagne eingerichtet sind – genauso, wie wenn ein Agent den Status setzt.
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
| Name | Pflicht | Bedeutung |
|---|---|---|
leadid | ja | die 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"
}
]
}
| Feld | Bedeutung |
|---|---|
id | die Nummer des Rückrufs |
user | der Agent, der ihn vereinbart hat |
global_callback | false, wenn nur dieser Agent den Rückruf bekommt, sonst true |
status | aktiv, bearbeitet, tot oder unknown |
created | wann er vereinbart wurde |
set_time | wann angerufen werden soll |
comments | der 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
| Name | Verfahren | Bedeutung |
|---|---|---|
lead_id | GET, Pflicht | die Lead-Nummer. Hier mit Unterstrich. |
callback | POST, Pflicht | wann angerufen werden soll: JJJJ-MM-TT HH:MM:SS |
user | POST | der Agent, dem der Rückruf gehört |
recipient | POST | user: 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. |
hinweise | POST | der Hinweis zum Rückruf |
status | POST | der Status, den der Lead zum Zeitpunkt des Rückrufs bekommen soll. Ohne Angabe CALLBK. |
Antwort
{ "status": "ok" }
{ "status": "error" }
Was dabei geschieht
- Ein schon vorhandener aktiver Rückruf dieses Leads wird auf bearbeitet gesetzt – es gibt immer nur einen aktiven.
- Der Lead bekommt den Status
CBHOLD. Damit ruft der Dialer ihn nicht weiter an, bis der Rückruf fällig ist. - Der Vorgang wird im Verwaltungsprotokoll festgehalten.
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"