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

# Programmatische Registrierung per Auth-API

> Didit-Organisationen per Auth-API anlegen – agentenfähig, ohne Browser. KYC-Sub-Accounts aufbauen, pro Aufruf zahlen, keine Verträge.



Programmatic Register Prompt
        Prompt in die Zwischenablage kopieren



      
      

\<pre>

\``Programmatically create a pending Didit account — step 1 of the two-step onboarding (no browser, no console).

Endpoint:
POST https://apx.didit.me/auth/v2/programmatic/register/

Authentication:
None. This is a public endpoint. (Don't confuse the Auth API host `apx.didit.me/auth/v2` with the verification host `verification.didit.me/v3`.)

Request body:
\- email (string, required) — Any real, deliverable email (personal, work, alias). The verification code is mailed synchronously, so reserved test domains (`@example.com`, `@example.org`, `@*.test`, `@*.example`, `@*.invalid`) get rejected by mail delivery and the call returns `500` — substitute the placeholder with an inbox you can read.
\- password (string, required) — Must satisfy ALL of: minimum 8 characters, ≥1 uppercase letter (A-Z), ≥1 lowercase letter (a-z), ≥1 digit (0-9), ≥1 special character from !@#$%^&*()_+-=[]{}|;:,.<>?. Rules are validated one at a time and the first failure short-circuits.

curl example (replace `you@yourdomain.com` with a real inbox):
curl -X POST https://apx.didit.me/auth/v2/programmatic/register/ \
-H "Content-Type: application/json" \
-d '{
"email": "you@yourdomain.com",
"password": "MyStr0ng!Pass"
}'

Response (201 Created):
\- message (string) — "Registration successful. Check your email for the verification code."
\- email (string) — echoed back.

What happens server-side:
\- A pending account is created (NOT usable yet).
\- A 6-character alphanumeric code (e.g. "A3K9F2") is emailed to the supplied address.
\- The code is valid for 15 minutes. After expiry the registration must be redone.

Failure modes (all 400 unless noted):
\- Field-level: { "email": ["Enter a valid email address."] } or { "password": ["Ensure this field has at least 8 characters."] }.
\- Password-strength failures CURRENTLY return as a BARE ARRAY (no field key), one rule at a time: ["Password must contain at least one uppercase letter."] / lowercase / digit / special character. Known server-side inconsistency — treat as { "password": [...] } client-side.
\- Duplicate email: { "detail": "An account with this email already exists." }
\- 429 — { "detail": "Too many registration attempts. Please try again later.", "wait": <seconds> } when more than 5 registrations from the same IP within an hour.
\- 500 — returned (with an HTML body, not JSON) when mail delivery to the supplied address fails synchronously. Most commonly triggered by reserved test domains; use a real inbox.

Rate limits:
5 registrations per IP per hour.

Next step:
After receiving the email, call POST https://apx.didit.me/auth/v2/programmatic/verify-email/ with { "email", "code" } to get your access_token and api_key — see /auth-api/verify-email.

For end-to-end Didit integration, paste in the full prompt at /integration/integration-prompt.``

\</pre>



      
      

Einfügen in



## OpenAPI

