Zum Hauptinhalt springen
REST · JSON · OpenAPI 3.1

doWallet API

Pässe für Apple Wallet und Google Wallet ausstellen, per Push aktualisieren und Einlösungen zählen. Diese Referenz beschreibt jeden Endpunkt mit Feldern, Antworten und einem Beispiel, das du direkt kopieren kannst.

1 · Token anlegen

Einstellungen → API-Management → „Neuer Token“. Rolle editor reicht für Einlösungen und Pass-Updates.

API-Management

2 · Einlösung melden

Ein Aufruf pro Vorgang oder gebündelt zum Tagesabschluss. Seriennummer oder Pass-ID als Referenz.

Endpunkt

3 · Ereignisse empfangen

Webhook registrieren und Pass hinzugefügt, entfernt oder eingelöst in dein System übernehmen.

Webhooks

Basis-URL

Produktionhttps://api.dowallet.de
Staginghttps://api-dowallet.doable.app

Alle Pfade sind versioniert (/v1/…). Zeitstempel ISO 8601 in UTC, Beträge in Cent, Antworten JSON.

Authentifizierung

Integrationen nutzen einen API-Token als Bearer-Token. Ein Token gehört zu einer Organisation und trägt eine Rolle (viewer, editor, admin). Die Web-App selbst verwendet eine Cookie-Sitzung; für Server-zu-Server-Aufrufe brauchst du das nicht.

Authorization: Bearer dwlt_xxxxxxxxxxxxxxxxxxxxxxxx

Rate-Limits und Idempotenz

Schreibende Endpunkte sind pro Token limitiert; bei 429 den Header Retry-After beachten. Massendaten schickst du gebündelt in einem Aufruf. Bei Einlösungen ist externalId der Idempotenz-Schlüssel: dieselbe Kennung wird nie doppelt gezählt.

Fehler

Jeder Fehler kommt als Envelope mit stabiler Kennung und einer Request-ID für den Support.

{
  "error": {
    "code": "validation_error",
    "title": "Ungültige Anfrage",
    "detail": "serial: Required",
    "requestId": "req-8f3a…"
  }
}
401Token fehlt oder ist ungültig
403Rolle reicht nicht
404Objekt gehört nicht zu deiner Organisation
409Konflikt, z. B. Duplikat oder falscher Status
422Validierung fehlgeschlagen, fields nennt die Felder
429Rate-Limit

Webhook-Signatur

Ausgehende Zustellungen und eingehende Einlösungen tragen dieselbe Signatur. Prüfe sie, bevor du den Body verarbeitest.

x-dowallet-signature: t=1758000000,v1=<hex(hmac_sha256(secret, t + "." + body))>

OpenAPI-Dokument: openapi.json · Interaktive Konsole: api-dowallet.doable.app/docs

Integration

API-Tokens

Tokens für Server-zu-Server-Zugriff anlegen, rotieren und widerrufen.

GET/v1/orgs/{orgId}/api-tokens

API-Tokens auflisten

Alle Tokens der Organisation mit Rolle, Erstellungsdatum und letztem Einsatz. Der Klartext eines Tokens erscheint nur einmal, direkt nach dem Anlegen.

Pfad-Parameter

  • orgIduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/orgs/{orgId}/api-tokens" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "data": [
    {
      "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "orgId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "name": "Sommer-Aktion",
      "tokenPrefix": "dwlt_xxxxxxxxxxxxxxxxxxxxxxxx",
      "scopes": [
        "text"
      ],
      "lastUsedAt": "2026-09-15T10:32:00Z",
      "expiresAt": "2026-09-15T10:32:00Z",
      "revokedAt": "2026-09-15T10:32:00Z",
      "createdAt": "2026-09-15T10:32:00Z"
    }
  ],
  "pagination": {
    "nextCursor": "text",
    "hasMore": true
  }
}
POST/v1/orgs/{orgId}/api-tokens

API-Token anlegen

Erzeugt einen Bearer-Token mit einer Rolle (viewer, editor, admin). Die Antwort enthält den Klartext genau einmal; danach ist nur noch der Hash gespeichert. Org-Owner.

Pfad-Parameter

  • orgIduuidPflicht

Request-Body (JSON)

  • namestringPflicht

    1–120 Zeichen

  • scopesstring[]Pflicht

    1–∞ Einträge

  • workspaceIduuid | nulloptional
  • expiresAtdate-time | nulloptional

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/orgs/{orgId}/api-tokens" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Sommer-Aktion",
  "scopes": [
    "text"
  ],
  "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "expiresAt": "2026-09-15T10:32:00Z"
}'
Antwort200
{
  "token": {
    "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "orgId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "name": "Sommer-Aktion",
    "tokenPrefix": "dwlt_xxxxxxxxxxxxxxxxxxxxxxxx",
    "scopes": [
      "text"
    ],
    "lastUsedAt": "2026-09-15T10:32:00Z",
    "expiresAt": "2026-09-15T10:32:00Z",
    "revokedAt": "2026-09-15T10:32:00Z",
    "createdAt": "2026-09-15T10:32:00Z"
  },
  "plaintext": "Heute 20 % auf alles. Nur bis Ladenschluss."
}
DELETE/v1/api-tokens/{id}

API-Token widerrufen

Sofort wirksam. Laufende Integrationen mit diesem Token bekommen ab jetzt 401.

Pfad-Parameter

  • iduuidPflicht

Antworten

  • 204Kein Inhalt
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X DELETE "https://api-dowallet.doable.app/v1/api-tokens/{id}" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort204
(kein Inhalt)

Einlösungen

Einlösungen melden, importieren und auswerten.

POST/v1/workspaces/{workspaceId}/redemptions/import

CSV-Import ausführen

Accepts multipart/form-data with a file part (≤ 10 MB) or application/json { "csv": "…" }. Delimiter (, ; tab) and header names are detected; see docs/redemptions.md for the recognised columns. Writes redemptionLogged events through the same ingest as the bulk API (externalId idempotency, pass resolution by id / serial / code). Editor role or above; session or API token. Rate limit 10/min.

Pfad-Parameter

  • workspaceIduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 413Zu groß
  • 422Validierung fehlgeschlagen
  • 429Rate-Limit
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/workspaces/{workspaceId}/redemptions/import" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "total": 1,
  "accepted": 1,
  "duplicates": 1,
  "unmatched": [
    {
      "index": 1,
      "row": {},
      "reason": "text"
    }
  ],
  "errors": [
    {
      "index": 1,
      "row": {},
      "reason": "text"
    }
  ],
  "mapping": {
    "delimiter": ",",
    "columns": {},
    "ignoredHeaders": [
      "text"
    ]
  },
  "parseErrors": [
    {
      "line": 1,
      "reason": "text"
    }
  ],
  "preview": [
    {}
  ]
}
POST/v1/workspaces/{workspaceId}/redemptions/import/preview

CSV-Import prüfen (Vorschau)

Same input as the import endpoint. Returns the detected column mapping, the first 20 parsed rows and how many rows would be unmatched or duplicates. Nothing is written.

Pfad-Parameter

  • workspaceIduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 413Zu groß
  • 422Validierung fehlgeschlagen
  • 429Rate-Limit
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/workspaces/{workspaceId}/redemptions/import/preview" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "mapping": {
    "delimiter": ",",
    "columns": {},
    "ignoredHeaders": [
      "text"
    ]
  },
  "rowCount": 1,
  "rows": [
    {}
  ],
  "parseErrors": [
    {
      "line": 1,
      "reason": "text"
    }
  ],
  "unmatched": 1,
  "duplicates": 1
}
GET/v1/workspaces/{workspaceId}/redemptions

Einlösungen auflisten

Pfad-Parameter

  • workspaceIduuidPflicht

Query-Parameter

  • limitintegeroptional
  • cursorstringoptional
  • passIduuidoptional
  • campaignIduuidoptional
  • fromstringoptional
  • tostringoptional

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 422Validierung fehlgeschlagen
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/workspaces/{workspaceId}/redemptions?limit=100&cursor=text&passId=3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "data": [
    {
      "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "occurredAt": "2026-09-15T10:32:00Z",
      "pass": {
        "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
        "serial": "ABC123456",
        "templateName": "Sommer-Aktion"
      },
      "amountCents": 1250,
      "currency": "EUR",
      "locationName": "Sommer-Aktion",
      "campaignId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "source": "text",
      "externalId": "bon-4711"
    }
  ],
  "pagination": {
    "nextCursor": "text",
    "hasMore": true
  }
}
POST/v1/workspaces/{workspaceId}/redemptions

Einlösungen melden (gebündelt)

Up to 5,000 redemptions per call. Each row names the pass by pass.id, pass.serial or pass.code (resolved in that order, within the workspace). externalId (e.g. the receipt number) is the idempotency key per workspace: resending the same externalId is reported under duplicates, never stored twice. Rows without externalId are deduped on (pass, redeemedAt) inside the batch. redeemedAt defaults to now. Editor role or above; session or API token (Authorization: Bearer dwlt_…). Rate limit 60/min.

Pfad-Parameter

  • workspaceIduuidPflicht

Request-Body (JSON)

  • redemptionsobject[]Pflicht

    1–5000 Einträge

  • passobjectoptional
  • iduuidoptional
  • serialstringoptional

    1–200 Zeichen

  • codestringoptional

    1–200 Zeichen

  • redeemedAtdate-timeoptional
  • amountCentsintegeroptional

    0 bis 100000000

  • currencystringoptional

    3–3 Zeichen

  • locationIduuidoptional
  • locationNamestringoptional

    1–200 Zeichen

  • campaignIduuidoptional
  • externalIdstringoptional

    1–200 Zeichen

  • notestringoptional

    0–2000 Zeichen

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 422Validierung fehlgeschlagen
  • 429Rate-Limit
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/workspaces/{workspaceId}/redemptions" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "redemptions": [
    {}
  ]
}'
Antwort200
{
  "total": 1,
  "accepted": 1,
  "duplicates": 1,
  "unmatched": [
    {
      "index": 1,
      "row": {},
      "reason": "text"
    }
  ],
  "errors": [
    {
      "index": 1,
      "row": {},
      "reason": "text"
    }
  ]
}
GET/v1/workspaces/{workspaceId}/redemptions/summary

Einlösungen zusammenfassen (Zeitraum, Quelle, Tag)

from/to bound total, bySource and topTemplates (default: the last 30 days). byDay always covers the 30 calendar days (workspace timezone) ending at to.

Pfad-Parameter

  • workspaceIduuidPflicht

Query-Parameter

  • fromstringoptional
  • tostringoptional

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 422Validierung fehlgeschlagen
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/workspaces/{workspaceId}/redemptions/summary?from=2026-09-15T10%3A32%3A00Z&to=2026-09-15T10%3A32%3A00Z" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "range": {
    "from": "2026-09-15T10:32:00Z",
    "to": "2026-09-15T10:32:00Z"
  },
  "total": 1,
  "amountCents": 1250,
  "bySource": [
    {
      "source": "text",
      "count": 1
    }
  ],
  "byDay": [
    {
      "day": "text",
      "count": 1
    }
  ],
  "topTemplates": [
    {
      "templateId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "templateName": "Sommer-Aktion",
      "count": 1
    }
  ]
}

Webhooks

Ausgehende Webhooks konfigurieren, Zustellungen prüfen, eingehende Ereignisse annehmen.

GET/v1/workspaces/{workspaceId}/webhooks

Webhooks auflisten

Ausgehende Endpunkte des Workspace mit Ereignis-Filter, Status und dem Zeitpunkt der letzten Zustellung.

Pfad-Parameter

  • workspaceIduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/workspaces/{workspaceId}/webhooks" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "data": [
    {
      "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "url": "https://example.de/hook",
      "eventTypes": [
        "pass.added"
      ],
      "isActive": true,
      "lastDeliveryAt": "2026-09-15T10:32:00Z",
      "lastDeliveryStatus": 1,
      "failedDeliveriesInARow": 1,
      "createdAt": "2026-09-15T10:32:00Z",
      "disabledAt": "2026-09-15T10:32:00Z"
    }
  ],
  "pagination": {
    "nextCursor": "text",
    "hasMore": true
  }
}
POST/v1/workspaces/{workspaceId}/webhooks

Webhook anlegen

Registriert eine HTTPS-URL. events leer = alle Ereignisse. Die Antwort enthält das Signatur-Secret einmalig. Jede Zustellung trägt x-dowallet-signature: t=<unix>,v1=<hmac-sha256(secret, t + '.' + body)>.

Pfad-Parameter

  • workspaceIduuidPflicht

Request-Body (JSON)

  • urluriPflicht
  • eventTypesstring[]Pflicht

    1–∞ Einträge

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/workspaces/{workspaceId}/webhooks" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "url": "https://example.de/hook",
  "eventTypes": [
    "pass.added"
  ]
}'
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "url": "https://example.de/hook",
  "eventTypes": [
    "pass.added"
  ],
  "isActive": true,
  "lastDeliveryAt": "2026-09-15T10:32:00Z",
  "lastDeliveryStatus": 1,
  "failedDeliveriesInARow": 1,
  "createdAt": "2026-09-15T10:32:00Z",
  "disabledAt": "2026-09-15T10:32:00Z",
  "secret": "text"
}
POST/v1/webhooks/{id}/test

Test-Zustellung senden

Schickt ein signiertes webhook.test-Ereignis an die URL und liefert Statuscode und Antwortzeit zurück.

Pfad-Parameter

  • iduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/webhooks/{id}/test" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "ok": true,
  "status": 1,
  "error": "text"
}
GET/v1/webhooks/{id}/deliveries

Zustellungen einsehen

Die letzten Zustellversuche mit Statuscode, Dauer und Wiederholungszähler. Zur Fehlersuche auf deiner Seite.

Pfad-Parameter

  • iduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 404Nicht gefunden
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/webhooks/{id}/deliveries" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "data": [
    {
      "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "webhookId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "attempt": 1,
      "status": "active",
      "responseStatus": 1,
      "responseBody": "Heute 20 % auf alles. Nur bis Ladenschluss.",
      "completedAt": "2026-09-15T10:32:00Z",
      "createdAt": "2026-09-15T10:32:00Z"
    }
  ]
}
PATCH/v1/webhooks/{id}

Webhook ändern

URL, Ereignis-Filter oder Aktiv-Status anpassen. Ein pausierter Webhook (nach 24 h Fehlern) wird mit active: true wieder aufgenommen.

Pfad-Parameter

  • iduuidPflicht

Request-Body (JSON)

  • urlurioptional
  • eventTypesstring[]optional

    1–∞ Einträge

  • isActivebooleanoptional

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X PATCH "https://api-dowallet.doable.app/v1/webhooks/{id}" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "url": "https://example.de/hook",
  "eventTypes": [
    "pass.added"
  ],
  "isActive": true
}'
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "url": "https://example.de/hook",
  "eventTypes": [
    "pass.added"
  ],
  "isActive": true,
  "lastDeliveryAt": "2026-09-15T10:32:00Z",
  "lastDeliveryStatus": 1,
  "failedDeliveriesInARow": 1,
  "createdAt": "2026-09-15T10:32:00Z",
  "disabledAt": "2026-09-15T10:32:00Z"
}
DELETE/v1/webhooks/{id}

Webhook löschen

Pfad-Parameter

  • iduuidPflicht

Antworten

  • 204Kein Inhalt
  • 401Nicht angemeldet
  • 404Nicht gefunden
Anfragecurl
curl -X DELETE "https://api-dowallet.doable.app/v1/webhooks/{id}" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort204
(kein Inhalt)
POST/v1/webhooks/incoming/{webhookId}

Einlösung von Kasse oder Shop melden

Eingehender Webhook ohne Token: der Body ist mit dem Webhook-Secret signiert (x-dowallet-signature). Referenz per passId oder serial; externalId verhindert Dubletten. Antwort 202, die Einlösung erscheint sofort in der Auswertung.

Pfad-Parameter

  • webhookIduuidPflicht

Antworten

  • 200OK
  • 400Ungültige Anfrage
  • 401Nicht angemeldet
  • 404Nicht gefunden
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/webhooks/incoming/{webhookId}" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "accepted": true
}

Pässe

Ausgegebene Pässe lesen, Inhalte aktualisieren, personenbezogene Daten löschen.

POST/v1/passes/{id}/push

Push an einen Pass senden

Hängt eine Nachricht an den Pass und stößt Apple- bzw. Google-Push an. Für viele Empfänger gleichzeitig eine Kampagne verwenden.

Pfad-Parameter

  • iduuidPflicht

Request-Body (JSON)

  • reasonstringoptional

    1–80 Zeichen

  • messagestringoptional

    1–80 Zeichen

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/passes/{id}/push" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "reason": "manual",
  "message": "Heute 20 % auf alles. Nur bis Ladenschluss."
}'
Antwort200
{
  "enqueued": true,
  "jobId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "mode": "instant",
  "delivered": 1
}
POST/v1/google-wallet/sync/{passId}

Google-Wallet-Objekt synchronisieren

Erzwingt einen erneuten Abgleich des Google-Objekts mit dem aktuellen Pass-Inhalt.

Pfad-Parameter

  • passIduuidPflicht

Request-Body (JSON)

  • asyncbooleanoptional

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
  • 409Konflikt
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/google-wallet/sync/{passId}" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "async": true
}'
Antwort200
{
  "mode": "sync",
  "jobId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "classStatus": 1,
  "objectStatus": 1
}
GET/v1/workspaces/{workspaceId}/passes

Pässe auflisten

Seitenweise mit Filtern nach Status, Plattform, Template und Suchbegriff (Seriennummer, Name, E-Mail). Personenbezogene Felder nur, wenn der Inhaber sie mit Einwilligung hinterlegt hat.

Pfad-Parameter

  • workspaceIduuidPflicht

Query-Parameter

  • templateIduuidoptional
  • statusactive | deactivatedoptional
  • utmSourcestringoptional
  • limitintegeroptional

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/workspaces/{workspaceId}/passes?templateId=3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01&status=active&utmSource=text" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "data": [
    {
      "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "serial": "ABC123456",
      "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "templateId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "templateVersion": 1,
      "platform": "apple",
      "status": "active",
      "isTest": true,
      "label": "Sommer-Aktion",
      "isInternal": true,
      "isDemo": true,
      "code": "text",
      "attributes": {},
      "utm": {
        "source": "text",
        "medium": "text",
        "campaign": "text",
        "term": "text",
        "content": "text"
      },
      "claimLinkId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "createdAt": "2026-09-15T10:32:00Z",
      "activatedAt": "2026-09-15T10:32:00Z",
      "deactivatedAt": "2026-09-15T10:32:00Z",
      "redemptionCount": 1,
      "generation": 1,
      "previousTemplateId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "expiredAt": "2026-09-15T10:32:00Z"
    }
  ],
  "pagination": {
    "nextCursor": "text",
    "hasMore": true
  }
}
GET/v1/passes/{id}/generations

Pass-Verlauf lesen

Alle Generationen eines Passes: welches Template und welche Version wann galten. Grundlage für „Früheres Pass-Template“-Zielgruppen.

Pfad-Parameter

  • iduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/passes/{id}/generations" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "data": [
    {
      "generation": 1,
      "templateId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "templateName": "Sommer-Aktion",
      "templateVersion": 1,
      "campaignId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "campaignName": "Sommer-Aktion",
      "appliedAt": "2026-09-15T10:32:00Z"
    }
  ]
}
POST/v1/passes/{id}/deactivate

Pass deaktivieren

Setzt den Pass auf expired; Wallets zeigen ihn als abgelaufen. Nicht umkehrbar.

Pfad-Parameter

  • iduuidPflicht

Request-Body (JSON)

  • reasonstringoptional

    1–80 Zeichen

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
  • 409Konflikt
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/passes/{id}/deactivate" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "reason": "manual"
}'
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "status": "deactivated",
  "deactivatedAt": "2026-09-15T10:32:00Z"
}
POST/v1/passes/{passId}/erase-personal-data

Personenbezogene Daten löschen

