Zum Inhalt springen

Ereignistypen

Der Umschlag

{ id, type, apiVersion, createdAt, workspaceId, actor, data }. id ist die Ereignis-ID (evt_…), die auch als webhook-id gesendet wird. apiVersion ist die Nutzlast-Version, mit der der Endpunkt erstellt wurde (2026-09-01).

actor sagt, wer das Ereignis ausgelöst hat: user (jemand in der App), api_key (mit seiner ID), staff oder system (Scans, Jobs, Domain-Prüfungen). Eine Integration, die über die API zurückschreibt, kann Ereignisse überspringen, die ihr eigener Schlüssel ausgelöst hat, und so Schleifen vermeiden.

Neue Ereignistypen und neue Felder können jederzeit auftauchen: Ignorieren Sie, was Sie nicht kennen. Eine Änderung, die einen Parser brechen würde, erscheint als neue apiVersion, für die sich bestehende Endpunkte entscheiden.

Ereignisse

code.createdEin Code wurde in der App oder über die API erstellt. Massenläufe senden bulk.completed.
code.updatedZiel, Inhalt, Name, Design, Regeln, Slug, Ordner oder Domain wurden geändert.
code.status_changedPausiert, fortgesetzt oder von Dotwick deaktiviert und wieder aktiviert.
code.deletedEin Code wurde gelöscht; sein Kurzlink antwortet mit 410.
scan.createdEine Person hat einen Code gescannt. Bots und Link-Vorschauen werden nie gesendet.
bulk.completedEin Massenlauf ist beendet: ein Ereignis pro Lauf mit seinen Zahlen.
export.completedEin ZIP-Export ist fertig oder fehlgeschlagen. Rufen Sie den Export ab, um einen neuen Download-Link zu erhalten.
domain.status_changedEine eigene Domain hat einen anderen Status angenommen (verified, active, failed, released).
form.submittedJemand hat ein gehostetes Formular beantwortet. Enthält die Antworten (personenbezogene Daten).
gs1.recall_changedEine GS1-Charge, -Variante oder -Seriennummer wurde zurückgerufen, aus dem Verkauf genommen oder freigegeben.
alert.firedEin Scan-Alarm wurde ausgelöst: ein Scan, N Scans in M Minuten oder keine Scans seit D Tagen.
webhook.testWird nur von „Testereignis senden“ gesendet. Sie können es nicht abonnieren.

Nutzlasten

Ein Beispiel für jedes Ereignis, so wie es zugestellt wird.

code.created

Nutzlast
{  "id": "evt_018f3k2m9q4x7c1v",  "type": "code.created",  "apiVersion": "2026-09-01",  "createdAt": "2026-09-12T14:03:51.000Z",  "workspaceId": "ws_8f21ac4e9d0b7c11",  "actor": {    "kind": "api_key",    "userId": "u8Hk2LmN0pQ4rS6tV8wX0yZ2aB4cD6eF",    "apiKeyId": "key_4f2a9c1e7b3d5a60"  },  "data": {    "code": {      "id": "qr_8841ce2mxk",      "workspaceId": "ws_8f21ac4e9d0b7c11",      "name": "Van fleet – unit 14",      "type": "url",      "dynamic": true,      "status": "active",      "slug": "Xq7mK2p",      "domainId": null,      "shortUrl": "https://dotwick.co/Xq7mK2p",      "content": {        "type": "url",        "url": "https://example.com/fleet/van-014"      },      "design": {        "pattern": "rounded",        "eyes": {          "frame": "circle",          "ball": "circle"        },        "colors": {          "fg": "#18181B",          "bg": "#FFFFFF"        }      },      "rules": {        "routes": [],        "expiresAt": null,        "scanLimit": null,        "inactiveUrl": null,        "passwordProtected": false      },      "folderId": "fld_8k2m4q7x",      "templateId": null,      "createdBy": "u8Hk2LmN0pQ4rS6tV8wX0yZ2aB4cD6eF",      "createdAt": "2026-09-10T09:41:08.000Z",      "updatedAt": "2026-09-10T09:41:08.000Z",      "scans": 0    }  }}

