# Rechnungen oder Angebote je Reiter zählen (https://developer.bimetrics.de/reference/sales/count-drafts)

`POST https://app.bimetrics.de/api/draft/list/count`

operationId: `countDrafts` · Berechtigung (Scope): `sales:read` · Bereich: Ausgangsrechnungen

Zählt wie die Reiter der Rechnungsliste in der App: Rechnungen und offene Storno-Entwürfe (`all`), Entwürfe (`draft`), offene (`open`, darin die überfälligen `overdue`), ungeklärte (`unknown`), bezahlte (`paid`) und stornierte (`cancelled`), dazu teilbezahlte und gemahnte (`extra`). Der Anfrageinhalt ist der von filterDrafts; Seite, Sortierung, `paymentStates` und `proposalStates` zählen nicht, alle anderen Felder schon. Mit einem Filter auf `kind` `proposal` zählt die Route die Reiter der Angebotsliste: alle Angebote (`all`), Entwürfe (`draft`), offene (`open`), abgelaufene (`expired`), angenommene (`accepted`) und abgelehnte (`rejected`), je mit dem Bruttobetrag. Die Zahlstand-Felder gehen dann nicht (`400`). Verändert nichts.

Benötigt einen Schlüssel mit der Berechtigung `sales:read` oder `read`.

### Authentifizierung

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

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

Schema `DraftFilterBody`.

| Feld | Typ | Beschreibung |
| --- | --- | --- |
| `attribute` | string | Filterattribut für `eq`, `in`, `range` und `oneof`, siehe `x-bimetrics-filter` der Operation. Groß-/Kleinschreibung und Punkte werden ignoriert. |
| `children` | Array<FilterDescriptor> | Teilfilter für `and`, `or` und `not`. |
| `direction` | string: `asc`, `desc` \| Array<string: `asc`, `desc`> | Richtung je Eintrag in `sort`; Standard `asc`. |
| `dueFrom` | string | Fällig ab diesem Tag (YYYY-MM-DD). Rechnungen ohne gültige Fälligkeit fallen heraus. |
| `dueTo` | string | Fällig bis zu diesem Tag (YYYY-MM-DD), einschließlich. |
| `includeDeleted` | boolean | `true` liefert auch gelöschte Einträge, erkennbar an `deletedAt`, aber nur bei Belegen, Kontakten, Bankkonten, Umsätzen und Buchungen; die übrigen Suchrouten ignorieren das Feld. Ohne das Feld oder mit `false` nur Einträge, die nicht gelöscht sind. Für Abgleiche von Löschungen mit `range` auf `deletedAt`, siehe [Delta-Sync](https://developer.bimetrics.de/recipes/delta-sync). |
| `kind` | string: ``, `and`, `or`, `eq`, `not`, `in`, `range`, `oneof` | Art des Filters: `and`/`or` verknüpfen `children`, `not` verneint `children`, `eq` vergleicht `attribute` mit `value` (`null` prüft auf leer), `in` sucht `value` als Text im Attribut (enthält, ohne Groß-/Kleinschreibung), `range` prüft `lower` ≤ Attribut ≤ `upper` (eine Grenze genügt), `oneof` prüft, ob das Attribut einem Wert der Liste `value` entspricht. Leer: alle Einträge. |
| `lastPaymentFrom` | string | Letzte Zahlung ab diesem Tag (YYYY-MM-DD). Bei Teilzahlungen zählt nur die letzte. |
| `lastPaymentTo` | string | Letzte Zahlung bis zu diesem Tag (YYYY-MM-DD), einschließlich. |
| `limit` | integer | Treffer je Seite. Standard und Höchstwert 1000; größere Werte werden auf 1000 begrenzt. |
| `lower` | beliebig, kann null sein | Untergrenze für `range`, einschließlich. |
| `offset` | integer | Anzahl übersprungener Treffer. Haben mehrere Treffer dieselben Werte in `sort`, ist ihre Reihenfolge nicht festgelegt, und sie können zwischen zwei Seiten doppelt kommen oder fehlen; `id` als letztes Attribut in `sort` oder ein Abgleich mit Überlappung ([Delta-Sync](https://developer.bimetrics.de/recipes/delta-sync)) hilft dagegen. |
| `partiallyPaid` | boolean | `true`: offen und schon teilweise bezahlt. `false`: alle anderen. |
| `paymentStates` | Array<string> | Zahlstände, von denen einer zutrifft: `open` (offen, also unbezahlt, auch überfällig, wie der Reiter „Offen“), `overdue` (davon die überfälligen), `unknown` (ungeklärt), `paid` (bezahlt) oder `cancelled` (storniert). |
| `proposalStates` | Array<string> | Ergebnisse ausgestellter Angebote, von denen eins zutrifft: `open` (offen, gültig bis heute oder später), `expired` (abgelaufen), `accepted` (angenommen) oder `rejected` (abgelehnt). Nur mit einem Filter auf `kind` `proposal`. |
| `reminded` | boolean | `true`: mit ausgestellter Zahlungserinnerung oder Mahnung; zurückgezogene zählen nicht. `false`: ohne. |
| `reminderHold` | boolean | `true`: mit Mahnsperre, die heute gilt, oder Kontakt „Nicht mahnen“. `false`: ohne. |
| `reminderLevels` | Array<integer> | Die höchste ausgestellte Stufe ist eine davon: 0 Zahlungserinnerung, 1 bis 3 Mahnung. |
| `sort` | string \| Array<string> | Attribute, nach denen sortiert wird; nur sortierbare Attribute (`sortable` in `x-bimetrics-filter`). Ein Attribut mit `sortable: false` ergibt `400`. |
| `upper` | beliebig, kann null sein | Obergrenze für `range`, einschließlich. |
| `value` | beliebig, kann null sein | Vergleichswert: für `eq` ein Wert oder `null`, für `in` ein Text, für `oneof` eine Liste. |

### Beispiel

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

### Antworten

| Status | Beschreibung | Inhalt |
| --- | --- | --- |
| 200 | Erfolg. | `application/json`: DraftCounts |
| 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 |
| 409 | bimetrics berechnet die Zahlstände der Firma gerade zum ersten Mal (`ReceivableStatesPending`), meist nur Sekunden lang. Gleich erneut senden. | `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 (`DraftCounts`)

| Feld | Typ | Beschreibung |
| --- | --- | --- |
| `counts` | DraftTabCounts | Die Reiter. Sie schließen sich aus, nur `overdue` ist ein Teil von `open`. |
| `extra` | DraftExtraCounts | Zusatzfilter der Rechnungsliste, die sich mit den Reitern überschneiden; fehlt bei Angeboten. |

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