{"openapi":"3.1.0","info":{"title":"DocuFleet API","version":"1","description":"Lesender und schreibender Zugang zum Fuhrpark. Jeder Schlüssel gehört einem Mandanten und einer Rolle; die Zugriffsregeln der Datenbank gelten unverändert — ein Schlüssel kann nie mehr sehen als die Rolle, die an ihm hängt."},"servers":[{"url":"https://app.docufleet.de/api/v1"}],"externalDocs":{"description":"DocuFleet Entwicklerdokumentation","url":"https://docufleet.de/entwickler"},"security":[{"ApiSchluessel":[]}],"components":{"securitySchemes":{"ApiSchluessel":{"type":"http","scheme":"bearer","description":"Schlüssel als `Authorization: Bearer …`. Erzeugt wird er in DocuFleet unter Einstellungen → API-Zugang; je Schlüssel wird festgelegt, welche Umfänge er hat, welche Rolle er annimmt und wann er abläuft.\n\nVerfügbare Umfänge:\n- `fahrzeuge:lesen` — Fahrzeuge lesen: Stammdaten der Fahrzeuge samt Kilometerstand und Status.\n- `vertraege:lesen` — Verträge lesen: Kauf-, Leasing- und Mietverträge mit Laufzeit und Rate.\n- `kosten:lesen` — Kosten lesen: Gebuchte Kosten je Fahrzeug und Zeitraum.\n- `kosten:schreiben` — Kosten buchen: Neue Kostenzeilen anlegen — etwa aus einem Tankkartensystem.\n- `schaeden:lesen` — Schäden lesen: Gemeldete Schäden mit Stand der Abwicklung.\n- `schaeden:schreiben` — Schaden melden: Einen Schaden anlegen — etwa aus einem Telematik- oder Werkstattsystem.\n- `termine:lesen` — Termine lesen: Fällige Prüfungen, Wartungen und Fristen.\n- `termine:schreiben` — Termin anlegen: Einen Termin eintragen — etwa den Werkstatttermin aus einem Buchungssystem.\n- `kilometerstand:schreiben` — Kilometerstand melden: Den Kilometerstand eines Fahrzeugs aktualisieren.\n- `wartung:lesen` — Wartung lesen: Werkstattaufträge mit Datum, Kilometerstand und Summe.\n- `dokumente:lesen` — Dokumente lesen: Die Ablage als Verzeichnis — Art, Name und Bezug. ⛔ Nicht die Datei selbst und nicht ihren Speicherort.\n- `verstoesse:lesen` — Verstöße lesen: Bußgeldbescheide mit Tatzeitpunkt, Betrag und Fristen. ⛔ Ohne die benannte Person — dafür kennt die Schnittstelle keinen Umfang.\n- `webhooks:verwalten` — Webhooks an- und abmelden: Ereignis-Abos selbst anlegen und entfernen — nötig für Zapier und Make. Der Schlüssel sieht dabei nur seine eigenen Abos, nicht die in den Einstellungen angelegten."}},"parameters":{"IdempotenzKopf":{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\x21-\\x7E]+$"},"description":"Ein eigener Wert je Vorgang (8–255 druckbare ASCII-Zeichen ohne Leerraum, etwa eine UUID).\n\nPFLICHT bei jedem schreibenden Aufruf, nicht optional: Fehlt die Kopfzeile, antwortet der Endpunkt mit 400 und dem Code `idempotenz_fehlt`.\n\nWird dieselbe Anfrage nach einer Zeitüberschreitung wiederholt, gehört DERSELBE Wert dazu. Die erste Antwort wird dann unverändert wiedergegeben — samt ihres Status und mit der Kopfzeile `Idempotent-Replay: true` —, statt ein zweites Mal zu buchen. Ohne diesen Schutz entstünde aus einer Wiederholung eine zweite Kostenzeile, und die ist nach sieben Tagen festgeschrieben.\n\nZwei Eigenschaften des Werts sind wichtig für seine Vergabe: Er ist innerhalb EINES Mandanten eindeutig — nicht je Schlüssel und nicht je Endpunkt —, und verglichen wird nur der Rumpf. Methode und Pfad werden festgehalten, aber NICHT zum Unterscheiden herangezogen: Derselbe Wert mit identischem Rumpf auf einem anderen Endpunkt gilt als Wiederholung und liefert die Antwort des ersten Aufrufs. Am sichersten ist deshalb ein je Vorgang neu erzeugter Zufallswert (UUID), keine fortlaufende Nummer.\n\nDerselbe Wert mit ANDEREM Rumpf ist ein Fehler des Aufrufers: 422, Code `idempotenz_inhalt`. Läuft die erste Anfrage noch, kommt 409 (`idempotenz_laeuft`) — dann kurz warten und dieselbe Anfrage erneut senden.\n\nIst der Aufruf gescheitert, wird der Wert sofort wieder frei: Der berichtigte Rumpf darf denselben Wert tragen. Ein erfolgreich benutzter Wert wird 30 Tage aufbewahrt; danach führt eine Wiederholung zu einer neuen Buchung."}},"responses":{"Fehler":{"description":"Fehler. Die Form ist bei jedem Endpunkt dieselbe, damit nicht für jeden eigener Code nötig ist.","content":{"application/json":{"schema":{"type":"object","properties":{"fehler":{"type":"object","properties":{"code":{"type":"string"},"nachricht":{"type":"string"},"hinweis":{"type":"string"},"dokumentation":{"type":"string","format":"uri-reference"}},"required":["code","nachricht","hinweis","dokumentation"]}},"required":["fehler"]}}}}},"schemas":{"Fahrzeug":{"type":"object","description":"Fahrzeug: veröffentlichte Felder der REST-API. Nullable-Felder entsprechen dem Datenbankschema.","properties":{"id":{"type":"string"},"kennzeichen":{"type":"string"},"hersteller":{"type":["string","null"]},"modell":{"type":"string"},"vin":{"type":["string","null"]},"status":{"type":"string"},"km":{"type":"number"},"erstzulassung":{"type":["string","null"]},"motor":{"type":["string","null"]},"farbe":{"type":["string","null"]},"mandant_id":{"type":["string","null"]},"kostenstelle_id":{"type":["string","null"]},"ist_pool":{"type":"boolean"},"updated_at":{"type":"string"}},"required":["id","kennzeichen","hersteller","modell","vin","status","km","erstzulassung","motor","farbe","mandant_id","kostenstelle_id","ist_pool","updated_at"]},"Vertrag":{"type":"object","description":"Vertrag: veröffentlichte Felder der REST-API. Nullable-Felder entsprechen dem Datenbankschema.","properties":{"id":{"type":"string"},"bezeichnung":{"type":"string"},"vertragsnummer":{"type":"string"},"art":{"type":"string"},"status":{"type":"string"},"anbieter":{"type":["string","null"]},"beginn":{"type":["string","null"]},"ende":{"type":["string","null"]},"monatsrate_netto":{"type":["number","null"]},"zahlungsintervall":{"type":"string"},"objekt_id":{"type":["string","null"]},"mandant_id":{"type":["string","null"]},"updated_at":{"type":"string"}},"required":["id","bezeichnung","vertragsnummer","art","status","anbieter","beginn","ende","monatsrate_netto","zahlungsintervall","objekt_id","mandant_id","updated_at"]},"Kostenzeile":{"type":"object","description":"Kostenzeile: veröffentlichte Felder der REST-API. Nullable-Felder entsprechen dem Datenbankschema.","properties":{"id":{"type":"string"},"objekt_id":{"type":["string","null"]},"vertrag_id":{"type":["string","null"]},"datum":{"type":"string"},"kostenart":{"type":"string"},"betrag_netto":{"type":["number","null"]},"betrag_brutto":{"type":"number"},"ust_satz":{"type":"number"},"anbieter":{"type":["string","null"]},"belegnummer":{"type":["string","null"]},"notiz":{"type":["string","null"]},"kostenstelle_id":{"type":["string","null"]},"quelle":{"type":"string"},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["id","objekt_id","vertrag_id","datum","kostenart","betrag_netto","betrag_brutto","ust_satz","anbieter","belegnummer","notiz","kostenstelle_id","quelle","created_at","updated_at"]},"Schaden":{"type":"object","description":"Schaden: veröffentlichte Felder der REST-API. Nullable-Felder entsprechen dem Datenbankschema.","properties":{"id":{"type":"string"},"aktennummer":{"type":["string","null"]},"objekt_id":{"type":"string"},"schaden_am":{"type":["string","null"]},"beschreibung":{"type":"string"},"gemeldet_von_name":{"type":["string","null"]},"freigabe_betrag":{"type":["number","null"]},"reparatur_freigegeben_am":{"type":["string","null"]},"erledigt_am":{"type":["string","null"]},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["id","aktennummer","objekt_id","schaden_am","beschreibung","gemeldet_von_name","freigabe_betrag","reparatur_freigegeben_am","erledigt_am","created_at","updated_at"]},"Termin":{"type":"object","description":"Termin: veröffentlichte Felder der REST-API. Nullable-Felder entsprechen dem Datenbankschema.","properties":{"id":{"type":["string","null"]},"art":{"type":["string","null"]},"titel":{"type":["string","null"]},"datum":{"type":["string","null"]},"status":{"type":["string","null"]},"objekt_id":{"type":["string","null"]},"vertrag_id":{"type":["string","null"]},"member_id":{"type":["string","null"]},"erledigt_am":{"type":["string","null"]},"updated_at":{"type":["string","null"]}},"required":["id","art","titel","datum","status","objekt_id","vertrag_id","member_id","erledigt_am","updated_at"]},"Wartung":{"type":"object","description":"Wartung: veröffentlichte Felder der REST-API. Nullable-Felder entsprechen dem Datenbankschema.","properties":{"id":{"type":"string"},"objekt_id":{"type":"string"},"datum":{"type":"string"},"status":{"type":"string"},"km_stand":{"type":["number","null"]},"gesamt_netto":{"type":"number"},"gesamt_brutto":{"type":"number"},"rechnungsnummer":{"type":["string","null"]},"werkstatt_kontakt_id":{"type":["string","null"]},"storniert_am":{"type":["string","null"]},"updated_at":{"type":"string"}},"required":["id","objekt_id","datum","status","km_stand","gesamt_netto","gesamt_brutto","rechnungsnummer","werkstatt_kontakt_id","storniert_am","updated_at"]},"Dokument":{"type":"object","description":"Dokument: veröffentlichte Felder der REST-API. Nullable-Felder entsprechen dem Datenbankschema.","properties":{"id":{"type":"string"},"art":{"type":["string","null"]},"label":{"type":["string","null"]},"datei_name":{"type":"string"},"mime_type":{"type":["string","null"]},"groesse_bytes":{"type":["number","null"]},"objekt_id":{"type":["string","null"]},"vertrag_id":{"type":["string","null"]},"schaden_id":{"type":["string","null"]},"version":{"type":"number"},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["id","art","label","datei_name","mime_type","groesse_bytes","objekt_id","vertrag_id","schaden_id","version","created_at","updated_at"]},"Verstoss":{"type":"object","description":"Verstoss: veröffentlichte Felder der REST-API. Nullable-Felder entsprechen dem Datenbankschema.","properties":{"id":{"type":"string"},"aktenzeichen":{"type":["string","null"]},"art":{"type":"string"},"status":{"type":"string"},"objekt_id":{"type":"string"},"tat_am":{"type":"string"},"tatbestand":{"type":"string"},"betrag":{"type":["number","null"]},"punkte":{"type":["number","null"]},"benennung_frist":{"type":["string","null"]},"zahlungsfrist":{"type":["string","null"]},"einspruch_frist":{"type":["string","null"]},"erledigt_am":{"type":["string","null"]},"updated_at":{"type":"string"}},"required":["id","aktenzeichen","art","status","objekt_id","tat_am","tatbestand","betrag","punkte","benennung_frist","zahlungsfrist","einspruch_frist","erledigt_am","updated_at"]},"WebhookAbo":{"type":"object","description":"WebhookAbo: veröffentlichte Felder der REST-API. Nullable-Felder entsprechen dem Datenbankschema.","properties":{"id":{"type":"string"},"name":{"type":"string"},"url":{"type":"string"},"ereignisse":{"type":"array","items":{"type":"string"}},"aktiv":{"type":"boolean"},"letzte_zustellung_am":{"type":["string","null"]},"created_at":{"type":"string"}},"required":["id","name","url","ereignisse","aktiv","letzte_zustellung_am","created_at"]},"TerminAngelegt":{"type":"object","properties":{"id":{"type":["string","null"]},"art":{"type":["string","null"]},"titel":{"type":["string","null"]},"datum":{"type":["string","null"]},"objekt_id":{"type":["string","null"]},"vertrag_id":{"type":["string","null"]},"notiz":{"type":["string","null"]},"updated_at":{"type":["string","null"]}},"required":["id","art","titel","datum","objekt_id","vertrag_id","notiz","updated_at"]},"WebhookAboMitSecret":{"allOf":[{"$ref":"#/components/schemas/WebhookAbo"},{"type":"object","properties":{"secret":{"type":"string","description":"Signaturgeheimnis des Abos. Vertraulich speichern."}},"required":["secret"]}]},"KilometerstandErgebnis":{"type":"object","properties":{"id":{"type":"string"},"kennzeichen":{"type":"string"},"km":{"type":"number"}},"required":["id","kennzeichen","km"]},"WebhookEreignis":{"type":"object","required":["ereignis","zustellung_id","erzeugt_am","daten"],"properties":{"ereignis":{"type":"string","enum":["schaden.gemeldet","kosten.gebucht","vertrag.laeuft_ab","pruefung.faellig","fuehrerschein.ueberfaellig","objekt.angelegt","objekt.archiviert","objekt.fahrer_geaendert","wartung.abgeschlossen","dokument.abgelegt","verstoss.eingegangen"]},"zustellung_id":{"type":"string","format":"uuid"},"erzeugt_am":{"type":"string","format":"date-time","description":"Erstellungszeitpunkt des gespeicherten Zustellungsdatensatzes."},"daten":{"type":"object","additionalProperties":true}}},"KostenzeileNeu":{"type":"object","description":"Der Rumpf von POST /kosten. Ein Bezug ist Pflicht — `objekt_id` oder `vertrag_id`; beides zugleich ist erlaubt, keines von beiden nicht. Ebenso muss mindestens einer der beiden Beträge gesetzt sein. Die Zeile wird als maschinell gebucht gekennzeichnet; Felder, die hier nicht stehen, werden nicht übernommen.","properties":{"objekt_id":{"type":"string","format":"uuid","description":"Fahrzeug, auf das gebucht wird."},"vertrag_id":{"type":"string","format":"uuid","description":"Vertrag, auf den gebucht wird."},"datum":{"type":"string","format":"date","description":"Belegdatum im Format JJJJ-MM-TT."},"kostenart":{"type":"string","enum":["treibstoff","energie","wartung","reparatur","pruefung","reifen","anschaffung","leasing","versicherung","steuer","maut","parken","reinigung","bussgeld","sonstiges"]},"betrag_netto":{"type":"number","minimum":0,"maximum":9999999999.99,"description":"Nettobetrag, 0–9999999999.99. Wird nur er geliefert, wird mit `ust_satz` auf brutto hochgerechnet. ⚠️ Geprüft wird das Ergebnis dieser Rechnung: Ein Netto knapp unter der Grenze kann mit dem Steuersatz darüber wachsen und wird dann abgewiesen."},"betrag_brutto":{"type":"number","minimum":0,"maximum":9999999999.99,"description":"Bruttobetrag, 0–9999999999.99 — die Spalte ist `numeric(12,2)`, ein größerer Wert wird abgewiesen. Er ist führend: Ist er gesetzt, wird der Nettobetrag daraus abgeleitet und ein mitgeschickter `betrag_netto` nicht verwendet. Ein negativer Betrag ist eine Gutschrift und wird im Fuhrpark als Stornozeile gebucht, nicht über ein Minuszeichen."},"ust_satz":{"type":"number","minimum":0,"maximum":30,"description":"Steuersatz in Prozent, 0–30. Die Obergrenze ist die der Datenbank; ein höherer Wert wird abgewiesen. Ohne Angabe gilt der in den Unternehmenseinstellungen hinterlegte Satz — geraten wird keiner."},"anbieter":{"type":"string"},"belegnummer":{"type":"string"},"notiz":{"type":"string"}},"required":["datum","kostenart"]},"SchadenNeu":{"type":"object","description":"Der Rumpf von POST /schaeden. ⛔ Status, Freigabebetrag und Reparaturfreigabe lassen sich nicht setzen — eine Freigabe ist eine Entscheidung mit Geldfolge und bleibt im Fuhrpark. Ebenso wenig der Melder als Mitglied: Ein Schlüssel gehört keiner Person.","properties":{"objekt_id":{"type":"string","format":"uuid"},"beschreibung":{"type":"string","description":"Ohne sie ist der Schaden im Fuhrpark nicht bearbeitbar."},"schaden_am":{"type":"string","format":"date-time","description":"Zeitpunkt nach ISO 8601. Darf fehlen — dann wird er im Fuhrpark nachgetragen —, aber nicht mehr als einen Tag in der Zukunft liegen: Ein Schaden wird gemeldet, nicht geplant."},"umstand":{"type":"string","enum":["unfall","parkschaden","steinschlag","vandalismus","diebstahl","hagel","wildunfall","sonstiges"],"default":"sonstiges"},"dritte_beteiligt":{"type":"boolean","default":false},"dritte_details":{"type":"string"},"schadennummer":{"type":"string"},"versicherung_name":{"type":"string"},"gemeldet_von_name":{"type":"string","description":"Der Melder als Klartext — der Weg, den Namen festzuhalten, ohne ihn einem Mitglied zuzuschreiben."}},"required":["objekt_id","beschreibung"]},"TerminNeu":{"type":"object","description":"Der Rumpf von POST /termine. Ein Termin gehört zu GENAU EINEM Bezug — `objekt_id` ODER `vertrag_id`, nicht beides und nicht keines.","properties":{"titel":{"type":"string"},"art":{"type":"string","enum":["wartung","begutachtung","hu_tuev","uvv","vertragsende","fuehrerschein","unterweisung","reifen","bussgeld_frist"]},"datum":{"type":"string","format":"date","description":"Format JJJJ-MM-TT."},"objekt_id":{"type":"string","format":"uuid"},"vertrag_id":{"type":"string","format":"uuid"},"notiz":{"type":"string"}},"required":["titel","art","datum"]},"KilometerstandMeldung":{"type":"object","description":"Der Rumpf von PUT /fahrzeuge/{id}/kilometerstand.","properties":{"km":{"type":"integer","minimum":0,"maximum":2147483647,"description":"Der neue Stand in ganzen Kilometern, 0–2147483647. Ein kleinerer Wert als der gespeicherte wird abgewiesen. Ein Wert über 2.000.000 km wird zwar angenommen, aber nicht übernommen: Er wird als Beobachtung festgehalten, und die Antwort nennt den Grund. Der gespeicherte Stand steht in jedem Fall in der Antwort."}},"required":["km"]}}},"paths":{"/fahrzeuge":{"get":{"operationId":"fahrzeuge_lesen","summary":"Fahrzeuge lesen","description":"Fahrzeuge lesen. Liefert die für Organisation und Rolle sichtbaren Einträge seitenweise. Umfang: fahrzeuge:lesen.","security":[{"ApiSchluessel":[]}],"x-docufleet-bereich":"fahrzeuge:lesen","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":50,"maximum":200},"description":"Einträge je Seite. Vorgabe 50, höchstens 200."},{"name":"offset","in":"query","schema":{"type":"integer","default":0}},{"name":"geaendert_seit","in":"query","schema":{"type":"string","format":"date-time"},"description":"Nur Einträge, die sich seit diesem Zeitpunkt geändert haben (Vergleich gegen `updated_at`). Damit wird aus dem Abruf ein Abgleich statt eines Vollabzugs. Ein unlesbarer Wert wird abgewiesen, nicht übergangen."},{"name":"status","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Liste, seitenweise.","content":{"application/json":{"schema":{"type":"object","properties":{"daten":{"type":"array","items":{"$ref":"#/components/schemas/Fahrzeug"}},"seite":{"type":"object","properties":{"limit":{"type":"integer"},"offset":{"type":"integer"},"hat_mehr":{"type":"boolean","description":"Ob nach dieser Seite noch etwas kommt. Bewusst statt einer Gesamtzahl — die kostete eine zweite Zählung, ohne dass sie zum Blättern nötig wäre."}},"required":["limit","offset","hat_mehr"]}},"required":["daten","seite"]}}}},"400":{"$ref":"#/components/responses/Fehler"},"401":{"$ref":"#/components/responses/Fehler"},"403":{"$ref":"#/components/responses/Fehler"},"429":{"$ref":"#/components/responses/Fehler"},"500":{"$ref":"#/components/responses/Fehler"}}}},"/fahrzeuge/{id}/kilometerstand":{"put":{"operationId":"kilometerstand_melden","summary":"Kilometerstand melden","description":"Eigener Endpunkt statt eines allgemeinen „Fahrzeug ändern“: Der Kilometerstand ist das Einzige, was ein angeschlossenes System sinnvoll fortschreibt. Ein kleinerer Wert als der gespeicherte wird abgewiesen — er ist fast immer ein Tachotausch oder ein Zahlendreher, und ein zurückspringender Stand macht jede Auswertung je Kilometer unbrauchbar.","security":[{"ApiSchluessel":[]}],"x-docufleet-bereich":"kilometerstand:schreiben","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/IdempotenzKopf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KilometerstandMeldung"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"daten":{"$ref":"#/components/schemas/KilometerstandErgebnis"},"hinweis":{"type":"string","enum":["beobachtet","unveraendert"]},"grund":{"type":"string"}},"required":["daten"]}}},"description":"Der neue Stand. `hinweis` sagt, was mit dem Wert geschehen ist — `beobachtet` für einen unplausiblen Sprung, `unveraendert` für denselben Wert; `grund` trägt den Klartext dazu."},"400":{"$ref":"#/components/responses/Fehler"},"401":{"$ref":"#/components/responses/Fehler"},"403":{"$ref":"#/components/responses/Fehler"},"404":{"$ref":"#/components/responses/Fehler"},"409":{"$ref":"#/components/responses/Fehler"},"422":{"$ref":"#/components/responses/Fehler"},"429":{"$ref":"#/components/responses/Fehler"},"500":{"$ref":"#/components/responses/Fehler"}}}},"/vertraege":{"get":{"operationId":"vertraege_lesen","summary":"Verträge lesen","description":"Verträge lesen. Liefert die für Organisation und Rolle sichtbaren Einträge seitenweise. Umfang: vertraege:lesen.","security":[{"ApiSchluessel":[]}],"x-docufleet-bereich":"vertraege:lesen","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":50,"maximum":200},"description":"Einträge je Seite. Vorgabe 50, höchstens 200."},{"name":"offset","in":"query","schema":{"type":"integer","default":0}},{"name":"geaendert_seit","in":"query","schema":{"type":"string","format":"date-time"},"description":"Nur Einträge, die sich seit diesem Zeitpunkt geändert haben (Vergleich gegen `updated_at`). Damit wird aus dem Abruf ein Abgleich statt eines Vollabzugs. Ein unlesbarer Wert wird abgewiesen, nicht übergangen."},{"name":"objekt_id","in":"query","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Liste, seitenweise.","content":{"application/json":{"schema":{"type":"object","properties":{"daten":{"type":"array","items":{"$ref":"#/components/schemas/Vertrag"}},"seite":{"type":"object","properties":{"limit":{"type":"integer"},"offset":{"type":"integer"},"hat_mehr":{"type":"boolean","description":"Ob nach dieser Seite noch etwas kommt. Bewusst statt einer Gesamtzahl — die kostete eine zweite Zählung, ohne dass sie zum Blättern nötig wäre."}},"required":["limit","offset","hat_mehr"]}},"required":["daten","seite"]}}}},"400":{"$ref":"#/components/responses/Fehler"},"401":{"$ref":"#/components/responses/Fehler"},"403":{"$ref":"#/components/responses/Fehler"},"429":{"$ref":"#/components/responses/Fehler"},"500":{"$ref":"#/components/responses/Fehler"}}}},"/wartung":{"get":{"operationId":"wartung_lesen","summary":"Wartung lesen","description":"Wartung lesen. Liefert die für Organisation und Rolle sichtbaren Einträge seitenweise. Umfang: wartung:lesen.","security":[{"ApiSchluessel":[]}],"x-docufleet-bereich":"wartung:lesen","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":50,"maximum":200},"description":"Einträge je Seite. Vorgabe 50, höchstens 200."},{"name":"offset","in":"query","schema":{"type":"integer","default":0}},{"name":"geaendert_seit","in":"query","schema":{"type":"string","format":"date-time"},"description":"Nur Einträge, die sich seit diesem Zeitpunkt geändert haben (Vergleich gegen `updated_at`). Damit wird aus dem Abruf ein Abgleich statt eines Vollabzugs. Ein unlesbarer Wert wird abgewiesen, nicht übergangen."},{"name":"objekt_id","in":"query","schema":{"type":"string","format":"uuid"}},{"name":"status","in":"query","schema":{"type":"string"}},{"name":"ab","in":"query","schema":{"type":"string","format":"date"}},{"name":"bis","in":"query","schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"Liste, seitenweise.","content":{"application/json":{"schema":{"type":"object","properties":{"daten":{"type":"array","items":{"$ref":"#/components/schemas/Wartung"}},"seite":{"type":"object","properties":{"limit":{"type":"integer"},"offset":{"type":"integer"},"hat_mehr":{"type":"boolean","description":"Ob nach dieser Seite noch etwas kommt. Bewusst statt einer Gesamtzahl — die kostete eine zweite Zählung, ohne dass sie zum Blättern nötig wäre."}},"required":["limit","offset","hat_mehr"]}},"required":["daten","seite"]}}}},"400":{"$ref":"#/components/responses/Fehler"},"401":{"$ref":"#/components/responses/Fehler"},"403":{"$ref":"#/components/responses/Fehler"},"429":{"$ref":"#/components/responses/Fehler"},"500":{"$ref":"#/components/responses/Fehler"}}}},"/dokumente":{"get":{"operationId":"dokumente_lesen","summary":"Dokumente lesen","description":"Dokumente lesen. Liefert die für Organisation und Rolle sichtbaren Einträge seitenweise. Umfang: dokumente:lesen.","security":[{"ApiSchluessel":[]}],"x-docufleet-bereich":"dokumente:lesen","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":50,"maximum":200},"description":"Einträge je Seite. Vorgabe 50, höchstens 200."},{"name":"offset","in":"query","schema":{"type":"integer","default":0}},{"name":"geaendert_seit","in":"query","schema":{"type":"string","format":"date-time"},"description":"Nur Einträge, die sich seit diesem Zeitpunkt geändert haben (Vergleich gegen `updated_at`). Damit wird aus dem Abruf ein Abgleich statt eines Vollabzugs. Ein unlesbarer Wert wird abgewiesen, nicht übergangen."},{"name":"objekt_id","in":"query","schema":{"type":"string","format":"uuid"}},{"name":"art","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Liste, seitenweise.","content":{"application/json":{"schema":{"type":"object","properties":{"daten":{"type":"array","items":{"$ref":"#/components/schemas/Dokument"}},"seite":{"type":"object","properties":{"limit":{"type":"integer"},"offset":{"type":"integer"},"hat_mehr":{"type":"boolean","description":"Ob nach dieser Seite noch etwas kommt. Bewusst statt einer Gesamtzahl — die kostete eine zweite Zählung, ohne dass sie zum Blättern nötig wäre."}},"required":["limit","offset","hat_mehr"]}},"required":["daten","seite"]}}}},"400":{"$ref":"#/components/responses/Fehler"},"401":{"$ref":"#/components/responses/Fehler"},"403":{"$ref":"#/components/responses/Fehler"},"429":{"$ref":"#/components/responses/Fehler"},"500":{"$ref":"#/components/responses/Fehler"}}}},"/verstoesse":{"get":{"operationId":"verstoesse_lesen","summary":"Verstöße lesen","description":"Verstöße lesen. Liefert die für Organisation und Rolle sichtbaren Einträge seitenweise. Umfang: verstoesse:lesen.","security":[{"ApiSchluessel":[]}],"x-docufleet-bereich":"verstoesse:lesen","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":50,"maximum":200},"description":"Einträge je Seite. Vorgabe 50, höchstens 200."},{"name":"offset","in":"query","schema":{"type":"integer","default":0}},{"name":"geaendert_seit","in":"query","schema":{"type":"string","format":"date-time"},"description":"Nur Einträge, die sich seit diesem Zeitpunkt geändert haben (Vergleich gegen `updated_at`). Damit wird aus dem Abruf ein Abgleich statt eines Vollabzugs. Ein unlesbarer Wert wird abgewiesen, nicht übergangen."},{"name":"objekt_id","in":"query","schema":{"type":"string","format":"uuid"}},{"name":"status","in":"query","schema":{"type":"string"}},{"name":"ab","in":"query","schema":{"type":"string","format":"date"}},{"name":"bis","in":"query","schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"Liste, seitenweise.","content":{"application/json":{"schema":{"type":"object","properties":{"daten":{"type":"array","items":{"$ref":"#/components/schemas/Verstoss"}},"seite":{"type":"object","properties":{"limit":{"type":"integer"},"offset":{"type":"integer"},"hat_mehr":{"type":"boolean","description":"Ob nach dieser Seite noch etwas kommt. Bewusst statt einer Gesamtzahl — die kostete eine zweite Zählung, ohne dass sie zum Blättern nötig wäre."}},"required":["limit","offset","hat_mehr"]}},"required":["daten","seite"]}}}},"400":{"$ref":"#/components/responses/Fehler"},"401":{"$ref":"#/components/responses/Fehler"},"403":{"$ref":"#/components/responses/Fehler"},"429":{"$ref":"#/components/responses/Fehler"},"500":{"$ref":"#/components/responses/Fehler"}}}},"/kosten":{"get":{"operationId":"kosten_lesen","summary":"Kosten lesen","description":"Kosten lesen. Liefert die für Organisation und Rolle sichtbaren Einträge seitenweise. Umfang: kosten:lesen.","security":[{"ApiSchluessel":[]}],"x-docufleet-bereich":"kosten:lesen","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":50,"maximum":200},"description":"Einträge je Seite. Vorgabe 50, höchstens 200."},{"name":"offset","in":"query","schema":{"type":"integer","default":0}},{"name":"geaendert_seit","in":"query","schema":{"type":"string","format":"date-time"},"description":"Nur Einträge, die sich seit diesem Zeitpunkt geändert haben (Vergleich gegen `updated_at`). Damit wird aus dem Abruf ein Abgleich statt eines Vollabzugs. Ein unlesbarer Wert wird abgewiesen, nicht übergangen."},{"name":"objekt_id","in":"query","schema":{"type":"string","format":"uuid"}},{"name":"ab","in":"query","schema":{"type":"string","format":"date"}},{"name":"bis","in":"query","schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"Liste, seitenweise.","content":{"application/json":{"schema":{"type":"object","properties":{"daten":{"type":"array","items":{"$ref":"#/components/schemas/Kostenzeile"}},"seite":{"type":"object","properties":{"limit":{"type":"integer"},"offset":{"type":"integer"},"hat_mehr":{"type":"boolean","description":"Ob nach dieser Seite noch etwas kommt. Bewusst statt einer Gesamtzahl — die kostete eine zweite Zählung, ohne dass sie zum Blättern nötig wäre."}},"required":["limit","offset","hat_mehr"]}},"required":["daten","seite"]}}}},"400":{"$ref":"#/components/responses/Fehler"},"401":{"$ref":"#/components/responses/Fehler"},"403":{"$ref":"#/components/responses/Fehler"},"429":{"$ref":"#/components/responses/Fehler"},"500":{"$ref":"#/components/responses/Fehler"}}},"post":{"operationId":"kosten_buchen","summary":"Kostenzeile buchen","description":"Brutto ist führend; wird nur netto geliefert, wird mit dem angegebenen oder dem im Mandanten hinterlegten Steuersatz hochgerechnet. Ein Bezug ist Pflicht — `objekt_id` oder `vertrag_id`.","security":[{"ApiSchluessel":[]}],"x-docufleet-bereich":"kosten:schreiben","parameters":[{"$ref":"#/components/parameters/IdempotenzKopf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KostenzeileNeu"}}}},"responses":{"201":{"description":"Die gebuchte Zeile.","content":{"application/json":{"schema":{"type":"object","properties":{"daten":{"$ref":"#/components/schemas/Kostenzeile"}},"required":["daten"]}}}},"400":{"$ref":"#/components/responses/Fehler"},"401":{"$ref":"#/components/responses/Fehler"},"403":{"$ref":"#/components/responses/Fehler"},"409":{"$ref":"#/components/responses/Fehler"},"422":{"$ref":"#/components/responses/Fehler"},"429":{"$ref":"#/components/responses/Fehler"},"500":{"$ref":"#/components/responses/Fehler"}}}},"/schaeden":{"get":{"operationId":"schaeden_lesen","summary":"Schäden lesen","description":"Schäden lesen. Liefert die für Organisation und Rolle sichtbaren Einträge seitenweise. Umfang: schaeden:lesen.","security":[{"ApiSchluessel":[]}],"x-docufleet-bereich":"schaeden:lesen","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":50,"maximum":200},"description":"Einträge je Seite. Vorgabe 50, höchstens 200."},{"name":"offset","in":"query","schema":{"type":"integer","default":0}},{"name":"geaendert_seit","in":"query","schema":{"type":"string","format":"date-time"},"description":"Nur Einträge, die sich seit diesem Zeitpunkt geändert haben (Vergleich gegen `updated_at`). Damit wird aus dem Abruf ein Abgleich statt eines Vollabzugs. Ein unlesbarer Wert wird abgewiesen, nicht übergangen."},{"name":"objekt_id","in":"query","schema":{"type":"string","format":"uuid"}},{"name":"ab","in":"query","schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"Liste, seitenweise.","content":{"application/json":{"schema":{"type":"object","properties":{"daten":{"type":"array","items":{"$ref":"#/components/schemas/Schaden"}},"seite":{"type":"object","properties":{"limit":{"type":"integer"},"offset":{"type":"integer"},"hat_mehr":{"type":"boolean","description":"Ob nach dieser Seite noch etwas kommt. Bewusst statt einer Gesamtzahl — die kostete eine zweite Zählung, ohne dass sie zum Blättern nötig wäre."}},"required":["limit","offset","hat_mehr"]}},"required":["daten","seite"]}}}},"400":{"$ref":"#/components/responses/Fehler"},"401":{"$ref":"#/components/responses/Fehler"},"403":{"$ref":"#/components/responses/Fehler"},"429":{"$ref":"#/components/responses/Fehler"},"500":{"$ref":"#/components/responses/Fehler"}}},"post":{"operationId":"schaden_melden","summary":"Schaden melden","description":"Für Systeme, bei denen ein Schaden zuerst auffällt. Pflicht sind `objekt_id` und `beschreibung`. Nicht setzbar sind Status, Freigabebetrag und Reparaturfreigabe — eine Freigabe ist eine Entscheidung mit Geldfolge und bleibt im Fuhrpark; ebenso wenig lässt sich der Melder auf ein Mitglied buchen, weil ein Schlüssel keiner Person gehört (`gemeldet_von_name` als Klartext ist möglich).","security":[{"ApiSchluessel":[]}],"x-docufleet-bereich":"schaeden:schreiben","parameters":[{"$ref":"#/components/parameters/IdempotenzKopf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchadenNeu"}}}},"responses":{"201":{"description":"Der angelegte Schaden.","content":{"application/json":{"schema":{"type":"object","properties":{"daten":{"$ref":"#/components/schemas/Schaden"}},"required":["daten"]}}}},"400":{"$ref":"#/components/responses/Fehler"},"401":{"$ref":"#/components/responses/Fehler"},"403":{"$ref":"#/components/responses/Fehler"},"404":{"$ref":"#/components/responses/Fehler"},"409":{"$ref":"#/components/responses/Fehler"},"422":{"$ref":"#/components/responses/Fehler"},"429":{"$ref":"#/components/responses/Fehler"},"500":{"$ref":"#/components/responses/Fehler"}}}},"/termine":{"get":{"operationId":"termine_lesen","summary":"Termine lesen","description":"Termine lesen. Liefert die für Organisation und Rolle sichtbaren Einträge seitenweise. Umfang: termine:lesen.","security":[{"ApiSchluessel":[]}],"x-docufleet-bereich":"termine:lesen","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":50,"maximum":200},"description":"Einträge je Seite. Vorgabe 50, höchstens 200."},{"name":"offset","in":"query","schema":{"type":"integer","default":0}},{"name":"geaendert_seit","in":"query","schema":{"type":"string","format":"date-time"},"description":"Nur Einträge, die sich seit diesem Zeitpunkt geändert haben (Vergleich gegen `updated_at`). Damit wird aus dem Abruf ein Abgleich statt eines Vollabzugs. Ein unlesbarer Wert wird abgewiesen, nicht übergangen."},{"name":"objekt_id","in":"query","schema":{"type":"string","format":"uuid"}},{"name":"status","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Liste, seitenweise.","content":{"application/json":{"schema":{"type":"object","properties":{"daten":{"type":"array","items":{"$ref":"#/components/schemas/Termin"}},"seite":{"type":"object","properties":{"limit":{"type":"integer"},"offset":{"type":"integer"},"hat_mehr":{"type":"boolean","description":"Ob nach dieser Seite noch etwas kommt. Bewusst statt einer Gesamtzahl — die kostete eine zweite Zählung, ohne dass sie zum Blättern nötig wäre."}},"required":["limit","offset","hat_mehr"]}},"required":["daten","seite"]}}}},"400":{"$ref":"#/components/responses/Fehler"},"401":{"$ref":"#/components/responses/Fehler"},"403":{"$ref":"#/components/responses/Fehler"},"429":{"$ref":"#/components/responses/Fehler"},"500":{"$ref":"#/components/responses/Fehler"}}},"post":{"operationId":"termin_anlegen","summary":"Termin anlegen","description":"Pflicht sind `titel`, `art` und `datum` sowie genau ein Bezug — `objekt_id` ODER `vertrag_id`, nicht beides und nicht keines.","security":[{"ApiSchluessel":[]}],"x-docufleet-bereich":"termine:schreiben","parameters":[{"$ref":"#/components/parameters/IdempotenzKopf"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TerminNeu"}}}},"responses":{"201":{"description":"Der angelegte Termin.","content":{"application/json":{"schema":{"type":"object","properties":{"daten":{"$ref":"#/components/schemas/TerminAngelegt"}},"required":["daten"]}}}},"400":{"$ref":"#/components/responses/Fehler"},"401":{"$ref":"#/components/responses/Fehler"},"403":{"$ref":"#/components/responses/Fehler"},"404":{"$ref":"#/components/responses/Fehler"},"409":{"$ref":"#/components/responses/Fehler"},"422":{"$ref":"#/components/responses/Fehler"},"429":{"$ref":"#/components/responses/Fehler"},"500":{"$ref":"#/components/responses/Fehler"}}}},"/webhooks/ereignisse":{"get":{"operationId":"webhook_ereignisse_lesen","summary":"Eigene zugestellte Abo-Ereignisse lesen","description":"Nur bereits zugestellte Ereignisse aktiver Abos dieses API-Schlüssels. Keine anderen Schlüssel, manuell angelegten Webhooks oder fremden Organisationen. Keine Personenliste. Gelöschte Nutzlasten werden nicht ausgeliefert. Ohne bisherige Zustellung ist die Liste leer. Das Tarifmerkmal des Ereignisses muss weiterhin vorhanden sein.","security":[{"ApiSchluessel":[]}],"x-docufleet-bereich":"webhooks:verwalten","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":50,"maximum":200},"description":"Einträge je Seite. Vorgabe 50, höchstens 200."},{"name":"offset","in":"query","schema":{"type":"integer","default":0}},{"name":"ereignis","in":"query","required":true,"schema":{"type":"string","enum":["schaden.gemeldet","kosten.gebucht","vertrag.laeuft_ab","pruefung.faellig","fuehrerschein.ueberfaellig","objekt.angelegt","objekt.archiviert","objekt.fahrer_geaendert","wartung.abgeschlossen","dokument.abgelegt","verstoss.eingegangen"]}}],"responses":{"200":{"description":"Eigene Ereignishistorie, neueste zuerst und seitenweise.","content":{"application/json":{"schema":{"type":"object","properties":{"daten":{"type":"array","items":{"$ref":"#/components/schemas/WebhookEreignis"}},"seite":{"type":"object","properties":{"limit":{"type":"integer"},"offset":{"type":"integer"},"hat_mehr":{"type":"boolean","description":"Ob nach dieser Seite noch etwas kommt. Bewusst statt einer Gesamtzahl — die kostete eine zweite Zählung, ohne dass sie zum Blättern nötig wäre."}},"required":["limit","offset","hat_mehr"]}},"required":["daten","seite"]}}}},"400":{"$ref":"#/components/responses/Fehler"},"401":{"$ref":"#/components/responses/Fehler"},"403":{"$ref":"#/components/responses/Fehler"},"429":{"$ref":"#/components/responses/Fehler"},"500":{"$ref":"#/components/responses/Fehler"}}}},"/webhooks":{"get":{"operationId":"webhooks_lesen","summary":"Eigene Ereignis-Abos lesen","description":"Nur die Abos DIESES Schlüssels. Was in den Einstellungen von Hand angelegt wurde, erscheint hier nicht — und lässt sich über die Schnittstelle auch nicht entfernen.","security":[{"ApiSchluessel":[]}],"x-docufleet-bereich":"webhooks:verwalten","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":50,"maximum":200},"description":"Einträge je Seite. Vorgabe 50, höchstens 200."},{"name":"offset","in":"query","schema":{"type":"integer","default":0}}],"responses":{"200":{"description":"Liste der eigenen Abos, seitenweise.","content":{"application/json":{"schema":{"type":"object","properties":{"daten":{"type":"array","items":{"$ref":"#/components/schemas/WebhookAbo"}},"seite":{"type":"object","properties":{"limit":{"type":"integer"},"offset":{"type":"integer"},"hat_mehr":{"type":"boolean","description":"Ob nach dieser Seite noch etwas kommt. Bewusst statt einer Gesamtzahl — die kostete eine zweite Zählung, ohne dass sie zum Blättern nötig wäre."}},"required":["limit","offset","hat_mehr"]}},"required":["daten","seite"]}}}},"401":{"$ref":"#/components/responses/Fehler"},"403":{"$ref":"#/components/responses/Fehler"},"429":{"$ref":"#/components/responses/Fehler"},"500":{"$ref":"#/components/responses/Fehler"}}},"post":{"operationId":"webhook_anlegen","summary":"Ereignis-Abo anlegen","description":"Legt ein Abo für GENAU EIN Ereignis an — der Weg, über den Zapier und Make einen Auslöser einschalten.\n\nDie Antwort enthält `secret`: das Signaturgeheimnis, mit dem sich jede Zustellung prüfen lässt (`x-docufleet-signatur: t=…,v1=…` über `<zeitstempel>.<rumpf>`, HMAC-SHA256). Es wird hier einmal ausgeliefert und danach nicht wieder.\n\nDieselbe Adresse zum selben Ereignis ergibt EIN Abo: Eine Wiederholung liefert die vorhandene Zeile mit HTTP 200 zurück, statt ein zweites anzulegen. Eine Kopfzeile zur Wiedererkennung ist deshalb nicht nötig.","security":[{"ApiSchluessel":[]}],"x-docufleet-bereich":"webhooks:verwalten","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri","description":"Zieladresse, nur https. Adressen aus privaten oder lokalen Netzen werden abgewiesen. Das Feld heißt bei Zapier und Make `targetUrl` — beide Schreibweisen werden angenommen."},"ereignis":{"type":"string","enum":["schaden.gemeldet","kosten.gebucht","vertrag.laeuft_ab","pruefung.faellig","fuehrerschein.ueberfaellig","objekt.angelegt","objekt.archiviert","objekt.fahrer_geaendert","wartung.abgeschlossen","dokument.abgelegt","verstoss.eingegangen"],"description":"`schaden.gemeldet` — Schaden gemeldet: Sobald ein Schaden erfasst wird — auch aus der Fahrer-App.\n`kosten.gebucht` — Kosten gebucht: Jede neue Kostenzeile, auch die automatisch erzeugten.\n`vertrag.laeuft_ab` — Vertrag läuft ab: 30 Tage vor Vertragsende, danach täglich bis zum Ende.\n`pruefung.faellig` — Prüfung fällig: Fällige oder überfällige Termine (§57a, HU/TÜV, UVV, Wartung).\n`fuehrerschein.ueberfaellig` — Führerscheinkontrolle überfällig: Wenn eine fällige Kontrolle nicht durchgeführt wurde.\n`objekt.angelegt` — Fahrzeug angelegt: Sobald ein Fahrzeug in den Bestand kommt — auch beim Import.\n`objekt.archiviert` — Fahrzeug archiviert: Beim Ausflotten, auch wenn die Archivierung vorgemerkt war und der Lauf sie ausführt.\n`objekt.fahrer_geaendert` — Fahrer gewechselt: Zuweisung, Wechsel und Entzug. Beim Entzug ist der Fahrer im Ereignis leer.\n`wartung.abgeschlossen` — Wartung abgeschlossen: Wenn eine Wartung auf „abgeschlossen“ gesetzt wird, mit Kilometerstand und Summe.\n`dokument.abgelegt` — Dokument abgelegt: Jedes neue Dokument — gemeldet wird die Art, nicht der Inhalt.\n`verstoss.eingegangen` — Verstoß eingegangen: Sobald ein Bußgeldbescheid erfasst ist, samt Benennungsfrist."},"name":{"type":"string","description":"Frei wählbare Bezeichnung. Sie steht im Fuhrpark unter Einstellungen → Webhooks — wer das Abo dort sieht, soll erkennen, wofür es da ist. Ohne Angabe wird ein Name aus dem Ereignis gebildet."}},"required":["url","ereignis"]}}}},"responses":{"200":{"description":"Dieses Abo bestand bereits — die vorhandene Zeile.","headers":{"Location":{"description":"Adresse zum Abmelden dieses Abos. Ein DELETE darauf meldet es ab. Sie wechselt bei jeder erneuten Anmeldung derselben Adresse zum selben Ereignis, ein DELETE auf eine ältere Fassung trifft nichts.","schema":{"type":"string","format":"uri"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"daten":{"$ref":"#/components/schemas/WebhookAboMitSecret"}},"required":["daten"]}}}},"201":{"description":"Das angelegte Abo, samt `secret`.","headers":{"Location":{"description":"Adresse zum Abmelden dieses Abos. Ein DELETE darauf meldet es ab. Sie wechselt bei jeder erneuten Anmeldung derselben Adresse zum selben Ereignis, ein DELETE auf eine ältere Fassung trifft nichts.","schema":{"type":"string","format":"uri"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"daten":{"$ref":"#/components/schemas/WebhookAboMitSecret"}},"required":["daten"]}}}},"400":{"$ref":"#/components/responses/Fehler"},"401":{"$ref":"#/components/responses/Fehler"},"403":{"$ref":"#/components/responses/Fehler"},"429":{"$ref":"#/components/responses/Fehler"},"500":{"$ref":"#/components/responses/Fehler"}}}},"/webhooks/{id}":{"delete":{"operationId":"webhook_entfernen","summary":"Ereignis-Abo entfernen","description":"Die Gegenrichtung zum Anlegen. Entfernt werden nur eigene Abos; ein fremdes oder bereits entferntes antwortet mit 404. Als Kennung gilt die `id` des Abos oder die Abmeldemarke aus der Kopfzeile Location.","security":[{"ApiSchluessel":[]}],"x-docufleet-bereich":"webhooks:verwalten","parameters":[{"name":"id","in":"path","required":true,"description":"Kennung des Abos oder die Abmeldemarke aus der Kopfzeile Location.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Das Abo ist entfernt.","content":{"application/json":{"schema":{"type":"object","properties":{"daten":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"entfernt":{"type":"boolean","const":true}},"required":["id","entfernt"]}},"required":["daten"]}}}},"401":{"$ref":"#/components/responses/Fehler"},"403":{"$ref":"#/components/responses/Fehler"},"404":{"$ref":"#/components/responses/Fehler"},"429":{"$ref":"#/components/responses/Fehler"},"500":{"$ref":"#/components/responses/Fehler"}}}}}}