Entfernt Name, E-Mail, Telefon und verknüpfte Kontaktdaten des Passes (DSGVO Art. 17). Der Pass selbst bleibt technisch gültig.

Pfad-Parameter

  • passIduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/passes/{passId}/erase-personal-data" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "ok": true,
  "customerErased": true,
  "passesScrubbed": 1
}
PATCH/v1/passes/{id}

Pass-Attribute setzen

Schreibt Attribute ({{attr.<key>}}-Platzhalter im Template) für genau diesen Pass, z. B. Punktestand oder Kundennummer. Löst kein Push aus; dafür PATCH /v1/passes/{id}/content oder POST /v1/passes/{id}/push.

Pfad-Parameter

  • iduuidPflicht

Request-Body (JSON)

  • labelstring | nulloptional
  • isInternalbooleanoptional

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X PATCH "https://api-dowallet.doable.app/v1/passes/{id}" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "label": "Sommer-Aktion",
  "isInternal": true
}'
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "label": "Sommer-Aktion",
  "isInternal": true
}
PATCH/v1/passes/{id}/content

Pass-Inhalt aktualisieren

Überschreibt Feldwerte oder Labels für einen Pass (Merge, null setzt auf das Template zurück). Optional mit pushMessage als Banner; ohne Nachricht holen die Geräte den neuen Inhalt still.

Pfad-Parameter

  • iduuidPflicht

Request-Body (JSON)

  • fieldValuesobjectoptional
  • fieldLabelsobjectoptional
  • pushMessagestringoptional

    1–160 Zeichen

  • resetbooleanoptional

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
  • 422Validierung fehlgeschlagen
Anfragecurl
curl -X PATCH "https://api-dowallet.doable.app/v1/passes/{id}/content" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "fieldValues": {},
  "fieldLabels": {},
  "pushMessage": "Heute 20 % auf alles. Nur bis Ladenschluss.",
  "reset": false
}'
Antwort200
{
  "updated": true,
  "enqueued": true,
  "walletDocumentOverride": {}
}

Kontakte

Kontakte mit Einwilligung, Export für eigene Systeme.

GET/v1/workspaces/{id}/customers/summary

Kontakte zählen

Gesamt, mit aktiver Einwilligung und widerrufen.

Pfad-Parameter

  • iduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/workspaces/{id}/customers/summary" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "total": 1,
  "consented": 1,
  "revoked": 1,
  "lastCollectedAt": "text"
}
GET/v1/workspaces/{id}/customers/export.csv

Kontakte als CSV exportieren

Nur Kontakte mit aktiver Einwilligung. Jeder Export wird mit Zweck und Anzahl im Audit-Log festgehalten. Org-Admin.

Pfad-Parameter

  • iduuidPflicht

Query-Parameter

  • purposestringoptional

Antworten

  • 200OK
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/workspaces/{id}/customers/export.csv?purpose=text" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{}

Ereignisse

Roh-Ereignisse pro Pass (Registrierung, Push, Abruf).

GET/v1/workspaces/{workspaceId}/events

Ereignisse abfragen

Roh-Ereignisse des Workspace (Registrierung, Push, Abruf, Einlösung) mit Filter nach Typ, Pass, Kampagne und Zeitraum. Für eigene Auswertungen und Data-Warehouses.

Pfad-Parameter

  • workspaceIduuidPflicht

Query-Parameter

  • typestringoptional
  • passIduuidoptional
  • limitintegeroptional

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/workspaces/{workspaceId}/events?type=text&passId=3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01&limit=100" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "data": [
    {
      "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "type": "text",
      "passId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "templateId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "campaignId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "payload": null,
      "source": "text",
      "occurredAt": "2026-09-15T10:32:00Z"
    }
  ],
  "pagination": {
    "nextCursor": "text",
    "hasMore": true
  }
}
POST/v1/workspaces/{workspaceId}/events

Eigenes Ereignis schreiben

Für Conversion-Signale aus deinem System, die keine Einlösung sind (z. B. Kaufabschluss).

Pfad-Parameter

  • workspaceIduuidPflicht

Request-Body (JSON)

  • typestringPflicht

    1–80 Zeichen

  • passIduuid | nulloptional
  • templateIduuid | nulloptional
  • campaignIduuid | nulloptional
  • payloadobjectoptional
  • sourcestringoptional

    0–60 Zeichen

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/workspaces/{workspaceId}/events" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "type": "text",
  "passId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "templateId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "campaignId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "payload": {},
  "source": "api"
}'
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "type": "text",
  "passId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "templateId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "campaignId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "payload": null,
  "source": "text",
  "occurredAt": "2026-09-15T10:32:00Z"
}
GET/v1/events/{id}

Ereignis lesen

Pfad-Parameter

  • iduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/events/{id}" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "type": "text",
  "passId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "templateId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "campaignId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "payload": null,
  "source": "text",
  "occurredAt": "2026-09-15T10:32:00Z"
}

Auswertung

Kennzahlen, Verläufe und Business-Case-Daten.

GET/v1/workspaces/{workspaceId}/analytics/dashboard-kpis

Kennzahlen des Workspace

Aktive Pässe, Pushes, Klicks, Einlösungen inklusive Trend gegenüber dem Vorzeitraum.

Pfad-Parameter

  • workspaceIduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/workspaces/{workspaceId}/analytics/dashboard-kpis" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "totalPasses": 1,
  "activePasses": 1,
  "passesCreatedLast7d": 1,
  "redemptionsLast7d": 1,
  "pushSentLast7d": 1,
  "pushDeliveredLast7d": 1
}
GET/v1/workspaces/{workspaceId}/analytics/source-performance

Leistung pro Quelle (UTM)

Downloads, Aktivierungen, Einlösungen und Kosten je Quelle.

Pfad-Parameter

  • workspaceIduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/workspaces/{workspaceId}/analytics/source-performance" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "data": [
    {
      "utmSource": "text",
      "passes": 1,
      "redemptions": 1
    }
  ]
}
GET/v1/workspaces/{workspaceId}/analytics/business-case

Business-Case-Daten

CAC, LTV, Retention und Projektion für das Business-Case-Dashboard.

Pfad-Parameter

  • workspaceIduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/workspaces/{workspaceId}/analytics/business-case" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "data": [
    {
      "utmSource": "text",
      "passes": 1,
      "redemptions": 1,
      "conversionRate": 1
    }
  ]
}
GET/v1/benchmarks/business-case

Branchen-Benchmarks

Referenzwerte je Kanal, gegen die der Business Case vergleicht.

Antworten

  • 200OK
  • 500Default Response
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/benchmarks/business-case" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
null

Pässe und Kampagnen

Pass-Templates

Pass-Templates: Design, Felder, Versionen, Veröffentlichung.

GET/v1/workspaces/{workspaceId}/templates

Pass-Templates auflisten

Pfad-Parameter

  • workspaceIduuidPflicht

Query-Parameter

  • statusdraft | published | archivedoptional
  • passTypeboardingPass | coupon | eventTicket | generic | storeCardoptional

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/workspaces/{workspaceId}/templates?status=draft&passType=boardingPass" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "data": [
    {
      "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "name": "Sommer-Aktion",
      "useCase": "coupon",
      "passType": "boardingPass",
      "googleClassType": "loyalty",
      "status": "draft",
      "currentVersion": 1,
      "currentDraftVersion": 1,
      "valueSource": {
        "mode": "static",
        "value": "text"
      },
      "organizationName": "Sommer-Aktion",
      "logoText": "Heute 20 % auf alles. Nur bis Ladenschluss.",
      "description": "Kurze Beschreibung",
      "eventStartsAt": "2026-09-15T10:32:00Z",
      "eventEndsAt": "2026-09-15T10:32:00Z",
      "createdById": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "createdAt": "2026-09-15T10:32:00Z",
      "updatedAt": "2026-09-15T10:32:00Z",
      "publishedAt": "2026-09-15T10:32:00Z",
      "archivedAt": "2026-09-15T10:32:00Z"
    }
  ],
  "pagination": {
    "nextCursor": "text",
    "hasMore": true
  }
}
POST/v1/workspaces/{workspaceId}/templates

Pass-Template anlegen

Startet als Entwurf. Felder, Farben, Barcode und Bilder werden per PATCH gepflegt und mit einer Version veröffentlicht.

Pfad-Parameter

  • workspaceIduuidPflicht

Request-Body (JSON)

  • namestringPflicht

    1–120 Zeichen

  • useCase"coupon" | "loyalty" | "giftCard" | "membership" | "eventTicket" | "boardingPass" | "transit" | "generic"Pflicht
  • passType"boardingPass" | "coupon" | "eventTicket" | "generic" | "storeCard"Pflicht
  • googleClassType"loyalty" | "offer" | "eventTicket" | "flight" | "transit" | "generic" | "giftCard"Pflicht
  • organizationNamestringPflicht

    1–120 Zeichen

  • logoTextstring | nulloptional
  • descriptionstring | nulloptional
  • walletDocumentobjectoptional
  • useCase"coupon" | "loyalty" | "giftCard" | "membership" | "eventTicket" | "boardingPass" | "transit" | "generic"Pflicht
  • identityobjectPflicht
  • passType"boardingPass" | "coupon" | "eventTicket" | "generic" | "storeCard"Pflicht
  • googleClass"loyalty" | "offer" | "eventTicket" | "flight" | "transit" | "generic" | "giftCard"Pflicht
  • serialstringoptional
  • transitType"PKTransitTypeAir" | "PKTransitTypeBus" | "PKTransitTypeTrain" | "PKTransitTypeBoat" | "PKTransitTypeGeneric"optional
  • brandingobjectPflicht
  • backgroundHexstringPflicht
  • foregroundHexstringPflicht
  • labelHexstringPflicht
  • logoTextstringoptional

    0–40 Zeichen

  • suppressStripShinebooleanoptional
  • groupingIdentifierstringoptional
  • landingStyle"classic" | "spotlight" | "card"optional
  • fieldsobjectPflicht
  • headerobject[]optional

    0–3 Einträge

  • keystringPflicht

    1–64 Zeichen

  • labelstringoptional

    0–120 Zeichen

  • valuestringPflicht
  • changeMessagestringoptional
  • textAlignment"PKTextAlignmentLeft" | "PKTextAlignmentCenter" | "PKTextAlignmentRight" | "PKTextAlignmentNatural"optional
  • numberStyle"PKNumberStyleDecimal" | "PKNumberStylePercent" | "PKNumberStyleScientific" | "PKNumberStyleSpellOut"optional
  • currencyCodestringoptional

    3–3 Zeichen

  • dateStyle"PKDateStyleNone" | "PKDateStyleShort" | "PKDateStyleMedium" | "PKDateStyleLong" | "PKDateStyleFull"optional
  • timeStyle"PKDateStyleNone" | "PKDateStyleShort" | "PKDateStyleMedium" | "PKDateStyleLong" | "PKDateStyleFull"optional
  • isRelativebooleanoptional
  • ignoresTimeZonebooleanoptional
  • attributedValuestringoptional
  • primaryobject[]Pflicht

    0–2 Einträge

  • keystringPflicht

    1–64 Zeichen

  • labelstringoptional

    0–120 Zeichen

  • valuestringPflicht
  • changeMessagestringoptional
  • textAlignment"PKTextAlignmentLeft" | "PKTextAlignmentCenter" | "PKTextAlignmentRight" | "PKTextAlignmentNatural"optional
  • numberStyle"PKNumberStyleDecimal" | "PKNumberStylePercent" | "PKNumberStyleScientific" | "PKNumberStyleSpellOut"optional
  • currencyCodestringoptional

    3–3 Zeichen

  • dateStyle"PKDateStyleNone" | "PKDateStyleShort" | "PKDateStyleMedium" | "PKDateStyleLong" | "PKDateStyleFull"optional
  • timeStyle"PKDateStyleNone" | "PKDateStyleShort" | "PKDateStyleMedium" | "PKDateStyleLong" | "PKDateStyleFull"optional
  • isRelativebooleanoptional
  • ignoresTimeZonebooleanoptional
  • attributedValuestringoptional
  • secondaryobject[]optional

    0–4 Einträge

  • keystringPflicht

    1–64 Zeichen

  • labelstringoptional

    0–120 Zeichen

  • valuestringPflicht
  • changeMessagestringoptional
  • textAlignment"PKTextAlignmentLeft" | "PKTextAlignmentCenter" | "PKTextAlignmentRight" | "PKTextAlignmentNatural"optional
  • numberStyle"PKNumberStyleDecimal" | "PKNumberStylePercent" | "PKNumberStyleScientific" | "PKNumberStyleSpellOut"optional
  • currencyCodestringoptional

    3–3 Zeichen

  • dateStyle"PKDateStyleNone" | "PKDateStyleShort" | "PKDateStyleMedium" | "PKDateStyleLong" | "PKDateStyleFull"optional
  • timeStyle"PKDateStyleNone" | "PKDateStyleShort" | "PKDateStyleMedium" | "PKDateStyleLong" | "PKDateStyleFull"optional
  • isRelativebooleanoptional
  • ignoresTimeZonebooleanoptional
  • attributedValuestringoptional
  • auxiliaryobject[]optional

    0–4 Einträge

  • keystringPflicht

    1–64 Zeichen

  • labelstringoptional

    0–120 Zeichen

  • valuestringPflicht
  • changeMessagestringoptional
  • textAlignment"PKTextAlignmentLeft" | "PKTextAlignmentCenter" | "PKTextAlignmentRight" | "PKTextAlignmentNatural"optional
  • numberStyle"PKNumberStyleDecimal" | "PKNumberStylePercent" | "PKNumberStyleScientific" | "PKNumberStyleSpellOut"optional
  • currencyCodestringoptional

    3–3 Zeichen

  • dateStyle"PKDateStyleNone" | "PKDateStyleShort" | "PKDateStyleMedium" | "PKDateStyleLong" | "PKDateStyleFull"optional
  • timeStyle"PKDateStyleNone" | "PKDateStyleShort" | "PKDateStyleMedium" | "PKDateStyleLong" | "PKDateStyleFull"optional
  • isRelativebooleanoptional
  • ignoresTimeZonebooleanoptional
  • attributedValuestringoptional
  • backobject[]optional
  • keystringPflicht

    1–64 Zeichen

  • labelstringoptional

    0–120 Zeichen

  • valuestringPflicht
  • changeMessagestringoptional
  • textAlignment"PKTextAlignmentLeft" | "PKTextAlignmentCenter" | "PKTextAlignmentRight" | "PKTextAlignmentNatural"optional
  • numberStyle"PKNumberStyleDecimal" | "PKNumberStylePercent" | "PKNumberStyleScientific" | "PKNumberStyleSpellOut"optional
  • currencyCodestringoptional

    3–3 Zeichen

  • dateStyle"PKDateStyleNone" | "PKDateStyleShort" | "PKDateStyleMedium" | "PKDateStyleLong" | "PKDateStyleFull"optional
  • timeStyle"PKDateStyleNone" | "PKDateStyleShort" | "PKDateStyleMedium" | "PKDateStyleLong" | "PKDateStyleFull"optional
  • isRelativebooleanoptional
  • ignoresTimeZonebooleanoptional
  • attributedValuestringoptional
  • loyaltyobjectoptional
  • pointsLabelstringPflicht

    1–40 Zeichen

  • pointsBalancenumber | stringPflicht
  • secondaryPointsLabelstringoptional

    1–40 Zeichen

  • secondaryPointsBalancenumber | stringoptional
  • accountIdstringoptional
  • accountNamestringoptional
  • tierstringoptional
  • giftCardobjectoptional
  • balancenumberPflicht

    0 bis ∞

  • currencyCodestringPflicht

    3–3 Zeichen

  • barcodesobject[]Pflicht

    1–4 Einträge

  • format"PKBarcodeFormatQR" | "PKBarcodeFormatPDF417" | "PKBarcodeFormatAztec" | "PKBarcodeFormatCode128" | "PKBarcodeFormatEAN13" | "PKBarcodeFormatCode39" | "PKBarcodeFormatCodabar" | "PKBarcodeFormatITF"Pflicht
  • messagestringPflicht
  • messageEncodingstringoptional
  • altTextstringoptional
  • rotatingBarcodeobjectoptional
  • totpKeystringPflicht

    16–∞ Zeichen

  • period60optional
  • type"QR_CODE" | "PDF_417"optional
  • imagesobjectPflicht
  • logoAssetIduuidoptional
  • iconAssetIduuidoptional
  • stripAssetIduuidoptional
  • thumbnailAssetIduuidoptional
  • backgroundAssetIduuidoptional
  • footerAssetIduuidoptional
  • heroAssetIduuidoptional
  • googleLogoAssetIduuidoptional
  • locationsobject[]optional

    0–10 Einträge

  • latitudenumberPflicht

    -90 bis 90

  • longitudenumberPflicht

    -180 bis 180

  • altitudenumberoptional
  • relevantTextstringoptional

    0–120 Zeichen

  • maxDistanceintegeroptional

    10 bis 50000

  • beaconsobject[]optional

    0–10 Einträge

  • proximityUuiduuidPflicht
  • majorintegeroptional

    0 bis 65535

  • minorintegeroptional

    0 bis 65535

  • relevantTextstringoptional

    0–120 Zeichen

  • nfcobjectoptional
  • messagestringPflicht
  • encryptionPublicKeystringoptional
  • requiresAuthenticationbooleanoptional
  • smartTapValuestringoptional
  • validityobjectPflicht
  • expirationDatedate-timeoptional
  • relevantDatedate-timeoptional
  • relevantDatesobject[]optional

    0–10 Einträge

  • startDatedate-timePflicht
  • endDatedate-timeoptional
  • voidedbooleanoptional
  • sharingProhibitedbooleanoptional
  • featuredActionsobject[]optional

    0–2 Einträge

  • labelstringPflicht

    1–40 Zeichen

  • urluriPflicht
  • typestringoptional
  • identifierstringoptional

    1–60 Zeichen

  • posterobjectoptional
  • enabledbooleanoptional
  • footerLabelstringoptional

    0–40 Zeichen

  • footerValuestringoptional

    0–80 Zeichen

  • appLinkobjectoptional
  • appStoreIdsinteger[]optional
  • launchUrlurioptional
  • backobjectoptional
  • linksobject[]optional
  • labelstringPflicht
  • urluriPflicht
  • textsobject[]optional
  • labelstringPflicht
  • valuestringPflicht
  • semanticsobjectoptional
  • localizationsobjectoptional

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/workspaces/{workspaceId}/templates" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Sommer-Aktion",
  "useCase": "coupon",
  "passType": "boardingPass",
  "googleClassType": "loyalty",
  "organizationName": "Sommer-Aktion",
  "logoText": "Heute 20 % auf alles. Nur bis Ladenschluss.",
  "description": "Kurze Beschreibung",
  "walletDocument": {
    "useCase": "coupon",
    "identity": {
      "passType": "boardingPass",
      "googleClass": "loyalty"
    },
    "branding": {
      "backgroundHex": "text",
      "foregroundHex": "text",
      "labelHex": "Sommer-Aktion"
    },
    "fields": {
      "primary": [
        {
          "key": "text",
          "value": "text"
        }
      ]
    },
    "loyalty": {
      "pointsLabel": "Sommer-Aktion",
      "pointsBalance": 1
    },
    "giftCard": {
      "balance": 1,
      "currencyCode": "EUR"
    },
    "barcodes": [
      {
        "format": "PKBarcodeFormatQR",
        "message": "Heute 20 % auf alles. Nur bis Ladenschluss."
      }
    ],
    "rotatingBarcode": {
      "totpKey": "text"
    },
    "images": {},
    "locations": [
      {
        "latitude": 1,
        "longitude": 1
      }
    ],
    "maxDistance": 10,
    "beacons": [
      {
        "proximityUuid": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01"
      }
    ],
    "nfc": {
      "message": "Heute 20 % auf alles. Nur bis Ladenschluss."
    },
    "validity": {},
    "featuredActions": [
      {
        "label": "Sommer-Aktion",
        "url": "https://example.de/hook"
      }
    ],
    "poster": {},
    "appLink": {},
    "back": {},
    "semantics": {},
    "localizations": {}
  }
}'
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "name": "Sommer-Aktion",
  "useCase": "coupon",
  "passType": "boardingPass",
  "googleClassType": "loyalty",
  "status": "draft",
  "currentVersion": 1,
  "currentDraftVersion": 1,
  "valueSource": {
    "mode": "static",
    "value": "text"
  },
  "organizationName": "Sommer-Aktion",
  "logoText": "Heute 20 % auf alles. Nur bis Ladenschluss.",
  "description": "Kurze Beschreibung",
  "eventStartsAt": "2026-09-15T10:32:00Z",
  "eventEndsAt": "2026-09-15T10:32:00Z",
  "createdById": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "createdAt": "2026-09-15T10:32:00Z",
  "updatedAt": "2026-09-15T10:32:00Z",
  "publishedAt": "2026-09-15T10:32:00Z",
  "archivedAt": "2026-09-15T10:32:00Z"
}
GET/v1/templates/{id}

