
# Eine Zustimmung erfassen

`POST /v1/users/{user_id}/consent-records` · Berechtigung `consent-records:write`

Erfasst eine Zustimmung, die Sie über Ihren eigenen Kanal eingeholt haben (`method = management_api`). Der Gegenstand ist ein Rechtsdokument (`subject_type = document`; Zustimmungszwecke sind noch nicht verfügbar) und `state` ist `presented`, `accepted` oder `declined`. Version, Inhalts-Hash und Sprache werden aus dem Dokument übernommen; Sie können sie nicht angeben. `occurred_at` ist standardmäßig jetzt und darf weder in der Zukunft liegen noch mehr als 5 Minuten zurückliegen. Zustimmungsdatensätze sind nur anhängbar: Sie werden nie aktualisiert oder gelöscht.

## Anfrage

Pfadparameter:

| Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
| `user_id` | string | ja | Benutzer-ID (`usr_…`). |

JSON-Body (unbekannte Felder werden mit `400 unknown_field` abgelehnt):

| Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
| `Idempotency-Key` | header | nein | Optionaler Schlüssel (16–64 Zeichen), mit dem ein wiederholter Request sicher ist. |
| `subject_type` | string | ja | Nur `document`. |
| `subject_id` | string | ja | ID des Rechtsdokuments (`ldoc_…`), das der Benutzer gesehen hat. |
| `state` | string | ja | `presented`, `accepted` oder `declined`. |
| `application_id` | string \| null | nein | Anwendung (`app_…`); wenn weggelassen und das Dokument anwendungsspezifisch ist, wird die Anwendung des Dokuments erfasst. |
| `occurred_at` | string (date-time) | nein | Zeitpunkt des Ereignisses; Standard ist jetzt, nicht in der Zukunft, höchstens 5 Minuten alt. |

## Antwort

`201 Created` mit dem Zustimmungsdatensatz.

```json
{
  "id": "crec_01j9xk3m7q8r2s4t6v8w0y2z4b",
  "user_id": "usr_01j9xk3m7q8r2s4t6v8w0y2z4c",
  "subject_type": "document",
  "subject_id": "ldoc_01j9xk3m7q8r2s4t6v8w0y2z4a",
  "subject_version": "2026-10",
  "content_sha256": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08",
  "locale": "en",
  "state": "accepted",
  "method": "management_api",
  "application_id": null,
  "occurred_at": "2026-10-05T09:31:12.004211Z"
}
```

## Fehler

| HTTP | code | Wann |
|---|---|---|
| 400 | `unknown_field` | Der Body enthält ein unbekanntes Feld. |
| 404 | `not_found` | Der Benutzer oder `application_id` existiert in dieser Umgebung nicht. Die Erweiterung `resource` gibt an, welches fehlt: `user` oder `application`. |
| 415 | `unsupported_media_type` | Der Content-Type ist nicht `application/json`. |
| 422 | `validation_failed` | Ein Feld ist ungültig: unbekanntes Dokument (`/subject_id`, `unknown_subject`), `subject_type: purpose` (`not_supported`), ein für Dokumente nicht erlaubter Status oder `occurred_at` außerhalb des Bereichs. |
| 401 | `unauthenticated` | Die Anmeldeinformation fehlt, ist ungültig oder wurde widerrufen. |
| 403 | `insufficient_permissions` | Der Anmeldeinformation fehlt die erforderliche Berechtigung. |
| 429 | `rate_limited` | Das Ratenlimit wurde überschritten; versuchen Sie es nach Ablauf von `Retry-After` erneut. |
| 503 | `service_unavailable` | Eine Abhängigkeit ist vorübergehend nicht verfügbar; versuchen Sie es nach Ablauf von `Retry-After` erneut. |

## Beispiel

```bash
curl -X POST https://api.eu.keenauth.com/v1/users/usr_01j9xk3m7q8r2s4t6v8w0y2z4c/consent-records \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"subject_type":"document","subject_id":"ldoc_01j9xk3m7q8r2s4t6v8w0y2z4a","state":"accepted"}'
```

## Personenbezogene Daten

Dieser Endpunkt verarbeitet personenbezogene Daten: Zustimmungsdatensätze. [Personenbezogene Daten in den KeenAuth-APIs](/docs/policies/personal-data) beschreibt, was gespeichert wird, wie lange es aufbewahrt wird und wie es gelöscht wird. Übermitteln Sie in keinem Feld besondere Kategorien personenbezogener Daten (Gesundheit, biometrische Daten, Religion, politische Meinungen, sexuelle Orientierung).
