> ## Documentation Index
> Fetch the complete documentation index at: https://docs.orbit.devotel.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Auskunftsanträge betroffener Personen (DSAR)

> Empfangen, verifizieren und erfüllen Sie Anfragen betroffener Personen nach DSGVO, CCPA, CPRA, LGPD, PDPA und DPDP auf Orbit – über Operator-Workflows oder das Self-Service-Portal.

# Auskunftsanträge betroffener Personen (DSAR)

Ein **Auskunftsantrag betroffener Personen** (auch Datenschutzanfrage
oder Antrag auf Verbraucherrechte genannt) ist der formelle Mechanismus,
mit dem eine Person ihre Rechte an den personenbezogenen Daten ausübt,
die Sie über sie halten – das Recht auf **Auskunft**, **Löschung**,
**Berichtigung**, **Datenübertragbarkeit** oder **Widerspruch gegen den
Verkauf** dieser Daten. Die meisten Datenschutzgesetze setzen Ihnen eine
feste Antwortfrist (30 Tage nach DSGVO, 45 nach CCPA/CPRA).

Orbit bietet Ihnen zwei Eingangswege und eine Erfüllungs-Pipeline:

* **Operator-gestellter DSAR** – Ihr Support- oder Compliance-Team stellt
  eine Anfrage im Namen eines Kunden über die authentifizierte API oder
  das Dashboard.
* **Öffentliches Self-Service-Portal** – die betroffene Person stellt
  ihre eigene Anfrage über einen öffentlichen, nicht authentifizierten
  Flow, der ihre Identität mit einem **Zwei-Faktor-E-Mail- + SMS-OTP**
  nachweist, bevor irgendetwas eingereiht wird.

<Warning>
  Diese Seite beschreibt die Plattformsteuerungen von Orbit. Sie ist
  **keine Rechtsberatung.** Ihre Pflichten – welche Gesetze anwendbar
  sind, was Sie offenlegen müssen und wie lange Sie Zeit haben – hängen
  davon ab, wo Ihre betroffenen Personen leben und welche Daten Sie
  verarbeiten. Ziehen Sie qualifizierten Rechtsbeistand hinzu.
</Warning>

Alle Endpunkte unten sind unter
`https://api.orbit.devotel.io/api/v1/compliance` verwurzelt.

***

## Unterstützte Rechtsordnungen und Fristen

Das Feld `applicable_jurisdiction` einer Anfrage steuert, welche
gesetzliche Frist Orbits SLA-Tracker anwendet. Operatoren können eine
Anfrage nach dem Eingang neu klassifizieren.

| Rechtsordnung            | Code     | Antwort-SLA |
| ------------------------ | -------- | ----------- |
| EU / EWR DSGVO           | `gdpr`   | 30 Tage     |
| Kalifornien CCPA         | `ccpa`   | 45 Tage     |
| Kalifornien CPRA         | `cpra`   | 45 Tage     |
| Brasilien LGPD           | `lgpd`   | 15 Tage     |
| Singapur / Thailand PDPA | `pdpa`   | 30 Tage     |
| Kanada PIPEDA            | `pipeda` | 30 Tage     |
| Indien DPDP              | `dpdp`   | 30 Tage     |

## Anfragetypen

`request_type` beschreibt, was die betroffene Person verlangt. Der
vollständige CCPA/CPRA-Verbensatz steht Operatoren zur Verfügung; das
öffentliche Portal exponiert eine freundlichere Teilmenge, die darauf
abbildet.

| Operator-`request_type` | Bedeutung                                                                   | Verb des öffentlichen Portals |
| ----------------------- | --------------------------------------------------------------------------- | ----------------------------- |
| `know`                  | Auskunft – Offenlegung der gehaltenen Daten (DSGVO Art. 15, CCPA §1798.110) | `access`                      |
| `delete`                | Löschung (DSGVO Art. 17, CCPA §1798.105)                                    | `delete`                      |
| `correct`               | Berichtigung (DSGVO Art. 16, CPRA §1798.106)                                | —                             |
| `portability`           | Maschinenlesbarer Export (DSGVO Art. 20)                                    | `portability`                 |
| `opt_out_sale`          | Widerspruch gegen Verkauf/Weitergabe (CCPA §1798.120)                       | `opt_out`                     |
| `limit_sensitive_pi`    | Nutzung sensibler PI beschränken (CPRA §1798.121)                           | —                             |
| `non_discrimination`    | Recht auf Nicht-Diskriminierung (CCPA §1798.125)                            | —                             |

