# Angebot annehmen, ablehnen oder zurücksetzen (https://developer.bimetrics.de/reference/sales/set-proposal-outcome)

`POST https://app.bimetrics.de/api/draft/{id}/proposal-outcome`

operationId: `setProposalOutcome` · Berechtigung (Scope): `invoices:draft` · Bereich: Ausgangsrechnungen

Hält fest, ob der Kunde ein ausgestelltes Angebot angenommen (`accepted`) oder abgelehnt (`rejected`) hat, wie in der App. `open` nimmt das Ergebnis zurück. Ein abgelaufenes Angebot lässt sich noch annehmen. bimetrics protokolliert jedes Ergebnis mit Schlüssel und Zeit; Angebot, PDF und Nummer bleiben unverändert. Das gleiche Ergebnis mit dem gleichen Grund ergibt `409 ProposalOutcomeUnchanged`, ein Entwurf `409 ProposalNotIssued`. Gibt es zum Angebot eine Auftragsbestätigung oder Rechnung, auch als Entwurf, sind Ablehnen und Zurücksetzen gesperrt (`409 ProposalConverted`, `context.draftId` und `context.kind` nennen den Beleg). deriveSalesDocument setzt ein Angebot von selbst auf angenommen. Idempotency-Key bei Wiederholung unverändert senden.

Benötigt einen Schlüssel mit der Berechtigung `invoices:draft`.

> **Achtung:** Ändert Daten der Firma; wird atomar mit Idempotenzbeleg und Herkunft protokolliert.
>
> KI-Agenten fragen vor diesem Aufruf beim Nutzer nach.

### Authentifizierung

`Authorization: Bearer bm_…` (alternativ `X-API-KEY: bm_…`, nie beide zugleich).

### Parameter

| Name | Ort | Pflicht | Typ | Beschreibung |
| --- | --- | --- | --- | --- |
| `id` | path | ja | string (uuid) | ID des Angebotsentwurfs in dieser Firma (UUID). |
| `Idempotency-Key` | header | ja | string | Stabiler Schlüssel für genau diese Änderung: 1–128 druckbare ASCII-Zeichen ohne Leerzeichen. Bei Wiederholungen denselben Schlüssel und unveränderten Inhalt senden; das Ergebnis wird nicht nochmals erzeugt. |

### Request-Body (`application/json`)

 

Schema `ProposalOutcomeCommand`.

| Feld | Typ | Beschreibung |
| --- | --- | --- |
| `outcome` | string: `accepted`, `rejected`, `open` | `accepted` (angenommen), `rejected` (abgelehnt) oder `open` (Ergebnis zurücknehmen). |
| `reason` | string | Grund einer Ablehnung, eine Zeile mit höchstens 200 Zeichen; nur bei `rejected`, sonst `400`. |

### Beispiel

```sh
curl --fail-with-body "https://app.bimetrics.de/api/draft/{id}/proposal-outcome" \
  -H "Authorization: Bearer $BIMETRICS_API_KEY" \
  -H "Idempotency-Key: rechnung-2026-001" \
  -H "Content-Type: application/json" \
  -d '{"kind":"and","children":[],"limit":50,"offset":0}'
```

### Antworten