Pass-Template lesen

Pfad-Parameter

  • iduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/templates/{id}" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "name": "Sommer-Aktion",
  "useCase": "coupon",
  "passType": "boardingPass",
  "googleClassType": "loyalty",
  "status": "draft",
  "currentVersion": 1,
  "currentDraftVersion": 1,
  "valueSource": {
    "mode": "static",
    "value": "text"
  },
  "organizationName": "Sommer-Aktion",
  "logoText": "Heute 20 % auf alles. Nur bis Ladenschluss.",
  "description": "Kurze Beschreibung",
  "eventStartsAt": "2026-09-15T10:32:00Z",
  "eventEndsAt": "2026-09-15T10:32:00Z",
  "createdById": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "createdAt": "2026-09-15T10:32:00Z",
  "updatedAt": "2026-09-15T10:32:00Z",
  "publishedAt": "2026-09-15T10:32:00Z",
  "archivedAt": "2026-09-15T10:32:00Z"
}
PATCH/v1/templates/{id}

Pass-Template bearbeiten

Ändert den Entwurf. Bereits ausgegebene Pässe folgen erst nach dem Veröffentlichen einer neuen Version.

Pfad-Parameter

  • iduuidPflicht

Request-Body (JSON)

  • namestringoptional

    1–120 Zeichen

  • organizationNamestringoptional

    1–120 Zeichen

  • logoTextstring | nulloptional
  • descriptionstring | nulloptional
  • eventStartsAtdate-time | nulloptional
  • eventEndsAtdate-time | nulloptional
  • valueSourceobject | nulloptional

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X PATCH "https://api-dowallet.doable.app/v1/templates/{id}" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Sommer-Aktion",
  "organizationName": "Sommer-Aktion",
  "logoText": "Heute 20 % auf alles. Nur bis Ladenschluss.",
  "description": "Kurze Beschreibung",
  "eventStartsAt": "2026-09-15T10:32:00Z",
  "eventEndsAt": "2026-09-15T10:32:00Z",
  "valueSource": {
    "mode": "static",
    "value": "text"
  }
}'
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "name": "Sommer-Aktion",
  "useCase": "coupon",
  "passType": "boardingPass",
  "googleClassType": "loyalty",
  "status": "draft",
  "currentVersion": 1,
  "currentDraftVersion": 1,
  "valueSource": {
    "mode": "static",
    "value": "text"
  },
  "organizationName": "Sommer-Aktion",
  "logoText": "Heute 20 % auf alles. Nur bis Ladenschluss.",
  "description": "Kurze Beschreibung",
  "eventStartsAt": "2026-09-15T10:32:00Z",
  "eventEndsAt": "2026-09-15T10:32:00Z",
  "createdById": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "createdAt": "2026-09-15T10:32:00Z",
  "updatedAt": "2026-09-15T10:32:00Z",
  "publishedAt": "2026-09-15T10:32:00Z",
  "archivedAt": "2026-09-15T10:32:00Z"
}
DELETE/v1/templates/{id}

Pass-Template archivieren

Pfad-Parameter

  • iduuidPflicht

Antworten

  • 204Kein Inhalt
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X DELETE "https://api-dowallet.doable.app/v1/templates/{id}" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort204
(kein Inhalt)
GET/v1/templates/{id}/versions

Versionen auflisten

Pfad-Parameter

  • iduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/templates/{id}/versions" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "data": [
    {
      "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "templateId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "version": 1,
      "walletDocument": {},
      "locales": {},
      "createdById": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "createdAt": "2026-09-15T10:32:00Z"
    }
  ],
  "pagination": {
    "nextCursor": "text",
    "hasMore": true
  }
}
POST/v1/templates/{id}/versions

Version erzeugen

Friert den aktuellen Entwurf als Version ein.

Pfad-Parameter

  • iduuidPflicht

Request-Body (JSON)

  • walletDocumentobjectPflicht
  • useCase"coupon" | "loyalty" | "giftCard" | "membership" | "eventTicket" | "boardingPass" | "transit" | "generic"Pflicht
  • identityobjectPflicht
  • passType"boardingPass" | "coupon" | "eventTicket" | "generic" | "storeCard"Pflicht
  • googleClass"loyalty" | "offer" | "eventTicket" | "flight" | "transit" | "generic" | "giftCard"Pflicht
  • serialstringoptional
  • transitType"PKTransitTypeAir" | "PKTransitTypeBus" | "PKTransitTypeTrain" | "PKTransitTypeBoat" | "PKTransitTypeGeneric"optional
  • brandingobjectPflicht
  • backgroundHexstringPflicht
  • foregroundHexstringPflicht
  • labelHexstringPflicht
  • logoTextstringoptional

    0–40 Zeichen

  • suppressStripShinebooleanoptional
  • groupingIdentifierstringoptional
  • landingStyle"classic" | "spotlight" | "card"optional
  • fieldsobjectPflicht
  • headerobject[]optional

    0–3 Einträge

  • keystringPflicht

    1–64 Zeichen

  • labelstringoptional

    0–120 Zeichen

  • valuestringPflicht
  • changeMessagestringoptional
  • textAlignment"PKTextAlignmentLeft" | "PKTextAlignmentCenter" | "PKTextAlignmentRight" | "PKTextAlignmentNatural"optional
  • numberStyle"PKNumberStyleDecimal" | "PKNumberStylePercent" | "PKNumberStyleScientific" | "PKNumberStyleSpellOut"optional
  • currencyCodestringoptional

    3–3 Zeichen

  • dateStyle"PKDateStyleNone" | "PKDateStyleShort" | "PKDateStyleMedium" | "PKDateStyleLong" | "PKDateStyleFull"optional
  • timeStyle"PKDateStyleNone" | "PKDateStyleShort" | "PKDateStyleMedium" | "PKDateStyleLong" | "PKDateStyleFull"optional
  • isRelativebooleanoptional
  • ignoresTimeZonebooleanoptional
  • attributedValuestringoptional
  • primaryobject[]Pflicht

    0–2 Einträge

  • keystringPflicht

    1–64 Zeichen

  • labelstringoptional

    0–120 Zeichen

  • valuestringPflicht
  • changeMessagestringoptional
  • textAlignment"PKTextAlignmentLeft" | "PKTextAlignmentCenter" | "PKTextAlignmentRight" | "PKTextAlignmentNatural"optional
  • numberStyle"PKNumberStyleDecimal" | "PKNumberStylePercent" | "PKNumberStyleScientific" | "PKNumberStyleSpellOut"optional
  • currencyCodestringoptional

    3–3 Zeichen

  • dateStyle"PKDateStyleNone" | "PKDateStyleShort" | "PKDateStyleMedium" | "PKDateStyleLong" | "PKDateStyleFull"optional
  • timeStyle"PKDateStyleNone" | "PKDateStyleShort" | "PKDateStyleMedium" | "PKDateStyleLong" | "PKDateStyleFull"optional
  • isRelativebooleanoptional
  • ignoresTimeZonebooleanoptional
  • attributedValuestringoptional
  • secondaryobject[]optional

    0–4 Einträge

  • keystringPflicht

    1–64 Zeichen

  • labelstringoptional

    0–120 Zeichen

  • valuestringPflicht
  • changeMessagestringoptional
  • textAlignment"PKTextAlignmentLeft" | "PKTextAlignmentCenter" | "PKTextAlignmentRight" | "PKTextAlignmentNatural"optional
  • numberStyle"PKNumberStyleDecimal" | "PKNumberStylePercent" | "PKNumberStyleScientific" | "PKNumberStyleSpellOut"optional
  • currencyCodestringoptional

    3–3 Zeichen

  • dateStyle"PKDateStyleNone" | "PKDateStyleShort" | "PKDateStyleMedium" | "PKDateStyleLong" | "PKDateStyleFull"optional
  • timeStyle"PKDateStyleNone" | "PKDateStyleShort" | "PKDateStyleMedium" | "PKDateStyleLong" | "PKDateStyleFull"optional
  • isRelativebooleanoptional
  • ignoresTimeZonebooleanoptional
  • attributedValuestringoptional
  • auxiliaryobject[]optional

    0–4 Einträge

  • keystringPflicht

    1–64 Zeichen

  • labelstringoptional

    0–120 Zeichen

  • valuestringPflicht
  • changeMessagestringoptional
  • textAlignment"PKTextAlignmentLeft" | "PKTextAlignmentCenter" | "PKTextAlignmentRight" | "PKTextAlignmentNatural"optional
  • numberStyle"PKNumberStyleDecimal" | "PKNumberStylePercent" | "PKNumberStyleScientific" | "PKNumberStyleSpellOut"optional
  • currencyCodestringoptional

    3–3 Zeichen

  • dateStyle"PKDateStyleNone" | "PKDateStyleShort" | "PKDateStyleMedium" | "PKDateStyleLong" | "PKDateStyleFull"optional
  • timeStyle"PKDateStyleNone" | "PKDateStyleShort" | "PKDateStyleMedium" | "PKDateStyleLong" | "PKDateStyleFull"optional
  • isRelativebooleanoptional
  • ignoresTimeZonebooleanoptional
  • attributedValuestringoptional
  • backobject[]optional
  • keystringPflicht

    1–64 Zeichen

  • labelstringoptional

    0–120 Zeichen

  • valuestringPflicht
  • changeMessagestringoptional
  • textAlignment"PKTextAlignmentLeft" | "PKTextAlignmentCenter" | "PKTextAlignmentRight" | "PKTextAlignmentNatural"optional
  • numberStyle"PKNumberStyleDecimal" | "PKNumberStylePercent" | "PKNumberStyleScientific" | "PKNumberStyleSpellOut"optional
  • currencyCodestringoptional

    3–3 Zeichen

  • dateStyle"PKDateStyleNone" | "PKDateStyleShort" | "PKDateStyleMedium" | "PKDateStyleLong" | "PKDateStyleFull"optional
  • timeStyle"PKDateStyleNone" | "PKDateStyleShort" | "PKDateStyleMedium" | "PKDateStyleLong" | "PKDateStyleFull"optional
  • isRelativebooleanoptional
  • ignoresTimeZonebooleanoptional
  • attributedValuestringoptional
  • loyaltyobjectoptional
  • pointsLabelstringPflicht

    1–40 Zeichen

  • pointsBalancenumber | stringPflicht
  • secondaryPointsLabelstringoptional

    1–40 Zeichen

  • secondaryPointsBalancenumber | stringoptional
  • accountIdstringoptional
  • accountNamestringoptional
  • tierstringoptional
  • giftCardobjectoptional
  • balancenumberPflicht

    0 bis ∞

  • currencyCodestringPflicht

    3–3 Zeichen

  • barcodesobject[]Pflicht

    1–4 Einträge

  • format"PKBarcodeFormatQR" | "PKBarcodeFormatPDF417" | "PKBarcodeFormatAztec" | "PKBarcodeFormatCode128" | "PKBarcodeFormatEAN13" | "PKBarcodeFormatCode39" | "PKBarcodeFormatCodabar" | "PKBarcodeFormatITF"Pflicht
  • messagestringPflicht
  • messageEncodingstringoptional
  • altTextstringoptional
  • rotatingBarcodeobjectoptional
  • totpKeystringPflicht

    16–∞ Zeichen

  • period60optional
  • type"QR_CODE" | "PDF_417"optional
  • imagesobjectPflicht
  • logoAssetIduuidoptional
  • iconAssetIduuidoptional
  • stripAssetIduuidoptional
  • thumbnailAssetIduuidoptional
  • backgroundAssetIduuidoptional
  • footerAssetIduuidoptional
  • heroAssetIduuidoptional
  • googleLogoAssetIduuidoptional
  • locationsobject[]optional

    0–10 Einträge

  • latitudenumberPflicht

    -90 bis 90

  • longitudenumberPflicht

    -180 bis 180

  • altitudenumberoptional
  • relevantTextstringoptional

    0–120 Zeichen

  • maxDistanceintegeroptional

    10 bis 50000

  • beaconsobject[]optional

    0–10 Einträge

  • proximityUuiduuidPflicht
  • majorintegeroptional

    0 bis 65535

  • minorintegeroptional

    0 bis 65535

  • relevantTextstringoptional

    0–120 Zeichen

  • nfcobjectoptional
  • messagestringPflicht
  • encryptionPublicKeystringoptional
  • requiresAuthenticationbooleanoptional
  • smartTapValuestringoptional
  • validityobjectPflicht
  • expirationDatedate-timeoptional
  • relevantDatedate-timeoptional
  • relevantDatesobject[]optional

    0–10 Einträge

  • startDatedate-timePflicht
  • endDatedate-timeoptional
  • voidedbooleanoptional
  • sharingProhibitedbooleanoptional
  • featuredActionsobject[]optional

    0–2 Einträge

  • labelstringPflicht

    1–40 Zeichen

  • urluriPflicht
  • typestringoptional
  • identifierstringoptional

    1–60 Zeichen

  • posterobjectoptional
  • enabledbooleanoptional
  • footerLabelstringoptional

    0–40 Zeichen

  • footerValuestringoptional

    0–80 Zeichen

  • appLinkobjectoptional
  • appStoreIdsinteger[]optional
  • launchUrlurioptional
  • backobjectoptional
  • linksobject[]optional
  • labelstringPflicht
  • urluriPflicht
  • textsobject[]optional
  • labelstringPflicht
  • valuestringPflicht
  • semanticsobjectoptional
  • localizationsobjectoptional
  • localesobjectoptional

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
  • 422Validierung fehlgeschlagen
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/templates/{id}/versions" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "walletDocument": {
    "useCase": "coupon",
    "identity": {
      "passType": "boardingPass",
      "googleClass": "loyalty"
    },
    "branding": {
      "backgroundHex": "text",
      "foregroundHex": "text",
      "labelHex": "Sommer-Aktion"
    },
    "fields": {
      "primary": [
        {
          "key": "text",
          "value": "text"
        }
      ]
    },
    "loyalty": {
      "pointsLabel": "Sommer-Aktion",
      "pointsBalance": 1
    },
    "giftCard": {
      "balance": 1,
      "currencyCode": "EUR"
    },
    "barcodes": [
      {
        "format": "PKBarcodeFormatQR",
        "message": "Heute 20 % auf alles. Nur bis Ladenschluss."
      }
    ],
    "rotatingBarcode": {
      "totpKey": "text"
    },
    "images": {},
    "locations": [
      {
        "latitude": 1,
        "longitude": 1
      }
    ],
    "maxDistance": 10,
    "beacons": [
      {
        "proximityUuid": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01"
      }
    ],
    "nfc": {
      "message": "Heute 20 % auf alles. Nur bis Ladenschluss."
    },
    "validity": {},
    "featuredActions": [
      {
        "label": "Sommer-Aktion",
        "url": "https://example.de/hook"
      }
    ],
    "poster": {},
    "appLink": {},
    "back": {},
    "semantics": {},
    "localizations": {}
  },
  "locales": {}
}'
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "templateId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "version": 1,
  "walletDocument": {},
  "locales": {},
  "createdById": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "createdAt": "2026-09-15T10:32:00Z"
}
POST/v1/templates/{id}/preflight

Veröffentlichung prüfen

Prüft Logo, Barcode, Pflichtfelder und Zertifikate und liefert die Liste der Probleme, bevor du veröffentlichst.

Pfad-Parameter

  • iduuidPflicht