Bei CCPA-Auskunftsanfragen können Sie zusätzlich
`consumer_categories` anhängen – die Kategorien nach CCPA
§1798.100(b), zu denen die betroffene Person fragt: `identifiers`,
`customer_records`, `protected_classifications`, `commercial`,
`biometric`, `internet_activity`, `geolocation`, `sensory`,
`professional`, `education`, `inferences`, `sensitive_pi`.

***

## Operator-gestellte Anfragen

### Eine Anfrage erstellen

`POST /compliance/dsar` – erfordert einen Admin- oder Owner-API-Schlüssel.
Geben Sie mindestens eine Betroffenen-Kennung (`contact_id`,
`subject_email` oder `subject_phone`) sowie die `requester_email` an,
die die Korrespondenz erhalten soll.

```bash theme={null}
curl -X POST https://api.orbit.devotel.io/api/v1/compliance/dsar \
  -H "X-API-Key: dv_live_sk_..." \
  -H "Content-Type: application/json" \
  -d '{
    "subject_email": "jordan@example.com",
    "requester_email": "jordan@example.com",
    "applicable_jurisdiction": "gdpr",
    "request_type": "know",
    "verification_method": "email_link"
  }'
```

Gibt `202 Accepted` zurück:

```json theme={null}
{
  "id": "dsar_8x2k…",
  "status": "received",
  "applicable_jurisdiction": "gdpr",
  "request_type": "know",
  "verification_status": "pending",
  "message": "Request received and queued for verification."
}
```

| Feld                      | Typ       | Hinweise                                                                                                                                                      |
| ------------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `contact_id`              | string    | Optional. Verknüpft die Anfrage mit einem bekannten Kontakt.                                                                                                  |
| `subject_email`           | email     | Eines aus E-Mail / Telefon / contact\_id ist erforderlich.                                                                                                    |
| `subject_phone`           | string    | E.164.                                                                                                                                                        |
| `requester_email`         | email     | **Erforderlich.** Wohin Statusaktualisierungen gesendet werden.                                                                                               |
| `applicable_jurisdiction` | enum      | Standard `gdpr`. Muss explizit auf `ccpa` oder `cpra` gesetzt werden, wenn `request_type` `opt_out_sale` oder `limit_sensitive_pi` ist (siehe Hinweis unten). |
| `request_type`            | enum      | Standard `know`.                                                                                                                                              |
| `consumer_categories`     | string\[] | CCPA-Kategorien (nur Auskunft).                                                                                                                               |
| `verification_method`     | enum      | `email_link`, `email_phone`, `document`, `manual_review`.                                                                                                     |
| `requester_statement`     | string    | Freitext, ≤ 4096 Zeichen.                                                                                                                                     |
| `authorized_agent`        | object    | `{ agent_name, agent_email, permission_document_id? }`, wenn ein Bevollmächtigter im Namen der betroffenen Person einreicht.                                  |

> **Hinweis** – `applicable_jurisdiction` hat nur für Rechte den
> Standard `gdpr`, die unter der DSGVO existieren. Die Anfragetypen
> `opt_out_sale` und `limit_sensitive_pi` sind nur unter CCPA/CPRA
> verfügbar und haben kein DSGVO-Äquivalent, daher müssen Sie
> `applicable_jurisdiction` für sie explizit auf `ccpa` oder `cpra`
> setzen. Das Weglassen (oder Beibehalten des `gdpr`-Standards) wird mit
> `422 VALIDATION_ERROR` abgelehnt.

### Status-Lebenszyklus

Eine Anfrage durchläuft:

`received` → `processing` → `completed`

mit den End-Zweigen `failed`, `expired` und `cancelled`. Der
**Verifikations**-Unterstatus wird unabhängig verfolgt:
`pending` → `verified` (der Worker fährt fort) oder `rejected` (der
Worker hält an). DSGVO-/Operator-eingereichte Zeilen haben standardmäßig
`not_required`.

### Identität verifizieren oder ablehnen

Anfragen mit höherem Schutzbedarf (Löschung, Opt-out, sensitive
Beschränkung) erfordern eine Operator-Entscheidung, bevor die Erfüllung
fortgesetzt wird:

```bash theme={null}
curl -X POST https://api.orbit.devotel.io/api/v1/compliance/dsar/dsar_8x2k…/verification \
  -H "X-API-Key: dv_live_sk_..." \
  -H "Content-Type: application/json" \
  -d '{ "decision": "verified", "notes": "Matched gov-ID upload." }'
```

