> ## 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.

# 10DLC-Registrierungs-Wizard mit Speichern-und-Wiederaufnehmen-Entwürfen

> Registrieren Sie Ihre TCR-Marke und -Kampagne über den Orbit-Wizard: Speichern Sie Teilentwürfe über Sitzungen hinweg, verifizieren Sie eine Sole-Proprietor-Rufnummer per OTP, lassen Sie den gespeicherten Entwurf preflighten und reichen Sie atomar ein.

# 10DLC-Registrierungs-Wizard

Der Wizard ist der empfohlene Weg, die [TCR-Marken- und Kampagnenregistrierung](/guides/10dlc-registration) abzuschließen. Er wandelt den linearen Ein-Schritt-Ablauf in einen geführten, fortsetzbaren Prozess um:

* **Speichern und wieder aufnehmen** — Ihr Entwurf bleibt über Sitzungen, Tabs und Wochen hinweg erhalten. Schließen Sie den Tab oder kommen Sie morgen zurück; Sie setzen dort fort, wo Sie aufgehört haben.
* **Zwischen Schritten nicht-linear wechseln** — der Wizard verfolgt `brand`, `campaign` und `review` als unabhängige Schritte. Füllen Sie die Kampagnen-Samples aus, während der Markenabschnitt noch unvollständig ist, und die Fortschritts-Payload hält beide Zähler.
* **Vor dem Zahlen validieren** — feldspezifische Validierung feuert bei jedem Speichern, und ein Pre-Submission-Lint-Durchlauf bewertet den gespeicherten Entwurf gegen bekannte TCR-Ablehnungsmuster, bevor die Upstream-Registrierungsgebühr fällig wird.

<Note>
  Der Wizard schreibt nur in den Entwurfsspeicher Ihrer eigenen Organisation. Er hält, gate-t oder routet keinen Nachrichtenverkehr.
</Note>

Alle Wizard-Endpunkte liegen unter `/api/v1/compliance/10dlc/wizard`. Authentifizieren Sie mit Ihrem API-Schlüssel, genau wie bei den [Marken- und Kampagnen-Endpunkten](/guides/10dlc-registration).

## Rollen und Ratenlimits

* Lesen (`GET /wizard`, `GET /wizard/draft`) — jede authentifizierte Rolle in der Organisation.
* Schreiben (`PUT /wizard/draft`, `DELETE /wizard/draft`, `POST /wizard/phone/send`, `POST /wizard/phone/confirm`, `POST /wizard/preflight`, `POST /wizard/submit`) — Owner- oder Admin-Rolle.
* Schreibprofil: 10 Anfragen pro Minute, entsprechend den Legacy-Marken/Kampagnen-Endpunkten. Wizard-Preflight: 30 Anfragen pro Minute, entsprechend dem Ad-hoc-Preflight-Endpunkt.

***

## GET `/10dlc/wizard` — Fortschritts-Payload

Gibt das berechnete Fortschrittsobjekt zurück, das das Dashboard für sein Banner „Fortsetzen, wo Sie aufgehört haben" verwendet. Immer `200 OK` — eine frische Organisation erhält die Leer-Entwurfsform mit `state: "not_started"`.

```bash theme={null}
curl https://api.orbit.devotel.io/api/v1/compliance/10dlc/wizard \
  -H "X-API-Key: dv_live_sk_your_key_here"
```

**Antwort:**

```json theme={null}
{
  "data": {
    "state": "in_progress",
    "current_step": "campaign",
    "brand": {
      "completed_fields": 10,
      "total_fields": 10,
      "missing_fields": []
    },
    "campaign": {
      "completed_fields": 4,
      "total_fields": 6,
      "missing_fields": ["message_flow", "optout_message"]
    },
    "next_action": "fill_campaign"
  },
  "meta": {
    "request_id": "req_wiz001",
    "timestamp": "2026-09-02T10:00:00Z"
  }
}
```

`state` ist einer von `not_started`, `in_progress`, `brand_pending`, `campaign_pending`, `ready`, `rejected`. `current_step` ist `brand`, `campaign` oder `review`. `next_action` ist ein maschinenlesbarer Hinweis: `fill_brand`, `fill_campaign`, `review_and_submit`, `amend_brand`, `amend_campaign` oder `done`. Sobald die Marke oder Kampagne eingereicht wurde, enthält die Antwort auch `brand_id`, `campaign_id` und etwaige Upstream-Ablehnungsgründe.

`GET /10dlc/wizard/draft` gibt den vollständig gespeicherten Entwurf (Markenfelder, Kampagnenfelder, aktueller Schritt) zur Formularvorbefüllung zurück.

***

## PUT `/10dlc/wizard/draft` — Teilspeichern

