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

# Endpoint de token: troca de código e atualização | Didit

> Na Didit, POST /token/ troca um código de autorização PKCE ou faz a rotação de um refresh token. Reutilizar um refresh token revoga a sessão.

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

Um token de atualização é válido apenas uma vez. Enviar de novo um token de atualização já utilizado revoga a sessão inteira, por isso faça apenas uma atualização de cada vez por sessão e substitua os três tokens em simultâneo. Consulte [Tokens de atualização](https://docs.didit.me/pt/authentication/tokens-and-jwks.md#tokens-de-atualização).


## OpenAPI

````yaml pt/openapi-authentication.json POST /token/
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:
  /token/:
    post:
      tags:
        - Tokens
      summary: Trocar um código ou renovar tokens
      description: >-
        O endpoint de token, para ambas as concessões.


        - `authorization_code` troca o código que o seu `redirect_uri` recebeu
        por um token de acesso, de ID e de atualização. O código funciona uma
        única vez, no prazo de 60 segundos, com o verificador PKCE e o
        `redirect_uri` exato do respetivo início de sessão. Quando a aplicação
        permite uma sessão por pessoa, a troca encerra as outras sessões da
        pessoa.

        - `refresh_token` devolve um novo token de acesso, de ID e de
        atualização, e o token de atualização enviado deixa de funcionar.
        **Enviar novamente um token de atualização já utilizado revoga a
        sessão** e devolve `invalid_grant`, pelo que deve executar uma
        atualização de cada vez por sessão e substituir os três tokens em
        conjunto. Se uma atualização falhar com `400` ou não obtiver resposta,
        inicie sessão novamente em vez de tentar novamente: uma nova tentativa
        após uma atualização bem-sucedida constitui uma reutilização. Uma
        resposta `429` é devolvida antes da execução da atualização, pelo que é
        seguro tentar novamente após o tempo indicado em `Retry-After`. Um
        código `503` significa que a atualização não ocorreu e que o token de
        atualização ainda funciona: tente novamente com backoff.


        O corpo pode ser JSON ou codificado em formulário.
      operationId: authentication_token
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TokenRequest'
            examples:
              AuthorizationCode:
                summary: Trocar o código de autorização
                value:
                  grant_type: authorization_code
                  code: Vb0bVt4CLlr8ZL0kE5mAxv8gS6R0rW3hYqC1pN7dJ2s
                  code_verifier: dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk
                  redirect_uri: https://app.example.com/auth/callback
              RefreshToken:
                summary: Renovar os tokens
                value:
                  grant_type: refresh_token
                  refresh_token: >-
                    N4yZTl6y24YKYq77X_SOrBn1q2Lit81WBQMOay7dq_IVfTnxyY8ZGcJk-6-fcmWW
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/TokenRequest'
      responses:
        '200':
          description: Novos tokens para a sessão.
          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/TokenResponse'
              examples:
                Tokens:
                  summary: Tokens para uma nova sessão
                  value:
                    access_token: >-
                      eyJhbGciOiJFUzI1NiIsImtpZCI6ImtfOHNKMmRRdlgwbkxyNVRmWWIzSGtQdyIsInR5cCI6ImF0K2p3dCJ9.eyJpc3MiOiJodHRwczovL3lvdXItYXBwLmF1dGguZGlkaXQubWUiLCJhdWQiOiI3YjBhNmMyZS0zZjQxLTRjOWEtOGQ1NS0xZTJmM2E0YjVjNmQiLCJzdWIiOiIxYzlkOGI4OC0xYmZmLTQzZDEtYWQ3YS04OGIyYmMwMDI0ZTkiLCJzaWQiOiJjOWFiZjZjYy0yZDY0LTRiZjItYjMxZS1hNGQwOWEwNzBhYjEiLCJqdGkiOiJSZ3F1NzE3OWUtbGhKMGJ2VmVELVlnIiwiaWF0IjoxNzkyMjMzNjc0LCJleHAiOjE3OTIyMzM5NzQsInZlbmRvcl9kYXRhIjoidXNlci00MiIsIm9yZyI6bnVsbCwidmVyaWZpZWQiOnt9LCJhbXIiOlsicGFzc3dvcmQiXSwiYWN0IjpudWxsLCJjbGllbnRfaWQiOiI3YjBhNmMyZS0zZjQxLTRjOWEtOGQ1NS0xZTJmM2E0YjVjNmQifQ.AxrqN8Pm-Op-3OayZk8HcvlFQZhozRiOvQ0SgQsGgrz4UNeJlUEeSlq9B8WcYUuM8naRaY5kQt_TUofnsYcyYQ
                    id_token: >-
                      eyJhbGciOiJFUzI1NiIsImtpZCI6ImtfOHNKMmRRdlgwbkxyNVRmWWIzSGtQdyIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczovL3lvdXItYXBwLmF1dGguZGlkaXQubWUiLCJhdWQiOiI3YjBhNmMyZS0zZjQxLTRjOWEtOGQ1NS0xZTJmM2E0YjVjNmQiLCJzdWIiOiIxYzlkOGI4OC0xYmZmLTQzZDEtYWQ3YS04OGIyYmMwMDI0ZTkiLCJzaWQiOiJjOWFiZjZjYy0yZDY0LTRiZjItYjMxZS1hNGQwOWEwNzBhYjEiLCJqdGkiOiJNTHRPNHM4SHItQnJrcDd2NTlPV0Z3IiwiaWF0IjoxNzkyMjMzNjc0LCJleHAiOjE3OTIyMzM5NzQsInZlbmRvcl9kYXRhIjoidXNlci00MiIsIm9yZyI6bnVsbCwidmVyaWZpZWQiOnt9LCJhbXIiOlsicGFzc3dvcmQiXSwiYWN0IjpudWxsLCJhdXRoX3RpbWUiOjE3OTIyMzM2NzQsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJlbWFpbCI6InBlcnNvbkBleGFtcGxlLmNvbSIsIm5vbmNlIjoibi0wUzZfV3pBMk1qIn0.avhfDFp_aUV5_1ssYzwDcIA7H6Waf19P0bn5GCg25FhLIZBGIlwc8HiUPGj1j26r21OkP4FQnS_jM1Ho3dHtKQ
                    refresh_token: >-
                      N4yZTl6y24YKYq77X_SOrBn1q2Lit81WBQMOay7dq_IVfTnxyY8ZGcJk-6-fcmWW
                    token_type: Bearer
                    expires_in: 299
                    session_id: c9abf6cc-2d64-4bf2-b31e-a4d09a070ab1
        '400':
          description: >-
            A concessão falhou. `invalid_grant`: o código ou o token de
            atualização é desconhecido, já foi utilizado ou expirou; o
            verificador PKCE ou o `redirect_uri` não coincide, ou o
            `redirect_uri` já não está registado; a pessoa foi bloqueada ou o
            seu e-mail já não está verificado; a sessão terminou ou já não
            cumpre a sua política de MFA; ou, no caso de um código, desativou o
            método de início de sessão a partir do qual foi gerado. Desativar um
            método não interrompe a renovação de sessões que este já tenha
            iniciado. `invalid_client`: o `client_id` não é o ID da sua
            aplicação. `mfa_required`: o início de sessão não cumpriu a sua
            política de MFA. Os erros de campo indicam um campo em falta ou
            inválido. Um corpo que não possa ser analisado recebe uma mensagem
            `detail`.
          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:
                anyOf:
                  - $ref: '#/components/schemas/OAuthError'
                  - $ref: '#/components/schemas/FieldErrors'
                  - $ref: '#/components/schemas/Detail'
              examples:
                InvalidGrant:
                  summary: Código ou token de atualização rejeitado
                  value:
                    error: invalid_grant
                InvalidClient:
                  summary: client_id incorreto
                  value:
                    error: invalid_client
                MfaRequired:
                  summary: Política de MFA não cumprida
                  value:
                    error: mfa_required
                MissingFields:
                  summary: Uma concessão sem os seus campos obrigatórios
                  value:
                    non_field_errors:
                      - invalid_request
                UnknownGrant:
                  summary: grant_type não suportado
                  value:
                    grant_type:
                      - '"password" is not a valid choice.'
                UnknownField:
                  summary: Um campo que o endpoint não aceita
                  value:
                    foo: unknown_field
                MalformedBody:
                  summary: Um corpo JSON que não pode ser analisado
                  value:
                    detail: >-
                      JSON parse error - Expecting property name enclosed in
                      double quotes: line 1 column 2 (char 1)
        '403':
          $ref: '#/components/responses/OriginNotAllowed'
        '404':
          $ref: '#/components/responses/ApplicationNotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
        '503':
          $ref: '#/components/responses/TemporarilyUnavailable'
      security:
        - {}
components:
  schemas:
    TokenRequest:
      description: >-
        Uma das duas concessões, escolhida por `grant_type`. O endpoint aceita
        os campos de ambas as concessões e valida todos os campos que recebe,
        pelo que uma atualização que também contenha um `code_verifier`
        malformado recebe um erro de campo. Envie apenas os campos da sua
        concessão; qualquer outro campo recebe `unknown_field`.
      oneOf:
        - $ref: '#/components/schemas/AuthorizationCodeGrantRequest'
        - $ref: '#/components/schemas/RefreshTokenGrantRequest'
      discriminator:
        propertyName: grant_type
        mapping:
          authorization_code: '#/components/schemas/AuthorizationCodeGrantRequest'
          refresh_token: '#/components/schemas/RefreshTokenGrantRequest'
    TokenResponse:
      type: object
      description: >-
        Tokens para uma sessão. Substitua todos os três em conjunto após uma
        atualização.
      required:
        - access_token
        - id_token
        - refresh_token
        - token_type
        - expires_in
        - session_id
      properties:
        access_token:
          type: string
          description: >-
            JWT ES256, cabeçalho `typ: at+jwt`. Envie-o como `Authorization:
            Bearer <access_token>`. Declarações: `AccessTokenClaims`.
          example: >-
            eyJhbGciOiJFUzI1NiIsImtpZCI6ImtfOHNKMmRRdlgwbkxyNVRmWWIzSGtQdyIsInR5cCI6ImF0K2p3dCJ9.eyJpc3MiOiJodHRwczovL3lvdXItYXBwLmF1dGguZGlkaXQubWUiLCJhdWQiOiI3YjBhNmMyZS0zZjQxLTRjOWEtOGQ1NS0xZTJmM2E0YjVjNmQiLCJzdWIiOiIxYzlkOGI4OC0xYmZmLTQzZDEtYWQ3YS04OGIyYmMwMDI0ZTkiLCJzaWQiOiJjOWFiZjZjYy0yZDY0LTRiZjItYjMxZS1hNGQwOWEwNzBhYjEiLCJqdGkiOiJSZ3F1NzE3OWUtbGhKMGJ2VmVELVlnIiwiaWF0IjoxNzkyMjMzNjc0LCJleHAiOjE3OTIyMzM5NzQsInZlbmRvcl9kYXRhIjoidXNlci00MiIsIm9yZyI6bnVsbCwidmVyaWZpZWQiOnt9LCJhbXIiOlsicGFzc3dvcmQiXSwiYWN0IjpudWxsLCJjbGllbnRfaWQiOiI3YjBhNmMyZS0zZjQxLTRjOWEtOGQ1NS0xZTJmM2E0YjVjNmQifQ.AxrqN8Pm-Op-3OayZk8HcvlFQZhozRiOvQ0SgQsGgrz4UNeJlUEeSlq9B8WcYUuM8naRaY5kQt_TUofnsYcyYQ
          x-didit-jwt:
            header: '#/components/schemas/AccessTokenHeader'
            claims: '#/components/schemas/AccessTokenClaims'
        id_token:
          type: string
          description: >-
            JWT ES256, cabeçalho `typ: JWT`, para a sua aplicação ler quem
            iniciou sessão. Nunca o envie como token de acesso. Declarações:
            `IDTokenClaims`.
          example: >-
            eyJhbGciOiJFUzI1NiIsImtpZCI6ImtfOHNKMmRRdlgwbkxyNVRmWWIzSGtQdyIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczovL3lvdXItYXBwLmF1dGguZGlkaXQubWUiLCJhdWQiOiI3YjBhNmMyZS0zZjQxLTRjOWEtOGQ1NS0xZTJmM2E0YjVjNmQiLCJzdWIiOiIxYzlkOGI4OC0xYmZmLTQzZDEtYWQ3YS04OGIyYmMwMDI0ZTkiLCJzaWQiOiJjOWFiZjZjYy0yZDY0LTRiZjItYjMxZS1hNGQwOWEwNzBhYjEiLCJqdGkiOiJNTHRPNHM4SHItQnJrcDd2NTlPV0Z3IiwiaWF0IjoxNzkyMjMzNjc0LCJleHAiOjE3OTIyMzM5NzQsInZlbmRvcl9kYXRhIjoidXNlci00MiIsIm9yZyI6bnVsbCwidmVyaWZpZWQiOnt9LCJhbXIiOlsicGFzc3dvcmQiXSwiYWN0IjpudWxsLCJhdXRoX3RpbWUiOjE3OTIyMzM2NzQsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJlbWFpbCI6InBlcnNvbkBleGFtcGxlLmNvbSIsIm5vbmNlIjoibi0wUzZfV3pBMk1qIn0.avhfDFp_aUV5_1ssYzwDcIA7H6Waf19P0bn5GCg25FhLIZBGIlwc8HiUPGj1j26r21OkP4FQnS_jM1Ho3dHtKQ
          x-didit-jwt:
            header: '#/components/schemas/IDTokenHeader'
            claims: '#/components/schemas/IDTokenClaims'
        refresh_token:
          type: string
          description: >-
            De utilização única. É válido até a sessão terminar, e cada
            renovação devolve um novo.
          example: N4yZTl6y24YKYq77X_SOrBn1q2Lit81WBQMOay7dq_IVfTnxyY8ZGcJk-6-fcmWW
        token_type:
          type: string
          enum:
            - Bearer
        expires_in:
          type: integer
          minimum: 0
          maximum: 300
          description: >-
            Segundos até o token de acesso expirar: no máximo 300, menos se a
            sessão terminar mais cedo.
          example: 299
        session_id:
          type: string
          format: uuid
          description: >-
            A sessão à qual estes tokens pertencem, o mesmo valor que o claim
            `sid`.
          example: c9abf6cc-2d64-4bf2-b31e-a4d09a070ab1
    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
    FieldErrors:
      title: Field errors
      type: object
      description: >-
        Erros de validação por campo. Um valor é uma lista de mensagens ou um
        único código (`unknown_field`, `invalid_redirect_uri`).
        `non_field_errors` contém regras transversais aos campos.
      additionalProperties:
        oneOf:
          - type: string
          - type: array
            items:
              type: string
    Detail:
      type: object
      required:
        - detail
      properties:
        detail:
          type: string
          example: invalid_token
    AuthorizationCodeGrantRequest:
      title: Authorization code grant
      type: object
      description: >-
        Troque o código de autorização do seu redirecionamento por tokens. O
        código funciona uma única vez, durante 60 segundos.
      required:
        - grant_type
        - code
        - code_verifier
        - redirect_uri
      properties:
        grant_type:
          type: string
          enum:
            - authorization_code
        code:
          type: string
          maxLength: 128
          description: >-
            O parâmetro de consulta `code` recebido pelo seu `redirect_uri`.
            Verifique o `state` do callback antes de o trocar.
          example: Vb0bVt4CLlr8ZL0kE5mAxv8gS6R0rW3hYqC1pN7dJ2s
        code_verifier:
          type: string
          minLength: 43
          maxLength: 128
          pattern: ^[A-Za-z0-9._~-]{43,128}$
          description: >-
            O verificador PKCE cujo hash S256 foi o `code_challenge` do início
            de sessão.
          example: dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk
        redirect_uri:
          type: string
          maxLength: 2048
          description: >-
            O `redirect_uri` exato com que o início de sessão foi iniciado. Deve
            ainda ser um dos URIs de redirecionamento da aplicação.
          example: https://app.example.com/auth/callback
        client_id:
          type: string
          maxLength: 64
          description: >-
            Opcional. Quando enviado, deve ser igual ao ID da sua aplicação,
            caso contrário o pedido falha com `invalid_client`.
          example: 7b0a6c2e-3f41-4c9a-8d55-1e2f3a4b5c6d
        scope:
          type: string
          maxLength: 512
          description: >-
            Opcional e aceite a partir de clientes OpenID Connect padrão. Nunca
            amplia o que o início de sessão concedeu.
          example: openid email
    RefreshTokenGrantRequest:
      title: Refresh token grant
      type: object
      description: >-
        Troca um token de atualização por um novo token de acesso, de ID e de
        atualização. O token de atualização funciona uma única vez: enviá-lo
        novamente revoga a sessão, por isso execute uma atualização de cada vez
        por sessão.
      required:
        - grant_type
        - refresh_token
      properties:
        grant_type:
          type: string
          enum:
            - refresh_token
        refresh_token:
          type: string
          maxLength: 128
          description: O `refresh_token` da resposta de token anterior.
          example: N4yZTl6y24YKYq77X_SOrBn1q2Lit81WBQMOay7dq_IVfTnxyY8ZGcJk-6-fcmWW
        client_id:
          type: string
          maxLength: 64
          description: >-
            Opcional. Quando enviado, deve ser igual ao ID da sua aplicação,
            caso contrário o pedido falha com `invalid_client`.
          example: 7b0a6c2e-3f41-4c9a-8d55-1e2f3a4b5c6d
        scope:
          type: string
          maxLength: 512
          description: >-
            Opcional e aceite por clientes OpenID Connect padrão. Uma renovação
            nunca amplia o que a sessão contém.
          example: openid email
  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.