Request-Body (JSON)

  • walletDocumentobjectoptional
  • useCase"coupon" | "loyalty" | "giftCard" | "membership" | "eventTicket" | "boardingPass" | "transit" | "generic"Pflicht
  • identityobjectPflicht
  • passType"boardingPass" | "coupon" | "eventTicket" | "generic" | "storeCard"Pflicht
  • googleClass"loyalty" | "offer" | "eventTicket" | "flight" | "transit" | "generic" | "giftCard"Pflicht
  • serialstringoptional
  • transitType"PKTransitTypeAir" | "PKTransitTypeBus" | "PKTransitTypeTrain" | "PKTransitTypeBoat" | "PKTransitTypeGeneric"optional
  • brandingobjectPflicht
  • backgroundHexstringPflicht
  • foregroundHexstringPflicht
  • labelHexstringPflicht
  • logoTextstringoptional

    0–40 Zeichen

  • suppressStripShinebooleanoptional
  • groupingIdentifierstringoptional
  • landingStyle"classic" | "spotlight" | "card"optional
  • fieldsobjectPflicht
  • headerobject[]optional

    0–3 Einträge

  • keystringPflicht

    1–64 Zeichen

  • labelstringoptional

    0–120 Zeichen

  • valuestringPflicht
  • changeMessagestringoptional
  • textAlignment"PKTextAlignmentLeft" | "PKTextAlignmentCenter" | "PKTextAlignmentRight" | "PKTextAlignmentNatural"optional
  • numberStyle"PKNumberStyleDecimal" | "PKNumberStylePercent" | "PKNumberStyleScientific" | "PKNumberStyleSpellOut"optional
  • currencyCodestringoptional

    3–3 Zeichen

  • dateStyle"PKDateStyleNone" | "PKDateStyleShort" | "PKDateStyleMedium" | "PKDateStyleLong" | "PKDateStyleFull"optional
  • timeStyle"PKDateStyleNone" | "PKDateStyleShort" | "PKDateStyleMedium" | "PKDateStyleLong" | "PKDateStyleFull"optional
  • isRelativebooleanoptional
  • ignoresTimeZonebooleanoptional
  • attributedValuestringoptional
  • primaryobject[]Pflicht

    0–2 Einträge

  • keystringPflicht

    1–64 Zeichen

  • labelstringoptional

    0–120 Zeichen

  • valuestringPflicht
  • changeMessagestringoptional
  • textAlignment"PKTextAlignmentLeft" | "PKTextAlignmentCenter" | "PKTextAlignmentRight" | "PKTextAlignmentNatural"optional
  • numberStyle"PKNumberStyleDecimal" | "PKNumberStylePercent" | "PKNumberStyleScientific" | "PKNumberStyleSpellOut"optional
  • currencyCodestringoptional

    3–3 Zeichen

  • dateStyle"PKDateStyleNone" | "PKDateStyleShort" | "PKDateStyleMedium" | "PKDateStyleLong" | "PKDateStyleFull"optional
  • timeStyle"PKDateStyleNone" | "PKDateStyleShort" | "PKDateStyleMedium" | "PKDateStyleLong" | "PKDateStyleFull"optional
  • isRelativebooleanoptional
  • ignoresTimeZonebooleanoptional
  • attributedValuestringoptional
  • secondaryobject[]optional

    0–4 Einträge

  • keystringPflicht

    1–64 Zeichen

  • labelstringoptional

    0–120 Zeichen

  • valuestringPflicht
  • changeMessagestringoptional
  • textAlignment"PKTextAlignmentLeft" | "PKTextAlignmentCenter" | "PKTextAlignmentRight" | "PKTextAlignmentNatural"optional
  • numberStyle"PKNumberStyleDecimal" | "PKNumberStylePercent" | "PKNumberStyleScientific" | "PKNumberStyleSpellOut"optional
  • currencyCodestringoptional

    3–3 Zeichen

  • dateStyle"PKDateStyleNone" | "PKDateStyleShort" | "PKDateStyleMedium" | "PKDateStyleLong" | "PKDateStyleFull"optional
  • timeStyle"PKDateStyleNone" | "PKDateStyleShort" | "PKDateStyleMedium" | "PKDateStyleLong" | "PKDateStyleFull"optional
  • isRelativebooleanoptional
  • ignoresTimeZonebooleanoptional
  • attributedValuestringoptional
  • auxiliaryobject[]optional

    0–4 Einträge

  • keystringPflicht

    1–64 Zeichen

  • labelstringoptional

    0–120 Zeichen

  • valuestringPflicht
  • changeMessagestringoptional
  • textAlignment"PKTextAlignmentLeft" | "PKTextAlignmentCenter" | "PKTextAlignmentRight" | "PKTextAlignmentNatural"optional
  • numberStyle"PKNumberStyleDecimal" | "PKNumberStylePercent" | "PKNumberStyleScientific" | "PKNumberStyleSpellOut"optional
  • currencyCodestringoptional

    3–3 Zeichen

  • dateStyle"PKDateStyleNone" | "PKDateStyleShort" | "PKDateStyleMedium" | "PKDateStyleLong" | "PKDateStyleFull"optional
  • timeStyle"PKDateStyleNone" | "PKDateStyleShort" | "PKDateStyleMedium" | "PKDateStyleLong" | "PKDateStyleFull"optional
  • isRelativebooleanoptional
  • ignoresTimeZonebooleanoptional
  • attributedValuestringoptional
  • backobject[]optional
  • keystringPflicht

    1–64 Zeichen

  • labelstringoptional

    0–120 Zeichen

  • valuestringPflicht
  • changeMessagestringoptional
  • textAlignment"PKTextAlignmentLeft" | "PKTextAlignmentCenter" | "PKTextAlignmentRight" | "PKTextAlignmentNatural"optional
  • numberStyle"PKNumberStyleDecimal" | "PKNumberStylePercent" | "PKNumberStyleScientific" | "PKNumberStyleSpellOut"optional
  • currencyCodestringoptional

    3–3 Zeichen

  • dateStyle"PKDateStyleNone" | "PKDateStyleShort" | "PKDateStyleMedium" | "PKDateStyleLong" | "PKDateStyleFull"optional
  • timeStyle"PKDateStyleNone" | "PKDateStyleShort" | "PKDateStyleMedium" | "PKDateStyleLong" | "PKDateStyleFull"optional
  • isRelativebooleanoptional
  • ignoresTimeZonebooleanoptional
  • attributedValuestringoptional
  • loyaltyobjectoptional
  • pointsLabelstringPflicht

    1–40 Zeichen

  • pointsBalancenumber | stringPflicht
  • secondaryPointsLabelstringoptional

    1–40 Zeichen

  • secondaryPointsBalancenumber | stringoptional
  • accountIdstringoptional
  • accountNamestringoptional
  • tierstringoptional
  • giftCardobjectoptional
  • balancenumberPflicht

    0 bis ∞

  • currencyCodestringPflicht

    3–3 Zeichen

  • barcodesobject[]Pflicht

    1–4 Einträge

  • format"PKBarcodeFormatQR" | "PKBarcodeFormatPDF417" | "PKBarcodeFormatAztec" | "PKBarcodeFormatCode128" | "PKBarcodeFormatEAN13" | "PKBarcodeFormatCode39" | "PKBarcodeFormatCodabar" | "PKBarcodeFormatITF"Pflicht
  • messagestringPflicht
  • messageEncodingstringoptional
  • altTextstringoptional
  • rotatingBarcodeobjectoptional
  • totpKeystringPflicht

    16–∞ Zeichen

  • period60optional
  • type"QR_CODE" | "PDF_417"optional
  • imagesobjectPflicht
  • logoAssetIduuidoptional
  • iconAssetIduuidoptional
  • stripAssetIduuidoptional
  • thumbnailAssetIduuidoptional
  • backgroundAssetIduuidoptional
  • footerAssetIduuidoptional
  • heroAssetIduuidoptional
  • googleLogoAssetIduuidoptional
  • locationsobject[]optional

    0–10 Einträge

  • latitudenumberPflicht

    -90 bis 90

  • longitudenumberPflicht

    -180 bis 180

  • altitudenumberoptional
  • relevantTextstringoptional

    0–120 Zeichen

  • maxDistanceintegeroptional

    10 bis 50000

  • beaconsobject[]optional

    0–10 Einträge

  • proximityUuiduuidPflicht
  • majorintegeroptional

    0 bis 65535

  • minorintegeroptional

    0 bis 65535

  • relevantTextstringoptional

    0–120 Zeichen

  • nfcobjectoptional
  • messagestringPflicht
  • encryptionPublicKeystringoptional
  • requiresAuthenticationbooleanoptional
  • smartTapValuestringoptional
  • validityobjectPflicht
  • expirationDatedate-timeoptional
  • relevantDatedate-timeoptional
  • relevantDatesobject[]optional

    0–10 Einträge

  • startDatedate-timePflicht
  • endDatedate-timeoptional
  • voidedbooleanoptional
  • sharingProhibitedbooleanoptional
  • featuredActionsobject[]optional

    0–2 Einträge

  • labelstringPflicht

    1–40 Zeichen

  • urluriPflicht
  • typestringoptional
  • identifierstringoptional

    1–60 Zeichen

  • posterobjectoptional
  • enabledbooleanoptional
  • footerLabelstringoptional

    0–40 Zeichen

  • footerValuestringoptional

    0–80 Zeichen

  • appLinkobjectoptional
  • appStoreIdsinteger[]optional
  • launchUrlurioptional
  • backobjectoptional
  • linksobject[]optional
  • labelstringPflicht
  • urluriPflicht
  • textsobject[]optional
  • labelstringPflicht
  • valuestringPflicht
  • semanticsobjectoptional
  • localizationsobjectoptional

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
  • 422Validierung fehlgeschlagen
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/templates/{id}/preflight" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "walletDocument": {
    "useCase": "coupon",
    "identity": {
      "passType": "boardingPass",
      "googleClass": "loyalty"
    },
    "branding": {
      "backgroundHex": "text",
      "foregroundHex": "text",
      "labelHex": "Sommer-Aktion"
    },
    "fields": {
      "primary": [
        {
          "key": "text",
          "value": "text"
        }
      ]
    },
    "loyalty": {
      "pointsLabel": "Sommer-Aktion",
      "pointsBalance": 1
    },
    "giftCard": {
      "balance": 1,
      "currencyCode": "EUR"
    },
    "barcodes": [
      {
        "format": "PKBarcodeFormatQR",
        "message": "Heute 20 % auf alles. Nur bis Ladenschluss."
      }
    ],
    "rotatingBarcode": {
      "totpKey": "text"
    },
    "images": {},
    "locations": [
      {
        "latitude": 1,
        "longitude": 1
      }
    ],
    "maxDistance": 10,
    "beacons": [
      {
        "proximityUuid": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01"
      }
    ],
    "nfc": {
      "message": "Heute 20 % auf alles. Nur bis Ladenschluss."
    },
    "validity": {},
    "featuredActions": [
      {
        "label": "Sommer-Aktion",
        "url": "https://example.de/hook"
      }
    ],
    "poster": {},
    "appLink": {},
    "back": {},
    "semantics": {},
    "localizations": {}
  }
}'
Antwort200
{
  "ok": true,
  "contrastRatio": 1,
  "issues": [
    {
      "severity": "error",
      "code": "text",
      "message": "Heute 20 % auf alles. Nur bis Ladenschluss."
    }
  ]
}
POST/v1/templates/{id}/versions/{version}/publish

Version veröffentlichen

Macht die Version zur aktiven; alle Pässe des Templates werden aktualisiert und still an die Wallets gepusht.

Pfad-Parameter

  • iduuidPflicht
  • versionintegerPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/templates/{id}/versions/{version}/publish" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "name": "Sommer-Aktion",
  "useCase": "coupon",
  "passType": "boardingPass",
  "googleClassType": "loyalty",
  "status": "draft",
  "currentVersion": 1,
  "currentDraftVersion": 1,
  "valueSource": {
    "mode": "static",
    "value": "text"
  },
  "organizationName": "Sommer-Aktion",
  "logoText": "Heute 20 % auf alles. Nur bis Ladenschluss.",
  "description": "Kurze Beschreibung",
  "eventStartsAt": "2026-09-15T10:32:00Z",
  "eventEndsAt": "2026-09-15T10:32:00Z",
  "createdById": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "createdAt": "2026-09-15T10:32:00Z",
  "updatedAt": "2026-09-15T10:32:00Z",
  "publishedAt": "2026-09-15T10:32:00Z",
  "archivedAt": "2026-09-15T10:32:00Z"
}
GET/v1/templates/{id}/locations

Standorte des Templates

Pfad-Parameter

  • iduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/templates/{id}/locations" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "data": [
    {
      "locationId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "role": "text",
      "isPrimary": true,
      "name": "Sommer-Aktion",
      "lat": 1,
      "lon": 1,
      "radiusM": 1
    }
  ]
}
POST/v1/templates/{id}/locations

Standort verknüpfen

Der Pass zeigt an diesem Standort einen Hinweis auf dem Sperrbildschirm (Geofencing).

Pfad-Parameter

  • iduuidPflicht

Request-Body (JSON)

  • locationIduuidPflicht
  • role"geofence" | "beacon"optional
  • isPrimarybooleanoptional

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
  • 409Konflikt
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/templates/{id}/locations" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "locationId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "role": "geofence",
  "isPrimary": false
}'
Antwort200
{
  "attached": true,
  "repushed": 1
}
DELETE/v1/templates/{id}/locations/{locationId}

Standort-Verknüpfung entfernen

Pfad-Parameter

  • iduuidPflicht
  • locationIduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X DELETE "https://api-dowallet.doable.app/v1/templates/{id}/locations/{locationId}" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "detached": true,
  "repushed": 1
}

Kampagnen

Kampagnen: Push, stille Aktualisierung, Pass ersetzen, Empfänger und Protokoll.

GET/v1/workspaces/{workspaceId}/campaigns

Kampagnen auflisten

Campaigns of a workspace, newest first. metrics carries the last rolled-up funnel (sent / delivered / failed / skipped / opened / redeemed); notify is the delivery mode (push | silent).

Pfad-Parameter

  • workspaceIduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/workspaces/{workspaceId}/campaigns" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "data": [
    {
      "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "name": "Sommer-Aktion",
      "status": "draft",
      "audienceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "audienceCount": 1,
      "templateId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "notification": null,
      "metrics": {},
      "locationIds": [
        "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01"
      ],
      "replace": {
        "targetTemplateId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01"
      },
      "pace": "fast",
      "notify": "push",
      "scheduleAt": "2026-09-15T10:32:00Z",
      "publishedAt": "2026-09-15T10:32:00Z",
      "pausedAt": "2026-09-15T10:32:00Z",
      "cancelledAt": "2026-09-15T10:32:00Z",
      "completedAt": "2026-09-15T10:32:00Z",
      "createdAt": "2026-09-15T10:32:00Z"
    }
  ],
  "pagination": {
    "nextCursor": "text",
    "hasMore": true
  }
}
POST/v1/workspaces/{workspaceId}/campaigns

Kampagne anlegen

Create a campaign (draft, or scheduled when scheduleAt is set). notify: "silent" requires replace (422 on field notify otherwise) and makes notification.text optional.

Pfad-Parameter

  • workspaceIduuidPflicht

Request-Body (JSON)

  • namestringPflicht

    1–160 Zeichen

  • templateIduuidPflicht
  • audienceIduuid | nulloptional
  • notificationobjectoptional
  • textstringoptional
  • localesobjectoptional
  • scheduleAtdate-time | nulloptional
  • locationIdsuuid[]optional
  • replaceobject | nulloptional
  • targetTemplateIduuidPflicht
  • codePoolIduuid | nulloptional
  • pace"fast" | "gentle"optional
  • notify"push" | "silent"optional

    Delivery mode. "push" appends notification.text to every targeted pass (lock-screen banner on Apple, addMessage on Google). "silent" refreshes the pass content without any message — requires replace; notification.text may be omitted.

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 422Validierung fehlgeschlagen
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/workspaces/{workspaceId}/campaigns" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Sommer-Aktion",
  "templateId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "audienceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "notification": {
    "text": "Heute 20 % auf alles. Nur bis Ladenschluss.",
    "locales": {}
  },
  "scheduleAt": "2026-09-15T10:32:00Z",
  "locationIds": [
    "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01"
  ],
  "replace": {
    "targetTemplateId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01"
  },
  "pace": "fast",
  "notify": "push"
}'
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "name": "Sommer-Aktion",
  "status": "draft",
  "audienceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "audienceCount": 1,
  "templateId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "notification": null,
  "metrics": {
    "sent": 1,
    "delivered": 1,
    "failed": 1,
    "skipped": 1,
    "opened": 1,
    "redeemed": 1,
    "replaced": 1,
    "codesAllocated": 1,
    "refreshedAt": "text"
  },
  "locationIds": [
    "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01"
  ],
  "replace": {
    "targetTemplateId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01"
  },
  "pace": "fast",
  "notify": "push",
  "scheduleAt": "2026-09-15T10:32:00Z",
  "publishedAt": "2026-09-15T10:32:00Z",
  "pausedAt": "2026-09-15T10:32:00Z",
  "cancelledAt": "2026-09-15T10:32:00Z",
  "completedAt": "2026-09-15T10:32:00Z",
  "createdAt": "2026-09-15T10:32:00Z"
}
GET/v1/campaigns/{id}

Kampagne mit Kennzahlen und Versand-Protokoll lesen

One campaign with its Versand-Protokoll (sendLog, last 50 delivery rows, newest first). metrics.delivered / failed / skipped / opened / redeemed are recomputed from the same events on every read (delivered = passes reached on Apple or Google, counted once per pass) and written back to the campaign, so list and detail agree.

Pfad-Parameter

  • iduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/campaigns/{id}" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "name": "Sommer-Aktion",
  "status": "draft",
  "audienceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "audienceCount": 1,
  "templateId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "notification": null,
  "metrics": {
    "sent": 1,
    "delivered": 1,
    "failed": 1,
    "skipped": 1,
    "opened": 1,
    "redeemed": 1,
    "replaced": 1,
    "codesAllocated": 1,
    "refreshedAt": "text"
  },
  "locationIds": [
    "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01"
  ],
  "replace": {
    "targetTemplateId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01"
  },
  "pace": "fast",
  "notify": "push",
  "scheduleAt": "2026-09-15T10:32:00Z",
  "publishedAt": "2026-09-15T10:32:00Z",
  "pausedAt": "2026-09-15T10:32:00Z",
  "cancelledAt": "2026-09-15T10:32:00Z",
  "completedAt": "2026-09-15T10:32:00Z",
  "createdAt": "2026-09-15T10:32:00Z",
  "sendLog": [
    {
      "at": "2026-09-15T10:32:00Z",
      "kind": "apple",
      "ok": 1,
      "failed": 1,
      "skipped": 1,
      "reason": "text",
      "notify": "push"
    }
  ]
}
PATCH/v1/campaigns/{id}

Kampagne bearbeiten (Entwurf oder geplant)

Edit a draft or scheduled campaign. The resulting combination must be valid: notify: "silent" without replace (sent now or already stored) is a 422 on field notify.

Pfad-Parameter

  • iduuidPflicht

Request-Body (JSON)

  • namestringoptional

    1–160 Zeichen

  • audienceIduuid | nulloptional
  • notificationobjectoptional
  • textstringoptional
  • localesobjectoptional
  • scheduleAtdate-time | nulloptional
  • locationIdsuuid[] | nulloptional
  • replaceobject | nulloptional
  • targetTemplateIduuidPflicht
  • codePoolIduuid | nulloptional
  • pace"fast" | "gentle"optional
  • notify"push" | "silent"optional

    Delivery mode. "push" appends notification.text to every targeted pass (lock-screen banner on Apple, addMessage on Google). "silent" refreshes the pass content without any message — requires replace; notification.text may be omitted.

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
  • 409Konflikt
  • 422Validierung fehlgeschlagen
Anfragecurl
curl -X PATCH "https://api-dowallet.doable.app/v1/campaigns/{id}" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Sommer-Aktion",
  "audienceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "notification": {
    "text": "Heute 20 % auf alles. Nur bis Ladenschluss.",
    "locales": {}
  },
  "scheduleAt": "2026-09-15T10:32:00Z",
  "locationIds": [
    "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01"
  ],
  "replace": {
    "targetTemplateId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01"
  },
  "pace": "fast",
  "notify": "push"
}'
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "name": "Sommer-Aktion",
  "status": "draft",
  "audienceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "audienceCount": 1,
  "templateId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "notification": null,
  "metrics": {
    "sent": 1,
    "delivered": 1,
    "failed": 1,
    "skipped": 1,
    "opened": 1,
    "redeemed": 1,
    "replaced": 1,
    "codesAllocated": 1,
    "refreshedAt": "text"
  },
  "locationIds": [
    "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01"
  ],
  "replace": {
    "targetTemplateId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01"
  },
  "pace": "fast",
  "notify": "push",
  "scheduleAt": "2026-09-15T10:32:00Z",
  "publishedAt": "2026-09-15T10:32:00Z",
  "pausedAt": "2026-09-15T10:32:00Z",
  "cancelledAt": "2026-09-15T10:32:00Z",
  "completedAt": "2026-09-15T10:32:00Z",
  "createdAt": "2026-09-15T10:32:00Z"
}
GET/v1/campaigns/{id}/recipients

Empfänger mit Zustell-Ergebnis

Targeted passes of a campaign with their per-pass outcome, from the same delivery events as the send log. outcome: confirmed = device fetched the update, delivered = accepted by APNs or Google, failed, skipped (with reason), pending = no outcome yet.

Pfad-Parameter

  • iduuidPflicht

Query-Parameter

  • outcomedelivered | confirmed | failed | skipped | pending | redeemedoptional
  • qstringoptional
  • limitintegeroptional
  • offsetintegeroptional

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/campaigns/{id}/recipients?outcome=delivered&q=sommer&limit=50" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "data": [
    {
      "passId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "serial": "ABC123456",
      "platform": "text",
      "status": "active",
      "isTest": true,
      "outcome": "delivered",
      "reason": "text",
      "redeemed": true,
      "lastEventAt": "text",
      "customerName": "Sommer-Aktion",
      "customerEmail": "kunde@example.de"
    }
  ],
  "total": 1,
  "counts": {}
}
POST/v1/campaigns/{id}/publish

Kampagne veröffentlichen oder planen

Snapshot the audience and start the fan-out. Push campaigns stamp notification.text onto every pass; silent campaigns only swap the content (replace) and tell the wallets to refresh — no message, no notification.

Pfad-Parameter

  • iduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
  • 409Konflikt
  • 429Rate-Limit
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/campaigns/{id}/publish" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "enqueued": 1,
  "audienceCount": 1
}
POST/v1/campaigns/{id}/pause

Kampagne pausieren

Pfad-Parameter

  • iduuidPflicht

Antworten

  • 204Kein Inhalt
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
  • 409Konflikt
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/campaigns/{id}/pause" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort204
(kein Inhalt)
POST/v1/campaigns/{id}/resume

Kampagne fortsetzen

Pfad-Parameter

  • iduuidPflicht

Antworten

  • 204Kein Inhalt
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
  • 409Konflikt
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/campaigns/{id}/resume" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort204
(kein Inhalt)
POST/v1/campaigns/{id}/cancel

Kampagne abbrechen

Noch nicht gesendete Pushes werden verworfen.

Pfad-Parameter

  • iduuidPflicht

Antworten

  • 204Kein Inhalt
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
  • 409Konflikt
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/campaigns/{id}/cancel" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort204
(kein Inhalt)

Zielgruppen

Zielgruppen aus Pass-Attributen und Verhalten.

GET/v1/workspaces/{workspaceId}/audiences

Zielgruppen auflisten

