> ## 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 para actualizar aplicaciones de clientes

> Actualiza los metadatos de una aplicación de Didit con PATCH /organizations/me/{org_id}/applications/{app_id}/ para clientes revendedores y marcas.



Prompt para actualizar una aplicación
        Copiar el prompt al portapapeles



      
      

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

What does NOT change:
\- uuid, client_id, api_key — credentials stay the same. Existing integrations keep working; no key rotation happens here.

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



      
      

Pegar en

Usa este endpoint para mantener cada aplicación alineada con el cliente, la marca, el entorno o el caso de uso interno que representa.Si eres revendedor, puedes renombrar o actualizar la aplicación de cada cliente sin compartir credenciales entre clientes. Si eres cliente directo, te ayuda a separar productos, regiones o entornos y a mantenerlo todo dentro de una sola organización.> [!NOTE]
>
> Este endpoint actualiza los metadatos de la aplicación. La `api_key` no cambia, salvo que rotes las credenciales por separado.


## OpenAPI

````yaml es/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 de registro y autenticación programáticos para desarrolladores y agentes
    de IA. Regístrate en 2 llamadas a la API, sin necesidad de navegador. La
    plataforma de verificación de identidad más adaptada a los agentes.


    ## URL base


    Todos los endpoints de esta especificación están alojados en
    `https://apx.didit.me/auth/v2`. Es un host distinto al de la API de
    verificación (`https://verification.didit.me/v3`). No los confundas: este
    host de autenticación emite tus **tokens de acceso JWT** y te permite listar
    y gestionar tus **organizaciones** y **aplicaciones**. El host de
    verificación es donde llamas a sesiones, flujos, AML, etc., autenticándote
    con la **`api_key`** que devuelve esta API.


    ## Cómo funciona el flujo de autenticación


    1. `POST /programmatic/register/`: envía el correo electrónico y la
    contraseña.

    2. Recibe por correo electrónico un código alfanumérico de 6 caracteres.

    3. `POST /programmatic/verify-email/`: envía el código. Recibes un
    `access_token` JWT, un `refresh_token`, una organización y una aplicación
    predeterminada con `client_id` y `api_key`.

    4. Guarda la `api_key`. Úsala como `x-api-key` en cada llamada a
    `https://verification.didit.me/v3/...`.

    5. Desde cualquier equipo en el futuro, `POST /programmatic/login/`
    intercambia tu correo electrónico y contraseña por un JWT nuevo; después
    llama a `GET /organizations/me/` y a los endpoints de aplicaciones para
    recuperar o rotar las credenciales.


    El JWT solo es necesario para los endpoints de **gestión de la cuenta** de
    esta especificación; el tráfico de la API de verificación usa la `api_key`
    de larga duración, no el JWT.


    ## Convenciones


    - Todos los cuerpos de solicitud y respuesta son JSON (`Content-Type:
    application/json`).

    - **Usa una dirección de correo electrónico real y que pueda recibir
    mensajes cuando pruebes `POST /programmatic/register/`.** El endpoint envía
    el código de verificación de forma síncrona, por lo que el servicio de
    entrega de correo rechaza las direcciones de dominios de prueba reservados
    (`@example.com`, `@example.org`, `@*.test`, `@*.example`, `@*.invalid`) y la
    solicitud devuelve un `500`. Sustituye el marcador `you@yourdomain.com` de
    los ejemplos por una bandeja de entrada que puedas leer.

    - Los errores de validación devuelven HTTP `400` con uno de dos formatos:
    `{"field": ["message", ...]}` para problemas a nivel de campo, o `{"detail":
    "message"}` para errores de reglas de negocio. Algunos validadores (la
    robustez de la contraseña en el registro y la caducidad del código en
    verify-email) responden actualmente con un array simple `["message"]` en
    lugar del formato con claves por campo; es una incoherencia conocida del
    servidor, por lo que el código cliente debe aceptar ambos formatos.

    - Los errores de autenticación se devuelven como `{"detail": "..."}` con
    HTTP `401` (token bearer no válido) o `403` (falta el token bearer o los
    privilegios son insuficientes).

    - Las respuestas de límite de solicitudes incluyen un campo `wait` con el
    tiempo de espera en segundos.
servers:
  - url: https://apx.didit.me/auth/v2
    description: Servidor de autenticación de producción
security: []
tags:
  - name: Programmatic Auth
    description: >-
      Ciclo de vida de la cuenta con correo electrónico y contraseña: registro,
      verificación e inicio de sesión. Devuelve el `access_token` JWT que usas
      con los endpoints de gestión de cuentas y, además (al verificar), el
      `client_id` y la `api_key` de tu primera aplicación.
  - name: Account Management
    description: >-
      Endpoints autenticados (JWT bearer) que listan organizaciones y crean,
      obtienen o actualizan aplicaciones. Úsalos para recuperar o rotar la
      `api_key` con la que autenticas las llamadas a la API de verificación.