Speichert eine beliebige Teilmenge von Marken- und/oder Kampagnenfeldern. Jedes Feld ist optional — Sie validieren nur die Felder, die Sie senden, und die anderen behalten ihre vorher gespeicherten Werte. `current_step` aktualisiert sich separat, sodass ein Resume auf dem richtigen Bildschirm landet.

```bash theme={null}
curl -X PUT https://api.orbit.devotel.io/api/v1/compliance/10dlc/wizard/draft \
  -H "X-API-Key: dv_live_sk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "brand": {
      "entity_type": "PRIVATE_PROFIT",
      "display_name": "Acme Corp",
      "company_name": "Acme Corporation Inc.",
      "email": "compliance@acme.com"
    },
    "current_step": "brand"
  }'
```

Ein Speichern, das die Validierung nicht besteht, gibt `422` zurück und lässt den persistierten Entwurf unberührt — der vorher gespeicherte Zustand überlebt.

**Markenfelder:** `entity_type`, `display_name`, `company_name`, `ein`, `phone`, `street`, `city`, `state`, `postal_code`, `country`, `email`, `website`, `vertical`.

**Kampagnenfelder:** `usecase`, `description` (40–4096 Zeichen), `sample_message` (1–10 Nachrichten), `message_flow` (min 40 Zeichen), `help_message` (min 20), `optout_message` (min 20), `is_political`, `cv_token`.

<Tip>
  Speichern Sie nach jedem Pflichtfeld, wenn Sie möchten — jedes Speichern kostet unter einem Schreib-Raten-Token und der Entwurf ist das Sicherheitsnetz. Die `brand_id` der Kampagne wird niemals manuell eingegeben: Der Wizard füllt sie aus dem Marken-Einreichungsergebnis.
</Tip>

***

## Sole-Proprietor-Telefonverifizierung (OTP)

US-Marken mit `entity_type: "SOLE_PROPRIETOR"`, und nur diese, ersetzen eine verifizierte Mobilnummer für eine EIN: TCR verankert die Sole-Proprietor-Identität an einer Rufnummer, deren Kontrolle der Registrant nachweist. Jeder andere US-Entity-Typ muss stattdessen eine EIN einreichen.

Verifizieren Sie die Nummer vor der Einreichung:

```bash theme={null}
# 1. Die Challenge an das brand.phone des Entwurfs senden
curl -X POST https://api.orbit.devotel.io/api/v1/compliance/10dlc/wizard/phone/send \
  -H "X-API-Key: dv_live_sk_your_key_here"
```

**Antwort:**

```json theme={null}
{
  "data": {
    "verification_id": "vf_abc123",
    "status": "pending",
    "channel": "sms",
    "expires_at": "2026-09-02T10:10:00Z"
  },
  "meta": {
    "request_id": "req_wiz002",
    "timestamp": "2026-09-02T10:00:00Z"
  }
}
```

```bash theme={null}
# 2. Den Code aus der SMS bestätigen
curl -X POST https://api.orbit.devotel.io/api/v1/compliance/10dlc/wizard/phone/confirm \
  -H "X-API-Key: dv_live_sk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{"code": "483921"}'
```

**Antwort:**

```json theme={null}
{
  "data": {
    "status": "verified",
    "phone": "+14155551234",
    "verified_at": "2026-09-02T10:04:12Z"
  },
  "meta": {
    "request_id": "req_wiz003",
    "timestamp": "2026-09-02T10:04:12Z"
  }
}
```

Der Nachweis ist auf die exakte Rufnummern-Zeichenfolge des Entwurfs ausgelegt. Bearbeiten Sie `brand.phone` nach der Verifizierung, zählt der alte Nachweis nicht mehr, und die Einreichung scheitert mit `422`, bis Sie eine frische Challenge gegen die neue Nummer laufen lassen. `/phone/send` auf einer bereits verifizierten Nummer gibt `409 ALREADY_VERIFIED` zurück; `/phone/confirm` ohne ausstehende Challenge gibt `404` zurück.

***

## POST `/10dlc/wizard/preflight` — Den gespeicherten Entwurf linten

Bewertet den **persistierten Wizard-Entwurf** gegen den Katalog bekannter TCR-Ablehnungsmuster, sodass der Bildschirm „Prüfen & Einreichen" Befunde gegen genau den Entwurf sieht, der gleich eingereicht wird — keine Chance auf Lint-Drift, wie ihn der Ad-hoc-[Preflight-Endpunkt](/guides/10dlc-registration#preflight-prüfung-ihrer-einreichung) hat, wenn er eine manuell gebaute Payload lint.