Pfad-Parameter

  • workspaceIduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/workspaces/{workspaceId}/audiences" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "data": [
    {
      "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "name": "Sommer-Aktion",
      "filter": null,
      "estimatedCount": 1,
      "lastEstimatedAt": "2026-09-15T10:32:00Z",
      "createdById": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "createdAt": "2026-09-15T10:32:00Z"
    }
  ],
  "pagination": {
    "nextCursor": "text",
    "hasMore": true
  }
}
POST/v1/workspaces/{workspaceId}/audiences

Zielgruppe anlegen

Gespeicherter Filter aus Attributen, Verhalten und Pass-Verlauf. In Kampagnen wiederverwendbar.

Pfad-Parameter

  • workspaceIduuidPflicht

Request-Body (JSON)

  • namestringPflicht

    1–120 Zeichen

  • filterobjectPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/workspaces/{workspaceId}/audiences" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Sommer-Aktion",
  "filter": null
}'
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "name": "Sommer-Aktion",
  "filter": null,
  "estimatedCount": 1,
  "lastEstimatedAt": "2026-09-15T10:32:00Z",
  "createdById": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "createdAt": "2026-09-15T10:32:00Z"
}
POST/v1/audiences/{id}/estimate

Reichweite neu berechnen

Pfad-Parameter

  • iduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/audiences/{id}/estimate" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "count": 1,
  "passIdsSample": [
    "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01"
  ]
}
PATCH/v1/audiences/{id}

Zielgruppe bearbeiten

Pfad-Parameter

  • iduuidPflicht

Request-Body (JSON)

  • namestringoptional

    1–120 Zeichen

  • filterobjectoptional

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X PATCH "https://api-dowallet.doable.app/v1/audiences/{id}" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Sommer-Aktion",
  "filter": null
}'
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "name": "Sommer-Aktion",
  "filter": null,
  "estimatedCount": 1,
  "lastEstimatedAt": "2026-09-15T10:32:00Z",
  "createdById": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "createdAt": "2026-09-15T10:32:00Z"
}
DELETE/v1/audiences/{id}

Zielgruppe löschen

Pfad-Parameter

  • iduuidPflicht

Antworten

  • 204Kein Inhalt
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
  • 409Konflikt
Anfragecurl
curl -X DELETE "https://api-dowallet.doable.app/v1/audiences/{id}" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort204
(kein Inhalt)
POST/v1/workspaces/{workspaceId}/audiences/preview

Zielgruppe schätzen (ohne Speichern)

Pfad-Parameter

  • workspaceIduuidPflicht

Request-Body (JSON)

  • filterobjectPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 422Validierung fehlgeschlagen
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/workspaces/{workspaceId}/audiences/preview" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "filter": null
}'
Antwort200
{
  "count": 1,
  "sample": [
    {
      "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "serial": "ABC123456",
      "platform": "text",
      "status": "active",
      "createdAt": "text",
      "utmSource": "text"
    }
  ]
}

Automatisierungen

Automatisierungen: ereignisgesteuerte Push- und E-Mail-Strecken.

GET/v1/workspaces/{workspaceId}/flows

Automatisierungen auflisten

Pfad-Parameter

  • workspaceIduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/workspaces/{workspaceId}/flows" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "data": [
    {
      "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "templateId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "name": "Sommer-Aktion",
      "status": "draft",
      "trigger": {
        "type": "event_date"
      },
      "definition": {
        "steps": [
          {
            "type": null,
            "timing": null,
            "message": null
          }
        ]
      },
      "definitionVersion": 1,
      "source": "text",
      "activatedAt": "2026-09-15T10:32:00Z",
      "pausedAt": "2026-09-15T10:32:00Z",
      "createdAt": "2026-09-15T10:32:00Z",
      "updatedAt": "2026-09-15T10:32:00Z"
    }
  ],
  "pagination": {
    "nextCursor": "text",
    "hasMore": true
  }
}
POST/v1/workspaces/{workspaceId}/flows

Automatisierung anlegen

Trigger (z. B. Pass hinzugefügt) plus Schritte (Push, E-Mail, Wartezeit, Inhalt ändern).

Pfad-Parameter

  • workspaceIduuidPflicht

Request-Body (JSON)

  • namestringPflicht

    1–120 Zeichen

  • templateIduuidPflicht
  • triggerobjectPflicht
  • definitionobjectPflicht
  • stepsobject[]Pflicht

    1–6 Einträge

  • source"manual" | "template" | "ai"optional

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
  • 422Validierung fehlgeschlagen
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/workspaces/{workspaceId}/flows" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Sommer-Aktion",
  "templateId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "trigger": {
    "type": "event_date"
  },
  "definition": {
    "steps": [
      {
        "type": "push",
        "timing": {
          "offsetMinutes": 1
        },
        "message": "Heute 20 % auf alles. Nur bis Ladenschluss."
      }
    ]
  },
  "source": "manual"
}'
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "templateId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "name": "Sommer-Aktion",
  "status": "draft",
  "trigger": {
    "type": "event_date"
  },
  "definition": {
    "steps": [
      {
        "type": "push",
        "timing": {
          "anchor": "trigger",
          "offsetMinutes": 1
        },
        "message": "Heute 20 % auf alles. Nur bis Ladenschluss."
      }
    ]
  },
  "definitionVersion": 1,
  "source": "text",
  "stats": {
    "enrolled": 1,
    "active": 1,
    "completed": 1,
    "cancelled": 1,
    "failed": 1
  },
  "activatedAt": "2026-09-15T10:32:00Z",
  "pausedAt": "2026-09-15T10:32:00Z",
  "createdAt": "2026-09-15T10:32:00Z",
  "updatedAt": "2026-09-15T10:32:00Z"
}
GET/v1/flows/{id}

Automatisierung lesen

Pfad-Parameter

  • iduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/flows/{id}" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "templateId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "name": "Sommer-Aktion",
  "status": "draft",
  "trigger": {
    "type": "event_date"
  },
  "definition": {
    "steps": [
      {
        "type": "push",
        "timing": {
          "anchor": "trigger",
          "offsetMinutes": 1
        },
        "message": "Heute 20 % auf alles. Nur bis Ladenschluss."
      }
    ]
  },
  "definitionVersion": 1,
  "source": "text",
  "stats": {
    "enrolled": 1,
    "active": 1,
    "completed": 1,
    "cancelled": 1,
    "failed": 1
  },
  "activatedAt": "2026-09-15T10:32:00Z",
  "pausedAt": "2026-09-15T10:32:00Z",
  "createdAt": "2026-09-15T10:32:00Z",
  "updatedAt": "2026-09-15T10:32:00Z"
}
PATCH/v1/flows/{id}

Automatisierung bearbeiten

Pfad-Parameter

  • iduuidPflicht

Request-Body (JSON)

  • namestringoptional

    1–120 Zeichen

  • triggerobjectoptional
  • definitionobjectoptional
  • stepsobject[]Pflicht

    1–6 Einträge

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
  • 409Konflikt
  • 422Validierung fehlgeschlagen
Anfragecurl
curl -X PATCH "https://api-dowallet.doable.app/v1/flows/{id}" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Sommer-Aktion",
  "trigger": {
    "type": "event_date"
  },
  "definition": {
    "steps": [
      {
        "type": "push",
        "timing": {
          "offsetMinutes": 1
        },
        "message": "Heute 20 % auf alles. Nur bis Ladenschluss."
      }
    ]
  }
}'
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "templateId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "name": "Sommer-Aktion",
  "status": "draft",
  "trigger": {
    "type": "event_date"
  },
  "definition": {
    "steps": [
      {
        "type": "push",
        "timing": {
          "anchor": "trigger",
          "offsetMinutes": 1
        },
        "message": "Heute 20 % auf alles. Nur bis Ladenschluss."
      }
    ]
  },
  "definitionVersion": 1,
  "source": "text",
  "stats": {
    "enrolled": 1,
    "active": 1,
    "completed": 1,
    "cancelled": 1,
    "failed": 1
  },
  "activatedAt": "2026-09-15T10:32:00Z",
  "pausedAt": "2026-09-15T10:32:00Z",
  "createdAt": "2026-09-15T10:32:00Z",
  "updatedAt": "2026-09-15T10:32:00Z"
}
POST/v1/flows/{id}/activate

Automatisierung aktivieren

Pfad-Parameter

  • iduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
  • 409Konflikt
  • 422Validierung fehlgeschlagen
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/flows/{id}/activate" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "status": "active",
  "enrollTargets": 1
}
POST/v1/flows/{id}/pause

Automatisierung pausieren

Pfad-Parameter

  • iduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
  • 409Konflikt
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/flows/{id}/pause" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "status": "paused"
}
POST/v1/flows/{id}/archive

Automatisierung archivieren

Pfad-Parameter

  • iduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
  • 409Konflikt
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/flows/{id}/archive" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "status": "archived"
}
GET/v1/flows/{id}/stats

Statistik der Automatisierung

Eingetreten, abgeschlossen, pro Schritt zugestellt.

Pfad-Parameter

  • iduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/flows/{id}/stats" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "enrolled": 1,
  "active": 1,
  "completed": 1,
  "cancelled": 1,
  "failed": 1,
  "perStep": [
    {
      "index": 1,
      "type": "text",
      "executed": 1,
      "skipped": 1,
      "pending": 1,
      "skippedQuota": 1,
      "skippedNoEmail": 1,
      "skippedNoLocation": 1,
      "failed": 1
    }
  ]
}
POST/v1/flows/{id}/dry-run

Probelauf

Zeigt, welche Pässe der Trigger jetzt treffen würde, ohne etwas zu senden.

Pfad-Parameter

  • iduuidPflicht

Request-Body (JSON)

  • passIduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
  • 422Validierung fehlgeschlagen
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/flows/{id}/dry-run" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "passId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01"
}'
Antwort200
{
  "steps": [
    {
      "index": 1,
      "type": "text",
      "outcome": "text"
    }
  ]
}
POST/v1/flows/{id}/steps/{index}/test

Einzelnen Schritt an einen Test-Pass senden

Pfad-Parameter

  • iduuidPflicht
  • indexintegerPflicht

Request-Body (JSON)

  • passIduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
  • 422Validierung fehlgeschlagen
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/flows/{id}/steps/{index}/test" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "passId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01"
}'
Antwort200
{
  "index": 1,
  "type": "text",
  "outcome": "text",
  "detail": "text"
}

Standorte

Standorte für Geofencing und standortbezogene Hinweise.

GET/v1/workspaces/{workspaceId}/locations

Standorte auflisten

Pfad-Parameter

  • workspaceIduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/workspaces/{workspaceId}/locations" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "data": [
    {
      "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "name": "Sommer-Aktion",
      "address": "text",
      "lat": 1,
      "lon": 1,
      "radiusM": 1,
      "beaconUuid": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "beaconMajor": 1,
      "beaconMinor": 1,
      "createdAt": "2026-09-15T10:32:00Z"
    }
  ],
  "pagination": {
    "nextCursor": "text",
    "hasMore": true
  }
}
POST/v1/workspaces/{workspaceId}/locations

Standort anlegen

Adresse, Koordinaten und Radius für Geofencing.

Pfad-Parameter

  • workspaceIduuidPflicht

Request-Body (JSON)

  • namestringPflicht

    1–120 Zeichen

  • addressstring | nulloptional
  • latnumberPflicht

    -90 bis 90

  • lonnumberPflicht

    -180 bis 180

  • radiusMintegeroptional

    10 bis 50000

  • beaconUuiduuid | nulloptional
  • beaconMajorinteger | nulloptional
  • beaconMinorinteger | nulloptional

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 422Validierung fehlgeschlagen
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/workspaces/{workspaceId}/locations" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Sommer-Aktion",
  "address": "text",
  "lat": 1,
  "lon": 1,
  "radiusM": 150,
  "beaconUuid": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "beaconMajor": 1,
  "beaconMinor": 1
}'
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "name": "Sommer-Aktion",
  "address": "text",
  "lat": 1,
  "lon": 1,
  "radiusM": 1,
  "beaconUuid": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "beaconMajor": 1,
  "beaconMinor": 1,
  "createdAt": "2026-09-15T10:32:00Z"
}
PATCH/v1/locations/{id}

Standort bearbeiten

Pfad-Parameter

  • iduuidPflicht

Request-Body (JSON)

  • namestringoptional

    1–120 Zeichen

  • addressstring | nulloptional
  • latnumberoptional

    -90 bis 90

  • lonnumberoptional

    -180 bis 180

  • radiusMintegeroptional

    10 bis 50000

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X PATCH "https://api-dowallet.doable.app/v1/locations/{id}" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Sommer-Aktion",
  "address": "text",
  "lat": 1,
  "lon": 1,
  "radiusM": 10
}'
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "name": "Sommer-Aktion",
  "address": "text",
  "lat": 1,
  "lon": 1,
  "radiusM": 1,
  "beaconUuid": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "beaconMajor": 1,
  "beaconMinor": 1,
  "createdAt": "2026-09-15T10:32:00Z"
}
DELETE/v1/locations/{id}

Standort löschen

Pfad-Parameter

  • iduuidPflicht

Antworten

  • 204Kein Inhalt
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X DELETE "https://api-dowallet.doable.app/v1/locations/{id}" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort204
(kein Inhalt)

Code-Pools

Code-Pools pro Quelle (UTM) für Multi-Coupon-Kampagnen.

GET/v1/workspaces/{workspaceId}/code-pools/stats

Code-Listen mit Verfügbarkeit

Pro Liste: gesamt, verfügbar, vergeben, davon in aktiven Pässen, Vergaben der letzten 7 Tage, low als Nachlade-Signal, und welche Templates und Landing-Seiten die Liste nutzen.

Pfad-Parameter

  • workspaceIduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/workspaces/{workspaceId}/code-pools/stats" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "data": [
    {
      "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "name": "Sommer-Aktion",
      "exhaustionPolicy": "fallback",
      "fallbackPattern": "text",
      "total": 1,
      "available": 1,
      "assigned": 1,
      "inActivePasses": 1,
      "inInactivePasses": 1,
      "assigned7d": 1,
      "lastAssignedAt": "text",
      "low": true,
      "templates": [
        {
          "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
          "name": "Sommer-Aktion"
        }
      ],
      "landingPages": [
        {
          "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
          "slug": "sommer-aktion"
        }
      ],
      "createdAt": "text"
    }
  ]
}
PATCH/v1/code-pools/{id}

Code-Liste ändern

Name und Erschöpfungsregel.

Pfad-Parameter

  • iduuidPflicht

Request-Body (JSON)

  • namestringoptional

    1–120 Zeichen

  • exhaustionPolicy"fallback" | "fail" | "block"optional
  • fallbackPatternstring | nulloptional

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X PATCH "https://api-dowallet.doable.app/v1/code-pools/{id}" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Sommer-Aktion",
  "exhaustionPolicy": "fallback",
  "fallbackPattern": "text"
}'
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "templateId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "name": "Sommer-Aktion",
  "allocationStrategy": "round_robin",
  "utmSourceFilter": {},
  "exhaustionPolicy": "fallback",
  "fallbackPattern": "text",
  "totalCount": 1,
  "assignedCount": 1,
  "createdAt": "2026-09-15T10:32:00Z"
}
DELETE/v1/code-pools/{id}

Code-Pool löschen

Pfad-Parameter

  • iduuidPflicht

Antworten

  • 204Kein Inhalt
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X DELETE "https://api-dowallet.doable.app/v1/code-pools/{id}" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort204
(kein Inhalt)
GET/v1/value-source/variables

Platzhalter für API-Wertquellen

Alle Variablen, die in URL und Request-Body einer API-Wertquelle als {{name}} verwendet werden können.

Antworten

  • 200OK
  • 401Nicht angemeldet
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/value-source/variables" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "data": [
    {
      "name": "Sommer-Aktion",
      "description": "Kurze Beschreibung"
    }
  ]
}
POST/v1/workspaces/{workspaceId}/value-source/test

API-Wertquelle testen

Ruft deinen Endpunkt mit Testdaten auf und zeigt Wert oder Fehler samt Antwortzeit. Nichts wird gespeichert.

Pfad-Parameter

  • workspaceIduuidPflicht

Request-Body (JSON)

  • mode"static"Pflicht
  • valuestringPflicht

    1–120 Zeichen

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 422Validierung fehlgeschlagen
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/workspaces/{workspaceId}/value-source/test" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "mode": "static",
  "value": "text"
}'
Antwort200
{
  "ok": true,
  "value": "text",
  "error": "text",
  "ms": 1
}
GET/v1/workspaces/{workspaceId}/code-pools

Code-Pools auflisten

Pfad-Parameter

  • workspaceIduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/workspaces/{workspaceId}/code-pools" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "data": [
    {
      "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "templateId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "name": "Sommer-Aktion",
      "allocationStrategy": "round_robin",
      "utmSourceFilter": {},
      "exhaustionPolicy": "fallback",
      "fallbackPattern": "text",
      "totalCount": 1,
      "assignedCount": 1,
      "createdAt": "2026-09-15T10:32:00Z"
    }
  ],
  "pagination": {
    "nextCursor": "text",
    "hasMore": true
  }
}
POST/v1/workspaces/{workspaceId}/code-pools

Code-Pool anlegen

Ein Pool pro Quelle (UTM). Landing-Seiten ziehen beim Ausstellen den nächsten freien Code.

Pfad-Parameter

  • workspaceIduuidPflicht

Request-Body (JSON)

  • namestringPflicht

    1–120 Zeichen

  • templateIduuid | nulloptional
  • allocationStrategy"round_robin" | "random" | "sequential"optional
  • utmSourceFilterobjectoptional
  • exhaustionPolicy"fallback" | "fail" | "block"optional
  • fallbackPatternstring | nulloptional

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 422Validierung fehlgeschlagen
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/workspaces/{workspaceId}/code-pools" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Sommer-Aktion",
  "templateId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "allocationStrategy": "sequential",
  "utmSourceFilter": {},
  "exhaustionPolicy": "fail",
  "fallbackPattern": "text"
}'
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "templateId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "name": "Sommer-Aktion",
  "allocationStrategy": "round_robin",
  "utmSourceFilter": {},
  "exhaustionPolicy": "fallback",
  "fallbackPattern": "text",
  "totalCount": 1,
  "assignedCount": 1,
  "createdAt": "2026-09-15T10:32:00Z"
}
POST/v1/code-pools/{id}/bulk

Codes in den Pool laden

Bis zu 50.000 Codes pro Aufruf; Dubletten werden gemeldet und übersprungen.

Pfad-Parameter

  • iduuidPflicht

Request-Body (JSON)

  • valuesstring[]Pflicht

    1–50000 Einträge

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
  • 422Validierung fehlgeschlagen
  • 429Rate-Limit
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/code-pools/{id}/bulk" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "values": [
    "text"
  ]
}'
Antwort200
{
  "inserted": 1,
  "duplicates": 1
}

Bilder

Bilder für Logo, Strip, Icon und Hero.

GET/v1/workspaces/{workspaceId}/assets

Bilder auflisten

Pfad-Parameter

  • workspaceIduuidPflicht

Query-Parameter

  • kindlogo | icon | strip | thumbnail | background | footer | hero | coveroptional

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/workspaces/{workspaceId}/assets?kind=logo" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "data": [
    {
      "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "kind": "logo",
      "originalKey": "text",
      "derivatives": {},
      "mime": "text",
      "width": 1,
      "height": 1,
      "sizeBytes": 1,
      "originalFilename": "Sommer-Aktion",
      "createdById": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "createdAt": "2026-09-15T10:32:00Z",
      "signedUrl": "https://example.de/hook"
    }
  ],
  "pagination": {
    "nextCursor": "text",
    "hasMore": true
  }
}
POST/v1/workspaces/{workspaceId}/assets

Bild hochladen

Multipart. Logo, Icon, Strip oder Hero; doWallet erzeugt die Wallet-Varianten (1x/2x/3x) selbst.

