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

# Criar token de monitorização | API de Autenticação Didit

> Didit: POST /monitoring-token/ troca um token de acesso por uma credencial de 15 minutos ligada ao vendor_data e à origem do navegador.

> [!WARNING]
>
> A autenticação é nova, e este endpoint permanece desativado até a Didit o ativar: até lá, responde com `503 monitoring_unavailable`.

Os SDKs para navegador e nativos chamam este endpoint a partir do dispositivo da pessoa; o seu servidor não precisa de o fazer. Cada evento enviado com a credencial fica registado em `vendor_data` da pessoa, independentemente do que o dispositivo declare.


## OpenAPI

````yaml pt/openapi-authentication.json POST /monitoring-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:
  /monitoring-token/:
    post:
      tags:
        - Monitoring
      summary: Criar um token de monitorização
      description: >-
        Troca o token de acesso da pessoa por uma credencial de dispositivo de
        curta duração, para que o navegador ou a aplicação da pessoa possa
        enviar eventos de atividade para a monitorização de transações sem o seu
        backend. A credencial está vinculada ao `vendor_data` da pessoa e ao
        `Origin` do pedido.


        Os SDKs Web e nativos chamam este endpoint; os SDKs de servidor não o
        fazem. Encontra-se desativado até que a Didit o ative, respondendo com
        `503 monitoring_unavailable` até lá.
      operationId: authentication_create_monitoring_token
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MonitoringTokenRequest'
            example: {}
      responses:
        '201':
          description: Uma credencial de dispositivo para a pessoa.
          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/MonitoringToken'
              examples:
                MonitoringToken:
                  summary: Uma credencial para o navegador da pessoa
                  value:
                    monitoring_token: mt_2f8c1d9e7b6a5f4e3d2c1b0a
                    expires_at: '2026-10-17T10:56:14Z'
                    allowed_event_categories:
                      - session
                      - gameplay
                      - bonus
                      - affiliate
                      - payment
                      - dispute
                      - responsible_gambling
                      - custom
                    max_uses: 1000
                    bind_to_origin: https://app.example.com
                    vendor_data: user-42
        '400':
          description: O corpo continha um campo. Envie um objeto vazio.
          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/FieldErrors'
              examples:
                UnknownField:
                  summary: Um campo no corpo
                  value:
                    vendor_data: unknown_field
        '401':
          $ref: '#/components/responses/InvalidToken'
        '403':
          $ref: '#/components/responses/OriginNotAllowed'
        '404':
          $ref: '#/components/responses/ApplicationNotFound'
        '409':
          description: >-
            A monitorização de eventos está desativada para a aplicação. Ative a
            ingestão de eventos nas definições de monitorização de transações.
          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:
                MonitoringDisabled:
                  summary: Ingestão de eventos desativada
                  value:
                    error: monitoring_disabled
        '429':
          $ref: '#/components/responses/RateLimited'
        '503':
          description: >-
            Os tokens de monitorização não estão ativados, ou a monitorização
            não conseguiu emitir um (`monitoring_unavailable`), ou um serviço do
            qual o pedido depende está temporariamente indisponível
            (`temporarily_unavailable`). Tente novamente mais tarde.
          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:
                MonitoringUnavailable:
                  summary: Não disponível
                  value:
                    error: monitoring_unavailable
                TemporarilyUnavailable:
                  summary: Tentar novamente mais tarde
                  value:
                    error: temporarily_unavailable
      security:
        - AccessToken: []
components:
  schemas:
    MonitoringTokenRequest:
      type: object
      description: 'Vazio: o token de acesso identifica a pessoa.'
      additionalProperties: false
      properties: {}
    MonitoringToken:
      type: object
      description: >-
        Uma credencial temporária de dispositivo para enviar eventos de
        atividade da pessoa para a monitorização de transações a partir do
        respetivo dispositivo. Não está associada à sessão: permanece utilizável
        até `expires_at`, mesmo após terminar sessão.
      required:
        - monitoring_token
        - expires_at
        - allowed_event_categories
        - max_uses
        - bind_to_origin
        - vendor_data
      properties:
        monitoring_token:
          type: string
          description: A credencial do dispositivo. Trate-a como um segredo.
          example: mt_2f8c1d9e7b6a5f4e3d2c1b0a
        expires_at:
          type: string
          format: date-time
          description: No máximo 15 minutos após ter sido emitido.
          example: '2026-10-17T10:56:14Z'
        allowed_event_categories:
          type: array
          items:
            type: string
          description: >-
            As categorias de eventos que pode enviar. Os eventos de autenticação
            e segurança provêm sempre da Didit, nunca do dispositivo.
          example:
            - session
            - gameplay
            - bonus
            - affiliate
            - payment
            - dispute
            - responsible_gambling
            - custom
        max_uses:
          type: integer
          example: 1000
        bind_to_origin:
          type: string
          nullable: true
          description: >-
            A origem do navegador a partir da qual a credencial funciona: o
            `Origin` do pedido, ou `null` quando não existia nenhum.
          example: https://app.example.com
        vendor_data:
          type: string
          description: >-
            A pessoa para quem cada evento é registado, independentemente do que
            o dispositivo enviar.
          example: user-42
    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
    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
    Detail:
      type: object
      required:
        - detail
      properties:
        detail:
          type: string
          example: invalid_token
  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.
  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.