`decision` ist `verified` oder `rejected`; `notes` ist optional
(≤ 2048 Zeichen). Gibt den neuen `verification_status` und
`verified_at` zurück.

### Eine Anfrage widerrufen

`POST /compliance/dsar/{id}/cancel` zieht eine laufende Anfrage zurück
(DSGVO Art. 7(3)). Funktioniert nur, solange die Anfrage `received` oder
`processing` ist; eine abgeschlossene Anfrage gibt `409 Conflict`
zurück.

```bash theme={null}
curl -X POST https://api.orbit.devotel.io/api/v1/compliance/dsar/dsar_8x2k…/cancel \
  -H "X-API-Key: dv_live_sk_..." \
  -H "Content-Type: application/json" \
  -d '{ "reason": "Duplicate of dsar_7a1f…" }'
```

### Anfragen auflisten und lesen

* `GET /compliance/dsar` – paginierte Liste. Query: `page` (≥ 1),
  `page_size` (≤ 100, Standard 25) und ein optionaler `status`-Filter.
* `GET /compliance/dsar/{id}` – eine Anfrage abrufen. Die Antwort
  enthält die signierte `export_url` (und ihr `export_expires_at`),
  sobald ein Auskunfts-/Portabilitäts-Export erzeugt wurde, sowie
  `tables_exported` mit den Zeilenzahlen je Tabelle.

### Löschanfragen

Löschungen nach DSGVO Art. 17 werden als eigene Ressource verfolgt,
damit Sie prüfen und eingreifen können, bevor Daten vernichtet werden:

* `GET /compliance/dsar/erasure-requests` – Liste. Query: `status`
  (`pending`, `cancelled`, `executing`, `executed`, `failed`) und
  `limit` (≤ 500).
* `POST /compliance/dsar/erasure-requests/{id}/cancel` – eine
  **ausstehende** Löschung vor ihrer Ausführung abbrechen. Optionaler
  `reason` (≤ 500 Zeichen). Gibt `409` zurück, wenn sie bereits
  ausgeführt wird oder fertig ist.

### SLA-Dashboard

`GET /compliance/dsar/sla` liefert eine kombinierte Export- +
Löschungs-SLA-Momentaufnahme, damit Sie nie eine gesetzliche Frist
verpassen:

```json theme={null}
{
  "items": [
    {
      "id": "dsar_8x2k…",
      "kind": "export",
      "status": "processing",
      "days_elapsed": 22,
      "days_remaining": 8,
      "severity": "amber",
      "sla_deadline_at": "2026-07-01T00:00:00.000Z",
      "approaching": true,
      "breach": false,
      "escalation_due": false
    }
  ],
  "alerts": {
    "breached": 0,
    "approaching": 1,
    "escalation_due": 0,
    "worst_severity": "amber",
    "has_alert": true
  },
  "sla_days": 30
}
```

Die Schweregrade **skalieren proportional zum SLA-Fenster jeder
Rechtsordnung** – die Tagesschwellen sind am DSGVO-30-Tage-Fall
verankert und mit dem Verhältnis `slaDays / 30` multipliziert, sodass
eine Anfrage immer beim selben Anteil ihrer eigenen Frist amber und rot
wird. `escalation_due` wird 5 Tage vor der gesetzlichen Frist aktiv
(`slaDays − 5`).

Für **DSGVO** (`sla_days: 30`): **grün** (\< 20 Tage verstrichen),
**amber** (20–25), **rot** (26–30), **rot + Verletzung** (> 30);
`escalation_due` an Tag 25.

Für **CCPA/CPRA** (`sla_days: 45`) ergeben dieselben Verhältnisse
**grün** (\< 30), **amber** (30–38), **rot** (39–45), **rot + Verletzung**
(> 45); `escalation_due` an Tag 40. Lesen Sie die Stufengrenzen immer
gegen die für diese Anfrage zurückgegebenen `sla_days`, nicht gegen die
festen Zahlen 20/25/30.

***

## Öffentliches Self-Service-Portal

