curl -X POST https://verification.didit.me/v3/phone/check/ \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"phone_number": "+14155552671",
"code": "123456",
"voip_number_action": "DECLINE"
}'from didit import Didit
# Reads DIDIT_API_KEY.
client = Didit()
result = client.phone.check_code(
phone_number="+14155552671",
code="123456",
)
print(result)import Didit from "@didit-protocol/sdk-node";
// Reads DIDIT_API_KEY.
const didit = new Didit();
const result = await didit.phone.checkCode({
phone_number: "+14155552671",
code: "123456",
});
console.log(result);ctx := context.Background()
// Reads DIDIT_API_KEY.
client := didit.NewClient()
result, err := client.Phone.CheckCode(ctx, didit.PhoneCheckCodeParams{
PhoneNumber: "+14155552671",
Code: "123456",
})
if err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", result)import me.didit.Didit;
import me.didit.types.PhoneCheckCodeParams;
// Reads DIDIT_API_KEY.
Didit client = new Didit();
var result = client.phone().checkCode(PhoneCheckCodeParams.builder()
.phoneNumber("+14155552671")
.code("123456")
.build());
System.out.println(result);<?php
require 'vendor/autoload.php';
use Didit\DiditClient;
// Reads DIDIT_API_KEY.
$didit = new DiditClient();
$result = $didit->phone->checkCode([
'phone_number' => '+14155552671',
'code' => '123456',
]);
print_r($result->toArray());require "didit"
# Reads DIDIT_API_KEY.
didit = Didit::Client.new
result = didit.phone.check_code(
phone_number: "+14155552671",
code: "123456"
)
puts result.to_husing System;
using System.Text.Json;
using Didit;
// Reads DIDIT_API_KEY.
using var client = new DiditClient();
var result = await client.Phone.CheckCodeAsync(new PhoneCheckCodeParams
{
PhoneNumber = "+14155552671",
Code = "123456",
});
Console.WriteLine(JsonSerializer.Serialize(result));{
"request_id": "e39cb057-92fc-4b59-b84e-02fec29a0f24",
"status": "Approved",
"message": "The verification code is correct.",
"phone": {
"status": "Approved",
"phone_number_prefix": "+1",
"phone_number": "4155552671",
"full_number": "+14155552671",
"country_code": "US",
"country_name": "United States",
"carrier": {
"name": "AT&T",
"type": "mobile"
},
"is_disposable": false,
"is_virtual": false,
"verification_method": "whatsapp",
"verification_attempts": 1,
"verified_at": "2026-06-12T01:24:47.311323Z",
"warnings": [],
"lifecycle": [
{
"type": "PHONE_VERIFICATION_MESSAGE_SENT",
"timestamp": "2026-06-12T01:23:39.580554+00:00",
"details": {
"status": "Success",
"reason": null,
"channel": "whatsapp",
"actual_channel": "whatsapp"
},
"fee": 0.0509
},
{
"type": "PHONE_DELIVERY_DELIVERED",
"timestamp": "2026-06-12T01:23:43.118220+00:00",
"details": {
"channel": "whatsapp",
"status": "delivered"
},
"fee": 0
},
{
"type": "VALID_CODE_ENTERED",
"timestamp": "2026-06-12T01:24:47.311201+00:00",
"details": {
"code_tried": "123456",
"status": "Approved"
},
"fee": 0
},
{
"type": "PHONE_VERIFICATION_APPROVED",
"timestamp": "2026-06-12T01:24:47.384292+00:00",
"details": null,
"fee": 0
}
],
"matches": []
},
"vendor_data": "user-1234",
"metadata": null,
"created_at": "2026-06-12T01:24:47.401719+00:00"
}電話番号OTP確認API:SMSコードを検証
DiditのPOST /v3/phone/check/で電話番号のOTPを検証し、キャリア種別、仮想番号、使い捨て番号を検出します。従量課金制で、月額の最低利用料金はありません。
curl -X POST https://verification.didit.me/v3/phone/check/ \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"phone_number": "+14155552671",
"code": "123456",
"voip_number_action": "DECLINE"
}'from didit import Didit
# Reads DIDIT_API_KEY.
client = Didit()
result = client.phone.check_code(
phone_number="+14155552671",
code="123456",
)
print(result)import Didit from "@didit-protocol/sdk-node";
// Reads DIDIT_API_KEY.
const didit = new Didit();
const result = await didit.phone.checkCode({
phone_number: "+14155552671",
code: "123456",
});
console.log(result);ctx := context.Background()
// Reads DIDIT_API_KEY.
client := didit.NewClient()
result, err := client.Phone.CheckCode(ctx, didit.PhoneCheckCodeParams{
PhoneNumber: "+14155552671",
Code: "123456",
})
if err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", result)import me.didit.Didit;
import me.didit.types.PhoneCheckCodeParams;
// Reads DIDIT_API_KEY.
Didit client = new Didit();
var result = client.phone().checkCode(PhoneCheckCodeParams.builder()
.phoneNumber("+14155552671")
.code("123456")
.build());
System.out.println(result);<?php
require 'vendor/autoload.php';
use Didit\DiditClient;
// Reads DIDIT_API_KEY.
$didit = new DiditClient();
$result = $didit->phone->checkCode([
'phone_number' => '+14155552671',
'code' => '123456',
]);
print_r($result->toArray());require "didit"
# Reads DIDIT_API_KEY.
didit = Didit::Client.new
result = didit.phone.check_code(
phone_number: "+14155552671",
code: "123456"
)
puts result.to_husing System;
using System.Text.Json;
using Didit;
// Reads DIDIT_API_KEY.
using var client = new DiditClient();
var result = await client.Phone.CheckCodeAsync(new PhoneCheckCodeParams
{
PhoneNumber = "+14155552671",
Code = "123456",
});
Console.WriteLine(JsonSerializer.Serialize(result));{
"request_id": "e39cb057-92fc-4b59-b84e-02fec29a0f24",
"status": "Approved",
"message": "The verification code is correct.",
"phone": {
"status": "Approved",
"phone_number_prefix": "+1",
"phone_number": "4155552671",
"full_number": "+14155552671",
"country_code": "US",
"country_name": "United States",
"carrier": {
"name": "AT&T",
"type": "mobile"
},
"is_disposable": false,
"is_virtual": false,
"verification_method": "whatsapp",
"verification_attempts": 1,
"verified_at": "2026-06-12T01:24:47.311323Z",
"warnings": [],
"lifecycle": [
{
"type": "PHONE_VERIFICATION_MESSAGE_SENT",
"timestamp": "2026-06-12T01:23:39.580554+00:00",
"details": {
"status": "Success",
"reason": null,
"channel": "whatsapp",
"actual_channel": "whatsapp"
},
"fee": 0.0509
},
{
"type": "PHONE_DELIVERY_DELIVERED",
"timestamp": "2026-06-12T01:23:43.118220+00:00",
"details": {
"channel": "whatsapp",
"status": "delivered"
},
"fee": 0
},
{
"type": "VALID_CODE_ENTERED",
"timestamp": "2026-06-12T01:24:47.311201+00:00",
"details": {
"code_tried": "123456",
"status": "Approved"
},
"fee": 0
},
{
"type": "PHONE_VERIFICATION_APPROVED",
"timestamp": "2026-06-12T01:24:47.384292+00:00",
"details": null,
"fee": 0
}
],
"matches": []
},
"vendor_data": "user-1234",
"metadata": null,
"created_at": "2026-06-12T01:24:47.401719+00:00"
}プロバイダー障害への対応
電話番号プロバイダーが一時的に利用できない場合、このエンドポイントは安定した機械可読コードとともに502を返します。
{
"detail": "The phone verification provider is temporarily unavailable.",
"code": "phone_provider_unavailable"
}
インテリジェンスアドオン
enable_enrichmentをtrueに設定すると、番号に対して電話番号インテリジェンスも実行されます。リスクスコア、回線種別、番号が最近ポーティングされたかどうか、信頼インデックスが得られます。
このアドオンは、チェックの料金に加えて、定価でリクエスト1件あたり$0.05が請求されます。
残高が不足している場合、リクエストは403を返します。
4つのフィールドで、各シグナルに対する処理を決定します。
各フィールドの値はNO_ACTION(デフォルト)またはDECLINEで、いずれもenable_enrichmentがtrueの場合にのみ有効になります。
| フィールド | 却下される条件 |
|---|---|
phone_intelligence_score_action | リスクスコアがしきい値を上回っている。 |
phone_type_risk_action | 番号が高リスクの回線種別である。 |
recent_port_action | 番号が最近ほかの通信事業者にポーティングされた。 |
low_phone_trust_action | 信頼インデックスがしきい値以下である。 |
NO_ACTIONの場合もシグナルはphone.phone_intelligenceで返されるため、独自のルールを適用できます。承認
お客様のアプリケーションのAPIキーです。Business ConsoleのDevelopers -> API keysで取得できます。プライマリキーはフルアクセス権を持ちます。名前付きキーにはスコープを設定できます。リソースごとのアクセス権(なし、読み取り、書き込み)、一部のワークフローまたは承認済みセッションへの限定、IPアドレスのリストへの限定、有効期限の設定です。401は、キーが誤っている、失効している、または期限切れであることを意味します。403は、キーが送信されていない、キーにこのリソースやアクションへのアクセス権がない、またはIPリスト外のアドレスからリクエストが送信されたことを意味します。セッションのルートでの404は、セッションがキーのワークフローまたはステータスの対象外であることを意味します。メディアへのアクセス権がないキーでは、画像、動画、PDFのURLがnullで返されます。セッションの書き込み権限がないキーでは、セッションのリンクとトークンがnullで返されます。詳細は次を参照してください: https://docs.didit.me/console/api-keys
ボディ
対応するPOST /v3/phone/send/の呼び出しで使用したものと同じ電話番号で、E.164形式です。この値によって、確認と送信が紐付けられます。
20"+14155552671"
エンドユーザーが受け取ったOTP。4〜8桁の数字である必要があります。それ以外の場合は試行回数を消費せずに400を返します。形式は正しいものの誤ったコードの場合は200とstatus: "Failed"を返し、3回の試行のうち1回を消費します。
4 - 8^[0-9]{4,8}$"123456"
同じ電話番号が、アプリケーションの別のユーザー(異なるvendor_data)によってすでに使用されている場合の対応です。DECLINEは最終的なstatusをDeclinedに切り替え、NO_ACTIONはリスクをphone.warningsに記録してphone.matchesを設定します。
NO_ACTION, DECLINE キャリア照会でその番号が一時的な使い捨て回線と判定された場合の処理です(phone.is_disposable)。DECLINEは最終的なstatusをDeclinedに変更し、NO_ACTIONはリスクをphone.warningsに記録します。
NO_ACTION, DECLINE キャリア照会で仮想回線タイプ(voip、isp、vpn)と報告された場合の処理です(phone.is_virtual)。DECLINEは最終的なstatusをDeclinedに変更し、NO_ACTIONはリスクをphone.warningsに記録します。
NO_ACTION, DECLINE trueの場合、その番号に対して電話番号インテリジェンスも実行します(リスクスコア、回線種別、最近番号ポータビリティで移転されたかどうか、信頼指数)。このエンドポイント自体の料金に加えて、リクエストごとにphone_intelligence_api1ユニット(定価で$0.05)として課金されます。残高が不足している場合、リクエストは403を返します。
false
電話番号インテリジェンスのリスクスコアがしきい値を超えた場合のアクション。DECLINEは最終的なstatusをDeclinedに変更し、NO_ACTIONは却下せずにシグナルを記録します。enable_enrichmentがtrueの場合にのみ有効です。
NO_ACTION, DECLINE 番号が高リスクの回線種別である場合のアクション。DECLINEは最終的なstatusをDeclinedに変更し、NO_ACTIONは却下せずにシグナルを記録します。enable_enrichmentがtrueの場合にのみ有効です。
NO_ACTION, DECLINE 番号が最近別の通信事業者にポートアウトされた場合のアクション。DECLINEは最終的なstatusをDeclinedに変更し、NO_ACTIONは却下せずにシグナルを記録します。enable_enrichmentがtrueの場合にのみ有効です。
NO_ACTION, DECLINE 電話番号インテリジェンスの信頼性指数がしきい値以下の場合のアクション。DECLINEは最終的なstatusをDeclinedに変更し、NO_ACTIONは却下せずにシグナルを記録します。enable_enrichmentがtrueの場合にのみ有効です。
NO_ACTION, DECLINE trueの場合、番号のソーシャルフットプリント(その番号が登録されているメッセージング、ソーシャル、EC、ビジネスの各プラットフォーム)も検索します。このエンドポイント自体の料金に加えて、リクエスト1件ごとにphone_social1ユニット分が請求されます。
true
ソーシャルフットプリントチェックで、対象となるいずれのプラットフォームにもこの電話番号が登録されていないと判明した場合のアクション。このエンドポイントで指定できるのはNO_ACTIONとDECLINEのみです。REVIEWは、ワークフロー設定の同名のキーで利用できます。
NO_ACTION, DECLINE レスポンス
チェックが完了しました。誤ったコードや存在しない検証の場合も200が返るため、HTTPコードではなくstatusを確認してください。phoneは確定した結果(Approved/Declined)の場合のみ値が入り、Failedではnull、Expired or Not Foundでは含まれません。
Approved/Declinedの場合は、一致した認証のセッションIDで、POST /v3/phone/send/が返すrequest_idと同一です。FailedおよびExpired or Not Foundの場合は、後から照会できないランダムな一回限りのUUIDです。
Approved:コードが正しく、却下となるリスクもありません。Declined:最終状態です。却下となるリスクに該当したか、試行回数の上限(3回)に達しました。Failed:コードが誤っており、試行回数が残っています。Expired or Not Found:直近5分以内に、この電話番号に対する保留中の認証がありません。
Approved, Declined, Failed, Expired or Not Found 結果を人が読める形で説明したもの。誤ったコードが入力された後の残り試行回数を含みます。
完全な電話番号レポート。最終的な結果(Approved/Declined)の場合にのみ存在します(nullではありません)。Failedではnullとなり、Expired or Not Foundでは含まれません。
Show child attributes
Show child attributes
一致した認証のセッションのvendor_dataです。Expired or Not Foundの場合はnullです。
一致した認証のセッションのmetadata。Expired or Not Foundの場合はnull。
このチェックレスポンスの日時。