Der Request-Body ist optional: `expected_msg_per_day_per_number` (für die Durchsatzstufen-Regel) und `brand_vetting_score` (0–100), wenn Sie bereits einen haben.

```bash theme={null}
curl -X POST https://api.orbit.devotel.io/api/v1/compliance/10dlc/wizard/preflight \
  -H "X-API-Key: dv_live_sk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{}'
```

Die Antwortform — `score`, `verdict`, `findings[]` — ist identisch mit dem [Preflight-Linter auf der Registrierungsseite](/guides/10dlc-registration#was-der-10dlc-linter-prüft). Wie bei jenem Endpunkt bedeutet ein `pass`-Urteil „keine bekannten Ablehnungsmuster gefunden", nicht „TCR wird zustimmen".

***

## POST `/10dlc/wizard/submit` — Atomare Marke + Kampagne

Validiert den vollständigen Entwurf, dann reicht er Marke und Kampagne in einem Aufruf ein. Das Marken-Vetting landet typischerweise in 1–48 Stunden; die Kampagne folgt unmittelbar danach.

```bash theme={null}
curl -X POST https://api.orbit.devotel.io/api/v1/compliance/10dlc/wizard/submit \
  -H "X-API-Key: dv_live_sk_your_key_here"
```

**Antwort (`201 Created`):**

```json theme={null}
{
  "data": {
    "state": "brand_pending",
    "current_step": "review",
    "brand_id": "BXXXXXX",
    "campaign_id": "CXXXXXX",
    "next_action": "done"
  },
  "meta": {
    "request_id": "req_wiz004",
    "timestamp": "2026-09-02T10:05:00Z"
  }
}
```

Validierungsfehler geben `422` zurück, bevor irgendetwas belastet wird, mit `details.section`, das Ihnen sagt, ob die fehlenden oder ungültigen Felder im `brand`- oder `campaign`-Abschnitt liegen.

**Fehlersemantik — der atomare Schutz:**

* **Marke upstream abgelehnt** — keine Kampagne wird eingereicht. Der Entwurf bleibt mit dem Markenablehnungsgrund gestempelt erhalten, und `next_action` wechselt auf `amend_brand`. Korrigieren Sie die Markenfelder und reichen Sie erneut ein.
* **Kampagne upstream abgelehnt** — die akzeptierte `brand_id` wird persistiert, der Zustand bleibt bei `brand_pending`, und der Kampagnenablehnungsgrund wird gestempelt. Eine Neuesreichung überspringt die Markenstufe komplett, sodass die Markengebühr niemals erneut belastet wird; nur die Kampagne zahlt wieder.
* **Upstream 5xx oder Provider nicht verfügbar** — der Entwurf bleibt verbatim erhalten, und Sie können ihn so erneut versuchen.

Zustandsübergänge auf `ready`, sobald sowohl Marke als auch Kampagne von der Carrier-Prüfung als `APPROVED` zurückkommen.

***

## DELETE `/10dlc/wizard/draft` — Zurücksetzen

```bash theme={null}
curl -X DELETE https://api.orbit.devotel.io/api/v1/compliance/10dlc/wizard/draft \
  -H "X-API-Key: dv_live_sk_your_key_here"
```

Gibt `204 No Content` zurück. Setzt den Wizard auf den leeren Entwurf (`state: "not_started"`) zurück. Dies löscht die genehmigten Marken- oder Kampagnen-IDs **nicht** — es setzt nur den Wizard-Arbeitszustand zurück, sodass es als Nach-Genehmigungs-Aufräumen oder „Neustart" sicher ist.

***

## Vollständiger Lebenszyklus

1. `PUT /10dlc/wizard/draft` — Marke + Kampagne progressiv füllen.
2. `(nur SOLE_PROPRIETOR)` `POST /10dlc/wizard/phone/send` → `POST /10dlc/wizard/phone/confirm`.
3. `POST /10dlc/wizard/preflight` — Befunde beheben, bis das Urteil durchgeht.
4. `POST /10dlc/wizard/submit` — atomare Einreichung.
5. `GET /10dlc/wizard` — Zustand pollen bis `ready` (oder `GET /10dlc/campaigns/:id/status` für die Carrier-Map, wie auf der [Registrierungsseite](/guides/10dlc-registration#schritt-3-genehmigung-abwarten)).
6. `DELETE /10dlc/wizard/draft` — optionales Nach-Genehmigungs-Aufräumen.

<Warning>
  Die Legacy-Ein-Aufruf-Endpunkte (`POST /10dlc/brand`, `POST /10dlc/campaign`) bleiben für Skript-Pipelines verfügbar. Der Wizard ist der empfohlene Operator-Ablauf; die direkten Endpunkte verlangen eine vollständig befüllte Payload in einem einzigen Request.
</Warning>