````yaml de/openapi-auth.json POST /programmatic/register/
openapi: 3.0.0
info:
  version: 1.0.0
  title: Didit Auth API
  description: >-
    API für programmatische Registrierung und Authentifizierung für Entwickler
    und KI-Agenten. Registrierung in 2 API-Aufrufen – kein Browser erforderlich.
    Die agentenfreundlichste Plattform für Identitätsverifizierung.


    ## Basis-URL


    Alle Endpoints in dieser Spezifikation werden unter
    `https://apx.didit.me/auth/v2` gehostet. Dies ist ein anderer Host als die
    Verifizierungs-API (`https://verification.didit.me/v3`). Zur Unterscheidung:
    Dieser Auth-Host stellt Ihre **JWT-Access-Tokens** aus und ermöglicht Ihnen
    das Auflisten und Verwalten Ihrer **Organisationen** und **Anwendungen**.
    Auf dem Verifizierungs-Host rufen Sie Sitzungen, Workflows, AML usw. auf und
    authentifizieren sich mit dem von dieser API zurückgegebenen **`api_key`**.


    ## So funktioniert der Auth-Flow


    1. `POST /programmatic/register/` — E-Mail + Passwort übermitteln.

    2. Erhalten Sie einen 6-stelligen alphanumerischen Code per E-Mail.

    3. `POST /programmatic/verify-email/` — Code übermitteln. Sie erhalten ein
    JWT-`access_token`, ein `refresh_token`, eine Organisation und eine
    Standardanwendung mit `client_id` + `api_key` zurück.

    4. Speichern Sie den `api_key`. Verwenden Sie ihn als `x-api-key` für jeden
    Aufruf von `https://verification.didit.me/v3/...`.

    5. Auf jedem zukünftigen Rechner tauscht `POST /programmatic/login/` Ihre
    E-Mail + Ihr Passwort gegen ein neues JWT aus; rufen Sie anschließend `GET
    /organizations/me/` und die Anwendungs-Endpoints auf, um Anmeldedaten
    wiederherzustellen oder zu rotieren.


    Das JWT wird nur für die **Kontoverwaltungs**-Endpoints in dieser
    Spezifikation benötigt; der Traffic der Verifizierungs-API verwendet den
    langlebigen `api_key`, nicht das JWT.


    ## Konventionen


    - Alle Request- und Response-Bodys sind JSON (`Content-Type:
    application/json`).

    - **Verwenden Sie beim Testen von `POST /programmatic/register/` eine echte,
    zustellbare E-Mail-Adresse.** Der Endpoint sendet den Verifizierungscode
    synchron. Daher werden Adressen auf reservierten Test-Domains
    (`@example.com`, `@example.org`, `@*.test`, `@*.example`, `@*.invalid`) bei
    der E-Mail-Zustellung abgewiesen und die Anfrage gibt einen `500` zurück.
    Ersetzen Sie den Platzhalter `you@yourdomain.com` in den Beispielen durch
    ein Postfach, auf das Sie tatsächlich zugreifen können.

    - Validierungsfehler geben HTTP `400` mit einem von zwei Envelopes zurück:
    `{"field": ["message", ...]}` für Probleme auf Feldebene oder `{"detail":
    "message"}` für Geschäftsregelfehler. Einige wenige Validatoren
    (Passwortstärke bei der Registrierung, Code-Ablauf bei verify-email)
    antworten derzeit mit einem einfachen Array `["message"]` anstelle der
    feldbezogenen Form – dies ist eine bekannte serverseitige Inkonsistenz,
    daher sollte Client-Code beide Formen akzeptieren.

    - Authentifizierungsfehler werden als `{"detail": "..."}` mit HTTP `401`
    (ungültiges Bearer-Token) oder `403` (fehlendes Bearer-Token / unzureichende
    Berechtigungen) zurückgegeben.

    - Rate-Limit-Antworten enthalten ein `wait`-Feld mit der Abklingzeit in
    Sekunden.
servers:
  - url: https://apx.didit.me/auth/v2
    description: Produktions-Authentifizierungsserver
security: []
tags:
  - name: Programmatic Auth
    description: >-
      Konto-Lebenszyklus mit E-Mail und Passwort: Registrieren, Verifizieren,
      Anmelden. Gibt das JWT-`access_token` zurück, das Sie für die
      Account-Management-Endpoints verwenden, sowie (bei Verifizierung)
      `client_id` und `api_key` Ihrer ersten Anwendung.
  - name: Account Management
    description: >-
      Authentifizierte Endpoints (JWT Bearer), die Organisationen auflisten und
      Anwendungen erstellen, abrufen oder aktualisieren. Verwenden Sie diese, um
      den `api_key` wiederherzustellen oder zu rotieren, mit dem Sie
      Verifizierungs-API-Aufrufe authentifizieren.