code.updated

Nutzlast
{  "id": "evt_028f3k2m9q4x7c1v",  "type": "code.updated",  "apiVersion": "2026-09-01",  "createdAt": "2026-09-12T14:03:51.000Z",  "workspaceId": "ws_8f21ac4e9d0b7c11",  "actor": {    "kind": "user",    "userId": "u8Hk2LmN0pQ4rS6tV8wX0yZ2aB4cD6eF",    "apiKeyId": null  },  "data": {    "code": {      "id": "qr_8841ce2mxk",      "workspaceId": "ws_8f21ac4e9d0b7c11",      "name": "Van fleet – unit 14",      "type": "url",      "dynamic": true,      "status": "active",      "slug": "Xq7mK2p",      "domainId": null,      "shortUrl": "https://dotwick.co/Xq7mK2p",      "content": {        "type": "url",        "url": "https://example.com/fleet/van-014-spring"      },      "design": {        "pattern": "rounded",        "eyes": {          "frame": "circle",          "ball": "circle"        },        "colors": {          "fg": "#18181B",          "bg": "#FFFFFF"        }      },      "rules": {        "routes": [],        "expiresAt": null,        "scanLimit": null,        "inactiveUrl": null,        "passwordProtected": false      },      "folderId": "fld_8k2m4q7x",      "templateId": null,      "createdBy": "u8Hk2LmN0pQ4rS6tV8wX0yZ2aB4cD6eF",      "createdAt": "2026-09-10T09:41:08.000Z",      "updatedAt": "2026-09-12T14:03:51.000Z",      "scans": 0    },    "changed": [      "content"    ],    "previousDestination": "https://example.com/fleet/van-014"  }}

code.status_changed

Nutzlast
{  "id": "evt_038f3k2m9q4x7c1v",  "type": "code.status_changed",  "apiVersion": "2026-09-01",  "createdAt": "2026-09-12T14:03:51.000Z",  "workspaceId": "ws_8f21ac4e9d0b7c11",  "actor": {    "kind": "user",    "userId": "u8Hk2LmN0pQ4rS6tV8wX0yZ2aB4cD6eF",    "apiKeyId": null  },  "data": {    "code": {      "id": "qr_8841ce2mxk",      "workspaceId": "ws_8f21ac4e9d0b7c11",      "name": "Van fleet – unit 14",      "type": "url",      "dynamic": true,      "status": "paused",      "slug": "Xq7mK2p",      "domainId": null,      "shortUrl": "https://dotwick.co/Xq7mK2p",      "content": {        "type": "url",        "url": "https://example.com/fleet/van-014"      },      "design": {        "pattern": "rounded",        "eyes": {          "frame": "circle",          "ball": "circle"        },        "colors": {          "fg": "#18181B",          "bg": "#FFFFFF"        }      },      "rules": {        "routes": [],        "expiresAt": null,        "scanLimit": null,        "inactiveUrl": null,        "passwordProtected": false      },      "folderId": "fld_8k2m4q7x",      "templateId": null,      "createdBy": "u8Hk2LmN0pQ4rS6tV8wX0yZ2aB4cD6eF",      "createdAt": "2026-09-10T09:41:08.000Z",      "updatedAt": "2026-09-12T14:03:51.000Z",      "scans": 0    },    "from": "active",    "to": "paused",    "reason": "user"  }}

code.deleted

Nutzlast
{  "id": "evt_048f3k2m9q4x7c1v",  "type": "code.deleted",  "apiVersion": "2026-09-01",  "createdAt": "2026-09-12T14:03:51.000Z",  "workspaceId": "ws_8f21ac4e9d0b7c11",  "actor": {    "kind": "api_key",    "userId": "u8Hk2LmN0pQ4rS6tV8wX0yZ2aB4cD6eF",    "apiKeyId": "key_4f2a9c1e7b3d5a60"  },  "data": {    "codeId": "qr_8841ce2mxk",    "name": "Van fleet – unit 14",    "slug": "Xq7mK2p",    "deletedAt": "2026-09-12T14:03:51.000Z"  }}

