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

# Anwendung per API erstellen: Didit Auth API

> Didit-Anwendung pro Kunde, Marke oder Geschäftseinheit anlegen (POST /organizations/me/{org_id}/applications/). Liefert client_id und api_key.



Create Application Prompt
        Prompt in die Zwischenablage kopieren



      
      

\<pre>

\`Create a new Didit application inside one of your organizations — each application has its own client_id and api_key, isolating sessions, webhooks, branding, and billing from sibling applications.

Endpoint:
POST https://apx.didit.me/auth/v2/organizations/me/{org_id}/applications/

Authentication:
Authorization: Bearer <access_token>
The access token must belong to an OWNER or ADMIN of the target organization. Get one via POST /programmatic/login/ or POST /programmatic/verify-email/.

Path parameter:
\- org_id (UUID, required) — Organization that will own the new application. Discover yours via GET /organizations/me/.

Request body (ALL fields optional — omit the body to get a default-named app):
\- name (string, optional) — Display name. Defaults to "<organization name> App".
\- website_url (string, URL, optional) — Public homepage shown in the verification flow.
\- redirect_uris (array of strings, optional) — Allowlisted OAuth-style redirect URIs.
\- terms_url (string, URL, optional) — Terms-of-service link shown in the verification UI.
\- privacy_url (string, URL, optional) — Privacy policy link shown in the verification UI.
\- description (string, optional) — Internal note. Not shown to end users.
\- data_location (string, optional) — Where the application's verification data is stored and processed: "eu" (European Union, Ireland), the default. "au" (Australia, Sydney) and "mx" (Mexico) are coming soon and answer 400 today. Chosen once: it can't be changed after the application is created.

When to call:
\- Resellers — one application per end customer to fully isolate credentials, branding, webhooks, and billing.
\- Multi-brand / multi-product — one application per brand, product, region, or environment (dev / staging / prod).
\- Use-case separation — e.g. one application for ID + selfie KYC, another for AML screening only.

curl example:
curl -X POST "https://apx.didit.me/auth/v2/organizations/me/<ORG_ID>/applications/" \
-H "Authorization: Bearer <ACCESS_TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"name": "Acme Customer App",
"website_url": "https://acme.example",
"redirect_uris": ["https://acme.example/callback"],
"terms_url": "https://acme.example/terms",
"privacy_url": "https://acme.example/privacy",
"data_location": "eu"
}'

Response (201 Created):
\{
"uuid": "b2c3d4e5-6789-...",
"name": "Acme Customer App",
"client_id": "S9LIYGSoWNuGMLHsvEt9dQ",
"api_key": "sk_live_example_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"website_url": "https://acme.example",
"redirect_uris": ["https://acme.example/callback"],
"terms_url": "https://acme.example/terms",
"privacy_url": "https://acme.example/privacy",
"description": null,
"created_at": "2025-06-01T10:00:00Z",
"data_location": "eu",
"products": [
\{ "product": "identity", "status": "enabled", "modules": { "user_verification": true, "business_verification": true, "case_management": true } },
\{ "product": "transactions", "status": "disabled", "modules": { "travel_rule": true, "case_management": true } },
\{ "product": "authentication", "status": "disabled", "modules": {} }
]
}

What to do with the response:
\- PERSIST api_key SECURELY — use it as the x-api-key header on every https://verification.didit.me/v3/... call (sessions, workflows, billing).
\- Persist uuid (app_id) — required for /organizations/me/{org_id}/applications/{app_id}/ reads and updates.
\- If you lose the api_key, recover it later via GET /organizations/me/{org_id}/applications/{app_id}/ — see /auth-api/get-credentials.
\- products is read-only and always lists identity, transactions and authentication in that order. A new application has identity enabled with every module on, and transactions and authentication disabled. A products key in the request body is ignored.

Failure modes:
\- 400 — { "<field>": ["Enter a valid URL."] } for malformed website_url / redirect_uris / terms_url / privacy_url.
\- 400 — { "data_location": ["This data location is not available yet."] } for "au" or "mx", and { "data_location": ["\\"us\\" is not a valid choice."] } for a location that does not exist. Nothing is created.
\- 401: { "detail": "Invalid access token" } or { "detail": "Expired access token" } when the token is malformed or expired.
\- 403: { "detail": "Only organization owners and admins can manage applications." } when you are a member of the organization but not an owner or admin.
\- 403: { "detail": "Your access to this organization is suspended." } when your membership in the organization is suspended.
\- 403: { "detail": "You do not have permission to perform this action." } when the request has no Authorization header.
\- 404: { "detail": "Organization not found." } when the organization does not exist or you are not a member of it.

Next steps:
\- Configure a workflow inside the new application via POST /v3/workflows/ — see /management-api/workflows/create.
\- Update application metadata later via PATCH /organizations/me/{org_id}/applications/{app_id}/ — see /auth-api/update-application.

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

\</pre>



      
      

Einfügen in

Verwenden Sie diesen Endpoint, wenn Sie Verifizierungsverkehr, Zugangsdaten, Branding oder Reporting innerhalb derselben Organisation trennen müssen.Das ist besonders nützlich für **Reseller**, die für jeden Kunden eine Anwendung anlegen. Es eignet sich auch gut, wenn Ihr eigenes Unternehmen mehrere Produkte, Marken, Regionen, Staging- und Produktionsumgebungen oder Anwendungsfälle hat, die nicht denselben API-Schlüssel und dieselben anwendungsspezifischen Einstellungen teilen sollten.> [!NOTE]
>
> Alle Auth-API-Endpoints verwenden `https://apx.didit.me/auth/v2`. Verwenden Sie den zurückgegebenen `api_key` als `x-api-key`, wenn Sie Endpoints unter `https://verification.didit.me/v3/...`, etwa Sitzungen und Workflows, aufrufen.## DatenstandortJede Anwendung speichert und verarbeitet ihre Verifizierungsdaten an einem einzigen Ort, ihrem Datenstandort, der beim Anlegen mit `data_location` festgelegt wird.
Derzeit ist `eu`, die Europäische Union (Irland), der einzige Standort. Er ist auch der Standard, wenn Sie das Feld weglassen.
Australien (Sydney, `au`) und Mexiko (`mx`) sind demnächst verfügbar. Eine Anfrage, die einen dieser Standorte nennt, erhält die Antwort 400 `This data location is not available yet.` und legt nichts an.
Jede Abfrage der Anwendung gibt ihren `data_location` zurück. Er kann nach dem Anlegen der Anwendung nicht mehr geändert werden.
Siehe [Datenstandort](https://docs.didit.me/de/console/applications.md#datenstandort).


## OpenAPI

````yaml de/openapi-auth.json POST /organizations/me/{org_id}/applications/
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:
  /organizations/me/{org_id}/applications/:
    post:
      tags:
        - Account Management
      summary: Anwendung erstellen
      description: >-
        Erstellen Sie eine Anwendung innerhalb einer Organisation am von Ihnen
        gewählten Datenstandort (`data_location`, standardmäßig die Europäische
        Union; dies kann nachträglich nicht geändert werden). Die Antwort
        enthält `api_key`; speichern Sie diesen jetzt (über GET
        wiederherstellbar). Erfordert ein Inhaber-/Admin-JWT.
      operationId: create_organization_application
      parameters:
        - name: org_id
          in: path
          required: true
          description: >-
            UUID der Organisation. Schlagen Sie sie mit `GET /organizations/me/`
            nach.
          schema:
            type: string
            format: uuid
            example: a1b2c3d4-5678-90ab-cdef-111111111111
      requestBody:
        required: false
        description: >-
          Alle Felder sind optional. Wenn der Body weggelassen wird, wird eine
          Anwendung mit dem Standardnamen `"<organization name> App"` und ohne
          konfigurierte öffentliche URLs erstellt.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ApplicationCreateRequest'
            examples:
              ResellerCustomer:
                summary: Reseller richtet eine kundenbezogene Anwendung ein
                value:
                  name: Acme Customer App
                  website_url: https://acme.example
                  redirect_uris:
                    - https://acme.example/callback
                  terms_url: https://acme.example/terms
                  privacy_url: https://acme.example/privacy
                  data_location: eu
              Minimal:
                summary: Minimales Erstellen -- alle Standardwerte akzeptieren
                value:
                  name: Sandbox App
              Empty:
                summary: Überhaupt kein Body – standardmäßig <org name> App
                value: {}
      responses:
        '201':
          description: >-
            Anwendung erstellt. Die Antwort enthält den langlebigen `api_key`;
            speichern Sie ihn jetzt dauerhaft und verwenden Sie ihn als
            `x-api-key`-Header bei jedem Aufruf von
            `https://verification.didit.me/v3/...`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Application'
              examples:
                Success:
                  value:
                    uuid: b2c3d4e5-6789-01bc-defg-222222222222
                    name: Acme Customer App
                    client_id: S9LIYGSoWNuGMLHsvEt9dQ
                    api_key: sk_live_example_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                    website_url: https://acme.example
                    redirect_uris:
                      - https://acme.example/callback
                    terms_url: https://acme.example/terms
                    privacy_url: https://acme.example/privacy
                    description: null
                    created_at: '2025-06-01T10:00:00Z'
                    data_location: eu
                    products:
                      - product: identity
                        status: enabled
                        modules:
                          user_verification: true
                          business_verification: true
                          case_management: true
                      - product: transactions
                        status: disabled
                        modules:
                          travel_rule: true
                          case_management: true
                      - product: authentication
                        status: disabled
                        modules: {}
        '400':
          description: >-
            Validierungsfehler im Request-Body: beispielsweise eine fehlerhafte
            Redirect-URI, eine `data_location`, die noch nicht verfügbar ist
            (`au`, `mx`), oder eine, die nicht existiert. Es wird nichts
            erstellt.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationError'
              examples:
                InvalidUrl:
                  value:
                    website_url:
                      - Enter a valid URL.
                DataLocationNotAvailable:
                  summary: Ein Datenstandort, der demnächst verfügbar ist
                  value:
                    data_location:
                      - This data location is not available yet.
                UnknownDataLocation:
                  summary: Ein Datenstandort, der nicht existiert
                  value:
                    data_location:
                      - '"us" is not a valid choice.'
        '401':
          description: >-
            Access-Token ist fehlerhaft, ungültig oder abgelaufen. Fordern Sie
            mit `POST /programmatic/login/` ein neues Token an.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthError'
              examples:
                InvalidToken:
                  value:
                    detail: Invalid access token
                ExpiredToken:
                  value:
                    detail: Expired access token
        '403':
          description: >-
            Sie können in dieser Organisation keine Anwendungen erstellen. Ein
            Mitglied der Organisation, das kein Eigentümer oder Administrator
            ist, erhält `Only organization owners and admins can manage
            applications.` Ein Eigentümer oder Administrator, dessen Zugriff auf
            die Organisation ausgesetzt ist, erhält `Your access to this
            organization is suspended.` Eine Anfrage ohne einen
            `Authorization`-Header erhält `You do not have permission to perform
            this action.` Für 72 Stunden nach der Wiederherstellung Ihres Kontos
            wird die Anfrage mit dem `code` `recovery_hold` und `until`
            abgelehnt, dem Zeitpunkt, an dem die Sperre endet.
          content:
            application/json:
              schema:
                oneOf:
                  - $ref: '#/components/schemas/AuthError'
                  - $ref: '#/components/schemas/RecoveryHoldError'
              examples:
                NotOwnerOrAdmin:
                  summary: Mitglied, das weder Eigentümer noch Administrator ist
                  value:
                    detail: >-
                      Only organization owners and admins can manage
                      applications.
                Suspended:
                  summary: Mitgliedschaft ausgesetzt
                  value:
                    detail: Your access to this organization is suspended.
                MissingToken:
                  summary: Kein Authorization-Header
                  value:
                    detail: You do not have permission to perform this action.
                RecoveryHold:
                  summary: Konto vor weniger als 72 Stunden wiederhergestellt
                  value:
                    detail: This action is on hold because you recovered your account.
                    code: recovery_hold
                    until: '2026-11-04T10:15:00+00:00'
        '404':
          description: >-
            Die Organisation existiert nicht oder Sie sind kein Mitglied von
            ihr.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthError'
              examples:
                OrganizationNotFound:
                  summary: Organisation nicht gefunden oder Sie sind kein Mitglied
                  value:
                    detail: Organization not found.
      security:
        - BearerAuth: []
      x-codeSamples:
        - lang: curl
          label: cURL
          source: >-
            curl -X POST
            "https://apx.didit.me/auth/v2/organizations/me/$ORG_ID/applications/"
            \
              -H "Authorization: Bearer $ACCESS_TOKEN" \
              -H "Content-Type: application/json" \
              -d '{
                "name": "Acme Customer App",
                "website_url": "https://acme.example",
                "redirect_uris": ["https://acme.example/callback"],
                "data_location": "eu"
              }'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Use the access token that account.login returns.
            client = Didit(account_token="YOUR_ACCESS_TOKEN")

            result = client.account.applications.create(
                "a1b2c3d4-5678-90ab-cdef-111111111111",
                name="Acme Customer App",
                website_url="https://acme.example",
                redirect_uris=["https://acme.example/callback"],
                terms_url="https://acme.example/terms",
                privacy_url="https://acme.example/privacy",
                data_location="eu",
            )
            print(result)
        - lang: javascript
          label: Node.js
          source: >-
            import Didit from "@didit-protocol/sdk-node";


            // Use the access token that account.login returns.

            const didit = new Didit({ accountToken: "YOUR_ACCESS_TOKEN" });


            const result = await
            didit.account.applications.create("a1b2c3d4-5678-90ab-cdef-111111111111",
            {
              name: "Acme Customer App",
              website_url: "https://acme.example",
              redirect_uris: ["https://acme.example/callback"],
              terms_url: "https://acme.example/terms",
              privacy_url: "https://acme.example/privacy",
              data_location: "eu",
            });

            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Use the access token that account.login returns.\nclient := didit.NewClient(option.WithAccountToken(\"YOUR_ACCESS_TOKEN\"))\n\nresult, err := client.Account.Applications.Create(ctx, \"a1b2c3d4-5678-90ab-cdef-111111111111\", didit.ApplicationCreateRequest{\n\tName:         didit.String(\"Acme Customer App\"),\n\tWebsiteURL:   didit.String(\"https://acme.example\"),\n\tRedirectURIs: didit.Some([]string{\"https://acme.example/callback\"}),\n\tTermsURL:     didit.String(\"https://acme.example/terms\"),\n\tPrivacyURL:   didit.String(\"https://acme.example/privacy\"),\n\tDataLocation: didit.Some(didit.ApplicationDataLocation(\"eu\")),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: >-
            import java.util.List;

            import me.didit.Didit;

            import me.didit.types.ApplicationCreateRequest;

            import me.didit.types.ApplicationDataLocation;


            // Use the access token that account.login returns.

            Didit client =
            Didit.builder().accountToken("YOUR_ACCESS_TOKEN").build();


            var result =
            client.account().applications().create("a1b2c3d4-5678-90ab-cdef-111111111111",
            ApplicationCreateRequest.builder()
                    .name("Acme Customer App")
                    .websiteUrl("https://acme.example")
                    .redirectUris(List.of("https://acme.example/callback"))
                    .termsUrl("https://acme.example/terms")
                    .privacyUrl("https://acme.example/privacy")
                    .dataLocation(ApplicationDataLocation.of("eu"))
                    .build());
            System.out.println(result);
        - lang: php
          label: PHP
          source: >-
            <?php


            require 'vendor/autoload.php';


            use Didit\DiditClient;


            // Use the access token that account.login returns.

            $didit = new DiditClient(accountToken: 'YOUR_ACCESS_TOKEN');


            $result =
            $didit->account->applications->create('a1b2c3d4-5678-90ab-cdef-111111111111',
            [
                'name' => 'Acme Customer App',
                'website_url' => 'https://acme.example',
                'redirect_uris' => ['https://acme.example/callback'],
                'terms_url' => 'https://acme.example/terms',
                'privacy_url' => 'https://acme.example/privacy',
                'data_location' => 'eu',
            ]);

            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

            # Use the access token that account.login returns.
            didit = Didit::Client.new(account_token: "YOUR_ACCESS_TOKEN")

            result = didit.account.applications.create(
              "a1b2c3d4-5678-90ab-cdef-111111111111",
              name: "Acme Customer App",
              website_url: "https://acme.example",
              redirect_uris: ["https://acme.example/callback"],
              terms_url: "https://acme.example/terms",
              privacy_url: "https://acme.example/privacy",
              data_location: "eu"
            )
            puts result.to_h
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using System.Text.Json;

            using Didit;


            // Use the access token that account.login returns.

            using var client = new DiditClient(new DiditClientOptions {
            AccountToken = "YOUR_ACCESS_TOKEN" });


            var result = await
            client.Account.Applications.CreateAsync("a1b2c3d4-5678-90ab-cdef-111111111111",
            new ApplicationCreateRequest

            {
                Name = "Acme Customer App",
                WebsiteUrl = "https://acme.example",
                RedirectUris = new string[] { "https://acme.example/callback" },
                TermsUrl = "https://acme.example/terms",
                PrivacyUrl = "https://acme.example/privacy",
                DataLocation = new ApplicationDataLocation("eu"),
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    ApplicationCreateRequest:
      type: object
      description: >-
        Alle Felder sind optional. Das Senden eines leeren Bodys erstellt eine
        Anwendung mit einem Standardnamen in der Europäischen Union.
      properties:
        name:
          type: string
          description: >-
            Anzeigename der Anwendung. Standardmäßig `"<organization name>
            App"`.
          example: Acme Customer App
        website_url:
          type: string
          description: Mit dieser Anwendung verknüpfte Website- oder App-URL.
          example: https://acme.example
        redirect_uris:
          type: array
          items:
            type: string
          description: >-
            Zulässige Weiterleitungs-URIs für Weiterleitungs-Workflows im
            OAuth-Stil und Verifizierungs-Weiterleitungs-Workflows.
          example:
            - https://acme.example/callback
        terms_url:
          type: string
          description: >-
            URL der Nutzungsbedingungen, die im Verifizierungsablauf angezeigt
            wird.
          example: https://acme.example/terms
        privacy_url:
          type: string
          description: Im Verifizierungsablauf angezeigte Datenschutzrichtlinien-URL.
          example: https://acme.example/privacy
        description:
          type: string
          description: >-
            Interne Beschreibung für die Anwendung (wird Endbenutzern nicht
            angezeigt).
        data_location:
          $ref: '#/components/schemas/ApplicationDataLocation'
    Application:
      type: object
      description: >-
        Vollständiger Anwendungsdatensatz. `uuid`, `client_id` und `api_key`
        ändern sich nach der Erstellung nie. `data_location` ändert sich
        ebenfalls nicht, außer einmalig bei der mit Ihrer Organisation
        erstellten Live-Anwendung, bevor diese verwendet wird (siehe
        Aktualisierungsanfrage).
      properties:
        uuid:
          type: string
          format: uuid
          description: Anwendungs-UUID. In nachfolgenden Aufrufen als `{app_id}` verwenden.
          example: b2c3d4e5-6789-01bc-defg-222222222222
        name:
          type: string
          description: In der Didit Console angezeigter Anzeigename der Anwendung.
          example: Acme Production App
        client_id:
          type: string
          description: >-
            Öffentlicher Client-Identifikator, der sicher in OAuth-ähnliche
            Abläufe eingebunden werden kann.
          example: S9LIYGSoWNuGMLHsvEt9dQ
        api_key:
          type: string
          description: >-
            Langlebiges Secret (auch `client_secret` genannt). Als
            `x-api-key`-Header für jeden Aufruf an
            `https://verification.didit.me/v3/...` verwenden (Sitzungen,
            Workflows, AML usw.). Wie Zugangsdaten behandeln; niemals
            clientseitig offenlegen. Neue Schlüssel beginnen mit `sk_live_`
            (Live-Anwendung) oder `sk_test_` (Sandbox-Anwendung), gefolgt von 43
            URL-sicheren Zeichen (Buchstaben, Ziffern, `-` und `_`). Schlüssel,
            die vor diesem Format erstellt wurden, haben kein Präfix und
            funktionieren weiterhin unverändert. Für 72 Stunden nach der
            Wiederherstellung Ihres Kontos geben Auflisten, Abrufen und
            Aktualisieren hier eine leere Zeichenkette anstelle des Schlüssels
            zurück.
          example: sk_live_example_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
        website_url:
          type: string
          nullable: true
          description: Mit dieser Anwendung verknüpfte Website- oder App-URL.
          example: https://acme.example
        redirect_uris:
          type: array
          items:
            type: string
          description: >-
            Zulässige Weiterleitungs-URIs für Weiterleitungs-Workflows im
            OAuth-Stil und Verifizierungs-Weiterleitungs-Workflows.
          example:
            - https://acme.example/callback
        terms_url:
          type: string
          nullable: true
          description: >-
            URL der Nutzungsbedingungen, die im Verifizierungsablauf angezeigt
            wird.
          example: https://acme.example/terms
        privacy_url:
          type: string
          nullable: true
          description: Im Verifizierungsablauf angezeigte Datenschutzrichtlinien-URL.
          example: https://acme.example/privacy
        description:
          type: string
          nullable: true
          description: >-
            Interne Beschreibung für die Anwendung (wird Endbenutzern nicht
            angezeigt).
        created_at:
          type: string
          format: date-time
          example: '2025-06-01T10:00:00Z'
        data_location:
          $ref: '#/components/schemas/ApplicationDataLocation'
        products:
          type: array
          readOnly: true
          description: >-
            Die Produkte der Anwendung. Immer alle drei, in dieser Reihenfolge:
            `identity`, `transactions`, `authentication`. Eine neue Anwendung
            hat `identity` aktiviert, wobei jedes Modul eingeschaltet ist, und
            `transactions` sowie `authentication` deaktiviert. Schreibgeschützt:
            Ein `products`-Schlüssel im Body einer Erstellung oder
            Aktualisierung wird ignoriert.
          items:
            $ref: '#/components/schemas/ApplicationProduct'
          example:
            - product: identity
              status: enabled
              modules:
                user_verification: true
                business_verification: true
                case_management: true
            - product: transactions
              status: disabled
              modules:
                travel_rule: true
                case_management: true
            - product: authentication
              status: disabled
              modules: {}
    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.
    AuthError:
      type: object
      description: >-
        Fehler-Envelope für Authentifizierung / Autorisierung / nicht gefundene
        Ressource.
      properties:
        detail:
          type: string
          example: Invalid access token
    RecoveryHoldError:
      type: object
      description: >-
        Wird 72 Stunden lang zurückgegeben, nachdem das Konto wiederhergestellt
        wurde (verlorene Anmeldemethoden wurden zurückgesetzt). Aktionen, die
        Organisationen, Anwendungen oder Geheimnisse erstellen, werden bis
        `until` abgelehnt; Leseoperationen funktionieren weiterhin.
      required:
        - detail
        - code
        - until
      properties:
        detail:
          type: string
          example: This action is on hold because you recovered your account.
        code:
          type: string
          enum:
            - recovery_hold
          example: recovery_hold
        until:
          type: string
          format: date-time
          description: >-
            Wann die Sperre endet (ISO 8601). Versuchen Sie die Anfrage nach
            diesem Zeitpunkt erneut.
          example: '2026-11-04T10:15:00+00:00'
    ApplicationDataLocation:
      type: string
      enum:
        - eu
        - au
        - mx
      description: >-
        Wo die Verifizierungsdaten der Anwendung gespeichert und verarbeitet
        werden, ausgewählt bei der Erstellung der Anwendung. `eu` ist die
        Europäische Union (Irland), die Standardeinstellung. `au` (Australien,
        Sydney) und `mx` (Mexiko) folgen in Kürze: Eine Anfrage, die diese
        angibt, führt zu einer 400-Antwort `This data location is not available
        yet.`. Die Sandbox-Anwendung einer Organisation befindet sich immer in
        der Europäischen Union.
      example: eu
    ApplicationProduct:
      type: object
      description: >-
        Ein Produkt einer Anwendung und dessen Status. Schreibgeschützt: Die
        Anwendungs-Endpoints geben es zurück und ignorieren es im Anfrage-Body.
      properties:
        product:
          type: string
          enum:
            - identity
            - transactions
            - authentication
          description: >-
            `identity` (Identitätsverifizierung), `transactions`
            (Transaktionsüberwachung) oder `authentication` (Authentifizierung).
          example: identity
        status:
          type: string
          enum:
            - enabled
            - early_access
            - disabled
          description: >-
            Gibt an, ob das Produkt für diese Anwendung aktiviert ist.
            `early_access` gilt nur für `authentication`, das Didit für Sie
            aktiviert.
          example: enabled
        modules:
          type: object
          additionalProperties:
            type: boolean
          description: >-
            Modulschalter des Produkts, jeweils `true` oder `false`. `identity`
            enthält `user_verification`, `business_verification` und
            `case_management`. `transactions` enthält `travel_rule` und
            `case_management`. `authentication` enthält keine (`{}`).
            `case_management` ist eine Einstellung, die sowohl unter `identity`
            als auch unter `transactions` angezeigt wird und daher in beiden
            denselben Wert hat.
          example:
            user_verification: true
            business_verification: true
            case_management: true
      required:
        - product
        - status
        - modules
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >-
        RS256-signiertes JWT `access_token`, das von `POST /programmatic/login/`
        oder `POST /programmatic/verify-email/` zurückgegeben wird. Als
        `Authorization: Bearer <access_token>` senden. Die Standardlebensdauer
        beträgt 86400 Sekunden (24 Stunden). Dieses Token ist nur für die
        Account-Management-Endpoints auf `apx.didit.me/auth/v2` gültig. Die
        Verifizierungs-API (`verification.didit.me/v3`) verwendet stattdessen
        den langlebigen `api_key` als `x-api-key`.

````

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