| Status | Beschreibung | Inhalt |
| --- | --- | --- |
| 200 | Erfolg. | `application/json`: Draft |
| 400 | Ungültige Anfrage, z. B. ein Parameter mit ungültigem Wert wie eine ID, die keine UUID ist; korrigieren statt wiederholen. Mehr unter [Fehler](https://developer.bimetrics.de/errors). | `application/json`: Error |
| 401 | Kein gültiger Schlüssel: fehlt (`Unauthorized`), ist unbekannt, abgelaufen oder widerrufen oder wurde nicht in genau einem Header gesendet (`InvalidAPIKey`). Schlüssel prüfen, nicht wiederholen. Auch eine ID, die zu einer anderen Firma gehört, ergibt `401 Unauthorized`. | `application/json`: Error |
| 403 | Dem Schlüssel fehlt die Berechtigung für diese Route (`APIKeyPermissionDenied`), oder die Firma hat keinen API-Zugang (mehr), etwa nach Ende der Testphase oder des Abos (`APIUnavailable`). | `application/json`: Error |
| 404 | Nicht gefunden (`NotFound`). | `application/json`: Error |
| 409 | Versionskonflikt (`VersionConflict`), abweichender Inhalt für denselben Idempotency-Key (`IdempotencyConflict`), Dublette (`ContactDuplicate`) oder fachlich gesperrte Änderung. Aktuellen Zustand laden und prüfen; keinen anderen Schlüssel verwenden, um einen Konflikt zu umgehen. | `application/json`: Error |
| 413 | Die Anfrage ist zu groß (`APIRequestTooLarge`), siehe `x-bimetrics-limits`. | `application/json`: Error |
| 429 | Zu viele Anfragen; nach `Retry-After` Sekunden erneut senden. Mehr unter [Fehler](https://developer.bimetrics.de/errors). (Header: Retry-After) | `application/json`: Error |
| 500 | Serverfehler; die Anfrage später wiederholen. Mehr unter [Fehler](https://developer.bimetrics.de/errors). | `application/json`: Error |

#### Felder der Antwort 200 (`Draft`)

| Feld | Typ | Beschreibung |
| --- | --- | --- |
| `billing` | OrderBilling | Nur getDraft eines ausgestellten Angebots oder einer ausgestellten Auftragsbestätigung: Abrechnung des Auftrags mit Abschlägen, abschließender Rechnung und Summen. |
| `billingSummary` | BillingSummary | Nur filterDrafts, an ausgestelltem Angebot und ausgestellter Auftragsbestätigung: Kurzform von `billing`. |
| `companyId` | string (uuid) | ID der Firma. |
| `createdAt` | string (date-time) | Anlage in bimetrics. |
| `creatorUserCompanyId` | string (uuid) | ID der erstellenden Mitgliedschaft. |
| `deductedBy` | BillingRef | Nur ausgestellter Abschlag: die ausgestellte, nicht stornierte Schlussrechnung, die ihn abzieht. |
| `deletedAt` | string (date-time), kann null sein | Gilt als gelöscht seit diesem Zeitpunkt; `null`, solange nicht gelöscht. Gesetzt ist es nur in der Antwort von `deleteDraft` und `deleteOrderConfirmationDraft`; gelöschte Entwürfe liefert keine andere Route, auch `filterDrafts` mit `includeDeleted` nicht. |
| `documentId` | string (uuid), kann null sein | ID des ausgestellten Rechnungsbelegs; null bei offenem Entwurf. |
| `documentMatched` | boolean | Der ausgestellte Beleg ist bereits einer Zuordnung zugeordnet. |
| `downPaymentOrdinal` | integer | Nur Abschlag: seine Ordnungszahl im Auftrag, wie `ordinal` in `billing`. |
| `draftBody` | DraftBody | Gespeicherter Rechnungsinhalt. |
| `externalRef` | string | Externe Bestellreferenz. |
| `finalTotal` | integer | Bruttosumme des ausgestellten Belegs in Cent. |
| `id` | string (uuid) | ID des Entwurfs. |
| `invoiceCorrection` | InvoiceCorrectionInput | Quellgebundener Grund und Bruttokorrekturbeträge je Position. |
| `invoiceNumber` | string | Arbeitsnummer; nach Abschluss endgültige Rechnungsnummer. |
| `invoiceRole` | string: `down_payment`, `final` | Rolle der Rechnung im Auftrag: `down_payment` (Abschlag) oder `final` (Schlussrechnung), fest ab dem Ableiten; fehlt bei allen anderen Entwürfen. Filterbar in `filterDrafts`. |
| `kind` | string | Dokumentart invoice, proposal, order_confirmation, cancellation, invoice_correction oder correction_reversal. |
| `legacyProposalTotal` | boolean | Angebot vor dem 21.09.2026 ausgestellt: Summe je Zeile gerundet wie sein PDF. |
| `orderConfirmationId` | string (uuid), kann null sein | Ausgestellte Auftragsbestätigung; null bei offenem Entwurf. |
| `originalInvoiceId` | string (uuid), kann null sein | Originalentwurf für eine Stornorechnung; sonst null. |
| `originalTotal` | integer | Bruttosumme des Storno-Originals in Cent. |
| `payment` | DraftPayment | Zahlstand einer ausgestellten Rechnung (Typ 380); fehlt bei allen anderen Entwürfen. |
| `proposal` | DraftProposal | Ergebnis eines ausgestellten Angebots; fehlt bei allen anderen Entwürfen. |
| `reversesCorrectionDocumentId` | string (uuid) | Ausgestellte Korrektur, die dieser Gegenbeleg aufhebt. |
| `salesProposalId` | string (uuid), kann null sein | ID eines erstellten Angebots, falls vorhanden. |
| `settledByFinalDraftId` | string (uuid) | Nur Storno oder Korrektur eines Abschlags: die Schlussrechnung, deren Ausstellen diesen Beleg erzeugt hat. |
| `source` | string | Zugang bei Anlage: web, api, mcp oder series für erzeugte Serienrechnungen. |
| `sourceInvoiceDocumentId` | string (uuid) | Unverändertes Original einer Rechnungskorrektur. |
| `sourceOrderConfirmationId` | string (uuid), kann null sein | Ausdrücklich gewählte finale AB als Rechnungsquelle; sonst null. |
| `sourceSalesProposalId` | string (uuid), kann null sein | Ursprüngliches Angebot, falls vorhanden. |
| `taxCase` | TaxCaseSnapshot | Beim Abschluss eingefrorener Steuerfall. |
| `typeCode` | string | EN-16931-Dokumenttyp: Rechnung 380, Rechnungskorrektur 381, Vollstorno oder Korrektur-Gegenbeleg 384. |
| `updatedAt` | string (date-time) | Letzte Änderung. |

Verschachtelte Schemas stehen vollständig in der OpenAPI-Beschreibung: https://app.bimetrics.de/api/openapi.json