paths:
  /programmatic/register/:
    post:
      tags:
        - Programmatic Auth
      summary: Konto registrieren
      description: >-
        Schritt 1 des programmatischen Onboardings. Erstellt ein ausstehendes
        Konto und sendet einen 6-stelligen Code per E-Mail (10 Min. TTL). Die
        Adresse wird geprüft, bevor ein Konto erstellt wird: Wenn der Code nicht
        empfangen werden kann, wird 400 `email_undeliverable` zurückgegeben.
        Rate-Limits: 5/IP/Stunde plus ein geteiltes stündliches Budget pro
        Netzwerk (/24 für IPv4, /64 für IPv6).
      operationId: programmatic_register
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RegisterRequest'
            examples:
              Gmail:
                summary: Mit privater Gmail-Adresse registrieren
                value:
                  email: you@yourdomain.com
                  password: MyStr0ng!Pass
              Work:
                summary: Mit geschäftlicher E-Mail-Adresse registrieren
                value:
                  email: you@yourcompany.com
                  password: C0mplex#Pass1
      responses:
        '201':
          description: >-
            Registrierung erfolgreich. Ein 6-stelliger alphanumerischer
            Verifizierungscode (z. B. `A3K9F2`) wurde an die angegebene Adresse
            gesendet und ist 10 Minuten lang gültig. Rufen Sie als Nächstes
            `POST /programmatic/verify-email/` auf.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RegisterResponse'
              examples:
                Success:
                  value:
                    message: >-
                      Registration successful. Check your email for the
                      verification code.
                    email: you@yourdomain.com
        '400':
          description: >-
            Validierungsfehler. Die vorgesehene Envelope ist `{"field":
            ["..."]}` für Fehler auf Feldebene und `{"detail": "..."}` für
            Geschäftsregelfehler (z. B. doppelte E-Mail). Regeln zur
            Passwortstärke antworten derzeit mit einem einfachen Array
            `["..."]`, eine Regel nach der anderen – bekannte serverseitige
            Inkonsistenz; behandeln Sie dies bis zur Behebung als `{"password":
            ["..."]}`. Wenn die Adresse den Code nicht empfangen kann (Wegwerf-,
            reservierte oder Test-Domain, kein Mailserver, ein wahrscheinlicher
            Tippfehler oder eine Adresse, bei der zuvor eine Zustellung
            fehlgeschlagen ist), lautet der Body `EmailUndeliverableError` mit
            `code: "email_undeliverable"`; es wird kein Konto erstellt oder
            geändert.
          content:
            application/json:
              schema:
                oneOf:
                  - $ref: '#/components/schemas/ValidationError'
                  - $ref: '#/components/schemas/EmailUndeliverableError'
              examples:
                MissingFields:
                  summary: Leerer Body
                  value:
                    email:
                      - This field is required.
                    password:
                      - This field is required.
                InvalidEmail:
                  summary: Ungültige E-Mail
                  value:
                    email:
                      - Enter a valid email address.
                PasswordTooShort:
                  summary: Passwort hat weniger als 8 Zeichen
                  value:
                    password:
                      - Ensure this field has at least 8 characters.
                PasswordMissingUppercase:
                  summary: Passwort enthält keinen Großbuchstaben
                  value:
                    - Password must contain at least one uppercase letter.
                PasswordMissingLowercase:
                  summary: Passwort enthält keinen Kleinbuchstaben
                  value:
                    - Password must contain at least one lowercase letter.
                PasswordMissingDigit:
                  summary: Passwort enthält keine Ziffer
                  value:
                    - Password must contain at least one digit.
                PasswordMissingSpecial:
                  summary: Passwort enthält kein Sonderzeichen
                  value:
                    - >-
                      Password must contain at least one special character
                      (!@#$%^&*()_+-=[]{}|;:,.<>?).
                Duplicate:
                  summary: Zu dieser E-Mail existiert bereits ein Konto
                  value:
                    detail: An account with this email already exists.
                EmailUndeliverable:
                  summary: Adresse kann keine E-Mails empfangen (Wegwerf-Domain)
                  value:
                    detail: >-
                      This email can't receive messages. Please use a different
                      email address.
                    code: email_undeliverable
                    reason: disposable_domain
                EmailLikelyTypo:
                  summary: Wahrscheinlicher Tippfehler in der Domain
                  value:
                    detail: >-
                      This email can't receive messages. Please use a different
                      email address.
                    code: email_undeliverable
                    reason: possible_typo
                    suggestion: gmail.com
        '429':
          description: >-
            Rate-Limit überschritten. Mehr als 5 Registrierungsversuche von
            derselben IP in der letzten Stunde oder das stündliche Kontingent
            für das Netzwerk des Aufrufers (/24 für IPv4, /64 für IPv6, geteilt
            für Registrierungs- und Code-Neuversand) ist aufgebraucht. Beide
            enthalten `Retry-After: 3600`. Wird auch mit einem `Retry-After:
            5`-Header zurückgegeben, wenn der Dienst vorübergehend so viele
            Passwörter oder Codes wie möglich gleichzeitig überprüft; versuchen
            Sie es nach der angegebenen Anzahl von Sekunden erneut.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitError'
              examples:
                RateLimited:
                  value:
                    detail: Too many registration attempts. Please try again later.
                PasswordChecksBusy:
                  summary: Zu viele Passwortüberprüfungen werden derzeit ausgeführt
                  value:
                    detail: >-
                      Too many sign-in attempts are being processed right now.
                      Please try again in a few seconds.
      security:
        - {}
      x-codeSamples:
        - lang: curl
          label: cURL
          source: |-
            curl -X POST https://apx.didit.me/auth/v2/programmatic/register/ \
              -H "Content-Type: application/json" \
              -d '{
                "email": "you@yourdomain.com",
                "password": "MyStr0ng!Pass"
              }'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # This call needs no API key.
            client = Didit()

            result = client.account.register(
                email="you@yourdomain.com",
                password="MyStr0ng!Pass",
            )
            print(result)
        - lang: javascript
          label: Node.js
          source: |-
            import Didit from "@didit-protocol/sdk-node";

            // This call needs no API key.
            const didit = new Didit();

            const result = await didit.account.register({
              email: "you@yourdomain.com",
              password: "MyStr0ng!Pass",
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// This call needs no API key.\nclient := didit.NewClient()\n\nresult, err := client.Account.Register(ctx, didit.RegisterRequest{\n\tEmail:    \"you@yourdomain.com\",\n\tPassword: \"MyStr0ng!Pass\",\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.RegisterRequest;

            // This call needs no API key.
            Didit client = new Didit();

            var result = client.account().register(RegisterRequest.builder()
                    .email("you@yourdomain.com")
                    .password("MyStr0ng!Pass")
                    .build());
            System.out.println(result);
        - lang: php
          label: PHP
          source: |-
            <?php

            require 'vendor/autoload.php';

            use Didit\DiditClient;

            // This call needs no API key.
            $didit = new DiditClient();

            $result = $didit->account->register([
                'email' => 'you@yourdomain.com',
                'password' => 'MyStr0ng!Pass',
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

            # This call needs no API key.
            didit = Didit::Client.new

            result = didit.account.register(
              email: "you@yourdomain.com",
              password: "MyStr0ng!Pass"
            )
            puts result.to_h
        - lang: csharp
          label: .NET
          source: |-
            using System;
            using System.Text.Json;
            using Didit;

            // This call needs no API key.
            using var client = new DiditClient();

            var result = await client.Account.RegisterAsync(new RegisterRequest
            {
                Email = "you@yourdomain.com",
                Password = "MyStr0ng!Pass",
            });
            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    RegisterRequest:
      type: object
      required:
        - email
        - password
      properties:
        email:
          type: string
          format: email
          description: >-
            Jede gültige E-Mail-Adresse (privat, geschäftlich, Alias). Dient als
            eindeutige Kontokennung.
          example: you@yourdomain.com
        password:
          type: string
          minLength: 8
          description: >-
            Mindestens 8 Zeichen. Muss mindestens einen Großbuchstaben (`A-Z`),
            einen Kleinbuchstaben (`a-z`), eine Ziffer (`0-9`) und ein
            Sonderzeichen aus `!@#$%^&*()_+-=[]{}|;:,.<>?` enthalten. Die
            Validierung meldet jeweils eine nicht erfüllte Regel.
          example: MyStr0ng!Pass
    RegisterResponse:
      type: object
      properties:
        message:
          type: string
          description: Lesbare Bestätigung, dass der Verifizierungscode gesendet wurde.
          example: Registration successful. Check your email for the verification code.
        email:
          type: string
          format: email
          description: Die E-Mail, an die der Verifizierungscode gesendet wurde.
          example: you@yourdomain.com
    ValidationError:
      description: >-
        Validierungsfehler-Body. Der vorgesehene Envelope ist eine `{field:
        ["message", ...]}`-Map für Fehler auf Feldebene oder ein
        Single-Key-Envelope `{detail: "..."}` für Geschäftsregel-Fehler. Einige
        wenige Validatoren (Passwortstärke bei der Registrierung,
        Code-Gültigkeit bei verify-email) antworten derzeit mit einem einfachen
        Array `["message"]` – eine bekannte serverseitige Inkonsistenz. Das
        untenstehende Schema behält diesen Zweig mit einfachem Array bei, damit
        aus dieser Spezifikation generierter Client-Code heutige Antworten
        deserialisiert. Neuer Client-Code sollte dies jedoch als die relevante
        feldbezogene Form (`{password: [...]}` oder `{code: [...]}`) behandeln,
        und der Serververtrag wird sich an diese Struktur anpassen.
      oneOf:
        - type: object
          additionalProperties:
            type: array
            items:
              type: string
          example:
            email:
              - Enter a valid email address.
        - type: object
          properties:
            detail:
              type: string
          example:
            detail: An account with this email already exists.
        - type: array
          items:
            type: string
          example:
            - Invalid or expired verification code.
    EmailUndeliverableError:
      type: object
      description: >-
        Wird von `POST /programmatic/register/` zurückgegeben, wenn die Adresse
        den Verifizierungscode nicht empfangen kann. Die Prüfung erfolgt, bevor
        ein Konto erstellt oder geändert wird, sodass kein Konto zurückbleibt.
      required:
        - detail
        - code
        - reason
      properties:
        detail:
          type: string
          description: Lesbare Nachricht.
          example: >-
            This email can't receive messages. Please use a different email
            address.
        code:
          type: string
          enum:
            - email_undeliverable
          description: Immer `email_undeliverable`.
        reason:
          type: string
          enum:
            - invalid_address
            - reserved_domain
            - no_mail_records
            - disposable_domain
            - possible_typo
            - suppressed
          description: >-
            Warum die Adresse abgelehnt wurde: `invalid_address` (keine gültige
            Adresse), `reserved_domain` (eine reservierte oder Test-Domain wie
            `example.com`), `no_mail_records` (die Domain hat keinen
            Mailserver), `disposable_domain` (ein Anbieter von
            Einweg-E-Mail-Adressen), `possible_typo` (ein wahrscheinlicher
            Tippfehler eines gängigen Anbieters; siehe `suggestion`),
            `suppressed` (die Adresse hat zuvor Bounces oder Beschwerden
            erzeugt).
        suggestion:
          type: string
          description: >-
            Die wahrscheinlich beabsichtigte Domain, nur vorhanden, wenn die
            Domain wie ein Tippfehler aussieht (beispielsweise `gmail.com` statt
            `gmial.com`). Die API akzeptiert keine Bestätigung: Registrieren Sie
            sich erneut mit der korrigierten Adresse.
          example: gmail.com
    RateLimitError:
      type: object
      description: >-
        Antwort bei Rate-Limit oder progressiver Sperrung. `wait` ist die
        Abklingzeit in Sekunden.
      properties:
        detail:
          type: string
          example: >-
            Too many login attempts from this IP address. Please wait before
            trying again.

````

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