> ## 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 Criar Aplicação: Aplicações Programáticas

> POST /organizations/me/{org_id}/applications/ cria uma aplicação Didit por cliente, marca, ambiente ou unidade. Devolve client_id e api_key.



Criar prompt de aplicação
        Copiar o prompt para a área de transferência



      
      

\<pre>

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

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

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

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

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

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

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

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

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

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

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

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

\</pre>



      
      

Colar em

Use este endpoint quando precisar de separar o tráfego de verificação, as credenciais, a identidade visual ou os relatórios dentro da mesma organização.Isto é especialmente útil para **revendedores** que criam uma aplicação por cliente. Também funciona bem quando a sua empresa tem vários produtos, marcas, regiões, ambientes de preparação e de produção, ou casos de utilização que não devem partilhar a mesma chave de API nem as mesmas definições ao nível da aplicação.> [!NOTE]
>
> Todos os endpoints da Auth API usam `https://apx.didit.me/auth/v2`. Use o `api_key` devolvido como `x-api-key` ao chamar os endpoints `https://verification.didit.me/v3/...`, como os endpoints de sessões e de fluxos.## Localização dos dadosCada aplicação armazena e processa os seus dados de verificação num único local (a localização dos dados), escolhido ao criar a aplicação com `data_location`.
Atualmente, a única localização disponível é `eu`, a União Europeia (Irlanda), que também é a predefinida se omitir o campo.
A Austrália (Sydney, `au`) e o México (`mx`) estão para breve: um pedido que as indique recebe uma resposta 400 `This data location is not available yet.` e não cria nada.
Cada consulta à aplicação devolve o seu `data_location`, e este não pode ser alterado depois de a aplicação ser criada.
Consulte [Localização dos dados](https://docs.didit.me/pt/console/applications.md#localização-dos-dados).


## OpenAPI

````yaml pt/openapi-auth.json POST /organizations/me/{org_id}/applications/
openapi: 3.0.0
info:
  version: 1.0.0
  title: Didit Auth API
  description: >-
    API de registo e autenticação programática para programadores e agentes de
    IA. Registe-se em 2 chamadas de API -- sem necessidade de navegador. A
    plataforma de verificação de identidade mais adaptada a agentes.


    ## URL base


    Todos os endpoints nesta especificação estão alojados em
    `https://apx.didit.me/auth/v2`. Este é um anfitrião diferente da API de
    verificação (`https://verification.didit.me/v3`). Não os confunda: este
    anfitrião de autenticação emite os seus **tokens de acesso JWT** e permite
    listar e gerir as suas **organizações** e **aplicações**. O anfitrião de
    verificação é onde chama sessões, fluxos, AML, etc., utilizando a
    **`api_key`** devolvida por esta API.


    ## Como funciona o fluxo de autenticação


    1. `POST /programmatic/register/` — envie e-mail + palavra-passe.

    2. Receba um código alfanumérico de 6 carateres por e-mail.

    3. `POST /programmatic/verify-email/` — envie o código. Recebe de volta um
    `access_token` JWT, um `refresh_token`, uma organização e uma aplicação
    predefinida com `client_id` + `api_key`.

    4. Guarde a `api_key`. Utilize-a como `x-api-key` em cada chamada para
    `https://verification.didit.me/v3/...`.

    5. A partir de qualquer máquina futura, `POST /programmatic/login/` troca o
    seu e-mail + palavra-passe por um novo JWT; em seguida, chame `GET
    /organizations/me/` e os endpoints de aplicações para recuperar ou renovar
    credenciais.


    O JWT só é necessário para os endpoints de **Gestão de contas** nesta
    especificação; o tráfego da API de verificação utiliza a `api_key` de longa
    duração, não o JWT.


    ## Convenções


    - Todos os corpos de pedido e resposta são JSON (`Content-Type:
    application/json`).

    - **Utilize um endereço de e-mail real e operacional ao testar `POST
    /programmatic/register/`.** O endpoint envia o código de verificação de
    forma síncrona, pelo que endereços em domínios de teste reservados
    (`@example.com`, `@example.org`, `@*.test`, `@*.example`, `@*.invalid`) são
    recusados pela entrega de correio e o pedido devolve um `500`. Substitua o
    marcador de posição `you@yourdomain.com` nos exemplos por uma caixa de
    entrada que possa realmente consultar.

    - Os erros de validação devolvem HTTP `400` com um de dois formatos:
    `{"field": ["message", ...]}` para problemas a nível de campo, ou
    `{"detail": "message"}` para erros de regras de negócio. Alguns validadores
    (força da palavra-passe no registo, expiração do código na verificação de
    e-mail) respondem atualmente com um array simples `["message"]` em vez do
    formato indexado por campo -- esta é uma inconsistência conhecida do lado do
    servidor, pelo que o código do cliente deve aceitar ambos os formatos.

    - Os erros de autenticação são devolvidos como `{"detail": "..."}` com HTTP
    `401` (token de portador inválido) ou `403` (token de portador em falta /
    permissões insuficientes).

    - As respostas de limite de pedidos incluem um campo `wait` com o tempo de
    espera em segundos.
servers:
  - url: https://apx.didit.me/auth/v2
    description: Servidor de autenticação de produção
security: []
tags:
  - name: Programmatic Auth
    description: >-
      Ciclo de vida de conta com e-mail e palavra-passe: registar, verificar,
      iniciar sessão. Devolve o `access_token` JWT que utiliza nos endpoints de
      Gestão de Contas, além de (na verificação) o `client_id` e a `api_key` da
      sua primeira aplicação.
  - name: Account Management
    description: >-
      Endpoints autenticados (JWT bearer) que listam organizações e criam, obtêm
      ou atualizam aplicações. Utilize-os para recuperar ou rodar a `api_key`
      com a qual autentica as chamadas à API de verificação.
paths:
  /organizations/me/{org_id}/applications/:
    post:
      tags:
        - Account Management
      summary: Criar aplicação
      description: >-
        Crie uma aplicação dentro de uma organização, na localização de dados da
        sua escolha (`data_location`, a União Europeia por predefinição; não
        pode ser alterada posteriormente). A resposta inclui `api_key`; guarde-a
        agora (recuperável via GET). Requer JWT de proprietário/administrador.
      operationId: create_organization_application
      parameters:
        - name: org_id
          in: path
          required: true
          description: UUID da organização. Consulte-o com `GET /organizations/me/`.
          schema:
            type: string
            format: uuid
            example: a1b2c3d4-5678-90ab-cdef-111111111111
      requestBody:
        required: false
        description: >-
          Todos os campos são opcionais. Omitir o corpo cria uma aplicação com o
          nome predefinido `"<organization name> App"` e sem URLs públicos
          configurados.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ApplicationCreateRequest'
            examples:
              ResellerCustomer:
                summary: Revendedor a criar uma aplicação com âmbito de cliente
                value:
                  name: Acme Customer App
                  website_url: https://acme.example
                  redirect_uris:
                    - https://acme.example/callback
                  terms_url: https://acme.example/terms
                  privacy_url: https://acme.example/privacy
                  data_location: eu
              Minimal:
                summary: Criação mínima -- aceitar todas as predefinições
                value:
                  name: Sandbox App
              Empty:
                summary: Nenhum corpo fornecido -- a predefinição é <org name> App
                value: {}
      responses:
        '201':
          description: >-
            Aplicação criada. A resposta inclui a `api_key` de longa duração;
            guarde-a agora e use-a como cabeçalho `x-api-key` em cada chamada a
            `https://verification.didit.me/v3/...`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Application'
              examples:
                Success:
                  value:
                    uuid: b2c3d4e5-6789-01bc-defg-222222222222
                    name: Acme Customer App
                    client_id: S9LIYGSoWNuGMLHsvEt9dQ
                    api_key: sk_live_example_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
                    website_url: https://acme.example
                    redirect_uris:
                      - https://acme.example/callback
                    terms_url: https://acme.example/terms
                    privacy_url: https://acme.example/privacy
                    description: null
                    created_at: '2025-06-01T10:00:00Z'
                    data_location: eu
                    products:
                      - product: identity
                        status: enabled
                        modules:
                          user_verification: true
                          business_verification: true
                          case_management: true
                      - product: transactions
                        status: disabled
                        modules:
                          travel_rule: true
                          case_management: true
                      - product: authentication
                        status: disabled
                        modules: {}
        '400':
          description: >-
            Erro de validação no corpo do pedido: por exemplo, um URI de
            redirecionamento malformado, um `data_location` que ainda não está
            disponível (`au`, `mx`) ou um que não existe. Nada é criado.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationError'
              examples:
                InvalidUrl:
                  value:
                    website_url:
                      - Enter a valid URL.
                DataLocationNotAvailable:
                  summary: Uma localização de dados que estará disponível em breve
                  value:
                    data_location:
                      - This data location is not available yet.
                UnknownDataLocation:
                  summary: Uma localização de dados que não existe
                  value:
                    data_location:
                      - '"us" is not a valid choice.'
        '401':
          description: >-
            Token de acesso mal formatado, inválido ou expirado. Obtenha um novo
            com `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: >-
            Não pode criar aplicações nesta organização. Um membro da
            organização que não seja proprietário ou administrador recebe `Only
            organization owners and admins can manage applications.` Um
            proprietário ou administrador cujo acesso à organização esteja
            suspenso recebe `Your access to this organization is suspended.` Um
            pedido sem o cabeçalho `Authorization` recebe `You do not have
            permission to perform this action.` Durante 72 horas após recuperar
            a sua conta, o pedido é recusado com o `code` `recovery_hold` e
            `until`, a data e hora em que a retenção termina.
          content:
            application/json:
              schema:
                oneOf:
                  - $ref: '#/components/schemas/AuthError'
                  - $ref: '#/components/schemas/RecoveryHoldError'
              examples:
                NotOwnerOrAdmin:
                  summary: Membro que não é proprietário nem administrador
                  value:
                    detail: >-
                      Only organization owners and admins can manage
                      applications.
                Suspended:
                  summary: Estatuto de membro suspenso
                  value:
                    detail: Your access to this organization is suspended.
                MissingToken:
                  summary: Sem cabeçalho Authorization
                  value:
                    detail: You do not have permission to perform this action.
                RecoveryHold:
                  summary: Conta recuperada há menos de 72 horas
                  value:
                    detail: This action is on hold because you recovered your account.
                    code: recovery_hold
                    until: '2026-11-04T10:15:00+00:00'
        '404':
          description: A organização não existe ou você não é membro dela.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthError'
              examples:
                OrganizationNotFound:
                  summary: Organização não encontrada ou o utilizador não é membro
                  value:
                    detail: Organization not found.
      security:
        - BearerAuth: []
      x-codeSamples:
        - lang: curl
          label: cURL
          source: >-
            curl -X POST
            "https://apx.didit.me/auth/v2/organizations/me/$ORG_ID/applications/"
            \
              -H "Authorization: Bearer $ACCESS_TOKEN" \
              -H "Content-Type: application/json" \
              -d '{
                "name": "Acme Customer App",
                "website_url": "https://acme.example",
                "redirect_uris": ["https://acme.example/callback"],
                "data_location": "eu"
              }'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

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

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


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

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


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

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

            import me.didit.Didit;

            import me.didit.types.ApplicationCreateRequest;

            import me.didit.types.ApplicationDataLocation;


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

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


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


            require 'vendor/autoload.php';


            use Didit\DiditClient;


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

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


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

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

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

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

            using System.Text.Json;

            using Didit;


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

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


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

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

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    ApplicationCreateRequest:
      type: object
      description: >-
        Todos os campos são opcionais. Enviar um corpo vazio cria uma aplicação
        com um nome predefinido, na União Europeia.
      properties:
        name:
          type: string
          description: >-
            Nome de apresentação da aplicação. O valor predefinido é
            `"<organization name> App"`.
          example: Acme Customer App
        website_url:
          type: string
          description: URL do website ou da aplicação associada a esta aplicação.
          example: https://acme.example
        redirect_uris:
          type: array
          items:
            type: string
          description: >-
            URIs de redirecionamento permitidos para fluxos de redirecionamento
            de verificação e do tipo OAuth.
          example:
            - https://acme.example/callback
        terms_url:
          type: string
          description: URL dos termos de serviço apresentado no fluxo de verificação.
          example: https://acme.example/terms
        privacy_url:
          type: string
          description: URL da política de privacidade apresentado no fluxo de verificação.
          example: https://acme.example/privacy
        description:
          type: string
          description: >-
            Descrição interna da aplicação (não visível para os utilizadores
            finais).
        data_location:
          $ref: '#/components/schemas/ApplicationDataLocation'
    Application:
      type: object
      description: >-
        Registo completo da aplicação. `uuid`, `client_id` e `api_key` nunca
        mudam após a criação. O `data_location` também não muda, exceto uma
        única vez na aplicação de produção criada com a sua organização, antes
        de ser utilizada (consulte o pedido de atualização).
      properties:
        uuid:
          type: string
          format: uuid
          description: UUID da aplicação. Use como `{app_id}` em chamadas subsequentes.
          example: b2c3d4e5-6789-01bc-defg-222222222222
        name:
          type: string
          description: Nome de apresentação da aplicação exibido na consola Didit.
          example: Acme Production App
        client_id:
          type: string
          description: >-
            Identificador público de cliente, seguro para incorporar em fluxos
            do tipo OAuth.
          example: S9LIYGSoWNuGMLHsvEt9dQ
        api_key:
          type: string
          description: >-
            Segredo de longa duração (também chamado `client_secret`). Utilize
            como cabeçalho `x-api-key` para todas as chamadas a
            `https://verification.didit.me/v3/...` (sessões, fluxos, AML, etc.).
            Trate como uma credencial; nunca exponha no lado do cliente. As
            novas chaves começam com `sk_live_` (aplicação de produção) ou
            `sk_test_` (aplicação sandbox), seguidas de 43 carateres seguros
            para URL (letras, dígitos, `-` e `_`). As chaves criadas antes deste
            formato não têm prefixo e continuam a funcionar sem alterações.
            Durante 72 horas após recuperar a sua conta, listar, obter e
            atualizar devolvem uma string vazia aqui em vez da chave.
          example: sk_live_example_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
        website_url:
          type: string
          nullable: true
          description: URL do website ou da aplicação associada a esta aplicação.
          example: https://acme.example
        redirect_uris:
          type: array
          items:
            type: string
          description: >-
            URIs de redirecionamento permitidos para fluxos de redirecionamento
            de verificação e do tipo OAuth.
          example:
            - https://acme.example/callback
        terms_url:
          type: string
          nullable: true
          description: URL dos termos de serviço apresentado no fluxo de verificação.
          example: https://acme.example/terms
        privacy_url:
          type: string
          nullable: true
          description: URL da política de privacidade apresentado no fluxo de verificação.
          example: https://acme.example/privacy
        description:
          type: string
          nullable: true
          description: >-
            Descrição interna da aplicação (não visível para os utilizadores
            finais).
        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: >-
            Os produtos da aplicação. Sempre todos os três, por esta ordem:
            `identity`, `transactions`, `authentication`. Uma nova aplicação tem
            `identity` ativado com todos os módulos ligados, e `transactions` e
            `authentication` desativados. Só de leitura: uma chave `products` no
            corpo de criação ou atualização é ignorada.
          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 do erro de validação. O envelope pretendido é um mapa `{field:
        ["message", ...]}` para erros ao nível do campo ou um envelope de chave
        única `{detail: "..."}` para erros de regras de negócio. Um pequeno
        número de validadores (força da palavra-passe no registo, validade do
        código no verify-email) responde atualmente com um array simples
        `["message"]` -- inconsistência conhecida do lado do servidor. O esquema
        abaixo mantém essa ramificação de array simples para que o código de
        cliente gerado a partir desta especificação desserialize as respostas
        atuais, mas o novo código de cliente deve tratá-lo sob a forma relevante
        indexada por campo (`{password: [...]}` ou `{code: [...]}`) e o contrato
        do servidor convergirá para essa estrutura.
      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: Envelope de erro de autenticação / autorização / não encontrado.
      properties:
        detail:
          type: string
          example: Invalid access token
    RecoveryHoldError:
      type: object
      description: >-
        Retornado durante 72 horas após a conta ter sido recuperada (os métodos
        de início de sessão perdidos foram repostos). Ações que criam
        organizações, aplicações ou segredos são recusadas até `until`; as
        operações de leitura continuam a funcionar.
      required:
        - detail
        - code
        - until
      properties:
        detail:
          type: string
          example: This action is on hold because you recovered your account.
        code:
          type: string
          enum:
            - recovery_hold
          example: recovery_hold
        until:
          type: string
          format: date-time
          description: >-
            Quando termina o bloqueio (ISO 8601). Tente novamente o pedido após
            este momento.
          example: '2026-11-04T10:15:00+00:00'
    ApplicationDataLocation:
      type: string
      enum:
        - eu
        - au
        - mx
      description: >-
        Onde os dados de verificação da aplicação são armazenados e processados,
        sendo o local selecionado quando a aplicação é criada. `eu` é a União
        Europeia (Irlanda), o padrão. `au` (Austrália, Sydney) e `mx` (México)
        estarão disponíveis em breve: um pedido que os indique responde 400
        `This data location is not available yet.` A aplicação Sandbox de uma
        organização está sempre na União Europeia.
      example: eu
    ApplicationProduct:
      type: object
      description: >-
        Um produto de uma aplicação e o seu estado. Só de leitura: os endpoints
        da aplicação devolvem-no e ignoram-no no corpo do pedido.
      properties:
        product:
          type: string
          enum:
            - identity
            - transactions
            - authentication
          description: >-
            `identity` (Verificação de identidade), `transactions`
            (Monitorização de transações) ou `authentication` (Autenticação).
          example: identity
        status:
          type: string
          enum:
            - enabled
            - early_access
            - disabled
          description: >-
            Se o produto está ativado para esta aplicação. `early_access`
            aplica-se apenas a `authentication`, que a Didit ativa para si.
          example: enabled
        modules:
          type: object
          additionalProperties:
            type: boolean
          description: >-
            Comutadores de módulos do produto, cada um `true` ou `false`.
            `identity` tem `user_verification`, `business_verification` e
            `case_management`. `transactions` tem `travel_rule` e
            `case_management`. `authentication` não tem nenhum (`{}`).
            `case_management` é uma definição única apresentada tanto em
            `identity` como em `transactions`, pelo que tem o mesmo valor em
            ambos.
          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 assinado com RS256 devolvido por `POST
        /programmatic/login/` ou `POST /programmatic/verify-email/`. Envie como
        `Authorization: Bearer <access_token>`. A duração predefinida é de 86400
        segundos (24h). Este token só é válido nos endpoints de Gestão de Contas
        em `apx.didit.me/auth/v2`. A API de verificação
        (`verification.didit.me/v3`) utiliza, em vez disso, a `api_key` de longa
        duração como `x-api-key`.

````

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