Pfad-Parameter

  • workspaceIduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 413Zu groß
  • 415Default Response
  • 422Validierung fehlgeschlagen
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/workspaces/{workspaceId}/assets" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "kind": "logo",
  "originalKey": "text",
  "derivatives": {},
  "mime": "text",
  "width": 1,
  "height": 1,
  "sizeBytes": 1,
  "originalFilename": "Sommer-Aktion",
  "createdById": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "createdAt": "2026-09-15T10:32:00Z",
  "signedUrl": "https://example.de/hook"
}
GET/v1/assets/{id}

Bild lesen

Pfad-Parameter

  • iduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/assets/{id}" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "kind": "logo",
  "originalKey": "text",
  "derivatives": {},
  "mime": "text",
  "width": 1,
  "height": 1,
  "sizeBytes": 1,
  "originalFilename": "Sommer-Aktion",
  "createdById": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "createdAt": "2026-09-15T10:32:00Z",
  "signedUrl": "https://example.de/hook"
}
DELETE/v1/assets/{id}

Bild löschen

Pfad-Parameter

  • iduuidPflicht

Antworten

  • 204Kein Inhalt
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X DELETE "https://api-dowallet.doable.app/v1/assets/{id}" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort204
(kein Inhalt)

Konto

Anmeldung und Sitzung

Anmeldung, Sitzung, Passkeys und Zwei-Faktor für Nutzerkonten.

POST/v1/auth/sign-in

Anmelden mit Passwort

Setzt die Sitzungs-Cookies der Web-App. Bei aktivierter Zwei-Faktor-Authentifizierung folgt mfaRequired mit einem Challenge-Token.

Request-Body (JSON)

  • identifierstringPflicht

    1–∞ Zeichen

  • passwordstringPflicht

    1–∞ Zeichen

  • captchaTokenstringoptional

    1–∞ Zeichen

Antworten

  • 200OK
  • 400Ungültige Anfrage
  • 401Nicht angemeldet
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/auth/sign-in" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "identifier": "text",
  "password": "text",
  "captchaToken": "dwlt_xxxxxxxxxxxxxxxxxxxxxxxx"
}'
Antwort200
{
  "user": {
    "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "email": "kunde@example.de",
    "name": "Sommer-Aktion",
    "isPlatformAdmin": true
  },
  "activeOrg": {
    "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "slug": "sommer-aktion",
    "name": "Sommer-Aktion"
  },
  "activeOrgRole": "super_admin",
  "mfaEnrolled": true,
  "activeWorkspace": {
    "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "slug": "sommer-aktion",
    "name": "Sommer-Aktion"
  },
  "availableWorkspaces": [
    {
      "org": {
        "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
        "slug": "sommer-aktion",
        "name": "Sommer-Aktion"
      },
      "workspaces": [
        {
          "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
          "slug": "sommer-aktion",
          "name": "Sommer-Aktion"
        }
      ]
    }
  ],
  "impersonation": {
    "superAdminUserId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "expiresAt": "2026-09-15T10:32:00Z",
    "mode": "read_only"
  }
}
POST/v1/auth/sign-in/mfa-verify

Zweiten Faktor bestätigen

Request-Body (JSON)

  • challengeTokenstringPflicht

    8–∞ Zeichen

  • codestringPflicht

    6–20 Zeichen

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 410Nicht mehr gültig
  • 429Rate-Limit
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/auth/sign-in/mfa-verify" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "challengeToken": "dwlt_xxxxxxxxxxxxxxxxxxxxxxxx",
  "code": "text"
}'
Antwort200
{
  "user": {
    "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "email": "kunde@example.de",
    "name": "Sommer-Aktion",
    "isPlatformAdmin": true
  },
  "activeOrg": {
    "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "slug": "sommer-aktion",
    "name": "Sommer-Aktion"
  },
  "activeOrgRole": "super_admin",
  "mfaEnrolled": true,
  "activeWorkspace": {
    "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "slug": "sommer-aktion",
    "name": "Sommer-Aktion"
  },
  "availableWorkspaces": [
    {
      "org": {
        "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
        "slug": "sommer-aktion",
        "name": "Sommer-Aktion"
      },
      "workspaces": [
        {
          "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
          "slug": "sommer-aktion",
          "name": "Sommer-Aktion"
        }
      ]
    }
  ],
  "impersonation": {
    "superAdminUserId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "expiresAt": "2026-09-15T10:32:00Z",
    "mode": "read_only"
  }
}
POST/v1/auth/passkeys/login-options

Passkey-Anmeldung: Optionen

Antworten

  • 200OK
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/auth/passkeys/login-options" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
null
POST/v1/auth/passkeys/login-verify

Passkey-Anmeldung: Bestätigung

Request-Body (JSON)

  • responseobjectPflicht

Antworten

  • 200OK
  • 400Ungültige Anfrage
  • 401Nicht angemeldet
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/auth/passkeys/login-verify" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "response": null
}'
Antwort200
{
  "user": {
    "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "email": "kunde@example.de",
    "name": "Sommer-Aktion",
    "isPlatformAdmin": true
  },
  "activeOrg": {
    "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "slug": "sommer-aktion",
    "name": "Sommer-Aktion"
  },
  "activeOrgRole": "super_admin",
  "mfaEnrolled": true,
  "activeWorkspace": {
    "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "slug": "sommer-aktion",
    "name": "Sommer-Aktion"
  },
  "availableWorkspaces": [
    {
      "org": {
        "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
        "slug": "sommer-aktion",
        "name": "Sommer-Aktion"
      },
      "workspaces": [
        {
          "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
          "slug": "sommer-aktion",
          "name": "Sommer-Aktion"
        }
      ]
    }
  ],
  "impersonation": {
    "superAdminUserId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "expiresAt": "2026-09-15T10:32:00Z",
    "mode": "read_only"
  }
}
POST/v1/auth/sign-out

Abmelden

Antworten

  • 204Kein Inhalt
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/auth/sign-out" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort204
(kein Inhalt)
POST/v1/auth/active-workspace

Aktiven Workspace wechseln

Request-Body (JSON)

  • workspaceIduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/auth/active-workspace" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01"
}'
Antwort200
{
  "user": {
    "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "email": "kunde@example.de",
    "name": "Sommer-Aktion",
    "isPlatformAdmin": true
  },
  "activeOrg": {
    "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "slug": "sommer-aktion",
    "name": "Sommer-Aktion"
  },
  "activeOrgRole": "super_admin",
  "mfaEnrolled": true,
  "activeWorkspace": {
    "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "slug": "sommer-aktion",
    "name": "Sommer-Aktion"
  },
  "availableWorkspaces": [
    {
      "org": {
        "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
        "slug": "sommer-aktion",
        "name": "Sommer-Aktion"
      },
      "workspaces": [
        {
          "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
          "slug": "sommer-aktion",
          "name": "Sommer-Aktion"
        }
      ]
    }
  ],
  "impersonation": {
    "superAdminUserId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "expiresAt": "2026-09-15T10:32:00Z",
    "mode": "read_only"
  }
}
POST/v1/auth/otp-request

Anmeldecode per E-Mail anfordern

Antwortet immer 204. Die E-Mail enthält einen 6-stelligen Code und einen Direkt-Link, beide 10 Minuten gültig und einmal verwendbar.

Request-Body (JSON)

  • emailemailPflicht

Antworten

  • 204Kein Inhalt
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/auth/otp-request" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "email": "kunde@example.de"
}'
Antwort204
(kein Inhalt)
POST/v1/auth/otp-verify

Anmeldecode einlösen

Request-Body (JSON)

  • emailemailPflicht
  • codestringPflicht

    4–12 Zeichen

Antworten

  • 200OK
  • 401Nicht angemeldet
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/auth/otp-verify" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "email": "kunde@example.de",
  "code": "text"
}'
Antwort200
{
  "user": {
    "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "email": "kunde@example.de",
    "name": "Sommer-Aktion",
    "isPlatformAdmin": true
  },
  "activeOrg": {
    "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "slug": "sommer-aktion",
    "name": "Sommer-Aktion"
  },
  "activeOrgRole": "super_admin",
  "mfaEnrolled": true,
  "activeWorkspace": {
    "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "slug": "sommer-aktion",
    "name": "Sommer-Aktion"
  },
  "availableWorkspaces": [
    {
      "org": {
        "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
        "slug": "sommer-aktion",
        "name": "Sommer-Aktion"
      },
      "workspaces": [
        {
          "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
          "slug": "sommer-aktion",
          "name": "Sommer-Aktion"
        }
      ]
    }
  ],
  "impersonation": {
    "superAdminUserId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "expiresAt": "2026-09-15T10:32:00Z",
    "mode": "read_only"
  }
}
POST/v1/auth/otp-link-verify

Anmelde-Link einlösen

Request-Body (JSON)

  • tokenstringPflicht

    20–200 Zeichen

Antworten

  • 200OK
  • 401Nicht angemeldet
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/auth/otp-link-verify" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "token": "dwlt_xxxxxxxxxxxxxxxxxxxxxxxx"
}'
Antwort200
{
  "user": {
    "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "email": "kunde@example.de",
    "name": "Sommer-Aktion",
    "isPlatformAdmin": true
  },
  "activeOrg": {
    "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "slug": "sommer-aktion",
    "name": "Sommer-Aktion"
  },
  "activeOrgRole": "super_admin",
  "mfaEnrolled": true,
  "activeWorkspace": {
    "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "slug": "sommer-aktion",
    "name": "Sommer-Aktion"
  },
  "availableWorkspaces": [
    {
      "org": {
        "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
        "slug": "sommer-aktion",
        "name": "Sommer-Aktion"
      },
      "workspaces": [
        {
          "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
          "slug": "sommer-aktion",
          "name": "Sommer-Aktion"
        }
      ]
    }
  ],
  "impersonation": {
    "superAdminUserId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "expiresAt": "2026-09-15T10:32:00Z",
    "mode": "read_only"
  }
}
POST/v1/auth/password-reset-request

Passwort-Zurücksetzen anfordern

Request-Body (JSON)

  • emailemailPflicht

Antworten

  • 204Kein Inhalt
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/auth/password-reset-request" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "email": "kunde@example.de"
}'
Antwort204
(kein Inhalt)
POST/v1/auth/password-reset-complete

Neues Passwort setzen

Request-Body (JSON)

  • tokenstringPflicht

    8–∞ Zeichen

  • newPasswordstringPflicht

    4–∞ Zeichen

Antworten

  • 204Kein Inhalt
  • 401Nicht angemeldet
  • 410Nicht mehr gültig
  • 422Validierung fehlgeschlagen
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/auth/password-reset-complete" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "token": "dwlt_xxxxxxxxxxxxxxxxxxxxxxxx",
  "newPassword": "text"
}'
Antwort204
(kein Inhalt)
POST/v1/auth/sessions/revoke-others

Alle anderen Sitzungen beenden

Antworten

  • 200OK
  • 401Nicht angemeldet
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/auth/sessions/revoke-others" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "revoked": 1
}
POST/v1/auth/change-password

Passwort ändern

Request-Body (JSON)

  • currentPasswordstringPflicht

    1–∞ Zeichen

  • newPasswordstringPflicht

    4–∞ Zeichen

Antworten

  • 204Kein Inhalt
  • 401Nicht angemeldet
  • 422Validierung fehlgeschlagen
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/auth/change-password" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "currentPassword": "text",
  "newPassword": "text"
}'
Antwort204
(kein Inhalt)
PATCH/v1/users/me

Eigenes Profil ändern

Request-Body (JSON)

  • namestringoptional

    1–120 Zeichen

  • locale"de-DE" | "fr-FR" | "en-US"optional

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 422Validierung fehlgeschlagen
Anfragecurl
curl -X PATCH "https://api-dowallet.doable.app/v1/users/me" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Sommer-Aktion",
  "locale": "de-DE"
}'
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "email": "kunde@example.de",
  "name": "Sommer-Aktion",
  "locale": "de",
  "isPlatformAdmin": true
}
GET/v1/auth/me

Eigene Sitzung lesen

Nutzer, aktive Organisation, Rolle, aktiver Workspace.

Antworten

  • 200OK
  • 401Nicht angemeldet
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/auth/me" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "user": {
    "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "email": "kunde@example.de",
    "name": "Sommer-Aktion",
    "isPlatformAdmin": true
  },
  "activeOrg": {
    "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "slug": "sommer-aktion",
    "name": "Sommer-Aktion"
  },
  "activeOrgRole": "super_admin",
  "mfaEnrolled": true,
  "activeWorkspace": {
    "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "slug": "sommer-aktion",
    "name": "Sommer-Aktion"
  },
  "availableWorkspaces": [
    {
      "org": {
        "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
        "slug": "sommer-aktion",
        "name": "Sommer-Aktion"
      },
      "workspaces": [
        {
          "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
          "slug": "sommer-aktion",
          "name": "Sommer-Aktion"
        }
      ]
    }
  ],
  "impersonation": {
    "superAdminUserId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "expiresAt": "2026-09-15T10:32:00Z",
    "mode": "read_only"
  }
}
POST/v1/auth/passkeys/register-options

Passkey registrieren: Optionen

Antworten

  • 200OK
  • 401Nicht angemeldet
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/auth/passkeys/register-options" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
null
POST/v1/auth/passkeys/register-verify

Passkey registrieren: Bestätigung

Request-Body (JSON)

  • responseobjectPflicht
  • deviceNamestringoptional

    0–80 Zeichen

Antworten

  • 200OK
  • 400Ungültige Anfrage
  • 401Nicht angemeldet
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/auth/passkeys/register-verify" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "response": null,
  "deviceName": "Sommer-Aktion"
}'
Antwort200
{
  "ok": true,
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01"
}
GET/v1/auth/passkeys

Passkeys auflisten

Antworten

  • 200OK
  • 401Nicht angemeldet
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/auth/passkeys" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "data": [
    {
      "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "deviceName": "Sommer-Aktion",
      "createdAt": "text",
      "lastUsedAt": "text"
    }
  ]
}
DELETE/v1/auth/passkeys/{id}

Passkey entfernen

Pfad-Parameter

  • iduuidPflicht

Antworten

  • 204Kein Inhalt
  • 401Nicht angemeldet
  • 404Nicht gefunden
Anfragecurl
curl -X DELETE "https://api-dowallet.doable.app/v1/auth/passkeys/{id}" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort204
(kein Inhalt)
GET/v1/auth/mfa/status

Zwei-Faktor-Status

Antworten

  • 200OK
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/auth/mfa/status" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "enrolled": true,
  "verifiedAt": "2026-09-15T10:32:00Z",
  "recoveryCodesRemaining": 1
}
POST/v1/auth/mfa/setup

Zwei-Faktor einrichten

Liefert Secret und QR-Code für eine Authenticator-App.

Antworten

  • 200OK
  • 409Konflikt
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/auth/mfa/setup" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "otpauth": "text",
  "secret": "text",
  "recoveryCodes": [
    "text"
  ]
}
POST/v1/auth/mfa/verify

Zwei-Faktor bestätigen

Aktiviert 2FA und gibt die Wiederherstellungscodes einmalig zurück.

Request-Body (JSON)

  • codestringPflicht

    6–8 Zeichen

Antworten

  • 204Kein Inhalt
  • 401Nicht angemeldet
  • 404Nicht gefunden
  • 429Rate-Limit
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/auth/mfa/verify" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "code": "text"
}'
Antwort204
(kein Inhalt)
POST/v1/auth/mfa/disable

Zwei-Faktor deaktivieren

Request-Body (JSON)

  • codestringPflicht

    6–20 Zeichen

Antworten

  • 204Kein Inhalt
  • 401Nicht angemeldet
  • 404Nicht gefunden
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/auth/mfa/disable" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "code": "text"
}'
Antwort204
(kein Inhalt)

Organisation

Organisation: Profil, Branding, Rechnungen, E-Mail-Absender.

GET/v1/orgs/{id}/onboarding

Onboarding-Fortschritt

Pfad-Parameter

  • iduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/orgs/{id}/onboarding" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "completed": 1,
  "total": 1,
  "steps": [
    {
      "key": "text",
      "label": "Sommer-Aktion",
      "done": true,
      "hint": "text"
    }
  ]
}
GET/v1/orgs/{id}/invoices

Rechnungen auflisten

Ohne Entwürfe. Enthält, ob PDF und E-Rechnung vorliegen.

Pfad-Parameter

  • iduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/orgs/{id}/invoices" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "data": [
    {
      "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "number": "text",
      "amountCents": 1250,
      "currency": "EUR",
      "status": "active",
      "issuedAt": "text",
      "dueAt": "text",
      "paidAt": "text",
      "hasPdf": true,
      "hasEinvoice": true,
      "einvoiceFilename": "Sommer-Aktion",
      "hasProof": true,
      "proofUploadedAt": "text"
    }
  ]
}
GET/v1/orgs/{id}/invoices/{invoiceId}/payment-proof

Zahlungsnachweis herunterladen

Pfad-Parameter

  • iduuidPflicht
  • invoiceIduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/orgs/{id}/invoices/{invoiceId}/payment-proof" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "url": "https://example.de/hook"
}
POST/v1/orgs/{id}/invoices/{invoiceId}/payment-proof

Zahlungsnachweis hochladen

PDF, PNG oder JPEG bis 10 MB. Die Rechnung wechselt in die Prüfung.

Pfad-Parameter

  • iduuidPflicht
  • invoiceIduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
  • 409Konflikt
  • 413Zu groß
  • 422Validierung fehlgeschlagen
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/orgs/{id}/invoices/{invoiceId}/payment-proof" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "number": "text",
  "amountCents": 1250,
  "currency": "EUR",
  "status": "active",
  "issuedAt": "text",
  "dueAt": "text",
  "paidAt": "text",
  "hasPdf": true,
  "hasEinvoice": true,
  "einvoiceFilename": "Sommer-Aktion",
  "hasProof": true,
  "proofUploadedAt": "text"
}
GET/v1/orgs/{id}/invoices/{invoiceId}/pdf

Rechnungs-PDF herunterladen

Liefert eine kurzlebige signierte URL.

Pfad-Parameter

  • iduuidPflicht
  • invoiceIduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/orgs/{id}/invoices/{invoiceId}/pdf" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "url": "https://example.de/hook"
}
GET/v1/orgs/{id}/invoices/{invoiceId}/einvoice

E-Rechnung herunterladen

XRechnung (XML) oder ZUGFeRD (PDF), als signierte URL.

Pfad-Parameter

  • iduuidPflicht
  • invoiceIduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/orgs/{id}/invoices/{invoiceId}/einvoice" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "url": "https://example.de/hook",
  "filename": "Sommer-Aktion"
}
PUT/v1/orgs/{id}/onboarding-case

Anwendungsfall festlegen

Pfad-Parameter

  • iduuidPflicht

Request-Body (JSON)

  • case"loyalty" | "coupon" | "membership" | "eventTicket" | "skipped"Pflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X PUT "https://api-dowallet.doable.app/v1/orgs/{id}/onboarding-case" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "case": "loyalty"
}'
Antwort200
{
  "case": "text"
}
GET/v1/orgs/{id}/usage

Verbrauch und Kontingente

Pfad-Parameter

  • iduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/orgs/{id}/usage" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "passesThisMonth": 1,
  "pushesThisMonth": 1,
  "quotas": {
    "passesPerMonth": 1,
    "pushesPerMonth": 1,
    "storageBytes": 1,
    "workspaces": 1,
    "teamMembers": 1
  }
}
GET/v1/orgs

Organisationen des Nutzers

Query-Parameter

  • cursorstringoptional
  • limitintegeroptional

Antworten

  • 200OK
  • 401Nicht angemeldet
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/orgs?cursor=text&limit=50" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "data": [
    {
      "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "slug": "sommer-aktion",
      "name": "Sommer-Aktion",
      "status": "active",
      "billingProfile": {},
      "quotas": {},
      "brandingLogoUrl": "https://example.de/hook",
      "branding": {},
      "entitlements": {
        "whiteLabel": true,
        "embedSdk": true
      },
      "subdomain": "text",
      "frozen": false,
      "frozenReason": "text",
      "paymentReminder": {},
      "auditRetentionDays": "text",
      "overdue": {
        "count": 1,
        "totalCents": 1
      },
      "billingSummary": {
        "packageName": "Sommer-Aktion",
        "tagline": "text",
        "badges": [
          "text"
        ],
        "priceCents": 1,
        "currency": "EUR",
        "period": "text",
        "durationMonths": 1,
        "perMessageFeeMicros": 1,
        "status": "active"
      },
      "createdAt": "2026-09-15T10:32:00Z",
      "updatedAt": "2026-09-15T10:32:00Z",
      "deletedAt": "2026-09-15T10:32:00Z"
    }
  ],
  "pagination": {
    "nextCursor": "text",
    "hasMore": true
  }
}
GET/v1/orgs/me