paths:
  /organizations/me/{org_id}/applications/{app_id}/:
    patch:
      tags:
        - Account Management
      summary: Actualizar aplicación
      description: >-
        Actualiza los metadatos de la aplicación (nombre, URL, URI de
        redirección). `api_key` y `client_id` nunca se rotan. `products` es de
        solo lectura: una clave `products` en el cuerpo se ignora. Requiere un
        JWT de propietario o administrador.
      operationId: update_organization_application
      parameters:
        - name: org_id
          in: path
          required: true
          description: UUID de la organización propietaria de la aplicación.
          schema:
            type: string
            format: uuid
            example: a1b2c3d4-5678-90ab-cdef-111111111111
        - name: app_id
          in: path
          required: true
          description: UUID de la aplicación que se va a actualizar.
          schema:
            type: string
            format: uuid
            example: b2c3d4e5-6789-01bc-defg-222222222222
      requestBody:
        required: true
        description: >-
          Envía solo los campos que quieras cambiar. Semántica PATCH: los campos
          que faltan se conservan.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ApplicationUpdateRequest'
            examples:
              RenameCustomerApplication:
                summary: Cambiar el nombre y mover a un nuevo dominio
                value:
                  name: Acme Production App
                  website_url: https://app.acme.example
              UpdateRedirectUris:
                summary: Añadir una segunda URI de redirección
                value:
                  redirect_uris:
                    - https://acme.example/callback
                    - https://staging.acme.example/callback
              UpdatePolicies:
                summary: >-
                  Actualizar las URL de los términos y de la política de
                  privacidad
                value:
                  terms_url: https://acme.example/v2/terms
                  privacy_url: https://acme.example/v2/privacy
      responses:
        '200':
          description: >-
            Aplicación actualizada. La respuesta es el registro completo de la
            aplicación tras el cambio, incluidos los `products`; `uuid`,
            `client_id` y `api_key` no cambian.
          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'
                    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: Error de validación en el cuerpo de la solicitud.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationError'
              examples:
                InvalidUrl:
                  value:
                    website_url:
                      - Enter a valid URL.
        '401':
          description: >-
            Token de acceso con formato incorrecto, no válido o expirado. Obtén
            uno nuevo 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: >-
            No puedes actualizar esta aplicación. Un miembro de la organización
            que no es propietario ni administrador recibe `Only organization
            owners and admins can manage applications.` Un propietario o
            administrador cuyo acceso a la organización está suspendido recibe
            `Your access to this organization is suspended.` Una solicitud sin
            encabezado `Authorization` recibe `You do not have permission to
            perform this action.`
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthError'
              examples:
                NotOwnerOrAdmin:
                  summary: Miembro que no es propietario ni administrador
                  value:
                    detail: >-
                      Only organization owners and admins can manage
                      applications.
                Suspended:
                  summary: Membresía suspendida
                  value:
                    detail: Your access to this organization is suspended.
                MissingToken:
                  summary: Sin encabezado Authorization
                  value:
                    detail: You do not have permission to perform this action.
        '404':
          description: >-
            La organización no existe o no eres miembro de ella, o la aplicación
            no existe en esa organización.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthError'
              examples:
                OrganizationNotFound:
                  summary: No se encontró la organización o no eres miembro de ella
                  value:
                    detail: Organization not found.
                ApplicationNotFound:
                  summary: No existe esa aplicación en esta organización
                  value:
                    detail: Application not found.
      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: >-
        Cuerpo PATCH para los metadatos de la aplicación. Envía solo los campos
        que quieras cambiar; los campos omitidos se conservan. `uuid`,
        `client_id` y `api_key` no se pueden actualizar. `products` es de solo
        lectura: se ignora cualquier clave `products` en el cuerpo.
      properties:
        name:
          type: string
          description: Nombre visible de la aplicación.
          example: Acme Production App
        website_url:
          type: string
          description: URL del sitio web o de la app asociada a esta aplicación.
          example: https://app.acme.example
        redirect_uris:
          type: array
          items:
            type: string
          description: >-
            URI de redirección permitidas para los flujos de redirección de tipo
            OAuth y de verificación.
          example:
            - https://acme.example/callback
        terms_url:
          type: string
          description: >-
            URL de los términos del servicio que se muestra en el flujo de
            verificación.
        privacy_url:
          type: string
          description: >-
            URL de la política de privacidad que se muestra en el flujo de
            verificación.
        description:
          type: string
          description: Descripción interna de la aplicación.
    Application:
      type: object
      description: >-
        Registro completo de la aplicación. `uuid`, `client_id` y `api_key`
        nunca cambian después de la creación.
      properties:
        uuid:
          type: string
          format: uuid
          description: >-
            UUID de la aplicación. Úsalo como `{app_id}` en las llamadas
            posteriores.
          example: b2c3d4e5-6789-01bc-defg-222222222222
        name:
          type: string
          description: >-
            Nombre visible de la aplicación que se muestra en la consola de
            Didit.
          example: Acme Production App
        client_id:
          type: string
          description: >-
            Identificador público del cliente, seguro para incrustarlo en flujos
            de tipo OAuth.
          example: S9LIYGSoWNuGMLHsvEt9dQ
        api_key:
          type: string
          description: >-
            Secreto de larga duración (también llamado `client_secret`). Úsalo
            como encabezado `x-api-key` en todas las llamadas a
            `https://verification.didit.me/v3/...` (sesiones, flujos, AML,
            etc.). Trátalo como una credencial; nunca lo expongas en el lado del
            cliente. Las claves nuevas empiezan por `sk_live_` (aplicación de
            producción) o `sk_test_` (aplicación de sandbox), seguidas de 43
            caracteres seguros para URL (letras, dígitos, `-` y `_`). Las claves
            creadas antes de este formato no tienen prefijo y siguen funcionando
            sin cambios. Durante las 72 horas posteriores a la recuperación de
            tu cuenta, las operaciones de listar, obtener y actualizar devuelven
            aquí una cadena vacía en lugar de la clave.
          example: sk_live_example_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
        website_url:
          type: string
          nullable: true
          description: URL del sitio web o de la app asociada a esta aplicación.
          example: https://acme.example
        redirect_uris:
          type: array
          items:
            type: string
          description: >-
            URI de redirección permitidas para los flujos de redirección de tipo
            OAuth y de verificación.
          example:
            - https://acme.example/callback
        terms_url:
          type: string
          nullable: true
          description: >-
            URL de los términos del servicio que se muestra en el flujo de
            verificación.
          example: https://acme.example/terms
        privacy_url:
          type: string
          nullable: true
          description: >-
            URL de la política de privacidad que se muestra en el flujo de
            verificación.
          example: https://acme.example/privacy
        description:
          type: string
          nullable: true
          description: >-
            Descripción interna de la aplicación (no se muestra a los usuarios
            finales).
        created_at:
          type: string
          format: date-time
          example: '2025-06-01T10:00:00Z'
        products:
          type: array
          readOnly: true
          description: >-
            Los productos de la aplicación. Siempre los tres, en este orden:
            `identity`, `transactions`, `authentication`. Una aplicación nueva
            tiene `identity` habilitado con todos los módulos activados, y
            `transactions` y `authentication` deshabilitados. Solo lectura: una
            clave `products` en el cuerpo de una creación o actualización se
            ignora.
          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: >-
        Cuerpo del error de validación. El formato previsto es un mapa `{field:
        ["message", ...]}` para los errores a nivel de campo o un formato de una
        sola clave `{detail: "..."}` para los errores de reglas de negocio.
        Algunos validadores (la seguridad de la contraseña en el registro y la
        validez del código en la verificación del correo electrónico) responden
        actualmente con un array simple `["message"]`: es una inconsistencia
        conocida del servidor. El esquema siguiente conserva esa variante de
        array simple para que el código cliente generado a partir de esta
        especificación deserialice las respuestas actuales, pero el código
        cliente nuevo debe tratarla como la forma indexada por el campo
        correspondiente (`{password: [...]}` o `{code: [...]}`), y el contrato
        del servidor convergerá en esa forma.
      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: >-
        Envoltorio de error de autenticación, autorización o recurso no
        encontrado.
      properties:
        detail:
          type: string
          example: Invalid access token
    ApplicationProduct:
      type: object
      description: >-
        Un producto de una aplicación y su estado. Solo lectura: los endpoints
        de aplicaciones lo devuelven y lo ignoran en el cuerpo de una solicitud.
      properties:
        product:
          type: string
          enum:
            - identity
            - transactions
            - authentication
          description: >-
            `identity` (Verificación de identidad), `transactions`
            (Monitorización de transacciones) o `authentication`
            (Autenticación).
          example: identity
        status:
          type: string
          enum:
            - enabled
            - early_access
            - disabled
          description: >-
            Si el producto está activado para esta aplicación. `early_access`
            solo se aplica a `authentication`, que Didit activa por ti.
          example: enabled
        modules:
          type: object
          additionalProperties:
            type: boolean
          description: >-
            Interruptores de los módulos del producto, cada uno `true` o
            `false`. `identity` tiene `user_verification`,
            `business_verification` y `case_management`. `transactions` tiene
            `travel_rule` y `case_management`. `authentication` no tiene ninguno
            (`{}`). `case_management` es un único ajuste que se muestra tanto en
            `identity` como en `transactions`, por lo que tiene el mismo valor
            en ambos.
          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` firmado con RS256 que devuelve `POST
        /programmatic/login/` o `POST /programmatic/verify-email/`. Envíalo como
        `Authorization: Bearer <access_token>`. La vida útil predeterminada es
        de 86400 segundos (24 h). Este token solo es válido para los endpoints
        de gestión de cuentas en `apx.didit.me/auth/v2`. La API de verificación
        (`verification.didit.me/v3`) usa en su lugar la `api_key` de larga
        duración como `x-api-key`.

````

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