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

# Telefon-OTP senden API: SMS-Verifizierungscode

> POST /v3/phone/send/ sendet per Didit einen SMS-Einmalcode. Wiederholung bei gesperrten Nummern, 5-min Gültigkeit, Preise pro Nutzung.

## Ihren Markennamen in der SMS angeben

SMS-Codes enthalten den SMS-Absendernamen Ihrer Anwendung, den Sie in der Business Console festlegen. Dafür fallen keine zusätzlichen Kosten an:

> 123456 ist Ihr Verifizierungscode für **Acme Bank**

Um einen Code mit einem anderen Namen zu versehen, übergeben Sie `options.sms_sender_name` (1 bis 30 Zeichen: nur Buchstaben, Ziffern, Leerzeichen sowie ' & - !, nicht ausschließlich Ziffern):

```json theme={null}
{
  "phone_number": "+14155552671",
  "options": {
    "preferred_channel": "sms",
    "sms_sender_name": "Acme Bank"
  }
}
```

Ein Name, der diese Regeln nicht erfüllt, führt zu `400`, und es wird kein Code gesendet.
WhatsApp-Codes verwenden eine feste Nachricht und sind nicht markenspezifisch. Verbinden Sie Ihre eigene WhatsApp-Business-Nummer in der Business Console, um sie unter Ihrem Geschäftsnamen zu versenden. Siehe [WhatsApp-Codes von Ihrer eigenen Nummer senden](https://docs.didit.me/de/core-technology/phone-verification/overview.md#whatsapp-codes-von-ihrer-eigenen-nummer-senden).
Welchen Namen ein Code trägt und wie hoch das tägliche Limit für neue Namen ist, erfahren Sie unter [Markenspezifische Verifizierungsnachrichten](https://docs.didit.me/de/core-technology/phone-verification/overview.md#gebrandete-verifizierungsnachrichten).

## Ausfälle des Anbieters behandeln

Wenn der Telefonanbieter vorübergehend nicht verfügbar ist, gibt dieser Endpoint `502` mit einem stabilen, maschinenlesbaren Code zurück:

```json theme={null}
{
  "detail": "The phone verification provider is temporarily unavailable.",
  "code": "phone_provider_unavailable"
}
```

Behandeln Sie diese Antwort als für einen Wiederholungsversuch geeignet. Verwenden Sie eine kurze Wartezeit (Backoff) und zeigen Sie dem Benutzer eine Meldung über eine vorübergehende Nichtverfügbarkeit des Dienstes an, statt ihn aufzufordern, eine gültige Telefonnummer oder einen gültigen Code zu ändern.


## OpenAPI

````yaml de/openapi-25.json POST /v3/phone/send/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API für Ausweisverifizierung. Authentifizierung über den x-api-key-Header.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/phone/send/:
    post:
      tags:
        - Standalone APIs
      summary: Telefoncode senden
      description: >-
        Senden Sie einen Einmalcode (OTP) über WhatsApp, SMS oder einen anderen
        unterstützten Kanal an eine Telefonnummer und verifizieren Sie ihn
        anschließend mit [`POST
        /v3/phone/check/`](/de/standalone-apis/phone-check).


        **Zusammenspiel von Senden und Prüfen.** Der Verifizierungsstatus wird
        über Ihre Anwendung und die `phone_number` im E.164-Format identifiziert
        – der Prüfaufruf erfordert keine `request_id`. Jeder neue Sendevorgang
        erstellt eine ausstehende Verifizierung mit einer Gültigkeitsdauer von
        **5 Minuten**: Rufen Sie die Prüfung mit derselben Nummer und dem Code
        auf, den der Benutzer erhalten hat, bevor das Zeitfenster abläuft. Wird
        der Sendevorgang für dieselbe Nummer erneut aufgerufen, während eine
        Verifizierung aussteht, wird ein Code für dieselbe Verifizierung erneut
        gesendet (`status: "Retry"`, dieselbe `request_id`). Auf diese Weise
        wird höchstens ein Wiederholungsversuch verknüpft (insgesamt zwei
        Sendevorgänge); ein weiterer Sendevorgang startet eine neue
        Verifizierung mit einer neuen `request_id`. Das 5-Minuten-Fenster
        beginnt mit dem ersten Sendevorgang und wird durch Wiederholungsversuche
        nicht verlängert.


        **Zustellkanäle.** `options.preferred_channel` wählt den Kanal aus
        (standardmäßig `whatsapp`; `sms`, `telegram`, `voice`, `rcs`, `viber`
        und `zalo` werden ebenfalls unterstützt). Wenn der bevorzugte Kanal für
        das Zielland oder die Zielnummer nicht verfügbar ist, greift die
        Zustellung automatisch auf SMS zurück – der Sendevorgang meldet
        weiterhin `Success`, und der tatsächlich genutzte Kanal wird in der
        Antwort der Prüfung angegeben (`phone.verification_method` und die
        `lifecycle`-Ereignisse).


        **Branding.** SMS-Codes enthalten ohne zusätzliche Kosten den
        SMS-Absendernamen Ihrer Anwendung, der in der Business Console
        eingerichtet wurde. Übergeben Sie `options.sms_sender_name`, um einen
        einzelnen Code mit einem anderen Namen zu versehen, oder
        `options.use_white_label_customization: true`, um auf Ihren öffentlichen
        White-Label-Namen zurückzugreifen, wenn kein Absendername festgelegt
        ist. WhatsApp-Codes nutzen eine feste Nachricht; verbinden Sie Ihre
        eigene WhatsApp Business-Nummer in der Business Console, um sie unter
        Ihrem Unternehmensnamen und Ihrer Nummer zu versenden – abgerechnet wird
        ausschließlich die Didit-Gebühr.


        **Sendestatus.** `Success` – OTP für eine neue Verifizierung gesendet;
        `Retry` – OTP für die ausstehende Verifizierung erneut gesendet;
        `Blocked` – die Betrugsprävention hat den Versand verweigert (siehe
        `reason`, z. B. `repeated_attempts`, `suspicious`, `spam`). Ein
        `Blocked`-Sendevorgang schließt die Verifizierung sofort mit dem Status
        `Declined` und einer Warnung vor hohem Risiko ab, sodass eine
        nachfolgende Prüfung `Expired or Not Found` zurückgibt.


        **Abrechnung.** Der Preis hängt vom Zielland und dem Kanal ab, der die
        Nachricht tatsächlich zustellt – siehe [Preise für
        Telefonverifizierung](/de/getting-started/phone-verification-pricing).
        Nur `Blocked`-Sendevorgänge sind garantiert kostenlos: Jeder andere noch
        nicht abgerechnete Sendeversuch wird beim Abschluss oder Ablauf der
        Verifizierung in Rechnung gestellt, selbst wenn die Zustellung nie
        bestätigt wurde oder der Zustelldienstleister die Nachricht als
        unzustellbar gemeldet hat. Prüfungen sind immer kostenlos. Als Maßnahme
        gegen Missbrauch ist die Telefonverifizierung bis zum ersten Aufladen
        Ihrer Organisation deaktiviert (`403`).


        **Sitzungspersistenz.** Jede neue Verifizierung wird als Sitzung vom Typ
        API persistent gespeichert: `request_id` ist eine echte Sitzungs-ID, die
        Sie an `GET /v3/session/{sessionId}/decision/` übergeben können, die
        Verifizierung erscheint in der Business Console und
        `status.updated`-Webhooks werden im weiteren Verlauf ausgelöst.


        **Sandbox.** Sandbox-API-Schlüssel überspringen Zustellung und
        Abrechnung: Nach der Anfragevalidierung (ungültige Eingaben geben
        weiterhin `400` zurück) liefert der Endpoint eine statische
        `Success`-Payload mit einer zufälligen `request_id` zurück; es wird
        keine Nachricht gesendet und nichts persistent gespeichert. Verwenden
        Sie den Code `123456` bei der Sandbox-Prüfung.


        **Authentifizierung.** Übergeben Sie den API-Schlüssel Ihrer Anwendung
        im Header `x-api-key`. Fehlende oder ungültige Anmeldedaten geben `403`
        zurück (`{"detail": "You do not have permission to perform this
        action."}`) – diese API gibt niemals `401` zurück.


        **Rate-Limits.** Gemeinsames Schreibbudget von 300 Anfragen/Min. pro
        API-Schlüssel über alle POST/PATCH/DELETE-Endpoints hinweg, plus eine
        Missbrauchsobergrenze von 4 Sendeversuchen pro Telefonnummer pro Stunde;
        das Überschreiten eines der Limits gibt `429` zurück.
      operationId: post_v3phone_send
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                phone_number:
                  type: string
                  maxLength: 20
                  description: >-
                    Telefonnummer des Empfängers im E.164-Format –
                    vorangestelltes `+` und Ländervorwahl (z. B.
                    `+14155552671`). Nummern werden validiert und in E.164
                    normalisiert; nicht analysierbare oder ungültige Nummern
                    geben `400` mit einem `phone_number`-Feldfehler zurück.
                  example: '+14155552671'
                options:
                  type: object
                  description: Optionen für die OTP-Zustellung. Alle Felder sind optional.
                  properties:
                    code_size:
                      type: integer
                      minimum: 4
                      maximum: 8
                      default: 6
                      description: Anzahl der Ziffern im OTP.
                    locale:
                      type: string
                      maxLength: 5
                      pattern: ^[a-z]{2,3}(-[A-Z]{2,3})?$
                      description: >-
                        BCP-47-Locale zur Lokalisierung der
                        Verifizierungsnachricht (z. B. `en-US`, `fr`, `es`).
                        Ungültige Formate geben `400` zurück.
                      example: en-US
                    preferred_channel:
                      type: string
                      enum:
                        - whatsapp
                        - sms
                        - telegram
                        - voice
                        - rcs
                        - viber
                        - zalo
                      default: whatsapp
                      description: >-
                        Bevorzugter Zustellkanal. Wenn der Kanal für das
                        Zielland oder die Zielnummer nicht verfügbar ist, weicht
                        die Nachricht automatisch auf SMS aus – der Versand
                        meldet weiterhin `Success`.
                    use_white_label_customization:
                      type: boolean
                      default: false
                      description: >-
                        Wenn `true`, erfolgt der Versand im White-Label-Design:
                        Wenn Ihre Anwendung keinen SMS-Absendernamen hat, nennt
                        die SMS stattdessen Ihren öffentlichen White-Label-Namen
                        („123456 ist Ihr Verifizierungscode für Acme Bank“). Ihr
                        SMS-Absendername wird, sofern festgelegt, mit oder ohne
                        dieses Flag verwendet. Gilt für SMS-Nachrichten,
                        einschließlich eines SMS-Fallbacks von einem anderen
                        Kanal; WhatsApp-Codes werden mit einer festen Nachricht
                        gesendet und tragen kein Branding. Standardmäßig
                        `false`.
                    sms_sender_name:
                      type: string
                      nullable: true
                      maxLength: 30
                      example: Acme Bank
                      description: >-
                        Der Name, den die SMS dieses Codes trägt („123456 ist
                        Ihr Verifizierungscode für Acme Bank“), anstelle des
                        SMS-Absendernamens Ihrer Anwendung. Kostenlos. 1 bis 30
                        Zeichen: nur Buchstaben, Ziffern, Leerzeichen und ' & -
                        !, nicht nur Ziffern, mit einzelnen Leerzeichen zwischen
                        den Wörtern; jeder andere Wert gibt `400` zurück und es
                        wird kein Code gesendet. Wenn weggelassen, `null` oder
                        leer, wird der SMS-Absendername Ihrer Anwendung
                        verwendet. Jede Anwendung kann pro Tag (UTC) bis zu zwei
                        neue Namen verwenden; darüber hinaus wird der Code mit
                        dem Namen Ihrer Anwendung gesendet. Gilt für
                        SMS-Nachrichten, einschließlich eines SMS-Fallbacks von
                        einem anderen Kanal; WhatsApp-Codes tragen kein
                        Branding.
                      pattern: ^$|^(?![\d ]+$)[\p{L}\p{N}'&!-]+( [\p{L}\p{N}'&!-]+)*$
                signals:
                  type: object
                  description: >-
                    Optionale Geräte- und Netzwerksignale über den Endbenutzer,
                    die an die Betrugsbekämpfungsebene weitergeleitet werden, um
                    die Erkennung von missbräuchlichem oder automatisiertem
                    Datenverkehr zu verbessern. Alle Felder sind optional.
                  properties:
                    ip:
                      type: string
                      description: IP-Adresse des Endbenutzergeräts. IPv4 oder IPv6.
                      example: 192.0.2.1
                    device_id:
                      type: string
                      maxLength: 255
                      description: >-
                        Eindeutige Kennung des Geräts des Endbenutzers. Android:
                        `ANDROID_ID`; iOS: `identifierForVendor`.
                      example: 8F0B8FDD-C2CB-4387-B20A-56E9B2E5A0D2
                    device_platform:
                      type: string
                      enum:
                        - android
                        - ios
                        - ipados
                        - tvos
                        - web
                      description: Plattform des Geräts des Endbenutzers.
                    device_model:
                      type: string
                      maxLength: 255
                      description: Modell des Geräts des Endbenutzers.
                      example: iPhone17,2
                    os_version:
                      type: string
                      maxLength: 64
                      description: Betriebssystemversion des Geräts des Endbenutzers.
                      example: 18.0.1
                    app_version:
                      type: string
                      maxLength: 64
                      description: Version Ihrer Anwendung.
                      example: 1.2.34
                    user_agent:
                      type: string
                      maxLength: 512
                      description: User-Agent des Browsers oder der App des Endbenutzers.
                      example: >-
                        Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X)
                        AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3
                        Mobile/15E148 Safari/604.1
                vendor_data:
                  type: string
                  description: >-
                    Optionale, vom Aufrufer gesteuerte Kennung (Ihre interne
                    Benutzer-ID, eine E-Mail-Adresse, eine UUID usw.), die in
                    der Sitzung gespeichert und in der Antwort auf den
                    Sendevorgang, der Antwort auf die Abgleichprüfung, Webhooks
                    und der Business Console zurückgegeben wird. Verwenden Sie
                    sie, um Didits `request_id` mit Ihrem Benutzerdatensatz zu
                    korrelieren.
                metadata:
                  type: object
                  nullable: true
                  description: >-
                    Optionales Freiform-JSON-Objekt, das in der Sitzung
                    gespeichert und in der Sendeantwort, der Antwort der
                    Abgleichprüfung, in Webhooks sowie in der Business Console
                    wiedergegeben wird.
              required:
                - phone_number
            examples:
              WhatsApp (default):
                summary: >-
                  6-stelliger OTP über WhatsApp, mit automatischem Fallback auf
                  SMS
                value:
                  phone_number: '+14155552671'
                  options:
                    preferred_channel: whatsapp
                    locale: en-US
                  vendor_data: user-1234
              SMS with custom code length:
                summary: SMS-Zustellung mit einem 4-stelligen Code erzwingen
                value:
                  phone_number: '+34699999999'
                  options:
                    preferred_channel: sms
                    code_size: 4
                    locale: es
              With fraud signals:
                summary: >-
                  Gerätesignale weiterleiten, um das
                  Betrugspräventions-Screening zu stärken
                value:
                  phone_number: '+14155552671'
                  signals:
                    ip: 192.0.2.1
                    device_id: 8F0B8FDD-C2CB-4387-B20A-56E9B2E5A0D2
                    device_platform: ios
                    device_model: iPhone17,2
                    os_version: 18.0.1
                    app_version: 1.2.34
                  vendor_data: user-1234
      responses:
        '200':
          description: >-
            Versand bestätigt. Prüfen Sie `status`: `Success` und `Retry`
            bedeuten, dass ein Code unterwegs ist; `Blocked` bedeutet, dass die
            Anti-Betrugs-Ebene abgelehnt hat und die Verifizierung bereits als
            `Declined` abgeschlossen ist. `request_id` ist die gespeicherte
            Sitzungs-ID (dieselbe ID bei einem `Retry`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PhoneVerificationSendResponse'
              examples:
                Success:
                  summary: OTP für eine neue Verifizierung gesendet
                  value:
                    request_id: e39cb057-92fc-4b59-b84e-02fec29a0f24
                    status: Success
                    reason: null
                    vendor_data: user-1234
                    metadata: null
                Retry:
                  summary: >-
                    Zweiter Versand an dieselbe Nummer innerhalb des
                    5-Minuten-Fensters — identische request_id
                  value:
                    request_id: e39cb057-92fc-4b59-b84e-02fec29a0f24
                    status: Retry
                    reason: null
                    vendor_data: user-1234
                    metadata: null
                Blocked:
                  summary: >-
                    Betrugsabwehr-Ablehnung – Verifizierung mit dem Status
                    „abgelehnt“ abgeschlossen, nichts abgerechnet
                  value:
                    request_id: 0d8af1f4-0c43-46d7-b75c-6e4e22c0a7b3
                    status: Blocked
                    reason: repeated_attempts
                    vendor_data: user-1234
                    metadata: null
        '400':
          description: >-
            Validierungsfehler. Eine fehlerhafte Eingabe gibt die
            Feld-Fehler-Envelope von DRF zurück (ein Array von Meldungen pro
            betroffenem Feld, bei Optionsfehlern unter `options` verschachtelt).
            Eine Nummer, die geparst werden kann, aber beim Senden abgelehnt
            wird (nicht erreichbar oder ein unzulässiger Leitungstyp wie ein
            Shortcode), gibt stattdessen eine `{"detail": ...}`-Envelope zurück.
          content:
            application/json:
              examples:
                Invalid phone number (field error):
                  summary: Die Nummer ist keine gültige E.164-Nummer
                  value:
                    phone_number:
                      - Invalid phone number provided.
                Missing phone number:
                  summary: '`phone_number` nicht im Body enthalten'
                  value:
                    phone_number:
                      - This field is required.
                Invalid options:
                  summary: >-
                    `code_size` außerhalb des gültigen Bereichs, ungültiges
                    `locale`, unbekanntes `preferred_channel`
                  value:
                    options:
                      code_size:
                        - Ensure this value is less than or equal to 8.
                      locale:
                        - Ensure this field has no more than 5 characters.
                      preferred_channel:
                        - '"carrier_pigeon" is not a valid choice.'
                Number rejected at send time:
                  summary: >-
                    Gültiges E.164-Format, aber die Nummer kann keinen OTP
                    empfangen
                  value:
                    detail: Invalid phone number provided.
                Ineligible line type:
                  summary: >-
                    Leitungstyp kann keinen Einmalcode empfangen (z. B.
                    Kurzwahlnummer)
                  value:
                    detail: Invalid phone line type provided.
        '403':
          description: >-
            Zugriff verweigert. Wird zurückgegeben, wenn der Header `x-api-key`
            fehlt (`{"detail": ...}`); ein falscher, widerrufener oder
            abgelaufener Schlüssel gibt `401` zurück. Wird auch vor jedem Senden
            zurückgegeben, wenn die Organisation noch nie aufgeladen hat
            (Missbrauchsschutz) oder wenn ihr Guthaben den Sendepreis des Ziels
            nicht decken kann (`{"error": ...}`).
          content:
            application/json:
              examples:
                Missing or invalid API key:
                  summary: >-
                    Kein `x-api-key`-Header, oder der Schlüssel ist
                    ungültig/widerrufen
                  value:
                    detail: You do not have permission to perform this action.
                Top-up required:
                  summary: >-
                    Die Telefonverifizierung bleibt bis zum ersten Aufladen der
                    Organisation deaktiviert
                  value:
                    detail: >-
                      To protect against abuse, phone verification is disabled
                      until your first top-up.
                Not enough credits:
                  summary: >-
                    Das Guthaben der Organisation reicht für den Preis des
                    Versands nicht aus
                  value:
                    error: You don't have enough credits to perform this request.
        '429':
          description: >-
            Rate-Limit überschritten. POST/PATCH/DELETE-Endpoints teilen sich
            ein Budget von 300 Schreibanfragen pro Minute pro API-Schlüssel
            (Transaktionserstellungen und Ereignis-Ingestion haben ein separates
            Budget von 600). Zusätzlich gilt vorgelagert eine Obergrenze zum
            Missbrauchsschutz von 4 Verifizierungsversuchen pro Telefonnummer
            pro Stunde. Die Antwort enthält die Header `X-RateLimit-Limit`,
            `X-RateLimit-Remaining`, `X-RateLimit-Reset` und `Retry-After`.
            Hinweis: Die Header `X-RateLimit-*`/`Retry-After` begleiten nur den
            429-Fehler des Schreiblimits von 300/Min; der 429-Fehler der
            Obergrenze pro Nummer enthält keine Rate-Limit-Header.
          content:
            application/json:
              examples:
                Per-number cap:
                  summary: >-
                    Mehr als 4 Verifizierungsversuche für dieselbe Nummer in der
                    letzten Stunde
                  value:
                    detail: >-
                      Maximum verification attempts reached for this phone
                      number. Only 4 authentication attempts are allowed per
                      hour. Try again later or use a different number.
                Write rate limit exceeded:
                  summary: Mehr als 300 Schreibanfragen in der aktuellen Minute
                  value:
                    detail: >-
                      Write request rate limit exceeded. You can make up to 300
                      requests per minute.
              schema:
                type: object
                properties:
                  detail:
                    type: string
        '500':
          description: >-
            Unerwarteter Fehler beim Erstellen der Verifizierung, der kein
            bekannter Anbieterausfall ist. Kann sicher wiederholt werden.
          content:
            application/json:
              examples:
                Provider error:
                  summary: OTP-Zustellung konnte nicht initiiert werden
                  value:
                    detail: Error creating phone verification
              schema:
                type: object
                properties:
                  detail:
                    type: string
        '502':
          description: >-
            Der Telefonverifizierungsanbieter ist vorübergehend nicht verfügbar
            – eine 5xx-Antwort, ein Timeout oder ein Verbindungsfehler, der die
            integrierten Wiederholungsversuche überdauert hat. Kann gefahrlos
            wiederholt werden; es wird nichts in Rechnung gestellt und kein
            Versuch angerechnet.
          content:
            application/json:
              examples:
                Provider outage:
                  summary: Der Anbieter hat die Sendeanfrage nicht beantwortet
                  value:
                    detail: >-
                      Phone verification is temporarily unavailable. Please try
                      again shortly.
                    code: phone_provider_unavailable
              schema:
                type: object
                properties:
                  detail:
                    type: string
                  code:
                    type: string
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: |-
            curl -X POST https://verification.didit.me/v3/phone/send/ \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{
                "phone_number": "+14155552671",
                "options": {
                  "code_size": 6,
                  "preferred_channel": "whatsapp",
                  "locale": "en-US"
                },
                "vendor_data": "user-1234"
              }'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.phone.send_code(
                phone_number="+14155552671",
                options={
                    "locale": "en-US",
                    "preferred_channel": "whatsapp",
                },
                vendor_data="user-1234",
            )
            print(result)
        - lang: javascript
          label: Node.js
          source: |-
            import Didit from "@didit-protocol/sdk-node";

            // Reads DIDIT_API_KEY.
            const didit = new Didit();

            const result = await didit.phone.sendCode({
              phone_number: "+14155552671",
              options: {
                locale: "en-US",
                preferred_channel: "whatsapp",
              },
              vendor_data: "user-1234",
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Phone.SendCode(ctx, didit.PhoneSendCodeParams{\n\tPhoneNumber: \"+14155552671\",\n\tOptions: didit.Some(didit.PhoneSendCodeParamsOptions{\n\t\tLocale:           didit.String(\"en-US\"),\n\t\tPreferredChannel: didit.Some(didit.PhoneSendCodeParamsOptionsPreferredChannel(\"whatsapp\")),\n\t}),\n\tVendorData: didit.String(\"user-1234\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: |-
            import me.didit.Didit;
            import me.didit.types.PhoneSendCodeParams;

            // Reads DIDIT_API_KEY.
            Didit client = new Didit();

            var result = client.phone().sendCode(PhoneSendCodeParams.builder()
                    .phoneNumber("+14155552671")
                    .options(PhoneSendCodeParams.Options.builder()
                            .locale("en-US")
                            .preferredChannel(PhoneSendCodeParams.Options.PreferredChannel.of("whatsapp"))
                            .build())
                    .vendorData("user-1234")
                    .build());
            System.out.println(result);
        - lang: php
          label: PHP
          source: |-
            <?php

            require 'vendor/autoload.php';

            use Didit\DiditClient;

            // Reads DIDIT_API_KEY.
            $didit = new DiditClient();

            $result = $didit->phone->sendCode([
                'phone_number' => '+14155552671',
                'options' => [
                    'locale' => 'en-US',
                    'preferred_channel' => 'whatsapp',
                ],
                'vendor_data' => 'user-1234',
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

            # Reads DIDIT_API_KEY.
            didit = Didit::Client.new

            result = didit.phone.send_code(
              phone_number: "+14155552671",
              options: {
                locale: "en-US",
                preferred_channel: "whatsapp",
              },
              vendor_data: "user-1234"
            )
            puts result.to_h
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using System.Text.Json;

            using Didit;


            // Reads DIDIT_API_KEY.

            using var client = new DiditClient();


            var result = await client.Phone.SendCodeAsync(new
            PhoneSendCodeParams

            {
                PhoneNumber = "+14155552671",
                Options = new PhoneSendCodeParamsOptions
                {
                    Locale = "en-US",
                    PreferredChannel = new PhoneSendCodeParamsOptionsPreferredChannel("whatsapp"),
                },
                VendorData = "user-1234",
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    PhoneVerificationSendResponse:
      type: object
      properties:
        request_id:
          type: string
          format: uuid
          description: >-
            Sitzungs-ID der Verifizierung. Ein `Retry`-Sendevorgang gibt
            dieselbe `request_id` wie der ursprüngliche Sendevorgang zurück.
            Diese ID erscheint in der Business Console, wird von einem
            finalisierten `POST /v3/phone/check/` erneut zurückgegeben und kann
            an `GET /v3/session/{sessionId}/decision/` übergeben werden.
        status:
          type: string
          enum:
            - Success
            - Retry
            - Blocked
          description: >-
            `Success` — OTP an eine neue Verifizierung gesendet. `Retry` — OTP
            für die ausstehende Verifizierung erneut gesendet, die durch einen
            vorherigen Versand erstellt wurde. `Blocked` — die
            Anti-Fraud-Schicht hat das Senden verweigert; die Verifizierung wird
            sofort als `Declined` abgeschlossen und es wird nichts abgerechnet.
        reason:
          type: string
          nullable: true
          description: >-
            Warum ein Versand den Status `Blocked` hatte (z. B.
            `repeated_attempts`, `suspicious`, `spam`). `null` bei `Success` und
            `Retry`.
        vendor_data:
          type: string
          nullable: true
          description: >-
            Rückgabe der in der Sitzung gespeicherten `vendor_data` (aus dem
            ersten Senden).
        metadata:
          type: object
          nullable: true
          description: >-
            Rückgabe der in der Sitzung gespeicherten `metadata` (aus dem ersten
            Senden).
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        Der API-Schlüssel Ihrer Anwendung, aus Entwickler -> API-Schlüssel in
        der Business Console. Der Primärschlüssel hat Vollzugriff. Ein benannter
        Schlüssel kann im Geltungsbereich eingeschränkt werden: keine, Lese-
        oder Schreibberechtigung pro Ressource, beschränkt auf bestimmte
        Workflows oder genehmigte Sitzungen, auf eine Liste von IP-Adressen und
        auf ein Ablaufdatum. 401 bedeutet, dass der Schlüssel falsch, widerrufen
        oder abgelaufen ist; 403 bedeutet, dass kein Schlüssel gesendet wurde,
        der Schlüssel keinen Zugriff auf diese Ressource oder Aktion hat oder
        die Anfrage von einer Adresse außerhalb seiner IP-Liste stammte; 404 bei
        einer Sitzungsroute bedeutet, dass die Sitzung außerhalb der Workflows
        oder Status des Schlüssels liegt. Ein Schlüssel ohne Medienzugriff
        erhält Bild-, Video- und PDF-URLs als null, und ein Schlüssel ohne
        Schreibberechtigung für Sitzungen erhält Sitzungslinks und Token als
        null. Siehe https://docs.didit.me/console/api-keys.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.