scan.created

Nutzlast
{  "id": "evt_058f3k2m9q4x7c1v",  "type": "scan.created",  "apiVersion": "2026-09-01",  "createdAt": "2026-09-12T14:03:51.000Z",  "workspaceId": "ws_8f21ac4e9d0b7c11",  "actor": {    "kind": "system",    "userId": null,    "apiKeyId": null  },  "data": {    "ts": "2026-09-12T14:03:51.000Z",    "codeId": "qr_8841ce2mxk",    "codeName": "Van fleet – unit 14",    "country": "US",    "city": "Portland",    "device": "mobile",    "os": "iOS 18",    "browser": "Safari 18",    "source": "qr",    "isBot": false  }}

bulk.completed

Nutzlast
{  "id": "evt_068f3k2m9q4x7c1v",  "type": "bulk.completed",  "apiVersion": "2026-09-01",  "createdAt": "2026-09-12T14:03:51.000Z",  "workspaceId": "ws_8f21ac4e9d0b7c11",  "actor": {    "kind": "system",    "userId": null,    "apiKeyId": null  },  "data": {    "bulkImportId": "blk_9f24ab7c3e1d5f80",    "status": "partially_succeeded",    "total": 50,    "created": 47,    "failed": 1,    "invalid": 2,    "canceled": 0,    "folderId": "fld_8k2m4q7x",    "exportId": "exp_2m7x4k9q1c8v3b6n"  }}

export.completed

Nutzlast
{  "id": "evt_078f3k2m9q4x7c1v",  "type": "export.completed",  "apiVersion": "2026-09-01",  "createdAt": "2026-09-12T14:03:51.000Z",  "workspaceId": "ws_8f21ac4e9d0b7c11",  "actor": {    "kind": "system",    "userId": null,    "apiKeyId": null  },  "data": {    "exportId": "exp_2m7x4k9q1c8v3b6n",    "status": "succeeded",    "counts": {      "total": 47,      "succeeded": 47,      "failed": 0    },    "formats": [      "svg",      "pdf"    ],    "expiresAt": "2026-09-19T14:03:51.000Z",    "bulkImportId": "blk_9f24ab7c3e1d5f80"  }}

domain.status_changed

Nutzlast
{  "id": "evt_088f3k2m9q4x7c1v",  "type": "domain.status_changed",  "apiVersion": "2026-09-01",  "createdAt": "2026-09-12T14:03:51.000Z",  "workspaceId": "ws_8f21ac4e9d0b7c11",  "actor": {    "kind": "system",    "userId": null,    "apiKeyId": null  },  "data": {    "domainId": "dom_5q8w2e7r4t1y9u3i",    "hostname": "qr.example.com",    "from": "ssl_issuing",    "to": "active"  }}

form.submitted

Nutzlast
{  "id": "evt_098f3k2m9q4x7c1v",  "type": "form.submitted",  "apiVersion": "2026-09-01",  "createdAt": "2026-09-12T14:03:51.000Z",  "workspaceId": "ws_8f21ac4e9d0b7c11",  "actor": {    "kind": "system",    "userId": null,    "apiKeyId": null  },  "data": {    "codeName": "Open house – RSVP",    "submission": {      "id": "fsb_6h3j8k1l4z7x2c5v",      "codeId": "qr_8841ce2mxk",      "submittedAt": "2026-09-12T14:03:51.000Z",      "data": {        "name": "Sam Okafor",        "email": "sam@example.com",        "guests": "2"      },      "country": "US"    }  }}

gs1.recall_changed

