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

# Obter configuração OpenID | API de Autenticação Didit

> GET /.well-known/openid-configuration devolve o documento OpenID Connect da Didit: emissor, endpoints, concessões, ES256 e claims.

> [!WARNING]
>
> A autenticação é novidade. Estes endpoints são disponibilizados pelo emissor da sua aplicação, como `https://<name>.auth.didit.me`, e nunca aceitam a sua chave de API da Didit.

Obtenha o discovery a partir do emissor que configurou, nunca a partir de um URL que leia num token. A resposta pode ser guardada em cache durante 5 minutos. Consulte [Tokens e JWKS](https://docs.didit.me/pt/authentication/tokens-and-jwks.md#descoberta-e-chaves) para saber o que significa cada campo para a sua integração.


## OpenAPI

````yaml pt/openapi-authentication.json GET /.well-known/openid-configuration
openapi: 3.0.3
info:
  title: Didit Authentication API
  version: 1.0.0
  description: >-
    Os endpoints do lado do servidor do Didit Authentication, o produto de
    início de sessão para os utilizadores finais da sua aplicação. O
    Authentication é **novo** e chega a produção na versão de 2026-11-01.


    ## URL base


    Cada aplicação é o seu próprio emissor OpenID Connect, e cada endpoint
    abaixo é disponibilizado na raiz desse emissor:


    - `https://<name>.auth.didit.me` para uma aplicação de produção, ou
    `https://<name>.sandbox.auth.didit.me` para uma aplicação de sandbox.

    - O seu próprio domínio personalizado, assim que estiver ativo. Este
    substitui o anfitrião predefinido como emissor: os novos tokens indicam-no
    em `iss`, a descoberta aponta para ele e a chave publicável é alterada. Os
    access tokens emitidos sob o anfitrião predefinido falham em `/session/`,
    `/step-up/` e `/monitoring-token/` até serem renovados.


    Produção e sandbox são aplicações separadas, pelo que são emissores
    separados com chaves separadas. A chave publicável é `pk_live_` (produção)
    ou `pk_test_` (sandbox) seguida pela codificação base64url sem preenchimento
    do emissor, sem barra final: descodifique-a para encontrar o emissor.
    Trata-se de um identificador público, não de uma credencial.


    Os mesmos endpoints JSON também são disponibilizados em
    `https://apx.didit.me/auth/v2/authentication/{application_id}/`. Os tokens
    indicam sempre o emissor acima, independentemente do endereço que os emitiu.


    ## Credenciais


    Estes endpoints nunca aceitam a sua chave de API da Didit nem um token da
    consola.


    - A descoberta, o JWKS e o `POST /token/` não requerem credenciais. Os
    clientes são públicos: não existe segredo de cliente, e um código de
    autorização está vinculado ao seu verificador PKCE (`S256`). O `client_id` é
    o ID da sua aplicação.

    - `/session/`, `/step-up/` e `/monitoring-token/` aceitam o access token da
    pessoa: `Authorization: Bearer <access_token>`. Cada chamada bem-sucedida
    conta como atividade na sessão, reiniciando o tempo limite de inatividade da
    sessão.


    ## Corpos dos pedidos


    Todos os endpoints que aceitam um corpo suportam corpos em JSON, codificados
    como formulário e multipart. Este documento lista JSON, além de codificados
    como formulário para `POST /token/` tal como os clientes OAuth os enviam. Um
    campo que o endpoint não aceite recebe `400 {"<field>": "unknown_field"}`.


    ## Tokens


    - **Access token**: um JWT ES256 com o cabeçalho `typ: at+jwt`, válido
    durante no máximo 5 minutos e nunca mais do que a sua sessão. Declarações:
    `AccessTokenClaims`.

    - **ID token**: um JWT ES256 com o cabeçalho `typ: JWT`. Declarações:
    `IDTokenClaims`. Nunca é aceite como um access token.

    - **Refresh token**: uma string aleatória que é substituída a cada
    utilização. O envio de um refresh token já utilizado revoga a sessão.


    Verifique um token com as chaves de `GET /.well-known/jwks.json`: o
    algoritmo deve ser `ES256`, `typ` deve corresponder ao tipo de token, `iss`
    deve ser igual ao emissor que configurou e `aud` ao ID da sua aplicação. A
    verificação offline só deteta uma sessão revogada após a expiração do
    respetivo access token; `GET /session/` é a verificação instantânea.


    ## Erros


    | Corpo | Quando |

    | --- | --- |

    | `{"error": "<code>"}` | Erros de `POST /token/`, todos com o estado `400`,
    no formato do corpo definido na [secção 5.2 do RFC
    6749](https://www.rfc-editor.org/rfc/rfc6749#section-5.2): `invalid_grant`,
    `invalid_client` e `mfa_required` da Didit. Erros de serviço:
    `temporarily_unavailable`, `monitoring_unavailable`, `monitoring_disabled`.
    |

    | `{"<field>": ["<message>"]}` ou `{"<field>": "<code>"}` | A validação de
    um campo do pedido falhou. `non_field_errors` indica uma regra entre campos,
    e `unknown_field` um campo que o endpoint não aceita. |

    | `{"detail": "<message>"}` | `401` (`invalid_token`), `403`
    (`origin_not_allowed`), `404` (aplicação desconhecida ou step-up
    desconhecido) e `429` (limite de pedidos). Também `400` para um corpo que
    não possa ser analisado (`JSON parse error - ...`), `405` para um método que
    o endpoint não disponibiliza e `415` para um `Content-Type` não suportado. |


    Um `401` também inclui `WWW-Authenticate: Bearer`, e um `429` inclui
    `Retry-After` em segundos.


    Duas recusas não estão em JSON. Um endereço que não seja um emissor é
    recusado antes de chegar a estes endpoints, por exemplo com um `404` vazio
    para um nome `*.auth.didit.me` não utilizado. Um `step_up_id` que não seja
    um UUID recebe uma página `404`.


    ## Limites de pedidos


    Um pedido tem de passar por duas camadas.


    **Limites de endpoint**, contabilizados por endereço IP do cliente, por
    aplicação e por endpoint:


    - Descoberta e o JWKS: 1 200 pedidos por minuto e 12 000 por hora.

    - Todos os outros endpoints: 30 pedidos por minuto e 300 por hora. `GET` e
    `DELETE /session/` partilham uma única contagem.


    Ao exceder um limite: `429 {"detail": "Too many requests from this IP
    address. Please wait before trying again. Expected available in 60
    seconds."}`, ou `3600 seconds` para o limite horário.


    **Proteção contra bots**, em cada `POST` e `DELETE`. Os seus contentores são
    partilhados por todos os pedidos `POST` e `DELETE` da aplicação, incluindo
    os passos de início de sessão alojados, e reabastecem continuamente:


    - 60 pedidos por minuto por endereço IP do cliente.

    - 30 pedidos por minuto por dispositivo, para pedidos que identificam o
    respetivo dispositivo, tal como fazem os SDKs nativos e para navegadores.

    - 3 000 pedidos por minuto para toda a aplicação, em todos os endereços IP.
    As renovações de tokens (`POST /token/` com `grant_type=refresh_token`)
    recorrem a um contentor próprio: 6 000 por minuto para toda a aplicação.


    Ao exceder um contentor: `429 {"detail": "rate_limited Expected available in
    N seconds."}`, (`1 second.` quando N é 1). O contentor por IP abrange vários
    endpoints, pelo que um único endereço que misture chamadas de token, step-up
    e encerramento de sessão pode esgotá-lo antes de atingir qualquer limite de
    endpoint. O contentor da aplicação contabiliza todos os clientes da
    aplicação, incluindo navegadores.


    Ambas as camadas respondem antes de o endpoint ser executado, pelo que um
    pedido que tenha recebido `429` não foi executado: tente novamente após o
    tempo indicado em `Retry-After`, incluindo uma renovação.


    ## Pedidos do navegador


    Um pedido que contenha um cabeçalho `Origin` deve provir de uma das origens
    da própria aplicação ou das suas origens permitidas, caso contrário recebe
    `403 origin_not_allowed`. Os pedidos servidor a servidor não enviam
    `Origin`.


    ## Não abrangido aqui


    Estas rotas servem as páginas alojadas, os SDKs nativos e para navegadores,
    e agentes de IA. Não fazem parte do contrato de servidor, e os SDKs de
    servidor não as chamam:


    - Passos de início de sessão: `POST /authorize/`, `POST /password/`,
    `/email/*`, `/phone/*`, `/password-reset/*`, `/passkeys/*`, `/mfa/*`,
    `/social/*` e `/protection/complete/`.

    - Páginas alojadas e retornos de chamada: `/sign-in`, `/magic`, `/invite`,
    `/reset`, `/verify/`, `/sso/*`, `/wallet/callback/`, `/logo/` e os ficheiros
    de associação de aplicações nativas em `/.well-known/`.

    - Acesso de agentes: `/agents/*` e `/grants/`, incluindo `GET
    /agents/session/`, a verificação em tempo real do access token de um agente
    de IA. O acesso de agentes não faz parte desta versão do contrato.

    - A API de gestão da consola para o Authentication, que aceita sessões da
    consola.


    Os eventos de autenticação ainda não são entregues como webhooks, pelo que
    este documento não define nenhum webhook.
servers:
  - url: https://{issuer}
    description: 'O emissor da sua aplicação: a sua origem de início de sessão.'
    variables:
      issuer:
        default: your-app.auth.didit.me
        description: >-
          O host do emissor: `<name>.auth.didit.me` (produção),
          `<name>.sandbox.auth.didit.me` (sandbox) ou o seu domínio
          personalizado ativo.
security: []
tags:
  - name: Issuer
    description: Chaves de descoberta e de assinatura, para verificar tokens.
  - name: Tokens
    description: As concessões de código de autorização e de atualização.
  - name: Sessions
    description: Verificar e terminar a sessão associada a um token de acesso.
  - name: Step-ups
    description: Verificação antes de uma ação sensível.
  - name: Monitoring
    description: Credenciais do dispositivo para eventos de monitorização de transações.
paths:
  /.well-known/openid-configuration:
    get:
      tags:
        - Issuer
      summary: Obter a configuração OpenID
      description: >-
        O documento de descoberta do emissor: os seus endpoints, concessões,
        algoritmo de assinatura e afirmações. Obtenha-o a partir do emissor que
        configurou, nunca a partir de um URL encontrado num token. Guarde-o em
        cache até 5 minutos, tal como indicado por `Cache-Control`.
      operationId: authentication_get_openid_configuration
      responses:
        '200':
          description: O documento de descoberta.
          headers:
            Cache-Control:
              description: >-
                `public, max-age=300`: você e caches partilhadas podem guardar
                uma resposta bem-sucedida durante 5 minutos, o tempo de vida de
                um token de acesso.
              schema:
                type: string
                example: public, max-age=300
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OpenIDConfiguration'
              examples:
                Discovery:
                  summary: Uma aplicação de produção
                  value:
                    issuer: https://your-app.auth.didit.me
                    authorization_endpoint: https://your-app.auth.didit.me/sign-in
                    token_endpoint: https://your-app.auth.didit.me/token/
                    jwks_uri: https://your-app.auth.didit.me/.well-known/jwks.json
                    response_types_supported:
                      - code
                    response_modes_supported:
                      - query
                    grant_types_supported:
                      - authorization_code
                      - refresh_token
                    subject_types_supported:
                      - public
                    id_token_signing_alg_values_supported:
                      - ES256
                    token_endpoint_auth_methods_supported:
                      - none
                    code_challenge_methods_supported:
                      - S256
                    scopes_supported:
                      - openid
                      - email
                      - phone
                      - profile
                      - offline_access
                    claims_supported:
                      - iss
                      - aud
                      - sub
                      - sid
                      - auth_time
                      - nonce
                      - vendor_data
                      - amr
                      - org
                      - verified
                      - act
                      - email
                      - email_verified
                      - name
                      - phone_number
        '403':
          $ref: '#/components/responses/OriginNotAllowed'
        '404':
          $ref: '#/components/responses/ApplicationNotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
        '503':
          $ref: '#/components/responses/TemporarilyUnavailable'
      security:
        - {}
components:
  schemas:
    OpenIDConfiguration:
      type: object
      description: >-
        O documento de descoberta OpenID Connect do emissor. Leia os endpoints a
        partir daqui em vez de os construir manualmente.
      required:
        - issuer
        - authorization_endpoint
        - token_endpoint
        - jwks_uri
        - response_types_supported
        - response_modes_supported
        - grant_types_supported
        - subject_types_supported
        - id_token_signing_alg_values_supported
        - token_endpoint_auth_methods_supported
        - code_challenge_methods_supported
        - scopes_supported
        - claims_supported
      properties:
        issuer:
          type: string
          format: uri
          description: >-
            O emissor: a origem de início de sessão da aplicação, sem barra
            final. O `iss` de cada token é igual a este valor.
          example: https://your-app.auth.didit.me
        authorization_endpoint:
          type: string
          format: uri
          description: A página de início de sessão alojada (`/sign-in`).
          example: https://your-app.auth.didit.me/sign-in
        token_endpoint:
          type: string
          format: uri
          example: https://your-app.auth.didit.me/token/
        jwks_uri:
          type: string
          format: uri
          example: https://your-app.auth.didit.me/.well-known/jwks.json
        response_types_supported:
          type: array
          items:
            type: string
          example:
            - code
        response_modes_supported:
          type: array
          items:
            type: string
          example:
            - query
        grant_types_supported:
          type: array
          items:
            type: string
          example:
            - authorization_code
            - refresh_token
        subject_types_supported:
          type: array
          items:
            type: string
          example:
            - public
        id_token_signing_alg_values_supported:
          type: array
          items:
            type: string
          example:
            - ES256
        token_endpoint_auth_methods_supported:
          type: array
          items:
            type: string
          description: '`none`: os clientes são públicos e não enviam nenhum segredo.'
          example:
            - none
        code_challenge_methods_supported:
          type: array
          items:
            type: string
          example:
            - S256
        scopes_supported:
          type: array
          items:
            type: string
          example:
            - openid
            - email
            - phone
            - profile
            - offline_access
        claims_supported:
          type: array
          items:
            type: string
          example:
            - iss
            - aud
            - sub
            - sid
            - auth_time
            - nonce
            - vendor_data
            - amr
            - org
            - verified
            - act
            - email
            - email_verified
            - name
            - phone_number
    Detail:
      type: object
      required:
        - detail
      properties:
        detail:
          type: string
          example: invalid_token
    OAuthError:
      title: OAuth error
      type: object
      description: Um erro de OAuth (RFC 6749 secção 5.2) ou um erro de serviço.
      required:
        - error
      properties:
        error:
          type: string
          example: invalid_grant
  responses:
    OriginNotAllowed:
      description: >-
        O pedido continha um `Origin` que não é o da própria aplicação nem está
        entre as respetivas origens permitidas. Os pedidos de servidor não
        enviam `Origin`.
      headers:
        Cache-Control:
          description: 'Sempre `no-store`: nunca guarde esta resposta em cache.'
          schema:
            type: string
            example: no-store
        Pragma:
          description: Sempre `no-cache`.
          schema:
            type: string
            example: no-cache
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Detail'
          examples:
            OriginNotAllowed:
              summary: Origem não permitida
              value:
                detail: origin_not_allowed
    ApplicationNotFound:
      description: >-
        O endereço pertence a uma aplicação, mas o Authentication não está ativo
        para ela; no endereço `apx.didit.me`, o ID da aplicação é desconhecido.
        Um endereço que não pertença a nenhuma aplicação é recusado antes de
        atingir o endpoint, e essa resposta não está em JSON.
      headers:
        Cache-Control:
          description: 'Sempre `no-store`: nunca guarde esta resposta em cache.'
          schema:
            type: string
            example: no-store
        Pragma:
          description: Sempre `no-cache`.
          schema:
            type: string
            example: no-cache
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Detail'
          examples:
            ApplicationNotFound:
              summary: Aplicação desconhecida
              value:
                detail: No Configuration matches the given query.
    RateLimited:
      description: >-
        Demasiados pedidos a partir deste endereço IP para este endpoint ou, num
        `POST` ou `DELETE`, um bucket de proteção contra bots está vazio. Nada
        foi executado: aguarde `Retry-After` segundos e, em seguida, tente
        novamente.
      headers:
        Retry-After:
          description: Segundos a aguardar antes de tentar novamente.
          schema:
            type: integer
            example: 60
        Cache-Control:
          description: 'Sempre `no-store`: nunca guarde esta resposta em cache.'
          schema:
            type: string
            example: no-store
        Pragma:
          description: Sempre `no-cache`.
          schema:
            type: string
            example: no-cache
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Detail'
          examples:
            RateLimited:
              summary: Limite de pedidos do endpoint
              value:
                detail: >-
                  Too many requests from this IP address. Please wait before
                  trying again. Expected available in 60 seconds.
            BotProtection:
              summary: Limite de proteção contra bots (POST e DELETE)
              value:
                detail: rate_limited Expected available in 2 seconds.
    TemporarilyUnavailable:
      description: >-
        Um serviço do qual o pedido depende está temporariamente indisponível.
        Tente novamente com recuo progressivo.
      headers:
        Cache-Control:
          description: 'Sempre `no-store`: nunca guarde esta resposta em cache.'
          schema:
            type: string
            example: no-store
        Pragma:
          description: Sempre `no-cache`.
          schema:
            type: string
            example: no-cache
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/OAuthError'
          examples:
            TemporarilyUnavailable:
              summary: Tentar novamente mais tarde
              value:
                error: temporarily_unavailable

````

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