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

# Aggiorna applicazione API: gestire le app dei clienti

> Aggiorna con PATCH /organizations/me/{org_id}/applications/{app_id}/ i metadati delle app clienti reseller in Didit: brand, ambienti e casi d'uso separati.



Prompt di aggiornamento dell'applicazione
        Copia il prompt negli appunti



      
      

\<pre>

\`Partially update one Didit application's metadata (name, public URLs, redirect URIs, description). Credentials (client_id, api_key, uuid) are NEVER changed by this call.

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

Authentication:
Authorization: Bearer <access_token>
The access token must belong to an OWNER or ADMIN of the organization.

Path parameters:
\- org_id (UUID, required) — Organization that owns the application.
\- app_id (UUID, required) — Application UUID to update.

Request body — PATCH semantics. Send ONLY the fields you want to change. Omitted fields are preserved.
\- name (string, optional) — Display name.
\- website_url (string, URL, optional) — Public homepage.
\- redirect_uris (array of strings, optional) — Allowlisted OAuth-style redirect URIs. The array REPLACES the previous value entirely.
\- terms_url (string, URL, optional) — Terms-of-service link.
\- privacy_url (string, URL, optional) — Privacy policy link.
\- description (string, optional) — Internal note (not shown to end users).
\- products is read-only: a products key in the body is ignored.
\- data_location (string, optional) — The application's data location, chosen when it was created. Naming the location it already has is accepted; any other location answers 400. One exception: the live application created with your organization (at sign-up or by POST /programmatic/verify-email/) has its location chosen by the first update that names data_location, once, while none of its API keys has been used and it has no verification session. Only "eu" (European Union, Ireland) is available today.

What does NOT change:
\- uuid, client_id, api_key — credentials stay the same. Existing integrations keep working; no key rotation happens here.
\- data_location — set when the application is created (see above for the one exception).

curl example — rename and move to a new domain:
curl -X PATCH "https://apx.didit.me/auth/v2/organizations/me/<ORG_ID>/applications/<APP_ID>/" \
-H "Authorization: Bearer <ACCESS_TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"name": "Acme Production App",
"website_url": "https://app.acme.example"
}'

curl example — add a second redirect URI (full replacement of the array):
curl -X PATCH "https://apx.didit.me/auth/v2/organizations/me/<ORG_ID>/applications/<APP_ID>/" \
-H "Authorization: Bearer <ACCESS_TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"redirect_uris": [
  "https://acme.example/callback",
  "https://staging.acme.example/callback"
]
}'

Response (200 OK):
The full application record after the change, including products (same shape as GET /organizations/me/{org_id}/applications/{app_id}/). uuid, client_id, and api_key are unchanged.

When to call:
\- Reseller customer rebrands → rename their application.
\- Domain migration → update website_url, terms_url, privacy_url.
\- Add or remove a staging redirect URI.
\- Refresh terms / privacy URLs shown in the verification flow.

Failure modes:
\- 400 — { "<field>": ["Enter a valid URL."] } for malformed website_url / redirect_uris / terms_url / privacy_url.
\- 400 — { "data_location": ["An application's data location can't be changed after it is created."] } for a location other than the application's own, and { "data_location": ["This data location is not available yet."] } for "au" or "mx". Nothing is changed.
\- 503 — { "detail": "We couldn't confirm that this application is unused. Try again in a moment.", "code": "data_location_check_unavailable" } only while choosing the first application's location. Nothing is changed; retry.
\- 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, or { "detail": "Application not found." } when the application is not in that organization.

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

\</pre>



      
      

Incolla in

Usa questo endpoint per mantenere ogni applicazione allineata al cliente, al brand, all'ambiente o al caso d'uso interno che rappresenta.Per i rivenditori, questo consente di rinominare o aggiornare ogni applicazione del cliente senza condividere le credenziali tra i clienti. Per i clienti diretti, aiuta a separare prodotti, regioni o ambienti mantenendo tutto sotto un'unica organizzazione.> [!NOTE]
>
> Questo endpoint aggiorna i metadati dell'applicazione. La `api_key` resta la stessa, a meno che tu non ruoti le credenziali separatamente.## Posizione dei datiLa posizione dei dati dell'applicazione (`data_location`) viene scelta al momento della creazione dell'applicazione e non può essere modificata in seguito: un aggiornamento che indica la posizione già assegnata all'applicazione viene accettato, mentre qualsiasi altra posizione restituisce 400.Fa eccezione l'applicazione di produzione creata insieme alla tua organizzazione, al momento della registrazione o tramite [Verifica email](https://docs.didit.me/it/auth-api/verify-email.md). Il primo aggiornamento che indica un `data_location` sceglie la sua posizione, una sola volta, purché nessuna delle chiavi API dell'applicazione sia stata utilizzata e l'applicazione non abbia alcuna sessione di verifica. Il passaggio **Dai un nome alla tua prima applicazione** della console usa questa funzionalità per salvare la posizione che scegli lì. Al momento l'unica posizione disponibile è `eu`, l'Unione Europea (Irlanda).


## OpenAPI

````yaml it/openapi-auth.json PATCH /organizations/me/{org_id}/applications/{app_id}/
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/{app_id}/:
    patch:
      tags:
        - Account Management
      summary: Aggiorna l'applicazione
      description: >-
        Aggiorna i metadati dell'applicazione (nome, URL, URI di
        reindirizzamento). `api_key` e `client_id` non vengono mai ruotati.
        `products` è di sola lettura: un parametro `products` nel corpo viene
        ignorato. `data_location` non può essere modificato dopo la creazione
        dell'applicazione, tranne una sola volta sull'applicazione di produzione
        creata con la tua organizzazione, finché rimane inutilizzata (vedi il
        corpo della richiesta). Richiede JWT owner/admin.
      operationId: update_organization_application
      parameters:
        - name: org_id
          in: path
          required: true
          description: UUID dell'organizzazione proprietaria dell'applicazione.
          schema:
            type: string
            format: uuid
            example: a1b2c3d4-5678-90ab-cdef-111111111111
        - name: app_id
          in: path
          required: true
          description: UUID dell'applicazione da aggiornare.
          schema:
            type: string
            format: uuid
            example: b2c3d4e5-6789-01bc-defg-222222222222
      requestBody:
        required: true
        description: >-
          Invia solo i campi che desideri modificare. Semantica PATCH: i campi
          mancanti vengono preservati.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ApplicationUpdateRequest'
            examples:
              RenameCustomerApplication:
                summary: Rinomina e sposta in un nuovo dominio
                value:
                  name: Acme Production App
                  website_url: https://app.acme.example
              UpdateRedirectUris:
                summary: Aggiungi un secondo URI di reindirizzamento
                value:
                  redirect_uris:
                    - https://acme.example/callback
                    - https://staging.acme.example/callback
              UpdatePolicies:
                summary: Aggiorna gli URL dei termini e dell'informativa sulla privacy
                value:
                  terms_url: https://acme.example/v2/terms
                  privacy_url: https://acme.example/v2/privacy
      responses:
        '200':
          description: >-
            Applicazione aggiornata. La risposta è il record completo
            dell'applicazione dopo la modifica, inclusi i `products`; `uuid`,
            `client_id` e `api_key` rimangono invariati.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Application'
              examples:
                Success:
                  value:
                    uuid: b2c3d4e5-6789-01bc-defg-222222222222
                    name: Acme Production App
                    client_id: S9LIYGSoWNuGMLHsvEt9dQ
                    api_key: sk_live_example_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                    website_url: https://app.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 URL
            non valido, una `data_location` non ancora disponibile o una
            `data_location` diversa da quella dell'applicazione stessa. Nulla
            viene modificato.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationError'
              examples:
                InvalidUrl:
                  value:
                    website_url:
                      - Enter a valid URL.
                DataLocationFixed:
                  summary: Un'ubicazione dei dati diversa da quella dell'applicazione
                  value:
                    data_location:
                      - >-
                        An application's data location can't be changed after it
                        is created.
                DataLocationNotAvailable:
                  summary: Una posizione dei dati disponibile prossimamente
                  value:
                    data_location:
                      - This data location is not available yet.
        '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 aggiornare questa applicazione. 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.`
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthError'
              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.
        '404':
          description: >-
            L'organizzazione non esiste o non ne fai parte, oppure
            l'applicazione non esiste in tale organizzazione.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthError'
              examples:
                OrganizationNotFound:
                  summary: Organizzazione non trovata, oppure non ne sei membro
                  value:
                    detail: Organization not found.
                ApplicationNotFound:
                  summary: Nessuna applicazione del genere in questa organizzazione
                  value:
                    detail: Application not found.
        '503':
          description: >-
            Solo quando l'aggiornamento seleziona un'altra posizione dei dati
            per l'applicazione di produzione creata con la tua organizzazione:
            Didit non ha potuto confermare che l'applicazione non abbia ancora
            alcuna sessione di verifica, pertanto non è stata apportata alcuna
            modifica. Riprova a inviare la richiesta.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceUnavailableError'
              examples:
                DataLocationCheckUnavailable:
                  value:
                    detail: >-
                      We couldn't confirm that this application is unused. Try
                      again in a moment.
                    code: data_location_check_unavailable
      security:
        - BearerAuth: []
      x-codeSamples:
        - lang: curl
          label: cURL
          source: >-
            curl -X PATCH
            "https://apx.didit.me/auth/v2/organizations/me/$ORG_ID/applications/$APP_ID/"
            \
              -H "Authorization: Bearer $ACCESS_TOKEN" \
              -H "Content-Type: application/json" \
              -d '{
                "name": "Acme Production App",
                "website_url": "https://app.acme.example"
              }'
        - 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.update(
                "a1b2c3d4-5678-90ab-cdef-111111111111",
                "b2c3d4e5-6789-01bc-defg-222222222222",
                name="Acme Production App",
                website_url="https://app.acme.example",
            )
            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.update(
              "a1b2c3d4-5678-90ab-cdef-111111111111",
              "b2c3d4e5-6789-01bc-defg-222222222222",
              {
                name: "Acme Production App",
                website_url: "https://app.acme.example",
              },
            );
            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.Update(ctx, \"a1b2c3d4-5678-90ab-cdef-111111111111\", \"b2c3d4e5-6789-01bc-defg-222222222222\", didit.ApplicationUpdateRequest{\n\tName:       didit.String(\"Acme Production App\"),\n\tWebsiteURL: didit.String(\"https://app.acme.example\"),\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.ApplicationUpdateRequest;


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

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


            var result =
            client.account().applications().update("a1b2c3d4-5678-90ab-cdef-111111111111",
            "b2c3d4e5-6789-01bc-defg-222222222222",
            ApplicationUpdateRequest.builder()
                    .name("Acme Production App")
                    .websiteUrl("https://app.acme.example")
                    .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->update('a1b2c3d4-5678-90ab-cdef-111111111111',
            'b2c3d4e5-6789-01bc-defg-222222222222', [
                'name' => 'Acme Production App',
                'website_url' => 'https://app.acme.example',
            ]);

            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.update(
              "a1b2c3d4-5678-90ab-cdef-111111111111",
              "b2c3d4e5-6789-01bc-defg-222222222222",
              name: "Acme Production App",
              website_url: "https://app.acme.example"
            )
            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.UpdateAsync("a1b2c3d4-5678-90ab-cdef-111111111111",
            "b2c3d4e5-6789-01bc-defg-222222222222", new ApplicationUpdateRequest

            {
                Name = "Acme Production App",
                WebsiteUrl = "https://app.acme.example",
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    ApplicationUpdateRequest:
      type: object
      description: >-
        Corpo PATCH per i metadati dell'applicazione. Invia solo i campi che
        desideri modificare; i campi omessi vengono conservati. `uuid`,
        `client_id` e `api_key` non possono essere aggiornati. `products` è di
        sola lettura: una chiave `products` nel corpo viene ignorata.
        `data_location` non può essere modificata dopo la creazione
        dell'applicazione: specificare la posizione che già possiede è
        consentito, mentre qualsiasi altra posizione restituisce 400. L'unica
        eccezione è l'applicazione di produzione creata con la tua
        organizzazione: il primo aggiornamento che specifica una `data_location`
        la imposta, una sola volta, purché non sia stata utilizzata alcuna
        chiave API dell'applicazione e quest'ultima non abbia alcuna sessione di
        verifica.
      properties:
        name:
          type: string
          description: Nome visualizzato dell'applicazione.
          example: Acme Production App
        website_url:
          type: string
          description: URL del sito web o dell'app associato a questa applicazione.
          example: https://app.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.
        privacy_url:
          type: string
          description: URL dell'informativa sulla privacy mostrato nel flusso di verifica.
        description:
          type: string
          description: Descrizione interna dell'applicazione.
        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
    ServiceUnavailableError:
      type: object
      description: >-
        Impossibile completare la richiesta in questo momento e non è stata
        apportata alcuna modifica. Riprova tra un momento.
      properties:
        detail:
          type: string
          example: >-
            We couldn't confirm that this application is unused. Try again in a
            moment.
        code:
          type: string
          example: data_location_check_unavailable
    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.