Nutzlast
{  "id": "evt_108f3k2m9q4x7c1v",  "type": "gs1.recall_changed",  "apiVersion": "2026-09-01",  "createdAt": "2026-09-12T14:03:51.000Z",  "workspaceId": "ws_8f21ac4e9d0b7c11",  "actor": {    "kind": "user",    "userId": "u8Hk2LmN0pQ4rS6tV8wX0yZ2aB4cD6eF",    "apiKeyId": null  },  "data": {    "codeId": "qr_8841ce2mxk",    "gtin14": "09506000134352",    "qualifier": {      "id": "gsq_4v8n2k7m1x5c9b3q",      "codeId": "qr_8841ce2mxk",      "key": "10:LOT-42",      "level": "batch",      "cpv": null,      "batch": "LOT-42",      "serial": null,      "links": [],      "defaultLinkType": null,      "state": "recalled",      "recall": {        "title": "Do not use batch LOT-42",        "body": "Northwind withdrew this batch after a supplier issue. Return the jar for a full refund.",        "date": "2026-09-12",        "contact": "recalls@example.com"      },      "expiry": "271231",      "printed": 5000,      "note": null,      "stateChangedAt": "2026-09-12T14:03:51.000Z",      "createdAt": "2026-09-10T09:41:08.000Z",      "updatedAt": "2026-09-12T14:03:51.000Z"    },    "from": "clear",    "to": "recalled"  }}

alert.fired

Nutzlast
{  "id": "evt_128f3k2m9q4x7c1v",  "type": "alert.fired",  "apiVersion": "2026-09-01",  "createdAt": "2026-09-12T14:03:51.000Z",  "workspaceId": "ws_8f21ac4e9d0b7c11",  "actor": {    "kind": "system",    "userId": null,    "apiKeyId": null  },  "data": {    "ruleId": "alr_3d9k2m7q4x8c1v5n",    "ruleName": "Spring menu: 50 scans in 10 minutes",    "kind": "threshold",    "scope": {      "kind": "folder",      "codeId": null,      "folderId": "fld_8k2m4q7x"    },    "codeId": null,    "codeName": null,    "scans": 50,    "windowStart": "2026-09-12T13:53:51.000Z",    "windowEnd": "2026-09-12T14:03:51.000Z",    "firedAt": "2026-09-12T14:03:51.000Z"  }}

webhook.test

Nutzlast
{  "id": "evt_118f3k2m9q4x7c1v",  "type": "webhook.test",  "apiVersion": "2026-09-01",  "createdAt": "2026-09-12T14:03:51.000Z",  "workspaceId": "ws_8f21ac4e9d0b7c11",  "actor": {    "kind": "user",    "userId": "u8Hk2LmN0pQ4rS6tV8wX0yZ2aB4cD6eF",    "apiKeyId": null  },  "data": {    "endpointId": "whe_3k8m2q9x7c4v1b6n",    "message": "Test event from Dotwick"  }}

Felder von bulk.completed

Ein Ereignis pro beendetem Lauf, egal wie groß – nicht ein code.created pro Code. Es enthält nur Zahlen: Rufen Sie die Codes aus dem Lauf ab.

data.bulkImportIdstringID des Laufs (blk_…).
data.status"succeeded" | "partially_succeeded" | "failed" | "canceled"Wie der Lauf endete.
data.totalnumberElemente in der Anfrage (Zeilen einer Datei).
data.creatednumberErstellte Codes.
data.failednumberGültige Elemente, deren Code zur Laufzeit nicht erstellt werden konnte – wiederholbar.
data.invalidnumberElemente, die vor Laufbeginn wegen fehlerhafter oder fehlender Daten übersprungen wurden.
data.cancelednumberElemente, die unbearbeitet blieben, weil der Lauf abgebrochen wurde.
data.folderIdstring | nullOrdner, in den die Codes einsortiert wurden, oder null für die Wurzel des Arbeitsbereichs.
data.exportIdstring | nullID des ZIP-Exports, wenn der Lauf einen angefordert hat – sonst null.