# Kontakt anlegen (https://developer.bimetrics.de/reference/contacts/create-contact)

`POST https://app.bimetrics.de/api/contact/`

operationId: `createContact` · Berechtigung (Scope): `contacts:write` · Bereich: Kontakte

Legt einen Kontakt ohne Bankverbindung an. Gleiche normalisierte USt-IdNr., externalRef oder gleicher Name ohne Rechtsform ergeben ContactDuplicate mit existingId. Nur eine Namensdublette kann mit forceDuplicate bestätigt werden.

Benötigt einen Schlüssel mit der Berechtigung `contacts:write`.

> **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 |
| --- | --- | --- | --- | --- |
| `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 `WriteBody`.

| Feld | Typ | Beschreibung |
| --- | --- | --- |
| `addresses` | Array<WriteAddress> | Vollständige Liste der gewünschten Anschriften. |
| `companyName` | string | Name oder Firma des Kontakts. |
| `contactInfo` | WriteContactInfo | Gezielte Änderungen an Kontakt- und Kommunikationsdaten. |
| `customerNumber` | integer | Kundennummer bei Anlage; spätere Änderungen nur in der App. |
| `expectedUpdatedAt` | string (date-time) | Exakter zuletzt gelesener updatedAt-Wert einschließlich Sekundenbruchteilen; für Änderungen erforderlich. |
| `externalRef` | string | Stabile externe Kundenreferenz, höchstens 255 Zeichen. |
| `forceDuplicate` | boolean | Nur nach bewusster Prüfung einer Namensdublette verwenden; umgeht keine USt-IdNr.- oder externalRef-Dublette. |
| `paymentInfo` | WritePaymentInfo | Steuer- und Leitwegkennung; Bankdaten werden nicht angenommen. |
| `type` | string | Kontaktart customer, supplier oder partner. |

### Beispiel

```sh
curl --fail-with-body "https://app.bimetrics.de/api/contact/" \
  -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`: Contact |
| 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 aktiven Tarif mit API-Zugang, etwa in der Testphase oder nach Ende des Abos (`APIUnavailable`). | `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 (`Contact`)

| Feld | Typ | Beschreibung |
| --- | --- | --- |
| `addresses` | Array<Address> | Anschriften. |
| `companyId` | string (uuid) | ID der Firma. |
| `companyName` | string | Name. |
| `contactInfo` | ContactInfo | Kontaktdaten. |
| `createdAt` | string (date-time) | Anlage in bimetrics. |
| `customerKind` | string: `business`, `private` | Steuerlich: `business` Unternehmen, `private` Privatperson. Fehlt, wenn unbekannt. |
| `customerNumber` | integer | Kunden- bzw. Lieferantennummer; ergibt Debitor- und Kreditorkonto. |
| `deletedAt` | string (date-time), kann null sein | Gilt als gelöscht seit diesem Zeitpunkt; `null`, solange nicht gelöscht. Gelöschte Einträge liefern nur die Suchrouten mit `includeDeleted`. |
| `externalRef` | string | Externe Kunden- oder Lieferantenreferenz. |
| `id` | string (uuid) | ID des Kontakts. |
| `paymentInfo` | PaymentInfo | Zahlungsdaten. |
| `source` | string | Zugang bei Anlage: web, api oder mcp. |
| `type` | string: `customer`, `supplier`, `partner` | Art des Kontakts. |
| `updatedAt` | string (date-time) | Letzte Änderung. |
| `vatCheck` | ContactVatCheck | Letzte Prüfung der USt-IdNr. über VIES. Fehlt ohne Prüfung. |

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