Der öffentliche Flow lässt eine betroffene Person eine Anfrage ohne
Konto einreichen. Die Identität wird mit einem **Zwei-Faktor-OTP**
nachgewiesen – einem E-Mail-Code und einem SMS-Code – bevor irgendeine
Anfrage eingereiht wird. Die Endpunkte liegen unter
`/compliance/public/dsar` und sind nicht authentifiziert, aber durch
Cloudflare Turnstile, Rate-Limits pro IP und pro Kennung sowie eine
datenschutzwahrende Antwortform abgesichert, die nie verrät, ob ein
E-Mail-/Telefon-Paar zu einem echten Kontakt passt.

<Note>
  SMS-Verifikationscodes werden über den Devotel-Softswitch zugestellt
  (der einzige ausgehende SMS-Pfad der Plattform). Es sind Plattform-
  OTPs, kein dem Mandanten zu berechnender Verkehr, und sie tragen keine
  Persistenz von Zustellquittungen.
</Note>

### Flow-Übersicht

<Steps>
  <Step title="Start">
    `POST /compliance/public/dsar/begin` mit `email`, `phone` (E.164),
    `request_type` (`access` | `delete` | `portability` | `opt_out`)
    und einem Cloudflare-`turnstile_token` (in Produktion erforderlich).
    Gibt eine intransparente `claim_id`, `email_sent: true` und
    `expires_in: 600` zurück. Ein E-Mail-OTP wird sofort versendet.
  </Step>

  <Step title="E-Mail verifizieren">
    `POST /compliance/public/dsar/verify-email` mit `claim_id` und dem
    6-stelligen `code`. Gibt den Zustand `email_verified` und den
    nächsten Schritt `phone_send` zurück. Codes laufen nach 10 Minuten
    ab; maximal 3 Versuche. `POST …/resend-email` (mit `claim_id` +
    `email`) stellt einen neuen Code aus, vorbehaltlich einer
    60-Sekunden-Sperre.
  </Step>

  <Step title="Telefon-Code senden">
    `POST /compliance/public/dsar/send-phone` mit `claim_id` und der
    `phone`, die der beim Start angegebenen entspricht. Sendet ein
    SMS-OTP (`expires_in: 600`). Zwischen Sendungen gilt eine
    60-Sekunden-Sperre; ein zu früher erneuter Versuch gibt `429` mit
    `Retry-After` zurück.
  </Step>

  <Step title="Telefon verifizieren">
    `POST /compliance/public/dsar/verify-phone` mit `claim_id` und dem
    6-stelligen `code`. Gibt den Zustand `phone_verified` und den
    nächsten Schritt `submit` zurück.
  </Step>

  <Step title="Einreichen">
    `POST /compliance/public/dsar/submit` mit `claim_id`. Persistiert
    eine Audit-Zeile und – nur wenn die verifizierte E-Mail + Telefon zu
    einem Kontakt in Ihrem Mandanten passen – reiht einen echten DSAR
    ein (vorab mit `verification_status: verified` markiert, da das OTP
    die Identität bereits nachgewiesen hat). Gibt eine `reference_id`
    (z. B. `dsar_pub_…`) und ein `queued`-Boolean zurück.
  </Step>
</Steps>

### Die Identitätsnachweis-Absender konfigurieren

Die beiden OTPs werden von Plattform-Absendern verschickt, die Sie
einmal in Ihrer API-Umgebung konfigurieren. Setzen Sie sie, bevor Sie
das Portal veröffentlichen – ein nicht gesetzter SMS-Absender ohne
Fallback lässt den Telefonschritt fail-closed scheitern.

| Variable                        | Verwendet für                       | Standard / Fallback                                                                                |
| ------------------------------- | ----------------------------------- | -------------------------------------------------------------------------------------------------- |
| `DEVOTEL_DSAR_PROOF_FROM_EMAIL` | Absenderadresse auf dem E-Mail-OTP. | `privacy@orbit.devotel.io`. Für die Zustellung ist außerdem `DEVOTEL_RESEND_API_KEY` erforderlich. |
| `DEVOTEL_DSAR_PROOF_SMS_FROM`   | E.164-Absender auf dem SMS-OTP.     | Fällt auf `DEVOTEL_PLATFORM_DEFAULT_FROM` zurück.                                                  |

Wenn `DEVOTEL_DSAR_PROOF_SMS_FROM` **und** `DEVOTEL_PLATFORM_DEFAULT_FROM`
beide nicht gesetzt sind, **scheitert der `send-phone`-Schritt fail-closed
mit einem `503`** – das Portal meldet „vorübergehend nicht verfügbar" und
der Fehler wird unter der Metrik `dsar.proof.sms_send_failed` emittiert,
sodass er in Ihren Dashboards auftaucht statt den zweiten Faktor still zu
überspringen. Ebenso gibt der E-Mail-Schritt `503` zurück, wenn
`DEVOTEL_RESEND_API_KEY` nicht gesetzt ist. Konfigurieren Sie beide
Absender, bevor Sie das Portal öffentlich verlinken.

