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

# モニタリングトークンの作成 | Didit Authentication API

> DiditのPOST /monitoring-token/は、アクセストークンを15分間有効なデバイス認証情報に交換します。この認証情報は本人のvendor_dataとブラウザのオリジンに紐づきます。

> [!WARNING]
>
> Authenticationは新しい機能で、このエンドポイントはDiditが有効化するまで無効のままです。それまでは`503 monitoring_unavailable`を返します。

ブラウザSDKとネイティブSDKは、本人のデバイスからこのエンドポイントを呼び出します。お客様のサーバーから呼び出す必要はありません。このクレデンシャルとともに送信されたすべてのイベントは、デバイスが何を申告しているかにかかわらず、その人物の`vendor_data`に記録されます。


## OpenAPI

````yaml ja/openapi-authentication.json POST /monitoring-token/
openapi: 3.0.3
info:
  title: Didit Authentication API
  version: 1.0.0
  description: >-
    Didit Authenticationのサーバー向けエンドポイントです。Didit
    Authenticationは、アプリケーションのエンドユーザー向けのサインイン製品です。Authenticationは**新しい**製品で、2026-11-01リリースで本番環境に提供されます。


    ## ベースURL


    各アプリケーションはそれぞれ独自のOpenID
    Connect発行者（issuer）であり、以下のすべてのエンドポイントはその発行者のルートで提供されます。


    -
    本番環境のアプリケーションでは`https://<name>.auth.didit.me`、サンドボックスのアプリケーションでは`https://<name>.sandbox.auth.didit.me`。

    -
    有効化された独自のカスタムドメイン。有効化されると、デフォルトのホストに代わってこのドメインが発行者になります。新しいトークンの`iss`にはこのドメインが記載され、ディスカバリーはこのドメインを指し、公開可能キー（publishable
    key）が変わります。デフォルトのホストで発行されたアクセストークンは、更新されるまで`/session/`、`/step-up/`、`/monitoring-token/`で失敗します。


    本番環境とサンドボックスは別々のアプリケーションであるため、それぞれ別の発行者となり、キーも別です。公開可能キーは、`pk_live_`（本番環境）または`pk_test_`（サンドボックス）の後に、末尾のスラッシュを除いた発行者をパディングなしのbase64urlでエンコードした文字列が続く形式です。デコードすると発行者がわかります。これは公開識別子であり、認証情報ではありません。


    同じJSONエンドポイントは`https://apx.didit.me/auth/v2/authentication/{application_id}/`でも提供されます。どのアドレスから発行されたかにかかわらず、トークンには常に上記の発行者が記載されます。


    ## 認証情報


    これらのエンドポイントは、DiditのAPIキーやコンソールトークンを受け付けることはありません。


    - ディスカバリー、JWKS、`POST
    /token/`には認証情報は不要です。クライアントはパブリッククライアントです。クライアントシークレットはなく、認可コードはそのPKCE検証子（`S256`）に紐付けられます。`client_id`はアプリケーションIDです。

    -
    `/session/`、`/step-up/`、`/monitoring-token/`には本人のアクセストークンを渡します（`Authorization:
    Bearer
    <access_token>`）。呼び出しが成功するたびにセッションのアクティビティとしてカウントされるため、セッションのアイドルタイムアウトがリセットされます。


    ## リクエストボディ


    ボディを受け取るすべてのエンドポイントは、JSON、フォームエンコード、マルチパートのボディを受け付けます。このドキュメントではJSONを記載し、`POST
    /token/`についてはOAuthクライアントが送信する形式であるフォームエンコードも記載します。エンドポイントが受け付けないフィールドには`400
    {"<field>": "unknown_field"}`が返されます。


    ## トークン


    - **アクセストークン**：ヘッダーが`typ: at+jwt`のES256
    JWTで、有効期間は最大5分であり、セッションの有効期間を超えることはありません。クレーム：`AccessTokenClaims`。

    - **IDトークン**：ヘッダーが`typ: JWT`のES256
    JWTです。クレーム：`IDTokenClaims`。アクセストークンとして受け付けられることはありません。

    -
    **リフレッシュトークン**：使用するたびにローテーションされるランダムな文字列です。使用済みのリフレッシュトークンを再度送信すると、セッションが取り消されます。


    トークンは`GET
    /.well-known/jwks.json`のキーで検証してください。アルゴリズムは`ES256`でなければならず、`typ`はトークンの種類と、`iss`は設定した発行者と、`aud`はアプリケーションIDと一致しなければなりません。オフライン検証では、取り消されたセッションはそのアクセストークンの有効期限が切れた時点で初めて検出されます。即時に確認するには`GET
    /session/`を使用します。


    ## エラー


    | ボディ | 発生条件 |

    | --- | --- |

    | `{"error": "<code>"}` | `POST /token/`のエラーで、すべてステータス`400`、[RFC 6749
    第5.2節](https://www.rfc-editor.org/rfc/rfc6749#section-5.2)のボディ形式です：`invalid_grant`、`invalid_client`、Didit独自の`mfa_required`。サービスエラー：`temporarily_unavailable`、`monitoring_unavailable`、`monitoring_disabled`。
    |

    | `{"<field>": ["<message>"]}`または`{"<field>": "<code>"}` |
    リクエストフィールドの検証に失敗しました。`non_field_errors`は複数のフィールドにまたがるルールを、`unknown_field`はエンドポイントが受け付けないフィールドを示します。
    |

    | `{"detail": "<message>"}` |
    `401`（`invalid_token`）、`403`（`origin_not_allowed`）、`404`（不明なアプリケーションまたはステップアップ）、`429`（レート制限）。また、解析できないボディには`400`（`JSON
    parse error -
    ...`）、エンドポイントが提供していないメソッドには`405`、サポートされていない`Content-Type`には`415`が返されます。 |


    `401`には`WWW-Authenticate: Bearer`も含まれ、`429`には秒単位の`Retry-After`が含まれます。


    JSON以外で返される拒否が2つあります。発行者ではないアドレスは、これらのエンドポイントに到達する前に拒否されます。たとえば、使用されていない`*.auth.didit.me`の名前には空の`404`が返されます。UUIDではない`step_up_id`には`404`ページが返されます。


    ## レート制限


    リクエストは2つのレイヤーを通過する必要があります。


    **エンドポイントの制限**：クライアントのIPアドレスごと、アプリケーションごと、エンドポイントごとにカウントされます。


    - ディスカバリーとJWKS：1分あたり1,200リクエスト、1時間あたり12,000リクエスト。

    - その他すべてのエンドポイント：1分あたり30リクエスト、1時間あたり300リクエスト。`GET`と`DELETE
    /session/`は1つのカウントを共有します。


    制限を超えた場合：`429 {"detail": "Too many requests from this IP address. Please
    wait before trying again. Expected available in 60
    seconds."}`が返されます。1時間あたりの制限では`3600 seconds`になります。


    **ボット対策**：すべての`POST`と`DELETE`に適用されます。そのバケットは、ホスト型のサインインステップを含むアプリケーションのすべての`POST`および`DELETE`リクエストで共有され、継続的に補充されます。


    - クライアントのIPアドレスごとに1分あたり60リクエスト。

    - デバイスを識別するリクエスト（ブラウザSDKやネイティブSDKが送信するもの）について、デバイスごとに1分あたり30リクエスト。

    - アプリケーション全体で、すべてのIPアドレスを合わせて1分あたり1,000リクエスト。


    バケットを超えた場合：`429 {"detail": "rate_limited Expected available in N
    seconds."}`が返されます（Nが1の場合は`1
    second.`）。IPごとのバケットはエンドポイントをまたいで適用されるため、トークン、ステップアップ、サインアウトの呼び出しを混在させる1つのアドレスは、いずれかのエンドポイントの制限に達する前にバケットを使い切る可能性があります。アプリケーションのバケットは、ブラウザを含むアプリケーションのすべてのクライアントをカウントします。


    どちらのレイヤーもエンドポイントが実行される前に応答するため、`429`を受け取ったリクエストは実行されていません。`Retry-After`の経過後に再試行してください。リフレッシュも同様です。


    ## ブラウザからのリクエスト


    `Origin`ヘッダーを含むリクエストは、アプリケーション自身のオリジンまたは許可されたオリジンのいずれかから送信されたものでなければならず、そうでない場合は`403
    origin_not_allowed`が返されます。サーバー間のリクエストは`Origin`を送信しません。


    ## このドキュメントの対象外


    これらのルートは、ホスト型ページ、ブラウザSDKとネイティブSDK、AIエージェントのためのものです。サーバー向けの仕様には含まれず、サーバーSDKはこれらを呼び出しません。


    - サインインステップ：`POST /authorize/`、`POST
    /password/`、`/email/*`、`/phone/*`、`/password-reset/*`、`/passkeys/*`、`/mfa/*`、`/social/*`、`/protection/complete/`。

    -
    ホスト型ページとコールバック：`/sign-in`、`/magic`、`/invite`、`/reset`、`/verify/`、`/sso/*`、`/wallet/callback/`、`/logo/`、および`/.well-known/`配下のネイティブアプリ関連付けファイル。

    - エージェントアクセス：`/agents/*`と`/grants/`。AIエージェントのアクセストークンをリアルタイムで確認する`GET
    /agents/session/`も含みます。エージェントアクセスは、このバージョンの仕様には含まれません。

    - Authenticationのコンソール管理API。コンソールセッションを使用します。


    AuthenticationのイベントはまだWebhookとして配信されないため、このドキュメントではWebhookを定義していません。
servers:
  - url: https://{issuer}
    description: お客様のアプリケーションの発行者で、そのサインインオリジンです。
    variables:
      issuer:
        default: your-app.auth.didit.me
        description: >-
          発行者のホストです。`<name>.auth.didit.me`(本番環境)、`<name>.sandbox.auth.didit.me`(サンドボックス)、または有効なカスタムドメインです。
security: []
tags:
  - name: Issuer
    description: トークンを検証するためのディスカバリー情報と署名鍵です。
  - name: Tokens
    description: 認可コードグラントとリフレッシュグラント。
  - name: Sessions
    description: アクセストークンに紐づくセッションを確認して終了します。
  - name: Step-ups
    description: 機密性の高いアクションの前に行う認証。
  - name: Monitoring
    description: トランザクションモニタリングイベント用のデバイス認証情報です。
paths:
  /monitoring-token/:
    post:
      tags:
        - Monitoring
      summary: モニタリングトークンを作成
      description: >-
        ユーザーのアクセストークンを有効期間の短いデバイス認証情報と交換し、ユーザーのブラウザまたはアプリがバックエンドを介さずにトランザクションモニタリングへアクティビティイベントを送信できるようにします。この認証情報は、ユーザーの`vendor_data`とリクエストの`Origin`に紐付けられます。


        このエンドポイントはブラウザSDKとネイティブSDKが呼び出します。サーバーSDKは呼び出しません。Diditが有効にするまでは無効で、それまでは`503
        monitoring_unavailable`を返します。
      operationId: authentication_create_monitoring_token
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MonitoringTokenRequest'
            example: {}
      responses:
        '201':
          description: 本人用のデバイス認証情報。
          headers:
            Cache-Control:
              description: 常に`no-store`です。このレスポンスは決してキャッシュしないでください。
              schema:
                type: string
                example: no-store
            Pragma:
              description: 常に`no-cache`です。
              schema:
                type: string
                example: no-cache
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MonitoringToken'
              examples:
                MonitoringToken:
                  summary: 本人のブラウザ用の認証情報
                  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: ボディにフィールドが含まれていました。空のオブジェクトを送信してください。
          headers:
            Cache-Control:
              description: 常に`no-store`です。このレスポンスは決してキャッシュしないでください。
              schema:
                type: string
                example: no-store
            Pragma:
              description: 常に`no-cache`です。
              schema:
                type: string
                example: no-cache
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FieldErrors'
              examples:
                UnknownField:
                  summary: 本文内のフィールド
                  value:
                    vendor_data: unknown_field
        '401':
          $ref: '#/components/responses/InvalidToken'
        '403':
          $ref: '#/components/responses/OriginNotAllowed'
        '404':
          $ref: '#/components/responses/ApplicationNotFound'
        '409':
          description: >-
            このアプリケーションではイベントモニタリングが無効になっています。トランザクションモニタリングの設定でイベント取り込みを有効にしてください。
          headers:
            Cache-Control:
              description: 常に`no-store`です。このレスポンスは決してキャッシュしないでください。
              schema:
                type: string
                example: no-store
            Pragma:
              description: 常に`no-cache`です。
              schema:
                type: string
                example: no-cache
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OAuthError'
              examples:
                MonitoringDisabled:
                  summary: イベント取り込みが無効
                  value:
                    error: monitoring_disabled
        '429':
          $ref: '#/components/responses/RateLimited'
        '503':
          description: >-
            モニタリングトークンが有効になっていない、モニタリングがトークンを発行できなかった（`monitoring_unavailable`）、またはリクエストが依存するサービスが一時的に利用できません（`temporarily_unavailable`）。しばらくしてから再試行してください。
          headers:
            Cache-Control:
              description: 常に`no-store`です。このレスポンスは決してキャッシュしないでください。
              schema:
                type: string
                example: no-store
            Pragma:
              description: 常に`no-cache`です。
              schema:
                type: string
                example: no-cache
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OAuthError'
              examples:
                MonitoringUnavailable:
                  summary: 利用不可
                  value:
                    error: monitoring_unavailable
                TemporarilyUnavailable:
                  summary: 後で再試行
                  value:
                    error: temporarily_unavailable
      security:
        - AccessToken: []
components:
  schemas:
    MonitoringTokenRequest:
      type: object
      description: '空: アクセストークンで本人が特定されます。'
      additionalProperties: false
      properties: {}
    MonitoringToken:
      type: object
      description: >-
        本人のデバイスから行動イベントをトランザクションモニタリングに送信するための、有効期間の短いデバイス認証情報です。セッションには紐付かないため、サインアウト後も`expires_at`まで使用できます。
      required:
        - monitoring_token
        - expires_at
        - allowed_event_categories
        - max_uses
        - bind_to_origin
        - vendor_data
      properties:
        monitoring_token:
          type: string
          description: デバイスの認証情報です。シークレットとして扱ってください。
          example: mt_2f8c1d9e7b6a5f4e3d2c1b0a
        expires_at:
          type: string
          format: date-time
          description: 発行から最大15分以内。
          example: '2026-10-17T10:56:14Z'
        allowed_event_categories:
          type: array
          items:
            type: string
          description: 送信できるイベントカテゴリです。認証およびセキュリティイベントは常にDiditから送信され、デバイスから送信されることはありません。
          example:
            - session
            - gameplay
            - bonus
            - affiliate
            - payment
            - dispute
            - responsible_gambling
            - custom
        max_uses:
          type: integer
          example: 1000
        bind_to_origin:
          type: string
          nullable: true
          description: 認証情報が機能するブラウザのオリジン。リクエストの`Origin`、またはオリジンがなかった場合は`null`です。
          example: https://app.example.com
        vendor_data:
          type: string
          description: デバイスが何を送信しても、すべてのイベントの記録対象となる人物です。
          example: user-42
    FieldErrors:
      title: Field errors
      type: object
      description: >-
        フィールドごとのバリデーションエラー。値はメッセージのリスト、または単一のコード（`unknown_field`、`invalid_redirect_uri`）です。`non_field_errors`には複数のフィールドにまたがるルールのエラーが入ります。
      additionalProperties:
        oneOf:
          - type: string
          - type: array
            items:
              type: string
    OAuthError:
      title: OAuth error
      type: object
      description: OAuthエラー（RFC 6749セクション5.2）またはサービスエラー。
      required:
        - error
      properties:
        error:
          type: string
          example: invalid_grant
    Detail:
      type: object
      required:
        - detail
      properties:
        detail:
          type: string
          example: invalid_token
  responses:
    InvalidToken:
      description: >-
        アクセストークンがない、形式が不正、期限切れ、別の発行者やキーで署名されている、IDトークンやエージェントトークンである、またはリフレッシュによって置き換えられています。あるいは、そのセッションが失効した、アイドル状態でタイムアウトした、有効期間を過ぎた、MFAポリシーを満たさなくなった、またはその人物がブロックされたかメールアドレスが未認証になっています。もう一度サインインを行ってもらってください。
      headers:
        WWW-Authenticate:
          description: '`Bearer`です。'
          schema:
            type: string
            example: Bearer
        Cache-Control:
          description: 常に`no-store`です。このレスポンスは決してキャッシュしないでください。
          schema:
            type: string
            example: no-store
        Pragma:
          description: 常に`no-cache`です。
          schema:
            type: string
            example: no-cache
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Detail'
          examples:
            InvalidToken:
              summary: 拒否されたアクセストークン
              value:
                detail: invalid_token
    OriginNotAllowed:
      description: >-
        リクエストに、アプリケーション自身のものでも許可されたオリジンに含まれるものでもない`Origin`が含まれていました。サーバーからのリクエストは`Origin`を送信しません。
      headers:
        Cache-Control:
          description: 常に`no-store`です。このレスポンスは決してキャッシュしないでください。
          schema:
            type: string
            example: no-store
        Pragma:
          description: 常に`no-cache`です。
          schema:
            type: string
            example: no-cache
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Detail'
          examples:
            OriginNotAllowed:
              summary: 許可されていないオリジンです
              value:
                detail: origin_not_allowed
    ApplicationNotFound:
      description: >-
        このアドレスはアプリケーションに属していますが、そのアプリケーションでAuthenticationが有効になっていません。`apx.didit.me`のアドレスでは、アプリケーションIDが不明です。どのアプリケーションにも属さないアドレスはエンドポイントに到達する前に拒否され、そのレスポンスはJSONではありません。
      headers:
        Cache-Control:
          description: 常に`no-store`です。このレスポンスは決してキャッシュしないでください。
          schema:
            type: string
            example: no-store
        Pragma:
          description: 常に`no-cache`です。
          schema:
            type: string
            example: no-cache
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Detail'
          examples:
            ApplicationNotFound:
              summary: 不明なアプリケーション
              value:
                detail: No Configuration matches the given query.
    RateLimited:
      description: >-
        このエンドポイントに対するこのIPアドレスからのリクエストが多すぎるか、`POST`または`DELETE`でボット対策のバケットが空になっています。処理は何も実行されていません。`Retry-After`秒待ってから再試行してください。
      headers:
        Retry-After:
          description: 再試行までに待機する秒数。
          schema:
            type: integer
            example: 60
        Cache-Control:
          description: 常に`no-store`です。このレスポンスは決してキャッシュしないでください。
          schema:
            type: string
            example: no-store
        Pragma:
          description: 常に`no-cache`です。
          schema:
            type: string
            example: no-cache
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Detail'
          examples:
            RateLimited:
              summary: エンドポイントの制限
              value:
                detail: >-
                  Too many requests from this IP address. Please wait before
                  trying again. Expected available in 60 seconds.
            BotProtection:
              summary: ボット対策の制限（POSTおよびDELETE）
              value:
                detail: rate_limited Expected available in 2 seconds.
  securitySchemes:
    AccessToken:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >-
        `POST /token/`から取得したこの人物のアクセストークンです。ヘッダーが`typ: at+jwt`のES256
        JWTで、有効期間は最長5分です。DiditのAPIキーではありません。

````

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