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

# API Creazione Applicazione: App Programmatiche

> POST /organizations/me/{org_id}/applications/ per creare un'applicazione Didit per cliente, brand, ambiente o business unit. Restituisce client_id e api_key.



Prompt per la creazione dell'applicazione
        Copia il prompt negli appunti



      
      

\<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>



      
      

Incolla in

Usa questo endpoint quando devi separare il traffico di verifica, le credenziali, il branding o la reportistica all'interno della stessa organizzazione.Questo è particolarmente utile per i **rivenditori** che creano un'applicazione per ogni cliente. Funziona bene anche quando la tua azienda ha più prodotti, brand, regioni, ambienti di staging/produzione o casi d'uso che non devono condividere la stessa chiave API e le stesse impostazioni a livello di applicazione.> [!NOTE]
>
> Tutti gli endpoint di Auth API usano `https://apx.didit.me/auth/v2`. Usa l'`api_key` restituita come `x-api-key` quando chiami gli endpoint `https://verification.didit.me/v3/...`, come sessioni e workflow.## Ubicazione dei datiOgni applicazione archivia ed elabora i dati di verifica in un'unica ubicazione, ovvero la sua ubicazione dei dati, scelta al momento della creazione tramite `data_location`.
Oggi l'unica ubicazione disponibile è `eu`, l'Unione Europea (Irlanda), che è anche il valore predefinito se ometti il campo.
Australia (Sydney, `au`) e Messico (`mx`) sono in arrivo: una richiesta che li indica risponde con 400 `This data location is not available yet.` e non crea nulla.
Ogni lettura dei dati dell'applicazione restituisce il relativo `data_location`, che non può essere modificato dopo la creazione dell'applicazione.
Vedi [Ubicazione dei dati](https://docs.didit.me/it/console/applications.md#posizione-dei-dati).


## OpenAPI

````yaml it/openapi-auth.json POST /organizations/me/{org_id}/applications/
openapi: 3.0.0
info:
  version: 1.0.0
  title: Didit Auth API
  description: >-
    API di registrazione e autenticazione programmatica per sviluppatori e
    agenti AI. Registrati in 2 chiamate API -- senza bisogno di browser. La
    piattaforma di verifica dell'identità più adatta agli agenti.


    ## Base URL


    Tutti gli endpoint di questa specifica sono ospitati su
    `https://apx.didit.me/auth/v2`. Si tratta di un host diverso rispetto a
    quello dell'API di verifica (`https://verification.didit.me/v3`).
    Distinguili chiaramente: questo host di autenticazione rilascia i tuoi
    **token di accesso JWT** e ti consente di elencare e gestire le tue
    **organizzazioni** e le tue **applicazioni**. L'host di verifica è il luogo
    in cui chiami sessioni, workflow, AML, ecc., autenticandoti con la
    **`api_key`** restituita da questa API.


    ## Come funziona il flusso di autenticazione


    1. `POST /programmatic/register/` — invia email + password.

    2. Ricevi un codice alfanumerico di 6 caratteri via email.

    3. `POST /programmatic/verify-email/` — invia il codice. Ricevi in risposta
    un `access_token` JWT, un `refresh_token`, un'organizzazione e
    un'applicazione predefinita con `client_id` + `api_key`.

    4. Salva la `api_key`. Usala come `x-api-key` per ogni chiamata a
    `https://verification.didit.me/v3/...`.

    5. Da qualsiasi macchina in futuro, `POST /programmatic/login/` scambia
    email + password con un nuovo JWT, quindi chiama `GET /organizations/me/` e
    gli endpoint dell'applicazione per recuperare o ruotare le credenziali.


    Il JWT serve solo per gli endpoint di **Gestione dell'account** in questa
    specifica; il traffico dell'API di verifica utilizza la `api_key` a lunga
    durata, non il JWT.


    ## Convenzioni


    - Tutti i corpi di richiesta e risposta sono in formato JSON (`Content-Type:
    application/json`).

    - **Usa un indirizzo email reale e recapitabile quando testi `POST
    /programmatic/register/`.** L'endpoint invia il codice di verifica in modo
    sincrono, quindi gli indirizzi su domini di test riservati (`@example.com`,
    `@example.org`, `@*.test`, `@*.example`, `@*.invalid`) vengono rifiutati
    dalla consegna della posta e la richiesta restituisce `500`. Sostituisci il
    segnaposto `you@yourdomain.com` negli esempi con una casella di posta che
    puoi effettivamente consultare.

    - Gli errori di validazione restituiscono HTTP `400` con una delle due
    strutture: `{"field": ["message", ...]}` per problemi a livello di campo,
    oppure `{"detail": "message"}` per errori legati a regole aziendali. Alcuni
    validatori (robustezza della password in fase di registrazione, scadenza del
    codice su verify-email) attualmente rispondono con un array semplice
    `["message"]` anziché con il formato indicizzato per campo: si tratta di
    un'incoerenza nota lato server, pertanto il codice client dovrebbe accettare
    entrambi i formati.

    - Gli errori di autenticazione vengono restituiti come `{"detail": "..."}`
    con HTTP `401` (token bearer non valido) o `403` (token bearer mancante /
    autorizzazioni insufficienti).

    - Le risposte relative al limite di frequenza includono un campo `wait` con
    il tempo di attesa in secondi.
servers:
  - url: https://apx.didit.me/auth/v2
    description: Server di autenticazione di produzione
security: []
tags:
  - name: Programmatic Auth
    description: >-
      Ciclo di vita dell'account basato su email e password: registrazione,
      verifica, accesso. Restituisce il JWT `access_token` utilizzato per gli
      endpoint di gestione dell'account, oltre a (in fase di verifica)
      `client_id` e `api_key` della tua prima applicazione.
  - name: Account Management
    description: >-
      Endpoint autenticati (bearer JWT) che elencano le organizzazioni e creano,
      recuperano o aggiornano le applicazioni. Usali per recuperare o ruotare la
      `api_key` con cui autentichi le chiamate API di verifica.
paths:
  /organizations/me/{org_id}/applications/:
    post:
      tags:
        - Account Management
      summary: Crea applicazione
      description: >-
        Crea un'applicazione all'interno di un'organizzazione, nella residenza
        dei dati scelta (`data_location`, l'Unione Europea per impostazione
        predefinita; non può essere modificata in seguito). La risposta include
        `api_key`; salvala subito (è recuperabile tramite GET). Richiede un JWT
        di tipo owner o admin.
      operationId: create_organization_application
      parameters:
        - name: org_id
          in: path
          required: true
          description: UUID dell'organizzazione. Cercalo con `GET /organizations/me/`.
          schema:
            type: string
            format: uuid
            example: a1b2c3d4-5678-90ab-cdef-111111111111
      requestBody:
        required: false
        description: >-
          Tutti i campi sono facoltativi. L'omissione del body crea
          un'applicazione con il nome predefinito `"<organization name> App"` e
          nessun URL pubblico configurato.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ApplicationCreateRequest'
            examples:
              ResellerCustomer:
                summary: Rivenditore che avvia un'applicazione con ambito cliente
                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: Creazione minima -- accetta tutti i valori predefiniti
                value:
                  name: Sandbox App
              Empty:
                summary: Nessun body -- il valore predefinito è <org name> App
                value: {}
      responses:
        '201':
          description: >-
            Applicazione creata. La risposta include la `api_key` a lungo
            termine; salvala ora e usala come intestazione `x-api-key` in ogni
            chiamata `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: >-
            Errore di validazione nel corpo della richiesta: per esempio un URI
            di reindirizzamento non valido, una `data_location` non ancora
            disponibile (`au`, `mx`) o una che non esiste. Nulla viene creato.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationError'
              examples:
                InvalidUrl:
                  value:
                    website_url:
                      - Enter a valid URL.
                DataLocationNotAvailable:
                  summary: Una posizione dei dati disponibile prossimamente
                  value:
                    data_location:
                      - This data location is not available yet.
                UnknownDataLocation:
                  summary: Una posizione dei dati inesistente
                  value:
                    data_location:
                      - '"us" is not a valid choice.'
        '401':
          description: >-
            Token di accesso non corretto, non valido o scaduto. Ottienine uno
            nuovo con `POST /programmatic/login/`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthError'
              examples:
                InvalidToken:
                  value:
                    detail: Invalid access token
                ExpiredToken:
                  value:
                    detail: Expired access token
        '403':
          description: >-
            Non puoi creare applicazioni in questa organizzazione. Un membro
            dell'organizzazione che non è proprietario o amministratore riceve
            `Only organization owners and admins can manage applications.` Un
            proprietario o amministratore il cui accesso all'organizzazione è
            sospeso riceve `Your access to this organization is suspended.` Una
            richiesta senza intestazione `Authorization` riceve `You do not have
            permission to perform this action.` Per 72 ore dopo il recupero
            dell'account, la richiesta viene rifiutata con `code`
            `recovery_hold` e `until`, l'orario in cui termina il blocco.
          content:
            application/json:
              schema:
                oneOf:
                  - $ref: '#/components/schemas/AuthError'
                  - $ref: '#/components/schemas/RecoveryHoldError'
              examples:
                NotOwnerOrAdmin:
                  summary: Membro che non è un proprietario o amministratore
                  value:
                    detail: >-
                      Only organization owners and admins can manage
                      applications.
                Suspended:
                  summary: Iscrizione sospesa
                  value:
                    detail: Your access to this organization is suspended.
                MissingToken:
                  summary: Nessuna intestazione Authorization
                  value:
                    detail: You do not have permission to perform this action.
                RecoveryHold:
                  summary: Account recuperato meno di 72 ore fa
                  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: L'organizzazione non esiste o non ne sei un membro.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthError'
              examples:
                OrganizationNotFound:
                  summary: Organizzazione non trovata, oppure non ne sei membro
                  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: >-
        Tutti i campi sono facoltativi. L'invio di un body vuoto crea
        un'applicazione con un nome predefinito, nell'Unione Europea.
      properties:
        name:
          type: string
          description: >-
            Nome visualizzato dell'applicazione. Il valore predefinito è
            `"<organization name> App"`.
          example: Acme Customer App
        website_url:
          type: string
          description: URL del sito web o dell'app associato a questa applicazione.
          example: https://acme.example
        redirect_uris:
          type: array
          items:
            type: string
          description: >-
            URI di reindirizzamento consentiti per i flussi in stile OAuth e di
            reindirizzamento della verifica.
          example:
            - https://acme.example/callback
        terms_url:
          type: string
          description: URL dei termini di servizio mostrato nel flusso di verifica.
          example: https://acme.example/terms
        privacy_url:
          type: string
          description: URL dell'informativa sulla privacy mostrato nel flusso di verifica.
          example: https://acme.example/privacy
        description:
          type: string
          description: >-
            Descrizione interna dell'applicazione (non mostrata agli utenti
            finali).
        data_location:
          $ref: '#/components/schemas/ApplicationDataLocation'
    Application:
      type: object
      description: >-
        Record completo dell'applicazione. `uuid`, `client_id` e `api_key` non
        cambiano mai dopo la creazione. Nemmeno `data_location` cambia, tranne
        una volta sull'applicazione di produzione creata con la tua
        organizzazione, prima che venga utilizzata (vedi la richiesta di
        aggiornamento).
      properties:
        uuid:
          type: string
          format: uuid
          description: >-
            UUID dell'applicazione. Da utilizzare come `{app_id}` nelle chiamate
            successive.
          example: b2c3d4e5-6789-01bc-defg-222222222222
        name:
          type: string
          description: Nome visualizzato dell'applicazione mostrato nella console Didit.
          example: Acme Production App
        client_id:
          type: string
          description: >-
            Identificatore client pubblico, sicuro da incorporare nei flussi di
            tipo OAuth.
          example: S9LIYGSoWNuGMLHsvEt9dQ
        api_key:
          type: string
          description: >-
            Segreto a lunga durata (chiamato anche `client_secret`). Da usare
            come intestazione `x-api-key` per ogni chiamata a
            `https://verification.didit.me/v3/...` (sessioni, workflow, AML,
            ecc.). Trattalo come una credenziale; non esporlo mai lato client.
            Le nuove chiavi iniziano con `sk_live_` (applicazione di produzione)
            o `sk_test_` (applicazione sandbox), seguiti da 43 caratteri
            URL-safe (lettere, cifre, `-` e `_`). Le chiavi create prima di
            questo formato non hanno prefisso e continuano a funzionare
            invariate. Per le 72 ore successive al recupero dell'account, le
            operazioni di elenco, recupero e aggiornamento restituiscono qui una
            stringa vuota al posto della chiave.
          example: sk_live_example_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
        website_url:
          type: string
          nullable: true
          description: URL del sito web o dell'app associato a questa applicazione.
          example: https://acme.example
        redirect_uris:
          type: array
          items:
            type: string
          description: >-
            URI di reindirizzamento consentiti per i flussi in stile OAuth e di
            reindirizzamento della verifica.
          example:
            - https://acme.example/callback
        terms_url:
          type: string
          nullable: true
          description: URL dei termini di servizio mostrato nel flusso di verifica.
          example: https://acme.example/terms
        privacy_url:
          type: string
          nullable: true
          description: URL dell'informativa sulla privacy mostrato nel flusso di verifica.
          example: https://acme.example/privacy
        description:
          type: string
          nullable: true
          description: >-
            Descrizione interna dell'applicazione (non mostrata agli utenti
            finali).
        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: >-
            I prodotti dell'applicazione. Sempre tutti e tre, in questo ordine:
            `identity`, `transactions`, `authentication`. Una nuova applicazione
            ha `identity` abilitato con tutti i moduli attivi, e `transactions`
            e `authentication` disabilitati. Di sola lettura: una chiave
            `products` nel corpo di creazione o aggiornamento viene ignorata.
          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: >-
        Corpo dell'errore di validazione. La busta prevista è una mappa `{field:
        ["message", ...]}` per errori a livello di campo o una busta a chiave
        singola `{detail: "..."}` per errori sulle regole di business. Alcuni
        validatori (complessità della password alla registrazione, validità del
        codice in verify-email) attualmente rispondono con un array semplice
        `["message"]` -- incoerenza nota lato server. Lo schema seguente
        mantiene quel ramo con array semplice in modo che il codice client
        generato da questa specifica deserializzi le risposte correnti, ma il
        nuovo codice client dovrebbe trattarlo come la forma con chiave di campo
        pertinente (`{password: [...]}` o `{code: [...]}`) e il contratto del
        server convergerà su tale formato.
      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: Contenitore di errori di autenticazione / autorizzazione / non trovato.
      properties:
        detail:
          type: string
          example: Invalid access token
    RecoveryHoldError:
      type: object
      description: >-
        Restituito per 72 ore dopo il recupero dell'account (i metodi di accesso
        smarriti sono stati reimpostati). Le azioni che creano organizzazioni,
        applicazioni o segreti vengono rifiutate fino a `until`; le operazioni
        di lettura continuano a funzionare.
      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: >-
            Data e ora di fine della sospensione (ISO 8601). Riprova la
            richiesta dopo questo orario.
          example: '2026-11-04T10:15:00+00:00'
    ApplicationDataLocation:
      type: string
      enum:
        - eu
        - au
        - mx
      description: >-
        Dove vengono archiviati ed elaborati i dati di verifica
        dell'applicazione; questa posizione viene scelta al momento della
        creazione dell'applicazione. `eu` indica l'Unione Europea (Irlanda), il
        valore predefinito. `au` (Australia, Sydney) e `mx` (Messico) saranno
        presto disponibili: una richiesta che li specifica risponde con 400
        `This data location is not available yet.` L'applicazione Sandbox di
        un'organizzazione si trova sempre nell'Unione Europea.
      example: eu
    ApplicationProduct:
      type: object
      description: >-
        Un prodotto di un'applicazione e il suo stato. Di sola lettura: gli
        endpoint dell'applicazione lo restituiscono e lo ignorano nel corpo
        della richiesta.
      properties:
        product:
          type: string
          enum:
            - identity
            - transactions
            - authentication
          description: >-
            `identity` (Verifica dell'identità), `transactions` (Monitoraggio
            delle transazioni) o `authentication` (Autenticazione).
          example: identity
        status:
          type: string
          enum:
            - enabled
            - early_access
            - disabled
          description: >-
            Indica se il prodotto è attivo per questa applicazione.
            `early_access` si applica solo ad `authentication`, che Didit attiva
            per te.
          example: enabled
        modules:
          type: object
          additionalProperties:
            type: boolean
          description: >-
            Interruttori dei moduli del prodotto, ciascuno `true` o `false`.
            `identity` include `user_verification`, `business_verification` e
            `case_management`. `transactions` include `travel_rule` e
            `case_management`. `authentication` non ne include nessuno (`{}`).
            `case_management` è un'impostazione mostrata sia sotto `identity`
            sia sotto `transactions`, pertanto ha lo stesso valore in entrambe.
          example:
            user_verification: true
            business_verification: true
            case_management: true
      required:
        - product
        - status
        - modules
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >-
        `access_token` JWT firmato con RS256 restituito da `POST
        /programmatic/login/` o `POST /programmatic/verify-email/`. Invia come
        `Authorization: Bearer <access_token>`. La durata predefinita è di 86400
        secondi (24 ore). Questo token è valido solo per gli endpoint di Account
        Management su `apx.didit.me/auth/v2`. L'API di verifica
        (`verification.didit.me/v3`) utilizza invece la `api_key` a lunga durata
        come `x-api-key`.

````

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