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

# 口座確認API：送金先の銀行口座名義を確認

> DiditのAccount Check APIで、送金前に銀行口座が指定した個人または企業の名義かを確認できます。セッションもサインインも不要です。

> [!WARNING]
>
> 銀行口座認証は、本番環境ではまだ有効になっていません。
> 有効になるまでは、このエンドポイントは`404`と`code: bank_verification_not_available`を返し、本番環境のワークフローに銀行口座認証ステップを追加することはできません。
> このページでは、エンドポイントが利用可能になった後の動作を説明します。

バックエンドから名義と口座情報を送信し、結果を受け取ります。銀行口座認証ステップの[口座チェック](https://docs.didit.me/ja/core-technology/bank-verification/account-check.md)を、本人情報なしで実行するものです。

## 口座情報は各国の表記形式で送信する

| 国 | `account` |
| - | - |
| IBAN採用国 | `{"iban": "..."}` |
| イギリス | `{"sort_code": "...", "account_number": "..."}` |
| アメリカ | `{"routing_number": "...", "account_number": "..."}` |
| カナダ | `{"transit_institution": "...", "account_number": "..."}` |
| オーストラリア | `{"bsb": "...", "account_number": "..."}` |
| インド | `{"ifsc": "...", "account_number": "..."}` |
| ナイジェリア | `{"bank_code": "...", "account_number": "..."}` |
| メキシコ | `{"clabe": "..."}` |
| アルゼンチン | `{"cbu_cvu": "..."}` |

一部の国では`bic`も必要で、法人口座の場合はさらに`registration_id`も必要です。スペース、ハイフン、ピリオドは無視されます。その国のチェックに必要なキーが含まれていない場合は、そのキーを示す`400`が返されます。例えば`"field": "account.sort_code", "reason": "required"`のようになります。

個人の口座を確認する場合は`holder.full_name`を、企業の口座を確認する場合は`holder.business_name`を送信します。

## 結果を確認する

| `result` | 意味 | 一般的な次のステップ |
| - | - | - |
| `match` | 送信した名義で、銀行にその口座が登録されています。 | 送金します。 |
| `close_match` | 銀行には類似した名義でその口座が登録されています。銀行がその名義を返した場合、`holder_name`にその名義が入ります。 | `holder_name`を比較するか、本人に確認を依頼します。 |
| `no_match` | 銀行には別の名義で登録されているか、該当する口座が存在しません。 | 送金しないでください。 |
| `cannot_verify` | 銀行は名義を照合せずに応答しました。例えば、凍結された口座や解約済みの口座の場合です。 | 独自のポリシーを適用します。例えば、別の口座を求めます。 |

## 請求と再試行

銀行が応答したチェックは、結果にかかわらず、口座の国の[口座チェック料金](https://docs.didit.me/ja/getting-started/bank-verification-pricing.md)で1回請求されます。エラーで応答したリクエストが請求されることはありません。対象は、拒否されたリクエストボディ（`400`）、クレジット不足（`402`）、まだどのチェックにも対応していない口座（`404`）、銀行が応答できなかった場合（`503`）です。

冪等性キーはなく、チェック結果を後から取得するエンドポイントもありません。再試行したリクエストは新しい`request_id`で新しいチェックとして実行され、再度請求されるため、レスポンスを保存してください。Diditが保存するのは請求情報のみで、リクエストID、国、結果、マスクされた口座番号が含まれます。名義や口座番号全体は一切保存しません。

## サンドボックスでテストする

サンドボックスのAPIキーでは銀行への照会は行われず、料金も一切発生しません。IBANの末尾4文字、IBANがない場合は口座番号の末尾4文字によって応答が決まります。

| 末尾 | 応答 |
| - | - |
| `0001` | `close_match`、`holder_name`あり |
| `0002` | `close_match`、`holder_name: null` |
| `0003`, `0006` | `no_match` |
| `0004` | `cannot_verify` |
| `0005` | `503`、`account_check_unavailable` |
| `0009` | `400`、`reason: rejected` |
| その他 | `match` |

IBAN、CLABE、CBUにはチェックディジットが含まれます。すべての形式チェックに合格する[サンドボックス用の値](https://docs.didit.me/ja/core-technology/bank-verification/account-check.md#サンドボックスでテストする)を使用してください。

## アクセス

アプリケーションの`x-api-key`、またはクライアントクレデンシャルのBearerトークンで認証します。スコープ付きAPIキーには、セッションへの書き込み権限が必要です。このエンドポイントは、APIキーごとに毎分300リクエストの書き込みレート制限を他のエンドポイントと共有します。


## OpenAPI

````yaml ja/openapi-25.json POST /v3/bank/account-check/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: 本人確認API。x-api-keyヘッダーで認証します。
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/bank/account-check/:
    post:
      tags:
        - Standalone APIs
      summary: 銀行口座を確認
      description: >-
        **本番環境ではまだ利用できません。**
        銀行口座検証は本番環境で無効になっているため、有効になるまで、このエンドポイントは`404`と`bank_verification_not_available`を返します。まだこのエンドポイントを前提に構築しないでください。以下の説明は、利用可能になった後のエンドポイントの動作です。


        送金する前に、銀行口座が指定した個人または企業のものであることを確認します。セッションもサインインも不要です。名前と口座を送信し、結果を読み取ります。これは銀行口座検証ステップの[口座チェック](/ja/core-technology/bank-verification/account-check)を、バックエンドから実行するものです。


        **送信する内容。** 口座の`country`（ISO 3166-1
        alpha-3）、その国の表記形式による`account`、および`holder`の名前（個人の場合は`full_name`、企業の場合は`business_name`）です。企業名を指定すると、法人口座をチェックします。


        **返される内容。**
        `result`は`match`、`close_match`、`no_match`、`cannot_verify`のいずれかです。`close_match`の場合、銀行が返したときは、`holder_name`に銀行がその口座を登録している名義が入ります。`account`は末尾4文字以外がマスクされて返されます。


        **請求。**
        銀行が応答したチェックは、結果にかかわらず、口座の国の口座チェック料金で1回請求されます。`no_match`、存在しない口座、`cannot_verify`も請求対象です。エラーで応答したリクエストが請求されることはありません。


        **すべてのリクエストは新しいチェックです。**
        冪等性キーも、チェック結果を再取得するエンドポイントもないため、再試行したリクエストは再度実行され、再度請求されます。レスポンスを保存してください。


        **サンドボックス。**
        銀行口座検証が利用可能な場合、サンドボックスキーはどの銀行も呼び出さず、料金も発生しません。IBANの末尾4文字（IBANがない場合は口座番号の末尾4文字）によって応答が決まります。`0001`は`holder_name`付きの`close_match`、`0002`は名義なしの`close_match`、`0003`と`0006`は`no_match`、`0004`は`cannot_verify`、`0005`は`503`、`0009`は`400`です。それ以外の末尾はすべて`match`になります。


        **APIキー。** スコープ付きAPIキーには、セッションへの書き込み権限が必要です。
      operationId: post_v3_bank_account_check
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BankAccountCheckRequest'
            examples:
              Person, United Kingdom:
                summary: 本人の氏名と照合されるソートコードと口座番号
                value:
                  country: GBR
                  account:
                    sort_code: 20-45-67
                    account_number: '31926819'
                  holder:
                    full_name: Maria Oliveira
                  vendor_data: payout_20481
              Company, IBAN:
                summary: 企業名と照合されるIBAN
                value:
                  country: DEU
                  account:
                    iban: DE89 3704 0044 0532 0130 00
                  holder:
                    business_name: Northwind Trading GmbH
      responses:
        '200':
          description: 銀行が応答しました。結果にかかわらず、チェックは課金されます。
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BankAccountCheckResponse'
              examples:
                Close match:
                  summary: 銀行は類似した名義で口座を保有しています
                  value:
                    request_id: c2f4a9e0-7b1d-4c3a-9e55-1d0a6b8f2a47
                    result: close_match
                    holder_name: MARIA R OLIVEIRA
                    account: '****6819'
                    vendor_data: payout_20481
                    created_at: '2026-10-21T14:32:08Z'
                Match:
                  summary: 銀行は送信された名義で口座を保有しています
                  value:
                    request_id: 5b0e2d7c-41a8-4f6e-9c3b-8e7d1a2f6c90
                    result: match
                    holder_name: null
                    account: '****3000'
                    vendor_data: null
                    created_at: '2026-10-21T14:35:41Z'
        '400':
          description: >-
            送信された内容では受け付けられず、請求も発生しません。`field`は修正が必要なボディのフィールド名を、`reason`はその理由を示します。理由はホスト型アカウントフォームに表示されるものと同じです。報告されるのは最初に拒否されたフィールドのみです。
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BankAccountCheckError'
              examples:
                Missing field:
                  summary: この国のチェックにはソートコードが必要です
                  value:
                    detail: The sort code is not valid (required).
                    code: invalid_account_input
                    field: account.sort_code
                    reason: required
                Invalid IBAN:
                  summary: IBANの長さがその国の形式と一致しません
                  value:
                    detail: The iban is not valid (length).
                    code: invalid_account_input
                    field: account.iban
                    reason: length
                Refused by the bank:
                  summary: 銀行は送信された口座を拒否しました
                  value:
                    detail: The account was refused as typed (rejected).
                    code: invalid_account_input
                    field: account.account_number
                    reason: rejected
                No name:
                  summary: '`holder`に`full_name`も`business_name`もありません'
                  value:
                    detail: >-
                      Send full_name for a person or business_name for a
                      company.
                    code: invalid_account_input
                    field: holder
                    reason: required
        '401':
          description: スコープ付きAPIキーの有効期限が切れています。
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BankAccountCheckError'
              examples:
                Expired key:
                  summary: キーの有効期限が過ぎています
                  value:
                    detail: This API key has expired.
        '402':
          description: チェックの料金を支払えないため、チェックは実行されませんでした。残高をチャージしてから、再度送信してください。
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BankAccountCheckError'
              examples:
                Out of credit:
                  summary: 残高が1回のチェック分に足りません
                  value:
                    detail: >-
                      You don't have enough credits to perform this request.
                      Please top up at https://business.didit.me
                    code: insufficient_credits
                Not in your contract:
                  summary: 契約にAccount check APIの料金が設定されていません
                  value:
                    detail: >-
                      Your contract does not price the Account check API.
                      Contact your account manager.
                    code: contract_rate_missing
        '403':
          description: >-
            `x-api-key`ヘッダーまたはBearerトークンがないか無効です。または、リクエストがキーのIPリスト外のアドレスから送信されたか、スコープ付きキーにセッションへの書き込み権限がありません。
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BankAccountCheckError'
              examples:
                Missing or invalid credentials:
                  summary: 有効なAPIキーまたはトークンがありません
                  value:
                    detail: You do not have permission to perform this action.
                No sessions write:
                  summary: セッションへの書き込み権限を持たないスコープ付きキー
                  value:
                    detail: This API key has no write access to sessions.
        '404':
          description: >-
            この口座に対応する口座チェックがまだないため、チェックも請求も行われていません。`country_not_covered`:その国、またはその国におけるその種類の口座(個人または企業)に対応するものがありません。`bank_not_covered`:その銀行に対応するものがありません。`bank_verification_not_available`:Bank
            Verificationが本番環境でまだ有効になっていません。有効化されるまで、本番環境ではすべてのリクエストに対してこの回答が返されます。
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BankAccountCheckError'
              examples:
                Country not covered:
                  summary: この国に対応する口座チェックがありません
                  value:
                    detail: No account check serves this country yet.
                    code: country_not_covered
                Bank not covered:
                  summary: この口座の銀行に対応する口座チェックがありません
                  value:
                    detail: No account check serves this account's bank yet.
                    code: bank_not_covered
        '429':
          $ref: '#/components/responses/RateLimitedWrite'
        '503':
          description: 銀行が応答できませんでした。チェックも課金も行われていません。後でもう一度チェックを送信してください。
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BankAccountCheckError'
              examples:
                Unavailable:
                  summary: 銀行が応答しませんでした
                  value:
                    detail: >-
                      The account check is temporarily unavailable and this
                      request was not charged. Please try again.
                    code: account_check_unavailable
      security:
        - ApiKeyAuth: []
        - BearerAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: |-
            curl -X POST https://verification.didit.me/v3/bank/account-check/ \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{
                "country": "GBR",
                "account": {"sort_code": "20-45-67", "account_number": "31926819"},
                "holder": {"full_name": "Maria Oliveira"},
                "vendor_data": "payout_20481"
              }'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.bank.account_check(
                country="GBR",
                account={
                    "account_number": "31926819",
                    "sort_code": "20-45-67",
                },
                holder={
                    "full_name": "Maria Oliveira",
                },
                vendor_data="payout_20481",
            )
            print(result)
        - lang: javascript
          label: Node.js
          source: |-
            import Didit from "@didit-protocol/sdk-node";

            // Reads DIDIT_API_KEY.
            const didit = new Didit();

            const result = await didit.bank.accountCheck({
              country: "GBR",
              account: {
                account_number: "31926819",
                sort_code: "20-45-67",
              },
              holder: {
                full_name: "Maria Oliveira",
              },
              vendor_data: "payout_20481",
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Bank.AccountCheck(ctx, didit.BankAccountCheckRequest{\n\tCountry: \"GBR\",\n\tAccount: didit.BankAccountCheckRequestAccount{\n\t\tAccountNumber: didit.String(\"31926819\"),\n\t\tSortCode:      didit.String(\"20-45-67\"),\n\t},\n\tHolder: didit.BankAccountCheckHolder{\n\t\tFullName: didit.String(\"Maria Oliveira\"),\n\t},\n\tVendorData: didit.String(\"payout_20481\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: >-
            import me.didit.Didit;

            import me.didit.types.BankAccountCheckHolder;

            import me.didit.types.BankAccountCheckPersonHolder;

            import me.didit.types.BankAccountCheckRequest;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.bank().accountCheck(BankAccountCheckRequest.builder()
                    .country("GBR")
                    .account(BankAccountCheckRequest.Account.builder()
                            .accountNumber("31926819")
                            .sortCode("20-45-67")
                            .build())
                    .holder(BankAccountCheckHolder.ofBankAccountCheckPersonHolder(BankAccountCheckPersonHolder.builder()
                            .fullName("Maria Oliveira")
                            .build()))
                    .vendorData("payout_20481")
                    .build());
            System.out.println(result);
        - lang: php
          label: PHP
          source: |-
            <?php

            require 'vendor/autoload.php';

            use Didit\DiditClient;

            // Reads DIDIT_API_KEY.
            $didit = new DiditClient();

            $result = $didit->bank->accountCheck([
                'country' => 'GBR',
                'account' => [
                    'account_number' => '31926819',
                    'sort_code' => '20-45-67',
                ],
                'holder' => [
                    'full_name' => 'Maria Oliveira',
                ],
                'vendor_data' => 'payout_20481',
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

            # Reads DIDIT_API_KEY.
            didit = Didit::Client.new

            result = didit.bank.account_check(
              country: "GBR",
              account: {
                account_number: "31926819",
                sort_code: "20-45-67",
              },
              holder: {
                full_name: "Maria Oliveira",
              },
              vendor_data: "payout_20481"
            )
            puts result.to_h
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using System.Text.Json;

            using Didit;


            // Reads DIDIT_API_KEY.

            using var client = new DiditClient();


            var result = await client.Bank.AccountCheckAsync(new
            BankAccountCheckRequest

            {
                Country = "GBR",
                Account = new()
                {
                    AccountNumber = "31926819",
                    SortCode = "20-45-67",
                },
                Holder = new()
                {
                    FullName = "Maria Oliveira",
                },
                VendorData = "payout_20481",
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    BankAccountCheckRequest:
      type: object
      required:
        - country
        - account
        - holder
      properties:
        country:
          type: string
          minLength: 3
          maxLength: 3
          description: '口座の国。ISO 3166-1 alpha-3コードで指定します（例: `GBR`）。小文字も使用できます。'
          example: GBR
        account:
          type: object
          description: >-
            その国の表記方法による口座情報です。`iban`、またはその国が必要とする銀行コードや支店コード（`sort_code`、`routing_number`、`transit_institution`、`bsb`、`ifsc`、`bank_code`または`bic`）を伴う`account_number`を指定します。メキシコは`clabe`、アルゼンチンは`cbu_cvu`を受け付け、これらはすでに銀行を特定しています。法人口座では、国が求める場合に`registration_id`を追加します。スペース、ハイフン、ドットは無視されます。その国のチェックで使用されないキーは無視されます。必要なキーが指定されていない場合は、そのキー名を示す`400`が返されます。
          properties:
            iban:
              type: string
              maxLength: 64
              description: IBANを使用する国の場合のIBAN。`country`に属している必要があります。
            account_number:
              type: string
              maxLength: 64
              description: 口座番号。銀行コードまたは支店コードを口座とは別に記載する国で使用します。
            sort_code:
              type: string
              maxLength: 64
              description: 英国:6桁のソートコード。
            routing_number:
              type: string
              maxLength: 64
              description: 米国:9桁のABAルーティング番号。
            transit_institution:
              type: string
              maxLength: 64
              description: カナダ:8桁のトランジット番号と金融機関番号。
            bsb:
              type: string
              maxLength: 64
              description: オーストラリア：6桁のBSB。
            ifsc:
              type: string
              maxLength: 64
              description: 'インド: 11文字のIFSC。'
            bank_code:
              type: string
              maxLength: 64
              description: 国によって必要な場合の銀行コード（例：ナイジェリア）。
            bic:
              type: string
              maxLength: 64
              description: 国のチェックで必要な場合の、銀行のBIC。
            clabe:
              type: string
              maxLength: 64
              description: メキシコ：18桁のCLABE。CLABEには銀行の情報がすでに含まれています。
            cbu_cvu:
              type: string
              maxLength: 64
              description: 'アルゼンチン: 22桁のCBUまたはCVU。これだけで銀行が特定されます。'
            registration_id:
              type: string
              maxLength: 64
              description: 国が要求する場合の、企業アカウントの登記番号。
          additionalProperties:
            type: string
            maxLength: 64
          example:
            sort_code: 20-45-67
            account_number: '31926819'
        holder:
          $ref: '#/components/schemas/BankAccountCheckHolder'
        vendor_data:
          type: string
          nullable: true
          description: このチェックに対するお客様独自の参照値で、変更されずに返されます。
          example: payout_20481
    BankAccountCheckResponse:
      type: object
      required:
        - request_id
        - result
        - holder_name
        - account
        - vendor_data
        - created_at
      properties:
        request_id:
          type: string
          format: uuid
          description: このチェックのID。
        result:
          type: string
          enum:
            - match
            - close_match
            - no_match
            - cannot_verify
          description: >-
            `match`: 送信した名義で銀行に口座があります。`close_match`: 近い名義で口座があります（例:
            ミドルネームの欠落や誤字）。`no_match`: 別の名義で口座がある、またはその口座が存在しません。`cannot_verify`:
            銀行が名義を照合せずに回答しました（例: 凍結または解約された口座の場合）。
        holder_name:
          type: string
          nullable: true
          description: '`close_match`の場合で、かつ銀行が返した場合のみ: 銀行が保持している口座名義です。それ以外の場合は`null`です。'
        account:
          type: string
          description: 末尾4文字以外をマスクした口座。
        vendor_data:
          type: string
          nullable: true
          description: 送信したとおりのお客様独自の参照値です。
        created_at:
          type: string
          format: date-time
          description: チェックが実行された日時（UTC）。
    BankAccountCheckError:
      type: object
      required:
        - detail
      properties:
        detail:
          type: string
          description: 発生した問題の内容（英語）です。
        code:
          type: string
          description: 分岐に使える安定したコード。`401`と`403`では含まれません。
        field:
          type: string
          description: '`400`の場合のみ：修正すべきボディのフィールドで、ドット区切りのパスで示されます。例：`account.sort_code`。'
        reason:
          type: string
          enum:
            - required
            - length
            - format
            - checksum
            - country_mismatch
            - rejected
          description: >-
            `400`の場合のみ：フィールドが拒否された理由です。`required`、`length`、`format`、`checksum`、`country_mismatch`（別の国のIBAN）はDidit独自のチェックです。`rejected`は、送信されたとおりの口座を銀行が拒否したことを意味します。
    BankAccountCheckHolder:
      description: 口座の照合に使用される名前です。`full_name`と`business_name`のうち、どちらか一方のみを送信してください。
      oneOf:
        - $ref: '#/components/schemas/BankAccountCheckPersonHolder'
        - $ref: '#/components/schemas/BankAccountCheckBusinessHolder'
    BankAccountCheckPersonHolder:
      type: object
      description: アカウントを保有すべき人物です。
      required:
        - full_name
      properties:
        full_name:
          type: string
          maxLength: 255
          description: アカウントを保有する人物の氏名です。
          example: Maria Oliveira
    BankAccountCheckBusinessHolder:
      type: object
      description: 口座を保有しているはずの企業。法人口座を確認します。
      required:
        - business_name
      properties:
        business_name:
          type: string
          maxLength: 255
          description: 口座を保有しているべき企業の名前です。法人口座を確認します。
  responses:
    RateLimitedWrite:
      description: APIキーあたり毎分300リクエストの共有書き込み制限を超えました。再試行する前に`Retry-After`に従ってください。
      content:
        application/json:
          schema:
            type: object
            required:
              - detail
            properties:
              detail:
                type: string
          example:
            detail: >-
              Write request rate limit exceeded. You can make up to 300 requests
              per minute.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        お客様のアプリケーションのAPIキーです。Business ConsoleのDevelopers -> API
        keysで取得できます。プライマリキーはフルアクセス権を持ちます。名前付きキーにはスコープを設定できます。リソースごとのアクセス権（なし、読み取り、書き込み）、一部のワークフローまたは承認済みセッションへの限定、IPアドレスのリストへの限定、有効期限の設定です。401は、キーが誤っている、失効している、または期限切れであることを意味します。403は、キーが送信されていない、キーにこのリソースやアクションへのアクセス権がない、またはIPリスト外のアドレスからリクエストが送信されたことを意味します。セッションのルートでの404は、セッションがキーのワークフローまたはステータスの対象外であることを意味します。メディアへのアクセス権がないキーでは、画像、動画、PDFのURLがnullで返されます。セッションの書き込み権限がないキーでは、セッションのリンクとトークンがnullで返されます。詳細は次を参照してください:
        https://docs.didit.me/console/api-keys
    BearerAuth:
      type: http
      scheme: bearer
      description: アプリケーションのクライアントクレデンシャルのアクセストークン。

````

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