Aktive Organisation

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 404Nicht gefunden
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/orgs/me" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "slug": "sommer-aktion",
  "name": "Sommer-Aktion",
  "status": "active",
  "billingProfile": {},
  "quotas": {},
  "brandingLogoUrl": "https://example.de/hook",
  "branding": {},
  "entitlements": {
    "whiteLabel": true,
    "embedSdk": true
  },
  "subdomain": "text",
  "frozen": false,
  "frozenReason": "text",
  "paymentReminder": {},
  "auditRetentionDays": "text",
  "overdue": {
    "count": 1,
    "totalCents": 1
  },
  "billingSummary": {
    "packageName": "Sommer-Aktion",
    "tagline": "text",
    "badges": [
      "text"
    ],
    "priceCents": 1,
    "currency": "EUR",
    "period": "text",
    "durationMonths": 1,
    "perMessageFeeMicros": 1,
    "status": "active"
  },
  "createdAt": "2026-09-15T10:32:00Z",
  "updatedAt": "2026-09-15T10:32:00Z",
  "deletedAt": "2026-09-15T10:32:00Z"
}
GET/v1/orgs/{id}

Organisation lesen

Pfad-Parameter

  • iduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/orgs/{id}" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "slug": "sommer-aktion",
  "name": "Sommer-Aktion",
  "status": "active",
  "billingProfile": {},
  "quotas": {},
  "brandingLogoUrl": "https://example.de/hook",
  "branding": {},
  "entitlements": {
    "whiteLabel": true,
    "embedSdk": true
  },
  "subdomain": "text",
  "frozen": false,
  "frozenReason": "text",
  "paymentReminder": {},
  "auditRetentionDays": "text",
  "overdue": {
    "count": 1,
    "totalCents": 1
  },
  "billingSummary": {
    "packageName": "Sommer-Aktion",
    "tagline": "text",
    "badges": [
      "text"
    ],
    "priceCents": 1,
    "currency": "EUR",
    "period": "text",
    "durationMonths": 1,
    "perMessageFeeMicros": 1,
    "status": "active"
  },
  "createdAt": "2026-09-15T10:32:00Z",
  "updatedAt": "2026-09-15T10:32:00Z",
  "deletedAt": "2026-09-15T10:32:00Z"
}
PATCH/v1/orgs/{id}

Organisation ändern

Name und Rechnungsprofil (USt-ID, Adresse, Rechnungs-E-Mail). Das Rechnungsprofil wird feldweise gemergt.

Pfad-Parameter

  • iduuidPflicht

Request-Body (JSON)

  • namestringoptional

    1–120 Zeichen

  • billingProfileobjectoptional
  • vatIdstringoptional

    0–40 Zeichen

  • addressstringoptional

    0–500 Zeichen

  • contactEmailemail | ""optional
  • brandingLogoUrluri | nulloptional

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X PATCH "https://api-dowallet.doable.app/v1/orgs/{id}" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Sommer-Aktion",
  "billingProfile": {
    "vatId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "address": "text",
    "contactEmail": "kunde@example.de"
  },
  "brandingLogoUrl": "https://example.de/hook"
}'
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "slug": "sommer-aktion",
  "name": "Sommer-Aktion",
  "status": "active",
  "billingProfile": {},
  "quotas": {},
  "brandingLogoUrl": "https://example.de/hook",
  "branding": {},
  "entitlements": {
    "whiteLabel": true,
    "embedSdk": true
  },
  "subdomain": "text",
  "frozen": false,
  "frozenReason": "text",
  "paymentReminder": {},
  "auditRetentionDays": "text",
  "overdue": {
    "count": 1,
    "totalCents": 1
  },
  "billingSummary": {
    "packageName": "Sommer-Aktion",
    "tagline": "text",
    "badges": [
      "text"
    ],
    "priceCents": 1,
    "currency": "EUR",
    "period": "text",
    "durationMonths": 1,
    "perMessageFeeMicros": 1,
    "status": "active"
  },
  "createdAt": "2026-09-15T10:32:00Z",
  "updatedAt": "2026-09-15T10:32:00Z",
  "deletedAt": "2026-09-15T10:32:00Z"
}
PATCH/v1/orgs/{id}/branding

Branding ändern

Farben, Schrift, Logo-Verwendung. Erweiterte Optionen benötigen die White-Label-Freigabe.

Pfad-Parameter

  • iduuidPflicht

Request-Body (JSON)

  • logoUrlurioptional
  • logoWhiteUrlurioptional
  • primaryColorstringoptional
  • surfaceColorstringoptional
  • textColorstringoptional
  • mutedColorstringoptional
  • fontFamilystringoptional

    0–80 Zeichen

  • fontCssSrcurioptional
  • poweredByDoWalletbooleanoptional
  • supportEmailemailoptional
  • embedOriginsstring[]optional

    0–20 Einträge

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X PATCH "https://api-dowallet.doable.app/v1/orgs/{id}/branding" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "logoUrl": "https://example.de/hook",
  "logoWhiteUrl": "https://example.de/hook",
  "primaryColor": "#1a73e8",
  "surfaceColor": "#1a73e8",
  "textColor": "Heute 20 % auf alles. Nur bis Ladenschluss.",
  "mutedColor": "#1a73e8",
  "fontFamily": "text",
  "fontCssSrc": "https://example.de/hook",
  "poweredByDoWallet": true,
  "supportEmail": "kunde@example.de",
  "embedOrigins": [
    "text"
  ]
}'
Antwort200
{
  "logoUrl": "https://example.de/hook",
  "logoWhiteUrl": "https://example.de/hook",
  "primaryColor": "#1a73e8",
  "surfaceColor": "#1a73e8",
  "textColor": "Heute 20 % auf alles. Nur bis Ladenschluss.",
  "mutedColor": "#1a73e8",
  "fontFamily": "text",
  "fontCssSrc": "https://example.de/hook",
  "poweredByDoWallet": true,
  "supportEmail": "kunde@example.de",
  "embedOrigins": [
    "text"
  ]
}
GET/v1/orgs/{id}/email-settings

E-Mail-Absender lesen

Pfad-Parameter

  • iduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/orgs/{id}/email-settings" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "senderName": "Sommer-Aktion",
  "replyTo": "text",
  "smtp": {
    "host": "text",
    "port": 1,
    "user": "text",
    "fromAddress": "text",
    "hasPassword": true
  },
  "verifiedAt": "text",
  "effectiveFrom": "text"
}
PATCH/v1/orgs/{id}/email-settings

E-Mail-Absender ändern

Pfad-Parameter

  • iduuidPflicht

Request-Body (JSON)

  • senderNamestring | nulloptional
  • replyToemail | nulloptional
  • smtpobject | nulloptional
  • hoststringPflicht

    1–255 Zeichen

  • portintegerPflicht

    1 bis 65535

  • userstringPflicht

    1–255 Zeichen

  • passwordstringoptional

    1–512 Zeichen

  • fromAddressemailPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
  • 422Validierung fehlgeschlagen
Anfragecurl
curl -X PATCH "https://api-dowallet.doable.app/v1/orgs/{id}/email-settings" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "senderName": "Sommer-Aktion",
  "replyTo": "kunde@example.de",
  "smtp": {
    "host": "text",
    "port": 1,
    "user": "text",
    "fromAddress": "kunde@example.de"
  }
}'
Antwort200
{
  "senderName": "Sommer-Aktion",
  "replyTo": "text",
  "smtp": {
    "host": "text",
    "port": 1,
    "user": "text",
    "fromAddress": "text",
    "hasPassword": true
  },
  "verifiedAt": "text",
  "effectiveFrom": "text"
}
POST/v1/orgs/{id}/email-settings/test

Test-E-Mail senden

Pfad-Parameter

  • iduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
  • 502Default Response
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/orgs/{id}/email-settings/test" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "sent": true,
  "to": "text",
  "via": "platform",
  "effectiveFrom": "text"
}

Workspaces

Workspaces (Filialen, Marken) innerhalb einer Organisation.

GET/v1/orgs/{orgId}/workspaces

Workspaces auflisten

Pfad-Parameter

  • orgIduuidPflicht

Query-Parameter

  • cursorstringoptional
  • limitintegeroptional

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/orgs/{orgId}/workspaces?cursor=text&limit=50" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "data": [
    {
      "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "orgId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "slug": "sommer-aktion",
      "name": "Sommer-Aktion",
      "timezone": "Europe/Berlin",
      "defaultLocale": "de",
      "brandColor": "#1a73e8",
      "environment": "production",
      "createdAt": "2026-09-15T10:32:00Z"
    }
  ],
  "pagination": {
    "nextCursor": "text",
    "hasMore": true
  }
}
POST/v1/orgs/{orgId}/workspaces

Workspace anlegen

Pfad-Parameter

  • orgIduuidPflicht

Request-Body (JSON)

  • namestringPflicht

    1–120 Zeichen

  • slugstringoptional

    2–60 Zeichen

  • timezonestringoptional
  • defaultLocalestringoptional
  • brandColorstringoptional

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 409Konflikt
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/orgs/{orgId}/workspaces" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Sommer-Aktion",
  "slug": "sommer-aktion",
  "timezone": "Europe/Berlin",
  "defaultLocale": "de",
  "brandColor": "#1a73e8"
}'
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "orgId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "slug": "sommer-aktion",
  "name": "Sommer-Aktion",
  "timezone": "Europe/Berlin",
  "defaultLocale": "de",
  "brandColor": "#1a73e8",
  "environment": "production",
  "createdAt": "2026-09-15T10:32:00Z"
}
GET/v1/workspaces/{id}

Workspace lesen

Pfad-Parameter

  • iduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/workspaces/{id}" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "orgId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "slug": "sommer-aktion",
  "name": "Sommer-Aktion",
  "timezone": "Europe/Berlin",
  "defaultLocale": "de",
  "brandColor": "#1a73e8",
  "environment": "production",
  "createdAt": "2026-09-15T10:32:00Z"
}
PATCH/v1/workspaces/{id}

Workspace ändern

Name, Zeitzone, Standardsprache, Sandbox oder Production.

Pfad-Parameter

  • iduuidPflicht

Request-Body (JSON)

  • namestringoptional

    1–120 Zeichen

  • timezonestringoptional
  • defaultLocalestringoptional
  • brandColorstring | nulloptional
  • environment"production" | "sandbox"optional

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X PATCH "https://api-dowallet.doable.app/v1/workspaces/{id}" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Sommer-Aktion",
  "timezone": "Europe/Berlin",
  "defaultLocale": "de",
  "brandColor": "#1a73e8",
  "environment": "production"
}'
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "orgId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "slug": "sommer-aktion",
  "name": "Sommer-Aktion",
  "timezone": "Europe/Berlin",
  "defaultLocale": "de",
  "brandColor": "#1a73e8",
  "environment": "production",
  "createdAt": "2026-09-15T10:32:00Z"
}

Team

Rollen der Team-Mitglieder.

GET/v1/orgs/{orgId}/memberships

Team-Mitglieder auflisten

Pfad-Parameter

  • orgIduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/orgs/{orgId}/memberships" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "data": [
    {
      "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "userId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "orgId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "role": "super_admin",
      "invitedBy": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "createdAt": "2026-09-15T10:32:00Z",
      "user": {
        "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
        "email": "kunde@example.de",
        "name": "Sommer-Aktion"
      }
    }
  ],
  "pagination": {
    "nextCursor": "text",
    "hasMore": true
  }
}
POST/v1/orgs/{orgId}/memberships

Mitglied hinzufügen

Pfad-Parameter

  • orgIduuidPflicht

Request-Body (JSON)

  • userIduuidPflicht
  • workspaceIduuid | nulloptional
  • role"org_owner" | "org_admin" | "editor" | "viewer"Pflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
  • 409Konflikt
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/orgs/{orgId}/memberships" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "userId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "role": "org_owner"
}'
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "userId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "orgId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "role": "super_admin",
  "invitedBy": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "createdAt": "2026-09-15T10:32:00Z",
  "user": {
    "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "email": "kunde@example.de",
    "name": "Sommer-Aktion"
  }
}
PATCH/v1/memberships/{id}

Rolle ändern

Pfad-Parameter

  • iduuidPflicht

Request-Body (JSON)

  • role"org_owner" | "org_admin" | "editor" | "viewer"Pflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X PATCH "https://api-dowallet.doable.app/v1/memberships/{id}" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "role": "org_owner"
}'
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "userId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "orgId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "role": "super_admin",
  "invitedBy": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "createdAt": "2026-09-15T10:32:00Z",
  "user": {
    "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "email": "kunde@example.de",
    "name": "Sommer-Aktion"
  }
}
DELETE/v1/memberships/{id}

Mitglied entfernen

Pfad-Parameter

  • iduuidPflicht

Antworten

  • 204Kein Inhalt
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X DELETE "https://api-dowallet.doable.app/v1/memberships/{id}" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort204
(kein Inhalt)

Einladungen

Einladungen ins Team.

GET/v1/orgs/{orgId}/invitations

Einladungen auflisten

Pfad-Parameter

  • orgIduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/orgs/{orgId}/invitations" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "data": [
    {
      "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "orgId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "email": "kunde@example.de",
      "role": "super_admin",
      "status": "pending",
      "invitedBy": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "createdAt": "2026-09-15T10:32:00Z",
      "expiresAt": "2026-09-15T10:32:00Z",
      "acceptedAt": "2026-09-15T10:32:00Z"
    }
  ],
  "pagination": {
    "nextCursor": "text",
    "hasMore": true
  }
}
POST/v1/orgs/{orgId}/invitations

Einladung senden

Pfad-Parameter

  • orgIduuidPflicht

Request-Body (JSON)

  • emailemailPflicht
  • role"org_owner" | "org_admin" | "editor" | "viewer"Pflicht
  • workspaceIduuid | nulloptional

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
  • 409Konflikt
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/orgs/{orgId}/invitations" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "email": "kunde@example.de",
  "role": "org_owner",
  "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01"
}'
Antwort200
{
  "invitation": {
    "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "orgId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "email": "kunde@example.de",
    "role": "super_admin",
    "status": "pending",
    "invitedBy": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "createdAt": "2026-09-15T10:32:00Z",
    "expiresAt": "2026-09-15T10:32:00Z",
    "acceptedAt": "2026-09-15T10:32:00Z"
  },
  "acceptUrl": "https://example.de/hook"
}
GET/v1/invitations/by-token/{token}

Einladung per Token lesen

Pfad-Parameter

  • tokenstringPflicht

Antworten

  • 200OK
  • 404Nicht gefunden
  • 410Nicht mehr gültig
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/invitations/by-token/{token}" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "email": "kunde@example.de",
  "role": "text",
  "org": {
    "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "slug": "sommer-aktion",
    "name": "Sommer-Aktion"
  },
  "workspace": {
    "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "slug": "sommer-aktion",
    "name": "Sommer-Aktion"
  },
  "existingUser": true
}
POST/v1/invitations/accept

Einladung annehmen

Setzt Passwort und legt die Mitgliedschaft an; AGB-Zustimmung ist Pflicht.

Request-Body (JSON)

  • tokenstringPflicht
  • passwordstringoptional

    10–∞ Zeichen

  • namestringoptional

    1–120 Zeichen

  • acceptTermsbooleanoptional

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
  • 410Nicht mehr gültig
  • 422Validierung fehlgeschlagen
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/invitations/accept" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "token": "dwlt_xxxxxxxxxxxxxxxxxxxxxxxx",
  "password": "text",
  "name": "Sommer-Aktion",
  "acceptTerms": true
}'
Antwort200
{
  "user": {
    "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "email": "kunde@example.de",
    "name": "Sommer-Aktion",
    "isPlatformAdmin": true
  },
  "activeOrg": {
    "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "slug": "sommer-aktion",
    "name": "Sommer-Aktion"
  },
  "activeOrgRole": "super_admin",
  "mfaEnrolled": true,
  "activeWorkspace": {
    "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "slug": "sommer-aktion",
    "name": "Sommer-Aktion"
  },
  "availableWorkspaces": [
    {
      "org": {
        "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
        "slug": "sommer-aktion",
        "name": "Sommer-Aktion"
      },
      "workspaces": [
        {
          "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
          "slug": "sommer-aktion",
          "name": "Sommer-Aktion"
        }
      ]
    }
  ],
  "impersonation": {
    "superAdminUserId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "expiresAt": "2026-09-15T10:32:00Z",
    "mode": "read_only"
  }
}
DELETE/v1/invitations/{id}

Einladung zurückziehen

Pfad-Parameter

  • iduuidPflicht

Antworten

  • 204Kein Inhalt
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X DELETE "https://api-dowallet.doable.app/v1/invitations/{id}" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort204
(kein Inhalt)

Wallet-Zertifikate

Apple- und Google-Zertifikate der Organisation.

GET/v1/orgs/{orgId}/wallet-credentials

Zertifikate auflisten

Pfad-Parameter

  • orgIduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/orgs/{orgId}/wallet-credentials" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "data": [
    {
      "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "orgId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "kind": "apple",
      "environment": "development",
      "metadata": {},
      "certExpiresAt": "text",
      "certStatus": "ok",
      "isPlatformDefault": true,
      "uploadedById": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "createdAt": "2026-09-15T10:32:00Z",
      "revokedAt": "2026-09-15T10:32:00Z"
    }
  ],
  "pagination": {
    "nextCursor": "text",
    "hasMore": true
  }
}
POST/v1/orgs/{orgId}/wallet-credentials

Zertifikat hochladen

Apple: Pass-Type-ID-Zertifikat plus Schlüssel; Google: Service-Account-JSON mit Issuer-ID. Verschlüsselt gespeichert.

Pfad-Parameter

  • orgIduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 413Zu groß
  • 422Validierung fehlgeschlagen
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/orgs/{orgId}/wallet-credentials" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "orgId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "kind": "apple",
  "environment": "development",
  "metadata": {
    "passTypeId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "teamId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "certExpiresAt": "text",
    "organizationName": "Sommer-Aktion",
    "issuerId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "serviceAccountEmail": "kunde@example.de",
    "projectId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01"
  },
  "certExpiresAt": "text",
  "certStatus": "ok",
  "isPlatformDefault": true,
  "uploadedById": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "createdAt": "2026-09-15T10:32:00Z",
  "revokedAt": "2026-09-15T10:32:00Z"
}
GET/v1/orgs/{orgId}/wallet-config

Wallet-Konfiguration lesen

Was für Apple und Google aktiv ist: eigene Zertifikate oder die doWallet-Standardkonfiguration.

Pfad-Parameter

  • orgIduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/orgs/{orgId}/wallet-config" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "apple": {
    "own": true,
    "platformDefault": true
  },
  "google": {
    "own": true,
    "platformDefault": true
  },
  "blessed": true,
  "blessedAt": "text"
}
POST/v1/orgs/{orgId}/apple-csr

Apple-CSR erzeugen

doWallet erzeugt Schlüssel und Zertifikatsanforderung; du lädst die CSR im Apple-Developer-Portal hoch.

Pfad-Parameter

  • orgIduuidPflicht

Request-Body (JSON)

  • commonNamestringoptional

    0–120 Zeichen

  • emailemailoptional

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/orgs/{orgId}/apple-csr" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "commonName": "Sommer-Aktion",
  "email": "kunde@example.de"
}'
Antwort200
{
  "csrPem": "text"
}
POST/v1/orgs/{orgId}/apple-csr/complete

Apple-Zertifikat einspielen