### Missbrauchsabwehr

| Steuerung                    | Limit                                                      |
| ---------------------------- | ---------------------------------------------------------- |
| Cloudflare Turnstile         | Auf `begin` in Produktion erforderlich (fail-closed).      |
| `begin` pro IP               | 3 pro Stunde.                                              |
| Sperre pro E-Mail            | 1 pro 60 s.                                                |
| SMS-Sperre pro Telefonnummer | 1 pro 60 s.                                                |
| Fastify-Gate pro IP          | 30 Anfragen/Min pro IP, unabhängig je Endpunkt angewendet. |
| OTP-TTL / Versuche           | 10 Minuten, maximal 3 Versuche pro Code.                   |
| Claim-TTL                    | 30 Minuten Ende-zu-Ende.                                   |

Die Antwortform ist identisch, ob die Kennungen zu einem echten Kontakt
passen oder nicht – das Portal bestätigt oder bestreitet nie, ob jemand
in Ihrer Datenbank ist. Wenn Redis nicht verfügbar ist, öffnen die
Rate-Limit-Gates (fail-**open**), um die Verfügbarkeit zu erhalten.

### Turnstile-Schutz aktivieren

Das Turnstile-Gate wird mit zwei Umgebungsvariablen konfiguriert.

| Variable                                 | Wo           | Beschreibung                                                                                                                              |
| ---------------------------------------- | ------------ | ----------------------------------------------------------------------------------------------------------------------------------------- |
| `DEVOTEL_TURNSTILE_SECRET_KEY`           | API (Server) | Cloudflare-Turnstile-Secret. Der `begin`-Endpunkt verifiziert das eingereichte `turnstile_token` gegen Cloudflare, wenn dies gesetzt ist. |
| `NEXT_PUBLIC_DEVOTEL_TURNSTILE_SITE_KEY` | Web (Client) | Öffentlicher Turnstile-Site-Key, mit dem das Portal das Widget rendert.                                                                   |

<Warning>
  Das Gate ist **fail-open**, wenn `DEVOTEL_TURNSTILE_SECRET_KEY` nicht
  gesetzt ist: `begin` akzeptiert Anfragen ohne Token und protokolliert
  eine einzelne Warnung. Setzen Sie das Secret in Produktion, sonst ist
  das Portal durch Turnstile ungeschützt, obwohl jede andere
  Missbrauchsabwehr oben weiterhin gilt. Erzeugen Sie beide Schlüssel im
  Cloudflare-Dashboard (Turnstile → Add site) und setzen Sie sie auf der
  API- bzw. Web-Bereitstellung.
</Warning>

***

## Den Portal-Link hosten

Veröffentlichen Sie das öffentliche Portal unter Ihrer
Datenschutzerklärung als Link „Datenschutzanfrage einreichen". Da sich
der Flow per OTP selbst verifiziert, sind Anfragen, die darüber
eingehen, bereits identitätsgeprüft – sie landen fertig zur Erfüllung in
Ihrer Operator-Warteschlange und erscheinen in `GET /compliance/dsar`
gemeinsam mit Operator-gestellten Anfragen.

***

## Weiterführende Referenzen

* [Eine DSGVO-Haltung Ende-zu-Ende zusammenstellen](/compliance/gdpr-posture-guide) —
  wo der DSAR-Eingang in der Gesamtabfolge liegt.
* [Einwilligungsverwaltung](/compliance/consent-management) – den
  Einwilligungsstand erfassen und abfragen, den ein DSAR Sie zu
  respektieren auffordern kann.
* [Opt-out- & Unterdrückungslisten](/compliance/opt-out-suppression) —
  wie `delete`- / `opt_out`-Ergebnisse in die Unterdrückung fließen.
* [Einwilligung zur Anrufaufzeichnung](/compliance/recording-consent) – Umgang
  mit Aufzeichnungen, auf die sich eine Auskunftsanfrage bezieht.
* [API-Referenz → Compliance](/api-reference/endpoints/compliance) – vollständige
  Anfrage-/Antwort-Schemata (aus der Live-API neu generiert).
