Conversion Trace API
Diese API liefert Einblick in einzelne Conversion-Tracking-Vorgänge ("Traces") – jeder eingehende Tracking-Aufruf (Bestellabschluss) wird mit allen Details protokolliert, egal ob er erfolgreich einer Kampagne zugeordnet werden konnte oder nicht. Diese Doku richtet sich an alle, die selbst gegen die API sprechen wollen (Scripting, eigene Auswertungen, Support-Tools).
Endpunkt & Request-Format
URL: POST https://SUBDOMAIN/ws/admin/JSON/
Content-Type: application/x-www-form-urlencoded
Der eigentliche Request steckt als JSON-String im Formularfeld REQUEST, dazu kommt NETWORKID als eigenes Feld:
| Feld | Beschreibung |
|---|---|
NETWORKID |
Ihre Netzwerk-ID |
REQUEST |
URL-encodeter JSON-String, siehe unten |
Aufbau von REQUEST
{
"function": { "class": "orders", "method": "getOrderTraces" },
"params": [
{ "limit": 50, "offset": 0, "sort": "timestamp", "sort_dir": "DESC" },
{ "id": "LOGIN_ID", "type": "adm", "network_id": "NETWORK_ID" }
],
"token": "IHR_API_TOKEN",
"login_id": "LOGIN_ID"
}
| Key | Beschreibung |
|---|---|
function.class |
Immer orders für alle hier beschriebenen Methoden. |
function.method |
Name der aufzurufenden Methode, siehe Methoden. |
params[0] |
Die eigentlichen Filter/Argumente der jeweiligen Methode. |
params[1] |
Ihr Login-Kontext: id (Ihre Login-ID), type (i.d.R. adm), network_id (Ihre Netzwerk-ID). |
token / login_id |
Ihre Zugangsdaten, siehe Authentifizierung. Alternativ als Header X-Auth-Token / X-Auth-ID statt im Body. |
Response-Format
Jede Antwort – Erfolg wie Fehler – kommt in derselben Hülle:
{
"data": { "...": "Rückgabewert der Methode" },
"log": "no logmessage provided",
"sessionId": "",
"session": null
}
Die eigentlichen Daten stehen immer im data-Feld.
Bei Fehlern (HTTP 500):
{ "error": true, "msg": "...", "type": "Ws\\Error", "data": [] }
Authentifizierung
Jeder Aufruf braucht ein gültiges Zugangsdaten-Paar: login_id + token (im REQUEST-JSON, siehe oben) oder alternativ als Header X-Auth-ID / X-Auth-Token.
Ihren API-Token erhalten Sie über Ihre Ansprechperson, oder – falls Sie bereits über einen klassischen Login verfügen – über den Login-Call: function.class: "user", method: "login" mit identifier/password/usertype. Die Antwort enthält Ihre login_id sowie einen token, den Sie danach für alle weiteren Aufrufe wiederverwenden.
Methoden
orders.getOrderTraces
Gefilterte, sortierte, paginierte Liste der Traces.
Filter (params[0]):
| Parameter | Typ | Beschreibung |
|---|---|---|
limit |
int | Default 50, maximal 200 |
offset |
int | Default 0 |
order_id |
int | Exakter Treffer auf eine Bestell-ID |
campaign_id |
int | Exakter Treffer auf eine Kampagnen-ID |
trigger_id |
int | Exakter Treffer auf eine Trigger-ID |
ordertoken |
string | Teilstring-Suche im Ordertoken |
result |
string | Exakter Treffer auf result (siehe Result-Werte) |
order_created |
"yes"/"1" oder "no"/"0" |
Filtert danach, ob aus dem Trace eine Bestellung entstanden ist |
date_from |
Datum/Zeitstempel | Traces ab diesem Zeitpunkt |
date_to |
Datum/Zeitstempel | Traces bis zu diesem Zeitpunkt (Tagesgrenze inklusive) |
matching_method |
string | Exakter Treffer auf die Zuordnungsmethode (z.B. VoucherCode) |
ip_hash |
string | Exakter Treffer auf den (gehashten) IP-Wert |
freetext |
string, mehrzeilig | Durchsucht Ordertoken, IP-Hash, Ergebnis-Detail und Fehlergrund gleichzeitig, sowie die Bestell-ID (exakt). Jede Zeile ist eine eigene Suche – mehrere Zeilen = mehrere IDs/Tokens auf einmal suchen. |
sort |
string | Eine von timestamp, order_id, campaign_id, result, matching_method, ordertoken (Default timestamp) |
sort_dir |
ASC/DESC |
Default DESC |
Response (data):
{
"traces": [
{
"id": 123,
"order_id": 456,
"campaign_id": 78,
"trigger_id": 9,
"ordertoken": "abc123",
"timestamp": "2026-07-06T10:00:00+02:00",
"user_agent": "...",
"ip_hash": "...",
"matching_method": "VoucherCode",
"matching_cascade": [ { "method": "VoucherCode", "matched": true, "reason": "...", "details": {}, "timestamp": "..." } ],
"patches_applied": [ { "type": "pre", "name": "...", "match_string": "...", "applied": true, "changes": {} } ],
"request_params": { "...": "alle GET/POST-Parameter des Trackingaufrufs" },
"duplicate_check": { "constraint_key": "...", "is_duplicate": false, "is_freezed": false, "detail": "..." },
"device_info": { "device": "...", "device_type": "...", "os": "...", "browser": "...", "browser_version": "..." },
"connection_info": { "ip": "...", "referer": "...", "cookies": "..." },
"result": "order_created",
"result_detail": "...",
"error_reason": null,
"tracking_type": "client",
"campaign_title": "Kampagnenname",
"trigger_title": "Triggername"
}
],
"total": 1337,
"limit": 50,
"offset": 0
}
Die verschachtelten Felder (matching_cascade, patches_applied, request_params, duplicate_check, device_info, connection_info) kommen als echtes JSON-Objekt/Array zurück, nicht als String.
orders.getOrderTrace
Alle Traces zu einer Bestell-ID (chronologisch, neueste zuerst).
Params: { "id": 456 }
Response: Array von Trace-Objekten (gleiches Format wie oben, ohne campaign_title/trigger_title).
orders.getOrderTraceResults
Liefert verfügbare Filterwerte (Result, Match Method, Campaign) inkl. Trefferzahl – praktisch, um eigene Filter-Dropdowns zu befüllen.
Params: keine.
Response:
{
"results": [ { "result": "order_created", "count": 900 }, ... ],
"matching_methods": [ { "matching_method": "VoucherCode", "count": 300 }, ... ],
"campaigns": [ { "campaign_id": 78, "campaign_title": "...", "count": 120 }, ... ]
}
orders.getOrderTraceStats
Liefert aggregierte Kennzahlen (stündlicher Verlauf + Zähler). Akzeptiert dieselben Filter wie getOrderTraces, mit Ausnahme von order_id/ordertoken/trigger_id/ip_hash/sort/sort_dir.
Filter (params[0]): campaign_id, result, matching_method, order_created, freetext, date_from, date_to (gleiche Bedeutung wie bei getOrderTraces).
Response:
{
"chart": [ { "hour": "2026-07-06T09:00:00+00:00", "total": 42, "success": 30, "errors": 2, "no_match": 10 } ],
"errors_1h": 2,
"success_1h": 30,
"no_match": 10
}
chart ist stündlich gruppiert. Ohne date_from/date_to beziehen sich chart auf die letzten 24h und die Zähler errors_1h/success_1h auf die letzte Stunde, no_match auf die letzten 24h. Sobald ein Datumsfilter gesetzt ist, gilt dieser Zeitraum für alle drei.
orders.retraceOrder
Führt einen gespeicherten Trace erneut aus – ein echter Tracking-Aufruf mit den ursprünglichen Parametern (User-Agent, Cookies, IP, Referer werden nachgebildet).
Params: { "trace_id": 123 }
Response (Auszug):
{
"trace_id": 123,
"type": "etrack",
"http_code": 200,
"total_time": "184ms",
"request": { "method": "GET", "user_agent": "...", "headers": [...], "cookies": "...", "params": {...} },
"response": { "...": "Antwort des Tracking-Aufrufs" },
"success": true,
"order_id": 999,
"original_trace": { "id": 123, "result": "order_created", "order_id": 456, "timestamp": "...", "matching_method": "VoucherCode" }
}
Achtung: Das ist kein Dry-Run. Bei erfolgreichem Retrace entsteht eine echte neue Bestellung im System.
orders.retrackTags
Spielt für angegebene Bestellungen serverseitige Tags gegen die aktuell hinterlegten Bedingungen neu durch. Zwei Aufrufvarianten:
| Parameter | Beschreibung |
|---|---|
traces |
Array bereits geladener Trace-Objekte (z.B. aus einem vorherigen getOrderTraces-Aufruf) |
order_ids |
Alternativ: String mit Bestell-IDs, komma-/zeilen-/leerzeichen-getrennt |
Result-Werte
| Wert | Bedeutung |
|---|---|
order_created |
Bestellung wurde erfolgreich erstellt |
duplicate |
Doppelte Bestellung erkannt |
freezed |
Bestellung eingefroren (Schutz vor Mehrfachbuchung) |
no_match |
Keine passende Kampagne/Zuordnung gefunden (kein Fehler) |
error |
Technischer Fehler |
campaign_blocked |
Kampagne ist blockiert/pausiert |
Fehlerbehandlung
Fehler kommen im Format { "error": true, "msg": "...", "type": "Ws\\Error", "data": [] } mit HTTP-Status 500. Eine leere Ergebnismenge (z.B. Filter ohne Treffer) ist kein Fehler – hier kommt ganz normal "data" mit leerem traces-Array bzw. "total": 0 zurück.
No comments to display
No comments to display