Das von Apple ausgestellte Zertifikat zur vorher erzeugten CSR.

Pfad-Parameter

  • orgIduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
  • 422Validierung fehlgeschlagen
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/orgs/{orgId}/apple-csr/complete" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "orgId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "kind": "apple",
  "environment": "development",
  "metadata": {
    "passTypeId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "teamId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "certExpiresAt": "text",
    "organizationName": "Sommer-Aktion",
    "issuerId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "serviceAccountEmail": "kunde@example.de",
    "projectId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01"
  },
  "certExpiresAt": "text",
  "certStatus": "ok",
  "isPlatformDefault": true,
  "uploadedById": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "createdAt": "2026-09-15T10:32:00Z",
  "revokedAt": "2026-09-15T10:32:00Z"
}
DELETE/v1/wallet-credentials/{id}

Zertifikat entfernen

Pfad-Parameter

  • iduuidPflicht

Antworten

  • 204Kein Inhalt
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X DELETE "https://api-dowallet.doable.app/v1/wallet-credentials/{id}" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort204
(kein Inhalt)

E-Mail

E-Mail-Einstellungen und Test-Versand.

POST/v1/workspaces/{workspaceId}/emails/preview

E-Mail-Vorschau rendern

Pfad-Parameter

  • workspaceIduuidPflicht

Request-Body (JSON)

  • templateKind"announcement" | "offer" | "winback" | "event_reminder"Pflicht
  • templateIduuidPflicht
  • subjectstringoptional

    0–160 Zeichen

  • bodystringoptional

    0–4000 Zeichen

  • slotsobjectoptional
  • ctaLabelstringoptional

    0–60 Zeichen

  • ctaUrlurioptional
  • offerValuestringoptional

    0–40 Zeichen

  • imageAssetIduuidoptional
  • includeWalletLinkbooleanoptional
  • localestringoptional

    0–10 Zeichen

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/workspaces/{workspaceId}/emails/preview" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "templateKind": "announcement",
  "templateId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "subject": "text",
  "body": "Heute 20 % auf alles. Nur bis Ladenschluss.",
  "slots": {
    "ctaLabel": "Sommer-Aktion",
    "ctaUrl": "https://example.de/hook",
    "offerValue": "text",
    "imageAssetId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01"
  },
  "includeWalletLink": true,
  "locale": "de"
}'
Antwort200
{
  "subject": "text",
  "html": "text",
  "text": "Heute 20 % auf alles. Nur bis Ladenschluss."
}
POST/v1/workspaces/{workspaceId}/emails/test

Test-E-Mail senden

Pfad-Parameter

  • workspaceIduuidPflicht

Request-Body (JSON)

  • templateKind"announcement" | "offer" | "winback" | "event_reminder"Pflicht
  • templateIduuidPflicht
  • subjectstringoptional

    0–160 Zeichen

  • bodystringoptional

    0–4000 Zeichen

  • slotsobjectoptional
  • ctaLabelstringoptional

    0–60 Zeichen

  • ctaUrlurioptional
  • offerValuestringoptional

    0–40 Zeichen

  • imageAssetIduuidoptional
  • includeWalletLinkbooleanoptional
  • localestringoptional

    0–10 Zeichen

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
  • 502Default Response
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/workspaces/{workspaceId}/emails/test" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "templateKind": "announcement",
  "templateId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "subject": "text",
  "body": "Heute 20 % auf alles. Nur bis Ladenschluss.",
  "slots": {
    "ctaLabel": "Sommer-Aktion",
    "ctaUrl": "https://example.de/hook",
    "offerValue": "text",
    "imageAssetId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01"
  },
  "includeWalletLink": true,
  "locale": "de"
}'
Antwort200
{
  "sent": true,
  "to": "text"
}

Support

Support-Tickets.

GET/v1/orgs/{orgId}/support/tickets

Support-Tickets der Organisation

Pfad-Parameter

  • orgIduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/orgs/{orgId}/support/tickets" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
[
  {
    "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "orgId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "orgName": "Sommer-Aktion",
    "subject": "text",
    "status": "open",
    "priority": "low",
    "createdByName": "Sommer-Aktion",
    "createdByEmail": "kunde@example.de",
    "messageCount": 1,
    "createdAt": "text",
    "lastReplyAt": "text"
  }
]
POST/v1/orgs/{orgId}/support/tickets

Support-Ticket eröffnen

Pfad-Parameter

  • orgIduuidPflicht

Request-Body (JSON)

  • subjectstringPflicht

    2–160 Zeichen

  • bodystringPflicht

    2–5000 Zeichen

  • priority"low" | "normal" | "high"optional

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/orgs/{orgId}/support/tickets" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "subject": "text",
  "body": "Heute 20 % auf alles. Nur bis Ladenschluss.",
  "priority": "low"
}'
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01"
}
GET/v1/support/tickets

Alle Tickets (Plattform)

Query-Parameter

  • statusopen | in_progress | resolvedoptional

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/support/tickets?status=open" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
[
  {
    "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "orgId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "orgName": "Sommer-Aktion",
    "subject": "text",
    "status": "open",
    "priority": "low",
    "createdByName": "Sommer-Aktion",
    "createdByEmail": "kunde@example.de",
    "messageCount": 1,
    "createdAt": "text",
    "lastReplyAt": "text"
  }
]
GET/v1/support/tickets/{id}

Ticket lesen

Pfad-Parameter

  • iduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/support/tickets/{id}" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "ticket": {
    "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "orgId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
    "orgName": "Sommer-Aktion",
    "subject": "text",
    "status": "open",
    "priority": "low",
    "createdByName": "Sommer-Aktion",
    "createdByEmail": "kunde@example.de",
    "messageCount": 1,
    "createdAt": "text",
    "lastReplyAt": "text"
  },
  "messages": [
    {
      "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "authorName": "Sommer-Aktion",
      "body": "Heute 20 % auf alles. Nur bis Ladenschluss.",
      "staff": true,
      "createdAt": "text"
    }
  ]
}
PATCH/v1/support/tickets/{id}

Ticket-Status ändern

Pfad-Parameter

  • iduuidPflicht

Request-Body (JSON)

  • status"open" | "in_progress" | "resolved"optional
  • priority"low" | "normal" | "high"optional

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X PATCH "https://api-dowallet.doable.app/v1/support/tickets/{id}" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "status": "open",
  "priority": "low"
}'
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "orgId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "orgName": "Sommer-Aktion",
  "subject": "text",
  "status": "open",
  "priority": "low",
  "createdByName": "Sommer-Aktion",
  "createdByEmail": "kunde@example.de",
  "messageCount": 1,
  "createdAt": "text",
  "lastReplyAt": "text"
}
POST/v1/support/tickets/{id}/messages

Nachricht im Ticket senden

Pfad-Parameter

  • iduuidPflicht

Request-Body (JSON)

  • bodystringPflicht

    1–5000 Zeichen

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/support/tickets/{id}/messages" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "body": "Heute 20 % auf alles. Nur bis Ladenschluss."
}'
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "authorName": "Sommer-Aktion",
  "body": "Heute 20 % auf alles. Nur bis Ladenschluss.",
  "staff": true,
  "createdAt": "text"
}

Datenschutz

Datenexport, Löschung und Betroffenenrechte.

GET/v1/orgs/{orgId}/avv.pdf

Auftragsverarbeitungsvertrag (PDF)

Pfad-Parameter

  • orgIduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/orgs/{orgId}/avv.pdf" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
null
POST/v1/orgs/{orgId}/data-export

Datenexport der Organisation anfordern

DSGVO Art. 20. Asynchron; der Download erscheint unter data-exports.

Pfad-Parameter

  • orgIduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/orgs/{orgId}/data-export" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "kind": "org",
  "orgId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "userId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "status": "queued",
  "archivePath": "text",
  "bytesWritten": "text",
  "error": "text",
  "downloadUrl": "https://example.de/hook",
  "createdAt": "2026-09-15T10:32:00Z",
  "startedAt": "2026-09-15T10:32:00Z",
  "completedAt": "2026-09-15T10:32:00Z",
  "expiresAt": "2026-09-15T10:32:00Z"
}
GET/v1/orgs/{orgId}/data-exports

Datenexporte auflisten

Pfad-Parameter

  • orgIduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/orgs/{orgId}/data-exports" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "data": [
    {
      "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "kind": "org",
      "orgId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "userId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "status": "queued",
      "archivePath": "text",
      "bytesWritten": "text",
      "error": "text",
      "downloadUrl": "https://example.de/hook",
      "createdAt": "2026-09-15T10:32:00Z",
      "startedAt": "2026-09-15T10:32:00Z",
      "completedAt": "2026-09-15T10:32:00Z",
      "expiresAt": "2026-09-15T10:32:00Z"
    }
  ]
}
POST/v1/users/me/data-export

Eigenen Datenexport anfordern

Antworten

  • 200OK
  • 401Nicht angemeldet
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/users/me/data-export" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "kind": "org",
  "orgId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "userId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "status": "queued",
  "archivePath": "text",
  "bytesWritten": "text",
  "error": "text",
  "downloadUrl": "https://example.de/hook",
  "createdAt": "2026-09-15T10:32:00Z",
  "startedAt": "2026-09-15T10:32:00Z",
  "completedAt": "2026-09-15T10:32:00Z",
  "expiresAt": "2026-09-15T10:32:00Z"
}
POST/v1/orgs/{orgId}/data-deletion

Löschung der Organisation einplanen

Mit Karenzzeit; bis dahin abbrechbar. Rechnungen bleiben gemäß Aufbewahrungspflicht.

Pfad-Parameter

  • orgIduuidPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 409Konflikt
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/orgs/{orgId}/data-deletion" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "kind": "org",
  "orgId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "userId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "status": "queued",
  "scheduledFor": "2026-09-15T10:32:00Z",
  "cancelledAt": "2026-09-15T10:32:00Z",
  "executedAt": "2026-09-15T10:32:00Z",
  "createdAt": "2026-09-15T10:32:00Z"
}
POST/v1/users/me/data-deletion

Eigenes Konto löschen

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 409Konflikt
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/users/me/data-deletion" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "kind": "org",
  "orgId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "userId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "status": "queued",
  "scheduledFor": "2026-09-15T10:32:00Z",
  "cancelledAt": "2026-09-15T10:32:00Z",
  "executedAt": "2026-09-15T10:32:00Z",
  "createdAt": "2026-09-15T10:32:00Z"
}
POST/v1/data-deletions/{id}/cancel

Löschung abbrechen

Pfad-Parameter

  • iduuidPflicht

Antworten

  • 204Kein Inhalt
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
  • 409Konflikt
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/data-deletions/{id}/cancel" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort204
(kein Inhalt)

Öffentlich und Geräte

Öffentliche Endpunkte

Öffentliche Endpunkte ohne Token: Landing-Seiten, Pass-Download, Pitch-Demos.

POST/v1/leads

Demo-Anfrage senden

Kontaktformular der Website. Einwilligung ist Pflicht.

Request-Body (JSON)

  • namestringPflicht

    1–200 Zeichen

  • emailemailPflicht
  • companystringoptional

    0–200 Zeichen

  • planInterest"free" | "growth" | "enterprise"optional
  • messagestringoptional

    0–4000 Zeichen

  • sourcestringoptional

    0–80 Zeichen

  • consentbooleanoptional
  • websitestringoptional

Antworten

  • 200OK
  • 422Validierung fehlgeschlagen
  • 429Rate-Limit
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/leads" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Sommer-Aktion",
  "email": "kunde@example.de",
  "company": "text",
  "planInterest": "free",
  "message": "Heute 20 % auf alles. Nur bis Ladenschluss.",
  "source": "text",
  "consent": true,
  "website": "text"
}'
Antwort200
{
  "ok": true,
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01"
}
GET/api/public/branding-assets/{orgId}/{file}

Branding-Datei

Pfad-Parameter

  • orgIduuidPflicht
  • filestringPflicht

Antworten

  • 404Nicht gefunden
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/api/public/branding-assets/{orgId}/{file}" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
GET/api/public/orgs/{id}/branding

Öffentliches Branding einer Organisation

Pfad-Parameter

  • iduuidPflicht

Antworten

  • 200OK
  • 404Nicht gefunden
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/api/public/orgs/{id}/branding" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "logoUrl": "https://example.de/hook",
  "logoWhiteUrl": "https://example.de/hook",
  "primaryColor": "#1a73e8",
  "surfaceColor": "#1a73e8",
  "textColor": "Heute 20 % auf alles. Nur bis Ladenschluss.",
  "mutedColor": "#1a73e8",
  "fontFamily": "text",
  "fontCssSrc": "https://example.de/hook",
  "poweredByDoWallet": true,
  "name": "Sommer-Aktion"
}
GET/api/public/branding/by-subdomain/{sub}

Branding per Subdomain

Pfad-Parameter

  • substringPflicht

Antworten

  • 200OK
  • 404Nicht gefunden
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/api/public/branding/by-subdomain/{sub}" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "orgId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "name": "Sommer-Aktion",
  "logoUrl": "https://example.de/hook",
  "logoWhiteUrl": "https://example.de/hook",
  "primaryColor": "#1a73e8",
  "surfaceColor": "#1a73e8",
  "textColor": "Heute 20 % auf alles. Nur bis Ladenschluss.",
  "mutedColor": "#1a73e8",
  "fontFamily": "text",
  "fontCssSrc": "text",
  "poweredByDoWallet": true
}
POST/api/public/claim/{slug}/redeem

Pass über die Landing-Seite ausstellen

Wird von der Landing-Seite aufgerufen. Liefert die Wallet-Links für Apple und Google; ein Handy erhält pro Landing-Seite einen Pass.

Pfad-Parameter

  • slugstringPflicht

Query-Parameter

  • utm_sourcestringoptional
  • utm_mediumstringoptional
  • utm_campaignstringoptional
  • utm_termstringoptional
  • utm_contentstringoptional

Request-Body (JSON)

  • emailemailoptional
  • namestringoptional

    0–120 Zeichen

  • firstNamestringoptional

    1–80 Zeichen

  • lastNamestringoptional

    1–80 Zeichen

  • consentbooleanoptional
  • platform"apple" | "google" | "both"optional
  • attributesobjectoptional
  • utmobjectoptional
  • sourcestringoptional
  • mediumstringoptional
  • campaignstringoptional
  • termstringoptional
  • contentstringoptional
  • attributionKeystringoptional

    8–128 Zeichen

Antworten

  • 200OK
  • 404Nicht gefunden
  • 409Konflikt
  • 422Validierung fehlgeschlagen
  • 429Rate-Limit
  • 503Nicht verfügbar
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/api/public/claim/{slug}/redeem?utm_source=text&utm_medium=text&utm_campaign=text" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "email": "kunde@example.de",
  "name": "Sommer-Aktion",
  "firstName": "Sommer-Aktion",
  "lastName": "Sommer-Aktion",
  "consent": true,
  "platform": "both",
  "attributes": {},
  "utm": {
    "source": "text",
    "medium": "text",
    "campaign": "text",
    "term": "text",
    "content": "text"
  },
  "attributionKey": "text"
}'
Antwort200
{
  "passId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "serial": "ABC123456",
  "code": "text",
  "platform": "apple",
  "apple": {
    "downloadUrl": "https://example.de/hook"
  },
  "google": {
    "saveUrl": "https://example.de/hook"
  }
}
POST/api/public/passes/{serial}/link-customer

Kontaktdaten mit Einwilligung hinterlegen

Name und E-Mail zu einem Pass, autorisiert über den signierten Link aus dem Pass. Einwilligung ist Pflicht.

Pfad-Parameter

  • serialstringPflicht

Query-Parameter

  • tstringPflicht

Request-Body (JSON)

  • emailemailPflicht

    0–240 Zeichen

  • firstNamestringPflicht

    1–80 Zeichen

  • lastNamestringPflicht

    1–80 Zeichen

  • consenttruePflicht
  • locale"de" | "en"optional

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 404Nicht gefunden
  • 422Validierung fehlgeschlagen
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/api/public/passes/{serial}/link-customer?t=text" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "email": "kunde@example.de",
  "firstName": "Sommer-Aktion",
  "lastName": "Sommer-Aktion",
  "consent": true,
  "locale": "de"
}'
Antwort200
{
  "ok": true,
  "customerId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01"
}

Einbettung

Add-to-Wallet-Button in deiner eigenen Website oder App. Ablauf: dein Server stellt mit einem API-Token einen kurzlebigen SDK-Token aus (POST /v1/sdk-tokens), dein Frontend liest damit Templates und Design (GET /v1/embed/templates) und zeigt den Button; das Ausstellen läuft über die Landing-Seiten-API. Benötigt die Embed-SDK-Freigabe der Organisation.

GET/v1/embed/templates

Templates für die Einbettung

Veröffentlichte Templates des Workspace, die der SDK-Token ausstellen darf.

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/embed/templates" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "data": [
    {
      "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
      "name": "Sommer-Aktion",
      "passType": "text",
      "status": "active"
    }
  ]
}
GET/v1/embed/template

Template für die Einbettung lesen

Design und Felder eines Templates für die Vorschau im eingebetteten Button.

Query-Parameter

  • templateIduuidoptional

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/embed/template?templateId=3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "name": "Sommer-Aktion",
  "passType": "text",
  "status": "active",
  "organizationName": "Sommer-Aktion",
  "walletDocument": null
}
PATCH/v1/embed/template

Template über das SDK anpassen

Begrenzte Änderungen (Texte, Farben) mit einem SDK-Token mit Schreib-Scope, z. B. für personalisierte Buttons.

Request-Body (JSON)

  • templateIduuidoptional
  • walletDocumentobjectPflicht

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X PATCH "https://api-dowallet.doable.app/v1/embed/template" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "templateId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "walletDocument": null
}'
Antwort200
{
  "id": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "draftVersion": 1
}

SDK-Tokens

Kurzlebige SDK-Tokens mit Scopes, die dein Frontend statt des API-Tokens verwendet. Der API-Token bleibt auf dem Server.

POST/v1/sdk-tokens

SDK-Token ausstellen

Kurzlebiger Token für den Add-to-Wallet-Button in deiner Website oder App. Benötigt die Embed-SDK-Freigabe der Organisation. Scopes begrenzen den Token auf Vorschau, Ausstellen oder Branding.

Request-Body (JSON)

  • workspaceIduuidPflicht
  • templateIduuidoptional
  • scopes"workspace:read" | "workspace:write" | "template:read" | "template:write" | "pass:read" | "pass:write" | "campaign:read" | "campaign:write" | "user:read" | "user:write"[]Pflicht

    1–∞ Einträge

  • endUserobjectoptional
  • externalIdstringoptional

    0–200 Zeichen

  • emailemailoptional
  • ttlSecondsintegeroptional

    60 bis 7200

Antworten

  • 200OK
  • 401Nicht angemeldet
  • 403Keine Berechtigung
  • 404Nicht gefunden
Anfragecurl
curl -X POST "https://api-dowallet.doable.app/v1/sdk-tokens" \
  -H "Authorization: Bearer $DOWALLET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "templateId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "scopes": [
    "workspace:read"
  ],
  "endUser": {
    "externalId": "bon-4711",
    "email": "kunde@example.de"
  },
  "ttlSeconds": 60
}'
Antwort200
{
  "token": "dwlt_xxxxxxxxxxxxxxxxxxxxxxxx",
  "expiresAt": "2026-09-15T10:32:00Z",
  "scopes": [
    "text"
  ]
}
GET/v1/sdk-tokens/me

SDK-Token prüfen

Liefert Organisation, Workspace und Scopes des Tokens. Nützlich beim Start deiner Einbettung.

Antworten

  • 200OK
  • 401Nicht angemeldet
Anfragecurl
curl -X GET "https://api-dowallet.doable.app/v1/sdk-tokens/me" \
  -H "Authorization: Bearer $DOWALLET_TOKEN"
Antwort200
{
  "orgId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "workspaceId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "templateId": "3f2c1b7e-8d4a-4c6e-9b1f-2a7d5e6c9f01",
  "scopes": [
    "text"
  ],
  "endUser": {}
}