> ## 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 sessão | API de Autenticação Didit

> A Didit verifica com GET /session/ um token de acesso contra a sessão ativa: falha de imediato após revogação, inatividade, bloqueio ou renovação.

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

Esta é a verificação de revogação instantânea. Permite 30 pedidos por minuto e 300 por hora por endereço, por isso valide os tokens offline em cada pedido e chame-a antes de ações sensíveis. Consulte [Verificar a sessão](https://docs.didit.me/pt/authentication/tokens-and-jwks.md#verifique-a-sessão).


## OpenAPI

````yaml pt/openapi-authentication.json GET /session/
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:
  /session/:
    get:
      tags:
        - Sessions
      summary: Obter a sessão
      description: >-
        Verifica o token de acesso contra a sessão ativa e devolve-o. Mais
        rigoroso do que verificar o JWT por si próprio: também falha de imediato
        quando a sessão foi revogada, ficou inativa ou ultrapassou o seu tempo
        de vida, quando a pessoa foi bloqueada ou o respetivo e-mail já não está
        verificado, quando a sessão já não cumpre a sua política de MFA (por
        exemplo, após a pessoa adicionar uma aplicação autenticadora ou
        tornar-se administrador da organização), ou quando o token foi
        substituído por um token de atualização. Utilize-o antes de uma ação
        sensível, por exemplo, um pagamento. Uma verificação bem-sucedida conta
        como atividade, pelo que reinicia o tempo limite de inatividade da
        sessão.
      operationId: authentication_get_session
      responses:
        '200':
          description: A sessão está ativa.
          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/Session'
              examples:
                Session:
                  summary: Uma sessão de palavra-passe
                  value:
                    sub: 1c9d8b88-1bff-43d1-ad7a-88b2bc0024e9
                    sid: c9abf6cc-2d64-4bf2-b31e-a4d09a070ab1
                    application_id: 7b0a6c2e-3f41-4c9a-8d55-1e2f3a4b5c6d
                    vendor_data: user-42
                    amr:
                      - password
                    mfa_verified: false
                    email: person@example.com
                    email_verified: true
                    phone: null
                    verified_identity: null
                    verified: null
                    expires_at: '2026-11-16T10:41:14.347557Z'
                    post_logout_redirect_uri: ''
                    organizations: []
                VerifiedMember:
                  summary: Um membro verificado da organização
                  value:
                    sub: 1c9d8b88-1bff-43d1-ad7a-88b2bc0024e9
                    sid: c9abf6cc-2d64-4bf2-b31e-a4d09a070ab1
                    application_id: 7b0a6c2e-3f41-4c9a-8d55-1e2f3a4b5c6d
                    vendor_data: user-42
                    amr:
                      - passkey
                    mfa_verified: true
                    email: person@example.com
                    email_verified: true
                    phone: '+34600000000'
                    verified_identity: null
                    verified:
                      level: full_id
                      over_18: true
                      given_name: Alex
                      country: ES
                    expires_at: '2026-11-16T10:41:14.347557Z'
                    post_logout_redirect_uri: https://app.example.com/
                    organizations:
                      - organization_id: 3e9a1f0b-5c2d-4e7f-8a6b-9c0d1e2f3a4b
                        organization__name: Northwind
                        role: admin
                        custom_role: null
        '401':
          $ref: '#/components/responses/InvalidToken'
        '403':
          $ref: '#/components/responses/OriginNotAllowed'
        '404':
          $ref: '#/components/responses/ApplicationNotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
        '503':
          $ref: '#/components/responses/TemporarilyUnavailable'
      security:
        - AccessToken: []
components:
  schemas:
    Session:
      type: object
      description: A sessão ativa associada a um token de acesso.
      required:
        - sub
        - sid
        - application_id
        - vendor_data
        - amr
        - mfa_verified
        - email
        - email_verified
        - phone
        - verified_identity
        - verified
        - expires_at
        - post_logout_redirect_uri
        - organizations
      properties:
        sub:
          type: string
          format: uuid
          description: O ID da identidade.
          example: 1c9d8b88-1bff-43d1-ad7a-88b2bc0024e9
        sid:
          type: string
          format: uuid
          description: O ID da sessão.
          example: c9abf6cc-2d64-4bf2-b31e-a4d09a070ab1
        application_id:
          type: string
          format: uuid
          example: 7b0a6c2e-3f41-4c9a-8d55-1e2f3a4b5c6d
        vendor_data:
          type: string
          description: >-
            A referência da pessoa em todos os produtos Didit, tal como nos
            tokens.
          example: user-42
        amr:
          $ref: '#/components/schemas/AuthenticationMethods'
        mfa_verified:
          type: boolean
          description: >-
            Se a sessão passou num segundo fator. Sempre `true` para um início
            de sessão com passkey.
          example: false
        email:
          type: string
          format: email
          nullable: true
          example: person@example.com
        email_verified:
          type: boolean
          example: true
        phone:
          type: string
          nullable: true
          description: Número de telefone E.164, ou `null`.
          example: null
        verified_identity:
          $ref: '#/components/schemas/WalletVerification'
        verified:
          type: object
          nullable: true
          description: >-
            Nível de verificação e alegações selecionadas, o mesmo objeto que os
            tokens transportam como `verified`, ou `null` quando não existir
            nenhum. Leia este campo, e não `email_verified`, para saber se a
            pessoa verificou a sua identidade.
          properties:
            level:
              type: string
              enum:
                - liveness
                - liveness_face_match
                - full_id
              description: >-
                O nível mais elevado aprovado. Do mais fraco para o mais forte:
                `liveness`, `liveness_face_match`, `full_id`.
              example: full_id
            over_18:
              type: boolean
              example: true
            over_21:
              type: boolean
              example: true
            given_name:
              type: string
              example: Alex
            family_name:
              type: string
              example: Doe
            birthdate:
              type: string
              description: Data de nascimento do documento, `YYYY-MM-DD`.
              example: '1990-04-12'
            nationality:
              type: string
              description: Código de país ISO 3166-1 alpha-2.
              example: ES
            country:
              type: string
              description: Código ISO 3166-1 alpha-2 do país do documento.
              example: ES
            document_verified:
              type: boolean
              example: true
            liveness:
              type: boolean
              example: true
        expires_at:
          type: string
          format: date-time
          description: >-
            Quando a sessão terminar, no máximo. O tempo limite por inatividade
            pode terminá-la mais cedo.
          example: '2026-11-16T10:41:14.347557Z'
        post_logout_redirect_uri:
          type: string
          description: >-
            Para onde a sua aplicação envia a pessoa após terminar a sessão.
            String vazia quando não definida.
          example: https://app.example.com/
        organizations:
          type: array
          description: >-
            Todas as organizações de clientes a que a pessoa pertence, quando as
            organizações estiverem ativadas. Vazio caso contrário.
          items:
            $ref: '#/components/schemas/SessionOrganization'
    AuthenticationMethods:
      type: array
      description: >-
        Como foi iniciada a sessão, como um único valor: por exemplo `password`,
        `code` (código por e-mail), `magic` (ligação mágica), `passkey`,
        `phone`, `sso`, `wallet` (Didit ID Wallet) ou o nome de um método de
        início de sessão social. Vazio para um token de agente.
      items:
        type: string
      example:
        - password
    WalletVerification:
      type: object
      description: >-
        O que a Didit ID Wallet partilhou no início de sessão. `null` quando a
        pessoa iniciou sessão de outra forma.
      nullable: true
      required:
        - issuer
        - subject
      properties:
        issuer:
          type: string
          description: O emissor da carteira.
          example: https://apx.didit.me/auth/idv
        subject:
          type: string
          description: O ID da pessoa na carteira.
          example: 8b7f5c1e-2d3a-4b5c-9e8f-7a6b5c4d3e2f
        shared_session:
          type: object
          description: >-
            Uma verificação que a pessoa escolheu partilhar, que resgata com a
            sua própria chave de API.
          properties:
            share_token:
              type: string
            session_id:
              type: string
            from_application_id:
              type: string
        claims:
          type: object
          description: >-
            Os factos verificados que a pessoa aceitou partilhar, limitados ao
            que a sua aplicação solicitou.
          additionalProperties:
            oneOf:
              - type: boolean
              - type: string
          example:
            over_18: true
            given_name: Alex
    SessionOrganization:
      type: object
      required:
        - organization_id
        - organization__name
        - role
        - custom_role
      properties:
        organization_id:
          type: string
          format: uuid
          example: 3e9a1f0b-5c2d-4e7f-8a6b-9c0d1e2f3a4b
        organization__name:
          type: string
          description: O nome da organização.
          example: Northwind
        role:
          type: string
          enum:
            - admin
            - member
            - billing
          example: admin
        custom_role:
          type: object
          nullable: true
          description: A função personalizada atribuída ao membro, ou `null`.
          required:
            - key
            - permissions
          properties:
            key:
              type: string
              example: approver
            permissions:
              type: array
              items:
                type: string
              example:
                - payouts.approve
    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:
    InvalidToken:
      description: >-
        O token de acesso está em falta, malformado, expirado, assinado por
        outro emissor ou chave, é um token de ID, um token de agente, ou foi
        substituído por uma atualização; ou a sua sessão foi revogada, expirou
        por inatividade, ultrapassou a sua duração ou já não cumpre a sua
        política de MFA, ou a pessoa em questão foi bloqueada ou o respetivo
        e-mail já não está verificado. Envie a pessoa novamente pelo fluxo de
        início de sessão.
      headers:
        WWW-Authenticate:
          description: '`Bearer`.'
          schema:
            type: string
            example: Bearer
        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:
            InvalidToken:
              summary: Token de acesso rejeitado
              value:
                detail: invalid_token
    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
  securitySchemes:
    AccessToken:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >-
        O token de acesso da pessoa a partir de `POST /token/`: um JWT ES256 com
        cabeçalho `typ: at+jwt`, válido no máximo por 5 minutos. Não é a sua
        chave de API Didit.

````

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