Entwickler
API-Referenz
Alle öffentlichen Endpunkte der VentionDesk-API. Die Liste entsteht aus den registrierten Routen des Servers; die Zugriffsregel je Endpunkt stammt aus den Prüfungen an der Route, die Tabellen aus den Zod-Verträgen, mit denen VentionDesk Anfragen prüft und Antworten formt. Was hier steht, ist also das, was der Server tatsächlich tut.
Adressen beginnen mit https://api.ventiondesk.com. Anmeldung, Scopes, Fehlerform und Rate Limits erklärt API-Grundlagen. Pflichtfelder sind mit * markiert; ein Endpunkt ohne Tabelle prüft seinen Rumpf mit einem Vertrag, der nicht veröffentlicht ist, oder hat keinen.
Zugriff liest sich so: „Inhaber" und „Inhaber und Mitarbeitende" heißt eine angemeldete Person in der Weboberfläche; mit einem API-Schlüssel antworten solche Endpunkte mit 403. Endpunkte mit Scope erreichen auch Agenten-Schlüssel, die diesen Scope tragen.
Aufgaben
GET/v1/tasks
Aufgaben lesen, gefiltert nach Projekt, Status, Zuständigkeit oder Suchtext.
Zugriff Inhaber, Mitarbeitende oder Agenten-Schlüssel mit Scope tasks:read
Abfrageparameter
| Feld | Typ | Hinweis |
|---|---|---|
| project | UUID | |
| projectSlug | Text | |
| status | "hold" | "todo" | "in_progress" | "question" | "review" | "done" | |
| assignee | "owner" | "staff" | "claude" | "external" | |
| claimable | "true" | "false" | |
| maxAttempts | Ganzzahl | ≥ 1 · ≤ 20 · Vorgabe: 3 |
| limit | Ganzzahl | ≥ 1 · ≤ 100 · Vorgabe: 20 |
| q | Text | mind. 1 Zeichen |
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| tasks | Liste aus Objekt |
POST/v1/tasks
Eine Aufgabe anlegen; ähnliche offene Aufgaben werden als Dublette erkannt.
Zugriff Inhaber, Mitarbeitende oder Agenten-Schlüssel mit Scope tasks:write
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| projectId | UUID | |
| projectSlug | Text | |
| title * | Text | mind. 25 Zeichen |
| descriptionMd | Text | mind. 1 Zeichen |
| area | "frontend" | "backend" | "design" | "infra" | "support" | |
| dueDate | Datum (JJJJ-MM-TT) | |
| estimateMinutes | Ganzzahl | > 0 |
| triggerCondition | Text | mind. 1 Zeichen |
| evidence | Text | mind. 1 Zeichen |
GET/v1/tasks/:id
Eine Aufgabe mit Beschreibung, Rückmeldungen und Anhängen.
Zugriff Inhaber, Mitarbeitende oder Agenten-Schlüssel mit Scope tasks:read
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| task | Objekt | |
| results | Liste aus Objekt | |
| attachments | Liste aus Objekt |
PATCH/v1/tasks/:id
Felder einer Aufgabe ändern.
Zugriff Inhaber, Mitarbeitende oder Agenten-Schlüssel mit Scope tasks:write
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| title | Text | mind. 1 Zeichen |
| descriptionMd | Text oder null | |
| status | "hold" | "todo" | "in_progress" | "question" | "review" | "done" | |
| assignee | "owner" | "staff" | "claude" | "external" oder null | |
| area | "frontend" | "backend" | "design" | "infra" | "support" oder null | |
| dueDate | Datum (JJJJ-MM-TT) oder null | |
| estimateMinutes | Ganzzahl oder null | > 0 |
| position | Text | mind. 1 Zeichen |
| triggerCondition | Text oder null |
POST/v1/tasks/:id/claim
Eine Aufgabe atomar übernehmen — zwei Läufe bekommen nie dieselbe.
Zugriff Inhaber, Mitarbeitende oder Agenten-Schlüssel mit Scope tasks:write
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| maxAttempts | Ganzzahl | ≥ 1 · ≤ 20 · Vorgabe: 3 |
| runId | UUID |
POST/v1/tasks/:id/decision
Freigabe oder Absage eines Menschen auf eine Rückmeldung; eine Absage verlangt einen Kommentar.
Zugriff Inhaber und Mitarbeitende
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| decision * | "approved" | "rejected" | |
| commentMd | Text | mind. 1 Zeichen · höchstens 20000 Zeichen |
| attachmentIds | Liste aus UUID | Vorgabe: [] |
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| task | Objekt | |
| result | Objekt |
POST/v1/tasks/:id/handoff
Eine Aufgabe an Claude übergeben.
Zugriff Inhaber, Mitarbeitende oder Agenten-Schlüssel mit Scope tasks:write
POST/v1/tasks/:id/result
Den Stand einer Aufgabe zurückmelden (arbeitet, kontrolle, frage, master, blockiert, erledigt).
Zugriff Inhaber, Mitarbeitende oder Agenten-Schlüssel mit Scope tasks:write
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| state * | "arbeitet" | "kontrolle" | "frage" | "master" | "blockiert" | "erledigt" | |
| summaryMd | Text | mind. 1 Zeichen |
| detailsMd | Text | mind. 1 Zeichen |
| prUrl | URL | |
| evidence | Text | mind. 1 Zeichen |
| runId | UUID |
Agenten-Läufe
POST/v1/agent/runs
Einen Lauf eines Agenten beginnen.
Zugriff nur Agenten-Schlüssel mit Scope agent:run
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| projectId | UUID | |
| projectSlug | Text | |
| meta | Objekt (frei) | Vorgabe: {} |
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| run | Objekt |
POST/v1/agent/runs/:id/finish
Einen Agentenlauf abschließen, mit Zusammenfassung oder Fehlerstatus.
Zugriff nur Agenten-Schlüssel
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| status * | "succeeded" | "failed" | |
| summary | Text | mind. 1 Zeichen |
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| run | Objekt |
POST/v1/agent/runs/:id/heartbeat
Lebenszeichen eines laufenden Agentenlaufs.
Zugriff nur Agenten-Schlüssel
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| run | Objekt |
Projekte
POST/v1/errors/:id/task
Aus einem Fehler eine Aufgabe anlegen.
Zugriff Inhaber und Mitarbeitende
GET/v1/errors/summary
Fehlerzahlen über alle Projekte für die Übersicht.
Zugriff Inhaber und Mitarbeitende
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| projects | Liste aus Objekt |
POST/v1/monitors/probe
Eine Monitor-Adresse vor dem Anlegen prüfen und Weiterleitungen samt Endziel melden.
Zugriff Inhaber und Mitarbeitende
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| url * | URL | höchstens 2048 Zeichen |
GET/v1/projects
Projekte, die das Konto oder der Schlüssel sehen darf.
Zugriff Inhaber, Mitarbeitende oder Agenten-Schlüssel mit Scope projects:read
Abfrageparameter
| Feld | Typ | Hinweis |
|---|---|---|
| status | "active" | "blocked" | "review" | "paused" | |
| includeArchived | "true" | "false" | |
| q | Text | mind. 1 Zeichen |
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| projects | Liste aus Objekt |
GET/v1/projects/:id
Ein Projekt über seine ID.
Zugriff Inhaber, Mitarbeitende oder Agenten-Schlüssel mit Scope projects:read
PATCH/v1/projects/:id/customer
Ein Projekt einem anderen Kunden zuordnen; Tickets, Entwürfe und Dokumente ziehen mit.
Zugriff Inhaber
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| customerId * | UUID |
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| project | Objekt | |
| changed | true | false | |
| moved | Objekt |
GET/v1/projects/:id/deploy
Welche Deploy-Ziele es gibt und was jedem fehlt.
Zugriff Inhaber
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| targets | Liste aus Objekt |
POST/v1/projects/:id/deploy
Einen Deploy anstoßen (202: angestoßen, nicht erfolgreich).
Zugriff Inhaber
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| target * | "production" | "staging" | "preview" | |
| provider | "vercel" | "render" |
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| provider | "vercel" | "render" | |
| target | "production" | "staging" | "preview" | |
| externalId | Text oder null | |
| started | Ganzzahl | > 0 |
POST/v1/projects/:id/error-sources
Ein Projekt beim Fehler-Tracker diesem Projekt zuordnen.
Zugriff Inhaber und Mitarbeitende
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| provider * | "sentry" | "bugsnag" | "rollbar" | |
| externalId * | Text | mind. 1 Zeichen · höchstens 200 Zeichen |
DELETE/v1/projects/:id/error-sources/:sourceId
Eine Fehlerquelle vom Projekt lösen.
Zugriff Inhaber und Mitarbeitende
GET/v1/projects/:id/errors
Fehler aus Sentry, Bugsnag oder Rollbar zu diesem Projekt.
Zugriff Inhaber und Mitarbeitende
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| issues | Liste aus Objekt | |
| stats | Objekt | |
| sources | Liste aus Objekt | |
| providers | Liste aus "sentry" | "bugsnag" | "rollbar" |
GET/v1/projects/:id/hosting
Die Hosting-Zuordnungen des Projekts.
Zugriff Inhaber und Mitarbeitende
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| mappings | Liste aus Objekt | |
| providers | Liste aus "netlify" | "cloudflare_pages" | "aws_amplify" | "railway" | "flyio" | "digitalocean_app_platform" |
POST/v1/projects/:id/hosting
Eine Site, App oder einen Dienst beim Hosting-Anbieter zuordnen.
Zugriff Inhaber und Mitarbeitende
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| provider * | "netlify" | "cloudflare_pages" | "aws_amplify" | "railway" | "flyio" | "digitalocean_app_platform" | |
| externalId * | Text | mind. 1 Zeichen · höchstens 200 Zeichen |
DELETE/v1/projects/:id/hosting/:mappingId
Eine Hosting-Zuordnung entfernen.
Zugriff Inhaber und Mitarbeitende
DELETE/v1/projects/:id/render-services/:serviceId
Eine veraltete Render-Dienstkennung vom Projekt lösen.
Zugriff Inhaber
POST/v1/projects/:id/sync
GitHub-Daten des Projekts sofort abgleichen statt erst nachts.
Zugriff Inhaber und Mitarbeitende
GET/v1/projects/by-slug/:slug
Ein Projekt über seinen Slug.
Zugriff Inhaber, Mitarbeitende oder Agenten-Schlüssel mit Scope projects:read
Vorgänge
GET/v1/tickets
Vorgänge lesen, gefiltert nach Status, Kanal, Priorität, Projekt oder Kunde.
Zugriff Inhaber und Mitarbeitende (Scope tickets:read ist für Agenten-Schlüssel gesperrt)
Abfrageparameter
| Feld | Typ | Hinweis |
|---|---|---|
| status | "open" | "in_progress" | "waiting" | "resolved" | |
| source | "contact_form" | "app" | "email" | "monitor" | "portal" | "phone" | "on_site" | "stripe" | "api" | |
| priority | "low" | "normal" | "high" | "critical" | |
| project | UUID | |
| projectSlug | Text | |
| customer | UUID | |
| withSla | "true" | "false" | |
| q | Text | mind. 1 Zeichen |
| limit | Ganzzahl | ≥ 1 · ≤ 100 · Vorgabe: 50 |
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| tickets | Liste aus Objekt |
POST/v1/tickets
Einen Vorgang anlegen, etwa nach einem Anruf.
Zugriff Inhaber und Mitarbeitende (Scope tickets:write ist für Agenten-Schlüssel gesperrt)
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| subject * | Text | mind. 3 Zeichen |
| bodyMd * | Text | mind. 1 Zeichen |
| source * | "contact_form" | "app" | "email" | "monitor" | "portal" | "phone" | "on_site" | "stripe" | "api" | |
| customerId | UUID oder null | |
| projectId | UUID oder null | |
| priority | "low" | "normal" | "high" | "critical" | Vorgabe: "normal" |
| requesterName | Text | |
| requesterEmail | ||
| requesterMeta | Objekt (frei) |
DELETE/v1/tickets/:id
Einen Vorgang löschen.
Zugriff Inhaber und Mitarbeitende
GET/v1/tickets/:id
Ein Vorgang samt Verlauf.
Zugriff Inhaber und Mitarbeitende (Scope tickets:read ist für Agenten-Schlüssel gesperrt)
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| ticket | Objekt | |
| messages | Liste aus Objekt |
PATCH/v1/tickets/:id
Betreff, Status, Priorität, Kanal, Kunde, Projekt, Zuständigkeit oder Portalfreigabe eines Vorgangs ändern.
Zugriff Inhaber und Mitarbeitende
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| subject | Text | mind. 3 Zeichen |
| status | "open" | "in_progress" | "waiting" | "resolved" | |
| priority | "low" | "normal" | "high" | "critical" | |
| source | "contact_form" | "app" | "email" | "monitor" | "portal" | "phone" | "on_site" | "stripe" | "api" | |
| customerId | UUID oder null | |
| projectId | UUID oder null | |
| assignedTo | UUID oder null | |
| portalVisible | true | false |
POST/v1/tickets/:id/messages
Einen Eintrag in den Verlauf schreiben: interne Notiz oder Entwurf. Es geht keine Mail hinaus.
Zugriff Inhaber und Mitarbeitende (Scope tickets:write ist für Agenten-Schlüssel gesperrt)
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| bodyMd * | Text | mind. 1 Zeichen |
| isInternalNote | true | false | Vorgabe: false |
| isDraft | true | false | Vorgabe: false |
POST/v1/tickets/:id/reply
Dem Kunden antworten — der einzige Weg, auf dem eine Mail hinausgeht. Setzt den Vorgang auf „wartet".
Zugriff Inhaber und Mitarbeitende
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| bodyMd * | Text | mind. 1 Zeichen |
| isInternalNote | true | false | Vorgabe: false |
| isDraft | true | false | Vorgabe: false |
| draftId | UUID |
POST/v1/tickets/:id/to-task
Aus einem Vorgang eine Aufgabe anlegen.
Zugriff Inhaber und Mitarbeitende
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| projectId * | UUID | |
| title | Text | mind. 10 Zeichen |
| assignee | "owner" | "staff" | "claude" | "external" oder null |
GET/v1/tickets/attachments/:id/url
Kurzlebige Adresse für einen Anhang eines Vorgangs.
Zugriff Inhaber und Mitarbeitende
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| url | URL | |
| expiresInSeconds | Ganzzahl | > 0 |
Notizen
POST/v1/notes
Eine Notiz an einem Projekt anlegen (Projekt-ID oder Slug).
Zugriff Inhaber, Mitarbeitende oder Agenten-Schlüssel mit Scope notes:write
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| projectId | UUID | |
| projectSlug | Text | |
| bodyMd * | Text | mind. 1 Zeichen |
| kind | "idea" | "decision" | "risk" | Vorgabe: "idea" |
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| note | Objekt |
POST/v1/notes/:id/to-task
Aus einer Notiz eine Aufgabe anlegen.
Zugriff Inhaber und Mitarbeitende
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| title | Text | mind. 25 Zeichen |
| assignee | "owner" | "staff" | "claude" | "external" oder null |
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| ok | false | |
| error | Text | |
| code | "note_already_converted" | |
| task | Objekt |
Zeit
GET/v1/time/entries
Zeiteinträge lesen.
Zugriff Inhaber und Mitarbeitende
Abfrageparameter
| Feld | Typ | Hinweis |
|---|---|---|
| from | Text | |
| to | Text | |
| project | UUID | |
| user | UUID | |
| unbilled | "true" | "false" | |
| limit | Ganzzahl | ≥ 1 · ≤ 500 · Vorgabe: 200 |
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| entries | Liste aus Objekt |
POST/v1/time/entries
Zeit nachtragen.
Zugriff Inhaber und Mitarbeitende
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| label * | Text | mind. 1 Zeichen |
| startedAt * | Zeitpunkt (ISO 8601) | |
| endedAt * | Zeitpunkt (ISO 8601) | |
| seconds | Ganzzahl | > 0 |
| projectId | UUID oder null | |
| ticketId | UUID oder null | |
| taskId | UUID oder null | |
| billable | true | false | Vorgabe: true |
DELETE/v1/time/entries/:id
Einen Zeiteintrag löschen.
Zugriff Inhaber und Mitarbeitende
PATCH/v1/time/entries/:id
Einen Zeiteintrag ändern.
Zugriff Inhaber und Mitarbeitende
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| label | Text | mind. 1 Zeichen |
| seconds | Ganzzahl | > 0 |
| billable | true | false | |
| projectId | UUID oder null | |
| ticketId | UUID oder null |
GET/v1/time/timer
Den laufenden Timer des Kontos.
Zugriff Inhaber und Mitarbeitende
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| timer | Objekt oder null |
POST/v1/time/timer/start
Den Timer starten.
Zugriff Inhaber und Mitarbeitende
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| label | Text | Vorgabe: "" |
| projectId | UUID oder null | |
| ticketId | UUID oder null | |
| taskId | UUID oder null |
POST/v1/time/timer/stop
Den Timer stoppen und die Zeit als Eintrag erfassen.
Zugriff Inhaber und Mitarbeitende
GET/v1/time/unbilled
Abrechenbare, noch nicht berechnete Stunden je Projekt samt Betrag.
Zugriff Inhaber
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| projects | Liste aus Objekt | |
| totals | Objekt |
Kunden
DELETE/v1/customers/:id
Einen Kunden samt Dateien löschen.
Zugriff Inhaber
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| customerId | UUID | |
| shortName | Text | |
| impact | Objekt | |
| files | Objekt | |
| portalAccounts | Objekt |
GET/v1/customers/:id/deletion
Vorschau, was beim Löschen eines Kunden mit entfernt würde.
Zugriff Inhaber
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| customerId | UUID | |
| shortName | Text | |
| deletable | true | false | |
| reason | Text oder null | |
| blockers | Objekt | |
| impact | Objekt |
POST/v1/customers/:id/portal-access
Einem Ansprechpartner Zugang zum Kundenportal geben.
Zugriff Inhaber
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| email * | ||
| displayName | Text | mind. 1 Zeichen |
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| access | Objekt | |
| Objekt |
DELETE/v1/customers/:id/portal-access/:userId
Einem Konto den Portalzugang entziehen. Ein schon ausgegebenes Token gilt bis zu seiner Erneuerung.
Zugriff Inhaber
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| revoked | Objekt |
POST/v1/customers/:id/portal-access/:userId/invite
Die Einladung ins Kundenportal erneut senden.
Zugriff Inhaber
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| Objekt |
Dokumente
GET/v1/documents
Dokumente lesen, gefiltert nach Kunde, Projekt oder Typ.
Zugriff jedes angemeldete Konto; was es sieht, entscheidet seine Rolle
Abfrageparameter
| Feld | Typ | Hinweis |
|---|---|---|
| customer | UUID | |
| project | UUID | |
| type | "pdf" | "image" | "sheet" | "contract" | "other" | |
| q | Text | mind. 1 Zeichen · höchstens 120 Zeichen |
| limit | Ganzzahl | ≥ 1 · ≤ 200 · Vorgabe: 50 |
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| documents | Liste aus Objekt |
PATCH/v1/documents/:id
Zuordnung, Typ, Schlagwörter oder Portalfreigabe eines Dokuments ändern.
Zugriff jedes angemeldete Konto; was es sieht, entscheidet seine Rolle
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| name | Text | mind. 1 Zeichen · höchstens 200 Zeichen |
| type | "pdf" | "image" | "sheet" | "contract" | "other" | |
| projectId | UUID oder null | |
| sharedWithPortal | true | false | |
| tags | Liste aus Text |
GET/v1/documents/:id/url
Kurzlebige Adresse zum Herunterladen eines Dokuments.
Zugriff jedes angemeldete Konto; was es sieht, entscheidet seine Rolle
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| url | URL | |
| expiresInSeconds | Ganzzahl | > 0 |
Finanzen
GET/v1/finance/export
Jahresexport für die Steuerberatung: ZIP mit einer CSV je Tabelle und den abgelegten Belegen.
Zugriff Inhaber
GET/v1/invoices
Rechnungen lesen, gefiltert nach Status, Kunde oder „überfällig“.
Zugriff Inhaber
Abfrageparameter
| Feld | Typ | Hinweis |
|---|---|---|
| status | "draft" | "open" | "overdue" | "paid" | "cancelled" | |
| customer | UUID | |
| overdue | "true" | "false" | |
| limit | Ganzzahl | ≥ 1 · ≤ 200 · Vorgabe: 50 |
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| invoices | Liste aus Objekt |
POST/v1/invoices
Einen Rechnungsentwurf anlegen — noch ohne Rechnungsnummer.
Zugriff Inhaber
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| customerId * | UUID | |
| projectId | UUID oder null | |
| paymentTermsDays | Ganzzahl | ≥ 1 · ≤ 90 |
| vatRate | Ganzzahl | |
| vatScheme | "standard" | "reverse_charge" | |
| serviceFrom | Text | festes Muster |
| serviceTo | Text | festes Muster |
| serviceDateEqualsInvoiceDate | true | false | Vorgabe: false |
| positions | Liste aus Objekt | Vorgabe: [] |
GET/v1/invoices/:id
Eine Rechnung mit Positionen, Summen und Zahlungen.
Zugriff Inhaber
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| invoice | Objekt | |
| positions | Liste aus Objekt |
POST/v1/invoices/:id/cancel
Eine finalisierte Rechnung stornieren; es entsteht ein Stornobeleg.
Zugriff Inhaber
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| reason * | Text | mind. 3 Zeichen · höchstens 500 Zeichen |
| serviceRendered * | true | false |
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| invoice | Objekt | |
| releasedEntries | Ganzzahl | ≥ 0 |
| entries | "released" | "failed" | |
| correction | "stored" | "skipped" | "failed" | |
| taxOfficeConsent | true | false |
GET/v1/invoices/:id/cancellation/pdf
Den Stornobeleg als PDF.
Zugriff Inhaber
POST/v1/invoices/:id/cancellation/send
Den Stornobeleg per Mail senden.
Zugriff Inhaber
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| "sent" | "skipped" | ||
| reason | Text | kann fehlen |
| invoice | Objekt |
POST/v1/invoices/:id/dunning/send
Die fällige Mahnstufe senden.
Zugriff Inhaber
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| "sent" | "skipped" | ||
| reason | Text | kann fehlen |
| invoice | Objekt | |
| level | Ganzzahl oder null | ≥ 1 · ≤ 4 |
POST/v1/invoices/:id/finalize
Einen Entwurf finalisieren: vergibt die fortlaufende Nummer, sperrt die Rechnung und legt das PDF ab.
Zugriff Inhaber
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| settle | Objekt |
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| invoice | Objekt | |
| "stored" | "skipped" | "failed" | ||
| payment | "none" | "booked" | "failed" | |
| paymentError | Text | kann fehlen |
POST/v1/invoices/:id/payments
Eine Zahlung oder Rückzahlung erfassen.
Zugriff Inhaber
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| amountCents * | Ganzzahl | |
| paidOn | Text | festes Muster |
| method | "transfer" | "stripe" | "cash" | "other" | Vorgabe: "transfer" |
| note | Text | höchstens 500 Zeichen |
GET/v1/invoices/:id/pdf
Die Rechnung als PDF — der beim Finalisieren abgelegte Beleg.
Zugriff Inhaber
POST/v1/invoices/:id/positions
Eine Position an einen Entwurf anhängen.
Zugriff Inhaber
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| description * | Text | mind. 1 Zeichen |
| quantity * | Zahl | > 0 |
| unit | "hour" | "flat" | Vorgabe: "hour" |
| unitPriceCents * | Ganzzahl | ≥ 0 |
| sort | Ganzzahl |
POST/v1/invoices/:id/remind
Eine Zahlungserinnerung senden.
Zugriff Inhaber
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| "sent" | "skipped" | ||
| reason | Text | kann fehlen |
| invoice | Objekt |
POST/v1/invoices/:id/send
Eine finalisierte Rechnung per Mail versenden.
Zugriff Inhaber
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| "sent" | "skipped" | ||
| reason | Text | kann fehlen |
| invoice | Objekt |
GET/v1/invoices/:id/stripe-refund
Ob und in welcher Höhe sich eine Stripe-Zahlung erstatten lässt.
Zugriff Inhaber
POST/v1/invoices/:id/stripe-refund
Eine über Stripe bezahlte Rechnung über Stripe erstatten; gebucht wird über den Webhook.
Zugriff Inhaber
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| amountCents | Ganzzahl | > 0 |
GET/v1/invoices/:id/test-pay-link
Einen Bezahllink im Stripe-Testmodus zum Ausprobieren.
Zugriff Inhaber
POST/v1/invoices/from-unbilled
Aus den offenen, abrechenbaren Stunden eines Projekts einen Rechnungsentwurf machen — je Zeiteintrag eine Position.
Zugriff Inhaber
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| projectId * | UUID | |
| untilDate | Text | |
| paymentTermsDays | Ganzzahl | ≥ 1 · ≤ 90 |
| vatRate | Ganzzahl | |
| vatScheme | "standard" | "reverse_charge" |
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| invoice | Objekt | |
| entries | Ganzzahl | ≥ 0 |
| hours | Zahl | ≥ 0 |
GET/v1/quotes
Angebote lesen.
Zugriff Inhaber
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| quotes | Liste aus Objekt |
POST/v1/quotes
Einen Angebotsentwurf anlegen.
Zugriff Inhaber
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| title * | Text | mind. 3 Zeichen |
| customerId | UUID oder null | |
| prospectName | Text | |
| prospectEmail | ||
| projectId | UUID oder null | |
| validUntil | Text | |
| vatRate | Ganzzahl | |
| vatScheme | "standard" | "reverse_charge" | |
| positions | Liste aus Objekt | Vorgabe: [] |
GET/v1/quotes/:id/pdf
Ein Angebot als PDF.
Zugriff Inhaber
POST/v1/quotes/:id/send
Ein Angebot per Mail versenden.
Zugriff Inhaber
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| "sent" | "skipped" | ||
| reason | Text | kann fehlen |
| quote | Objekt |
Anbindungen
GET/v1/integrations
Die verbundenen Quellen des Betriebs, ohne Geheimnisse.
Zugriff Inhaber und Mitarbeitende
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| integrations | Liste aus Objekt | |
| plattform | true | false | |
| githubInstallierbar | true | false |
POST/v1/integrations
Eine Quelle verbinden. Der Zugang wird beim Anbieter geprüft, bevor er gespeichert wird.
Zugriff Inhaber
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| provider * | "vercel" | "render" | "netlify" | "cloudflare_pages" | "aws_amplify" | "railway" | "flyio" | "digitalocean_app_platform" | "postmark" | "mailgun" | "amazon_ses" | "resend" | "sentry" | "bugsnag" | "rollbar" | "stripe" | |
| fields * | Objekt (frei) |
DELETE/v1/integrations/:id
Eine Anbindung entfernen.
Zugriff Inhaber
PATCH/v1/integrations/:id
Eine Anbindung bearbeiten; ein leeres Geheimnis bleibt unverändert.
Zugriff Inhaber
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| fields * | Objekt (frei) |
GET/v1/integrations/:id/webhook
Die Webhook-Adresse einer Anbindung (Stripe, Sentry, Bugsnag, Rollbar) zum Eintragen beim Anbieter.
Zugriff Inhaber
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| url | URL | |
| signiert | true | false | |
| bereit | true | false |
GET/v1/integrations/:provider/error-projects
Projekte, die der Zugang beim Fehler-Tracker sieht.
Zugriff Inhaber und Mitarbeitende
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| resources | Liste aus Objekt |
GET/v1/integrations/:provider/resources
Sites, Apps oder Dienste, die der Hosting-Zugang beim Anbieter sieht.
Zugriff Inhaber und Mitarbeitende
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| resources | Liste aus Objekt |
GET/v1/integrations/github/callback
Rückweg von GitHub nach der Installation; bindet die Installation an den Betrieb.
Zugriff signierter state und GitHub-Anmeldung
Abfrageparameter
| Feld | Typ | Hinweis |
|---|---|---|
| installation_id | Text | festes Muster |
| setup_action | Text | höchstens 20 Zeichen |
| code | Text | höchstens 200 Zeichen |
| state | Text | höchstens 2000 Zeichen |
POST/v1/integrations/github/install-url
Adresse zur Installation der VentionDesk-App auf GitHub.
Zugriff Inhaber
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| url | URL |
Konto, Einstellungen und Verwaltung
GET/v1/admin/api-keys
Die API-Schlüssel des Betriebs, ohne Klartext.
Zugriff Inhaber
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| keys | Liste aus Objekt |
POST/v1/admin/api-keys
Einen Agenten- oder Eingangs-Schlüssel anlegen. Der Klartext steht nur in dieser einen Antwort.
Zugriff Inhaber
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| name * | Text | mind. 3 Zeichen |
| kind | "agent" | "intake" | Vorgabe: "agent" |
| scopes * | Liste aus "projects:read" | "tasks:read" | "tasks:write" | "tickets:read" | "tickets:write" | "notes:write" | "deployments:read" | "agent:run" | "intake:write" | "access-log:write" | |
| projectIds * | Liste aus UUID oder null | |
| expiresAt | Zeitpunkt (ISO 8601) |
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| key | Objekt | |
| plaintext | Text |
DELETE/v1/admin/api-keys/:id
Einen Schlüssel zurückziehen — wirkt sofort.
Zugriff Inhaber
DELETE/v1/admin/api-keys/:id/endgueltig
Einen zurückgezogenen Schlüssel endgültig löschen.
Zugriff Inhaber
GET/v1/admin/members
Die Mitglieder des Betriebs mit Rolle.
Zugriff Inhaber
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| members | Liste aus Objekt |
PATCH/v1/admin/members/:id
Die Rolle eines Mitglieds ändern.
Zugriff Inhaber
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| role * | "owner" | "staff" |
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| member | Objekt | |
| activeHere | true | false |
DELETE/v1/admin/users/:id
Ein Portalkonto löschen; Name und Adresse im Verlauf werden vorher pseudonymisiert.
Zugriff Inhaber
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| removed | Objekt | |
| account | "kept" | "deleted" | "locked" |
POST/v1/admin/users/invite
Eine Mitarbeiterin oder einen Mitarbeiter per Mail einladen.
Zugriff Inhaber
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| email * | ||
| role * | "owner" | "staff" | |
| displayName | Text | mind. 1 Zeichen |
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| user | Objekt | |
| existingAccount | true | false | kann fehlen · Vorgabe: false |
GET/v1/me
Das eigene Konto: Rolle, Betrieb, Betriebe zur Auswahl und Adressen der Dienste.
Zugriff jedes angemeldete Konto; was es sieht, entscheidet seine Rolle
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| id | UUID | |
| role | "owner" | "staff" | "customer" | "agent" | |
| customerId | UUID oder null | |
| displayName | Text | mind. 1 Zeichen |
| mfaRequired | true | false | |
| intake | Objekt | |
| organization | Objekt oder null | kann fehlen · Vorgabe: null |
| memberships | Liste aus Objekt | kann fehlen · Vorgabe: [] |
| support | Objekt oder null | kann fehlen |
POST/v1/me/organization
Den aktiven Betrieb wechseln, wenn das Konto mehreren angehört.
Zugriff jedes angemeldete Konto; was es sieht, entscheidet seine Rolle
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| orgId * | UUID |
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| organization | Objekt | |
| role | "owner" | "staff" |
GET/v1/settings
Einstellungen des Betriebs, darunter der Briefkopf für Belege.
Zugriff Inhaber
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| company | Objekt |
PATCH/v1/settings
Einstellungen und Briefkopf ändern.
Zugriff Inhaber
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| company * | Objekt |
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| company | Objekt |
GET/v1/settings/agreements
Stand der Zustimmung zu AGB und AVV.
Zugriff Inhaber
POST/v1/settings/agreements
Einer neuen Fassung von AGB oder AVV zustimmen oder sie ablehnen.
Zugriff Inhaber
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| document * | "agb" | "avv" | |
| version * | Text | mind. 1 Zeichen · höchstens 40 Zeichen |
| decision * | "accepted" | "declined" |
GET/v1/settings/benachrichtigungen
Mail bei neuem Vorgang: an oder aus, Empfänger, Kanäle und Mindest-Priorität.
Zugriff Inhaber
PATCH/v1/settings/benachrichtigungen
Mail bei neuem Vorgang einstellen (nur Inhaber).
Zugriff Inhaber
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| aktiv * | true | false | |
| empfaenger * | Liste aus E-Mail oder null | |
| kanaele * | Liste aus "contact_form" | "app" | "email" | "monitor" | "portal" | "phone" | "on_site" | "stripe" | "api" oder null | |
| mindestPrioritaet * | "low" | "normal" | "high" | "critical" |
GET/v1/settings/mail
Absender für Mails an Kunden und Stand der eigenen Absender-Domain.
Zugriff Inhaber
PATCH/v1/settings/mail
Absendername und Absenderadresse ändern.
Zugriff Inhaber
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| absenderName | Text oder null | höchstens 60 Zeichen |
| postfachname | Text | höchstens 40 Zeichen |
GET/v1/settings/mail-templates
Die Mailvorlagen des Betriebs samt Standardtexten.
Zugriff Inhaber
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| vorlagen | Liste aus Objekt |
DELETE/v1/settings/mail-templates/:kind
Eine Mailvorlage auf den Standardtext zurücksetzen.
Zugriff Inhaber
PUT/v1/settings/mail-templates/:kind
Eine Mailvorlage speichern.
Zugriff Inhaber
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| subject * | Text | mind. 1 Zeichen · höchstens 200 Zeichen |
| html * | Text | mind. 1 Zeichen · höchstens 102400 Zeichen |
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| kind | "invoice_send" | "invoice_reminder" | "dunning" | "invoice_cancellation" | "quote_send" | "ticket_reply" | "ticket_receipt" | "ticket_internal" | "member_invite" | "portal_invite" | "deletion_reminder" | |
| angepasst | true | false | |
| subject | Text oder null | |
| html | Text oder null | |
| aktualisiertAm | Text oder null | |
| bereinigt | true | false |
DELETE/v1/settings/mail/domain
Die eigene Absender-Domain entfernen.
Zugriff Inhaber
POST/v1/settings/mail/domain
Eine eigene Absender-Domain anlegen; die Antwort nennt die DNS-Einträge.
Zugriff Inhaber
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| adresse * | Text | mind. 3 Zeichen · höchstens 254 Zeichen |
POST/v1/settings/mail/domain/verify
Die DNS-Einträge der Absender-Domain prüfen lassen.
Zugriff Inhaber
Abo von VentionDesk
GET/v1/abo
Stand des VentionDesk-Abos des Betriebs: Tarif, Testphase, Sperre.
Zugriff jedes angemeldete Konto; was es sieht, entscheidet seine Rolle
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| betrieb | Text | |
| tarif | "solo" | "team" | "enterprise" | |
| abrechnung | "jaehrlich" | "monatlich" | |
| status | "trial" | "active" | "past_due" | "canceled" | |
| testphaseBis | Text oder null | |
| laufzeitBis | Text oder null | |
| kuendigtZum | Text oder null | kann fehlen · Vorgabe: null |
| loeschungAm | Text oder null | kann fehlen · Vorgabe: null |
| gesperrt | true | false | kann fehlen · Vorgabe: false |
| sperrGrund | "beendet" | "testphase" | "zahlungsverzug" | "anbieter" oder null | kann fehlen · Vorgabe: null |
| sperreAb | Text oder null | kann fehlen · Vorgabe: null |
| plaetze | Ganzzahl oder null | |
| mitglieder | Ganzzahl | |
| stripeKunde | true | false | |
| stripeAbo | true | false | kann fehlen · Vorgabe: false |
| befreit | true | false | |
| stripeBereit | true | false |
POST/v1/abo/cancel
Das VentionDesk-Abo zum Ende der Laufzeit kündigen.
Zugriff Inhaber
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| nonce * | Text | festes Muster |
| grund | "too_expensive" | "missing_features" | "switched_service" | "unused" | "too_complex" | "low_quality" | "customer_service" | "other" | |
| kommentar | Text | höchstens 500 Zeichen |
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| angenommen | true | |
| ausstehend | true | false | kann fehlen |
| hinweis | Text | kann fehlen |
POST/v1/abo/change
Tarif oder Zahlungsweise des VentionDesk-Abos wechseln.
Zugriff Inhaber
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| tarif * | "solo" | "team" | "enterprise" | |
| abrechnung * | "jaehrlich" | "monatlich" | |
| plaetze * | Ganzzahl | ≥ 1 · ≤ 10000 |
| nonce * | Text | festes Muster |
POST/v1/abo/checkout
Ein VentionDesk-Abo abschließen (leitet zu Stripe Checkout).
Zugriff Inhaber
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| tarif * | "solo" | "team" | "enterprise" | |
| abrechnung * | "jaehrlich" | "monatlich" |
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| url | URL |
GET/v1/abo/export
Datenexport des ganzen Betriebs als ZIP (Aufbau siehe Datenexport).
Zugriff Inhaber
POST/v1/abo/preview
Vorschau eines Tarifwechsels mit dem anteiligen Betrag.
Zugriff Inhaber
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| tarif * | "solo" | "team" | "enterprise" | |
| abrechnung * | "jaehrlich" | "monatlich" | |
| plaetze * | Ganzzahl | ≥ 1 · ≤ 10000 |
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| waehrung | Text | |
| anteiligCent | Ganzzahl | |
| rechnungCent | Ganzzahl | |
| steuerCent | Ganzzahl | |
| sofortCent | Ganzzahl | |
| faelligAm | Text oder null | |
| imTest | true | false |
GET/v1/abo/rechnungen
Die Rechnungen von VentionDesk an den Betrieb.
Zugriff Inhaber
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| rechnungen | Liste aus Objekt |
POST/v1/abo/resume
Eine Kündigung zurücknehmen, solange die Laufzeit noch läuft.
Zugriff Inhaber
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| nonce * | Text | festes Muster |
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| angenommen | true | |
| ausstehend | true | false | kann fehlen |
| hinweis | Text | kann fehlen |
GET/v1/abo/verlauf
Verlauf des Abos: Abschluss, Wechsel, Kündigung.
Zugriff Inhaber
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| eintraege | Liste aus Objekt |
POST/v1/abo/zahlungsdaten
Zahlungsdaten bei Stripe ändern (leitet zu Stripe).
Zugriff Inhaber
Rumpf (JSON)
| Feld | Typ | Hinweis |
|---|---|---|
| nonce * | Text | festes Muster |
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| url | URL |
GET/v1/abo/zahlungsmittel
Das hinterlegte Zahlungsmittel des Abos.
Zugriff Inhaber
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| zahlungsmittel | Objekt oder null |
Öffentlicher Eingang
POST/f/:publicKey
HTML-Formular einer fremden Seite: legt einen Vorgang an (application/x-www-form-urlencoded).
Zugriff öffentlicher Projektschlüssel (vd_pub_…) in der Adresse
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| ok | true | |
| ticket | Objekt |
POST/v1/contact
Kontaktformular der VentionDesk-Website (Impressum).
Zugriff öffentlich
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| ok | true |
POST/v1/intake/reports
Meldung aus dem Browser einer Kunden-App, optional mit Bildschirmfoto — mit dem öffentlichen Projektschlüssel.
Zugriff öffentlicher Projektschlüssel im Kopf x-ventiondesk-key, erlaubte Herkunft
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| ok | true | |
| ticket | Objekt |
POST/v1/intake/tickets
Vorgang von Server zu Server einliefern, optional mit Bildschirmfoto — mit einem Eingangs-Schlüssel.
Zugriff Eingangs-Schlüssel (vd_intake_…) als Bearer
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| ok | true | |
| ticket | Objekt |
POST/v1/signup
Registrierung eines neuen Betriebs samt Inhaber-Konto.
Zugriff öffentlich
Antwort
| Feld | Typ | Hinweis |
|---|---|---|
| ok | true | |
| testphaseBis | Text | |
| checkoutUrl | URL oder null | kann fehlen · Vorgabe: null |
| test | true | false | kann fehlen · Vorgabe: false |
MCP
ALL/mcp
Jede andere Methode als POST antwortet mit 405 und Allow: POST.
Zugriff öffentlich
POST/mcp
MCP-Server über HTTP (zustandslos): die Werkzeuge für Claude, mit einem Agenten-Schlüssel.
Zugriff Agenten-Schlüssel (vd_live_…) als Bearer
Webhooks
POST/webhooks/errors/:provider/:integrationId
Webhook eines Fehler-Trackers mit Signatur im Kopf (Sentry).
Zugriff Signatur des Anbieters
POST/webhooks/errors/:provider/:integrationId/:token
Webhook eines Fehler-Trackers mit Geheimnis in der Adresse (Bugsnag, Rollbar).
Zugriff Geheimnis in der Adresse
POST/webhooks/stripe/:orgId
Stripe-Webhook des eigenen Stripe-Kontos eines Betriebs: bucht Zahlungen und Erstattungen von Rechnungen.
Zugriff Signatur Stripe-Signature
Betrieb und Bezahllink
GET/api/health
Lebenszeichen des Dienstes — antwortet, solange der Prozess läuft.
Zugriff öffentlich
GET/api/health/ready
Bereitschaft: meldet, welche Dienste konfiguriert sind; ohne Datenbank „degraded“.
Zugriff öffentlich
GET/pay/:token
Bezahllink einer Rechnung: leitet (303) zur Bezahlseite von Stripe weiter. Der Link steht in Rechnungsmail und PDF.
Zugriff Token in der Adresse
GET/pay/:token/abgebrochen
Rücksprungseite, wenn die Zahlung bei Stripe abgebrochen wurde.
Zugriff Token in der Adresse
GET/pay/:token/danke
Rücksprungseite nach erfolgreicher Zahlung bei Stripe.
Zugriff Token in der Adresse