> ## 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 de mise à jour d'application : gérer les apps clients

> Mettez à jour les métadonnées des apps clients revendeurs Didit via PATCH /organizations/me/{org_id}/applications/{app_id}/.



Prompt de mise à jour de l'application
        Copier le prompt dans le presse-papiers



      
      

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



      
      

Coller dans

Utilisez cet endpoint pour que chaque application reste alignée sur le client, la marque, l'environnement ou le cas d'usage interne qu'elle représente.Pour les revendeurs, cela vous permet de renommer ou de mettre à jour chaque application client sans partager les identifiants entre les clients. Pour les clients directs, cela permet de séparer les produits, les régions ou les environnements tout en gardant l'ensemble sous une même organisation.> [!NOTE]
>
> Cet endpoint met à jour les métadonnées de l'application. La valeur `api_key` reste la même, sauf si vous renouvelez les identifiants séparément.## Emplacement des donnéesL'emplacement des données de l'application (`data_location`) est choisi à la création de l'application et ne peut plus être modifié ensuite : une mise à jour qui indique l'emplacement déjà attribué à l'application est acceptée, et toute autre valeur renvoie 400.Il existe une exception pour l'application de production créée avec votre organisation, lors de l'inscription ou via [Vérifier l'e-mail](https://docs.didit.me/fr/auth-api/verify-email.md). La première mise à jour qui indique un `data_location` fixe son emplacement, une seule fois, à condition qu'aucune des clés API de l'application n'ait été utilisée et qu'elle n'ait aucune session de vérification.L'étape **Nommez votre première application** de la console utilise ce mécanisme pour enregistrer l'emplacement que vous choisissez à cette étape. Aujourd'hui, le seul emplacement disponible est `eu`, l'Union européenne (Irlande).


## OpenAPI

````yaml fr/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 d'inscription et d'authentification programmatiques pour les développeurs et les agents IA. Inscrivez-vous en 2 appels d'API -- aucun navigateur requis. La plateforme de vérification d'identité la plus adaptée aux agents.\n\n## URL de base\n\nTous les endpoints de cette spécification sont hébergés sur `https://apx.didit.me/auth/v2`. Il s'agit d'un hôte différent de celui de l'API de vérification (`https://verification.didit.me/v3`). Distinguez-les bien\_: cet hôte d'authentification délivre vos **tokens d'accès JWT** et vous permet de lister et gérer vos **organisations** et **applications**. L'hôte de vérification est celui sur lequel vous appelez les sessions, les workflows, l'AML, etc., en vous authentifiant avec la **`api_key`** renvoyée par cette API.\n\n## Fonctionnement du flux d'authentification\n\n1. `POST /programmatic/register/` — soumettez e-mail + mot de passe.\n2. Recevez un code alphanumérique de 6 caractères par e-mail.\n3. `POST /programmatic/verify-email/` — soumettez le code. Vous recevez en retour un `access_token` JWT, un `refresh_token`, une organisation et une application par défaut avec `client_id` + `api_key`.\n4. Enregistrez la `api_key`. Utilisez-la comme `x-api-key` pour chaque appel vers `https://verification.didit.me/v3/...`.\n5. Depuis n'importe quelle machine ultérieure, `POST /programmatic/login/` échange votre e-mail + mot de passe contre un nouveau JWT, puis appelez `GET /organizations/me/` et les endpoints d'application pour récupérer ou renouveler les identifiants.\n\nLe JWT n'est requis que pour les endpoints de **Gestion de compte** de cette spécification\_; le trafic de l'API de vérification utilise la `api_key` de longue durée, pas le JWT.\n\n## Conventions\n\n- Tous les corps de requête et de réponse sont en JSON (`Content-Type: application/json`).\n- **Utilisez une véritable adresse e-mail distribuable lors du test de `POST /programmatic/register/`.** L'endpoint envoie le code de vérification de manière synchrone\_; les adresses sur des domaines de test réservés (`@example.com`, `@example.org`, `@*.test`, `@*.example`, `@*.invalid`) sont donc refusées par le service de distribution des e-mails et la requête renvoie une erreur `500`. Remplacez l'espace réservé `you@yourdomain.com` dans les exemples par une boîte de réception que vous pouvez réellement consulter.\n- Les erreurs de validation renvoient un code HTTP `400` avec l'une des deux structures\_: `{\"field\": [\"message\", ...]}` pour les problèmes au niveau des champs, ou `{\"detail\": \"message\"}` pour les erreurs de règles métier. Quelques validateurs (force du mot de passe lors de l'inscription, expiration du code lors de la vérification de l'e-mail) répondent actuellement avec un simple tableau `[\"message\"]` au lieu du format avec des clés correspondant aux champs -- il s'agit d'une incohérence connue côté serveur\_; le code client doit donc accepter les deux formats.\n- Les erreurs d'authentification renvoient `{\"detail\": \"...\"}` avec un code HTTP `401` (token porteur non valide) ou `403` (token porteur manquant / privilèges insuffisants).\n- Les réponses de limite de débit incluent un champ `wait` indiquant le délai d'attente en secondes."
servers:
  - url: https://apx.didit.me/auth/v2
    description: Serveur d'authentification de production
security: []
tags:
  - name: Programmatic Auth
    description: >-
      Cycle de vie d'un compte avec e-mail et mot de passe : inscription,
      vérification, connexion. Renvoie le `access_token` JWT que vous utilisez
      sur les endpoints de gestion de compte, plus (lors de la vérification) le
      `client_id` et la `api_key` de votre première application.
  - name: Account Management
    description: >-
      Endpoints authentifiés (Bearer JWT) qui listent les organisations et
      créent, récupèrent ou mettent à jour des applications. Utilisez-les pour
      récupérer ou remplacer la clé `api_key` avec laquelle vous authentifiez
      les appels à l'API de vérification.
paths:
  /organizations/me/{org_id}/applications/{app_id}/:
    patch:
      tags:
        - Account Management
      summary: Mettre à jour l'application
      description: >-
        Mettre à jour les métadonnées de l'application (nom, URLs, URI de
        redirection). `api_key` et `client_id` ne sont jamais renouvelés.
        `products` est en lecture seule : une clé `products` dans le corps est
        ignorée. `data_location` ne peut pas être modifié après la création de
        l'application, sauf une fois sur l'application de production créée avec
        votre organisation, tant qu'elle est inutilisée (voir le corps de la
        requête). Nécessite un JWT propriétaire/administrateur.
      operationId: update_organization_application
      parameters:
        - name: org_id
          in: path
          required: true
          description: UUID de l'organisation propriétaire de l'application.
          schema:
            type: string
            format: uuid
            example: a1b2c3d4-5678-90ab-cdef-111111111111
        - name: app_id
          in: path
          required: true
          description: UUID de l'application à mettre à jour.
          schema:
            type: string
            format: uuid
            example: b2c3d4e5-6789-01bc-defg-222222222222
      requestBody:
        required: true
        description: >-
          Envoyez uniquement les champs que vous souhaitez modifier. Sémantique
          PATCH : les champs manquants sont conservés.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ApplicationUpdateRequest'
            examples:
              RenameCustomerApplication:
                summary: Renommer et déplacer vers un nouveau domaine
                value:
                  name: Acme Production App
                  website_url: https://app.acme.example
              UpdateRedirectUris:
                summary: Ajouter un second URI de redirection
                value:
                  redirect_uris:
                    - https://acme.example/callback
                    - https://staging.acme.example/callback
              UpdatePolicies:
                summary: >-
                  Actualiser les URL des conditions d'utilisation et de
                  confidentialité
                value:
                  terms_url: https://acme.example/v2/terms
                  privacy_url: https://acme.example/v2/privacy
      responses:
        '200':
          description: >-
            Application mise à jour. La réponse est l'enregistrement complet de
            l'application après la modification, y compris `products` ; `uuid`,
            `client_id` et `api_key` sont inchangés.
          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: >-
            Erreur de validation dans le corps de la requête : par exemple une
            URL mal formée, un `data_location` qui n'est pas encore disponible
            ou un `data_location` autre que celui de l'application. Rien n'est
            modifié.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationError'
              examples:
                InvalidUrl:
                  value:
                    website_url:
                      - Enter a valid URL.
                DataLocationFixed:
                  summary: >-
                    Un autre emplacement de données que celui propre à
                    l'application
                  value:
                    data_location:
                      - >-
                        An application's data location can't be changed after it
                        is created.
                DataLocationNotAvailable:
                  summary: Un emplacement de données prochainement disponible
                  value:
                    data_location:
                      - This data location is not available yet.
        '401':
          description: >-
            Token d'accès malformé, invalide ou expiré. Obtenez-en un nouveau
            avec `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: >-
            Vous ne pouvez pas mettre à jour cette application. Un membre de
            l'organisation qui n'est ni propriétaire ni administrateur reçoit
            `Only organization owners and admins can manage applications.` Un
            propriétaire ou un administrateur dont l'accès à l'organisation est
            suspendu reçoit `Your access to this organization is suspended.` Une
            requête sans en-tête `Authorization` reçoit `You do not have
            permission to perform this action.`
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthError'
              examples:
                NotOwnerOrAdmin:
                  summary: Membre qui n'est ni propriétaire ni administrateur
                  value:
                    detail: >-
                      Only organization owners and admins can manage
                      applications.
                Suspended:
                  summary: Adhésion suspendue
                  value:
                    detail: Your access to this organization is suspended.
                MissingToken:
                  summary: Aucun en-tête Authorization
                  value:
                    detail: You do not have permission to perform this action.
        '404':
          description: >-
            L'organisation n'existe pas ou vous n'en êtes pas membre, ou
            l'application n'existe pas dans cette organisation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthError'
              examples:
                OrganizationNotFound:
                  summary: Organisation introuvable, ou vous n'en êtes pas membre
                  value:
                    detail: Organization not found.
                ApplicationNotFound:
                  summary: Aucune application de ce type dans cette organisation
                  value:
                    detail: Application not found.
        '503':
          description: >-
            Uniquement lorsque la mise à jour choisit un autre emplacement de
            données pour l'application de production créée avec votre
            organisation : Didit n'a pas pu confirmer que l'application ne
            possède encore aucune session de vérification, rien n'a donc été
            modifié. Réessayez la requête.
          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: >-
        Corps PATCH pour les métadonnées de l'application. N'envoyez que les
        champs que vous souhaitez modifier ; les champs omis sont conservés.
        `uuid`, `client_id` et `api_key` ne peuvent pas être mis à jour.
        `products` est en lecture seule : une clé `products` dans le corps est
        ignorée. `data_location` ne peut pas être modifié après la création de
        l'application : indiquer l'emplacement qu'elle a déjà est accepté, et
        tout autre emplacement renvoie 400. La seule exception concerne
        l'application de production créée avec votre organisation : la première
        mise à jour qui indique une `data_location` la choisit, une seule fois,
        tant qu'aucune clé API de l'application n'a été utilisée et qu'elle n'a
        aucune session de vérification.
      properties:
        name:
          type: string
          description: Nom d'affichage de l'application.
          example: Acme Production App
        website_url:
          type: string
          description: URL du site web ou de l'application associée à cette application.
          example: https://app.acme.example
        redirect_uris:
          type: array
          items:
            type: string
          description: >-
            URI de redirection autorisées pour les flux de redirection de type
            OAuth et de vérification.
          example:
            - https://acme.example/callback
        terms_url:
          type: string
          description: >-
            URL des conditions d'utilisation affichée dans le flux de
            vérification.
        privacy_url:
          type: string
          description: >-
            URL de la politique de confidentialité affichée dans le flux de
            vérification.
        description:
          type: string
          description: Description interne de l'application.
        data_location:
          $ref: '#/components/schemas/ApplicationDataLocation'
    Application:
      type: object
      description: >-
        Enregistrement complet de l'application. `uuid`, `client_id` et
        `api_key` ne changent jamais après la création. `data_location` non
        plus, sauf une fois sur l'application de production créée avec votre
        organisation, avant sa première utilisation (voir la requête de mise à
        jour).
      properties:
        uuid:
          type: string
          format: uuid
          description: >-
            UUID de l'application. À utiliser comme `{app_id}` dans les appels
            ultérieurs.
          example: b2c3d4e5-6789-01bc-defg-222222222222
        name:
          type: string
          description: Nom d'affichage de l'application affiché dans la console Didit.
          example: Acme Production App
        client_id:
          type: string
          description: >-
            Identifiant client public, pouvant être intégré en toute sécurité
            dans des flux de type OAuth.
          example: S9LIYGSoWNuGMLHsvEt9dQ
        api_key:
          type: string
          description: >-
            Secret à longue durée de vie (également appelé `client_secret`). À
            utiliser comme en-tête `x-api-key` pour chaque appel à
            `https://verification.didit.me/v3/...` (sessions, workflows, AML,
            etc.). Traitez-le comme un identifiant confidentiel ; ne l'exposez
            jamais côté client. Les nouvelles clés commencent par `sk_live_`
            (application de production) ou `sk_test_` (application sandbox),
            suivies de 43 caractères compatibles avec les URL (lettres,
            chiffres, `-` et `_`). Les clés créées avant ce format n'ont aucun
            préfixe et continuent de fonctionner à l'identique. Pendant 72
            heures après la récupération de votre compte, lister, récupérer et
            mettre à jour renvoient une chaîne vide ici à la place de la clé.
          example: sk_live_example_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
        website_url:
          type: string
          nullable: true
          description: URL du site web ou de l'application associée à cette application.
          example: https://acme.example
        redirect_uris:
          type: array
          items:
            type: string
          description: >-
            URI de redirection autorisées pour les flux de redirection de type
            OAuth et de vérification.
          example:
            - https://acme.example/callback
        terms_url:
          type: string
          nullable: true
          description: >-
            URL des conditions d'utilisation affichée dans le flux de
            vérification.
          example: https://acme.example/terms
        privacy_url:
          type: string
          nullable: true
          description: >-
            URL de la politique de confidentialité affichée dans le flux de
            vérification.
          example: https://acme.example/privacy
        description:
          type: string
          nullable: true
          description: >-
            Description interne de l'application (non visible par les
            utilisateurs finaux).
        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: >-
            Les produits de l'application. Toujours les trois, dans cet ordre :
            `identity`, `transactions`, `authentication`. Une nouvelle
            application a `identity` activé avec chaque module activé, et
            `transactions` ainsi que `authentication` désactivés. Lecture seule
            : une clé `products` dans un corps de création ou de mise à jour est
            ignorée.
          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: >-
        Corps de l'erreur de validation. L'enveloppe prévue est une structure
        `{field: ["message", ...]}` pour les erreurs au niveau des champs ou une
        enveloppe à clé unique `{detail: "..."}` pour les erreurs de règles
        métier. Quelques validateurs (robustesse du mot de passe lors de
        l'inscription, validité du code lors de verify-email) répondent
        actuellement avec un simple tableau `["message"]`, une incohérence
        connue côté serveur. Le schéma ci-dessous conserve cette branche avec
        tableau simple afin que le code client généré à partir de cette
        spécification désérialise les réponses actuelles, mais le nouveau code
        client devrait le traiter sous la forme indexée par champ appropriée
        (`{password: [...]}` ou `{code: [...]}`) et le contrat serveur
        convergera vers cette structure.
      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: >-
        Enveloppe d'erreur d'authentification / d'autorisation / d'élément
        introuvable.
      properties:
        detail:
          type: string
          example: Invalid access token
    ServiceUnavailableError:
      type: object
      description: >-
        La requête n'a pas pu être traitée pour le moment et rien n'a été
        modifié. Réessayez dans un instant.
      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: >-
        Emplacement où les données de vérification de l'application sont
        stockées et traitées, choisi lors de la création de l'application. `eu`
        correspond à l'Union européenne (Irlande), la valeur par défaut. `au`
        (Australie, Sydney) et `mx` (Mexique) seront bientôt disponibles : une
        requête les mentionnant renvoie une erreur 400 `This data location is
        not available yet.` L'application Sandbox d'une organisation se trouve
        toujours dans l'Union européenne.
      example: eu
    ApplicationProduct:
      type: object
      description: >-
        Un produit d'une application et son état. En lecture seule : les
        endpoints de l'application le renvoient et l'ignorent dans le corps de
        la requête.
      properties:
        product:
          type: string
          enum:
            - identity
            - transactions
            - authentication
          description: >-
            `identity` (Vérification d'identité), `transactions` (Surveillance
            des transactions) ou `authentication` (Authentification).
          example: identity
        status:
          type: string
          enum:
            - enabled
            - early_access
            - disabled
          description: >-
            Indique si le produit est activé pour cette application.
            `early_access` s'applique uniquement à `authentication`, que Didit
            active pour vous.
          example: enabled
        modules:
          type: object
          additionalProperties:
            type: boolean
          description: >-
            Interrupteurs de modules du produit, chacun valant `true` ou
            `false`. `identity` comporte `user_verification`,
            `business_verification` et `case_management`. `transactions`
            comporte `travel_rule` et `case_management`. `authentication` n'en a
            aucun (`{}`). `case_management` est un paramètre unique affiché à la
            fois sous `identity` et `transactions`, il a donc la même valeur sur
            les deux.
          example:
            user_verification: true
            business_verification: true
            case_management: true
      required:
        - product
        - status
        - modules
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >-
        JWT `access_token` signé en RS256 renvoyé par `POST
        /programmatic/login/` ou `POST /programmatic/verify-email/`. À envoyer
        sous la forme `Authorization: Bearer <access_token>`. La durée de vie
        par défaut est de 86400 secondes (24h). Ce token n'est valable que pour
        les endpoints de gestion de compte sur `apx.didit.me/auth/v2`. L'API de
        vérification (`verification.didit.me/v3`) utilise plutôt la `api_key` de
        longue durée sous forme de `x-api-key`.

````

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