開発者向けリファレンス
DNSリゾルバー比較
DNSリゾルバー比較 APIのドキュメントで、リクエストパラメーター、レスポンスフィールド、コード例、DomScan連携のエラー処理を確認できます。
DNSリゾルバー比較
CloudflareとGoogleという2つの公開再帰DNSサービスを、それぞれ独立したDoHエンドポイントで問い合わせてDNSレコードの応答を比較します。どちらもグローバルエニーキャストサービスです。結果はWorkerのリクエスト経路から得た各サービスの観測値であり、地域別プローブ、権威DNSサーバーへの直接問い合わせ、世界全体への伝播を示す証拠ではありません。
GET
/v1/dns/propagation
クエリパラメータ
| パラメータ | タイプ | 説明 |
|---|---|---|
| domain 必須 | string | 各リゾルバーで問い合わせるドメイン(例:"example.com") |
| type オプション | string | 比較するレコードタイプ:A、AAAA、CNAME、MX、TXT、NS、SOA(デフォルト:A) |
| expected オプション | string | 比較基準として使用する任意の期待レコード値(例:新しいIPアドレス) |
レスポンスフィールド
| フィールド | タイプ | 説明 |
|---|---|---|
propagation_percentage | number | expectedなし:同一回答の最大グループ数を設定済みリゾルバー総数で割った割合。expectedあり:期待値との完全一致数を設定済みリゾルバー総数で割った割合(0~100) |
fully_propagated | boolean | 設定済みリゾルバーがすべて同じ回答に収束した場合、またはexpected指定時にすべてがその値と一致した場合にTrue |
consistent | boolean | 設定済みリゾルバーがすべて正常に応答し、同じ正規化済み回答セットを返した場合にのみTrue |
unique_values | array | 正常に応答したリゾルバーから返された一意のレコード値 |
results | array | リゾルバーごとのプロバイダー、レコード、観測TTL、リクエスト経路からの応答時間、エラー |
リクエスト例
# Compare A records across configured resolvers
curl -H "X-API-Key: your-api-key" "https://domscan.net/v1/dns/propagation?domain=example.com&type=A"
# Compare MX answers against an expected value
curl -H "X-API-Key: your-api-key" "https://domscan.net/v1/dns/propagation?domain=example.com&type=MX&expected=mail.example.com"
const domscanFetch = (url, options = {}) =>
fetch(url, {
...options,
headers: { ...options.headers, "X-API-Key": "your-api-key" },
});
const url = new URL("https://domscan.net/v1/dns/propagation");
url.searchParams.set("domain", "example.com");
url.searchParams.set("type", "A");
url.searchParams.set("expected", "203.0.113.42");
const response = await domscanFetch(url);
const data = await response.json();
// Legacy response field names are retained for API compatibility.
console.log(`Resolver convergence: ${data.propagation_percentage}%`);
console.log(`All configured resolvers match: ${data.fully_propagated}`);
// Check which servers are still showing old values
data.results
.filter(r => !r.success || !r.records.includes(data.expected_value))
.forEach(r => console.log(`${r.server.name}: ${r.records}`));
import requests
domscan = requests.Session()
domscan.headers.update({"X-API-Key": "your-api-key"})
response = domscan.get(
"https://domscan.net/v1/dns/propagation",
params={"domain": "example.com", "type": "A"}
)
data = response.json()
# Legacy response field names are retained for API compatibility.
print(f"Resolver convergence: {data['propagation_percentage']}%")
print(f"All configured resolvers match: {data['fully_propagated']}")
# Show servers with different values
for result in data['results']:
print(f"{result['server']['name']}: {result['records']}")
package main
import (
"encoding/json"
"fmt"
"net/http"
"os"
)
func domscanGet(url string) (*http.Response, error) {
request, err := http.NewRequest(http.MethodGet, url, nil)
if err != nil {
return nil, err
}
request.Header.Set("X-API-Key", os.Getenv("DOMSCAN_API_KEY"))
return http.DefaultClient.Do(request)
}
func main() {
resp, _ := domscanGet("https://domscan.net/v1/dns/propagation?domain=example.com&type=A")
defer resp.Body.Close()
var data map[string]interface{}
json.NewDecoder(resp.Body).Decode(&data)
// Legacy response field names are retained for API compatibility.
fmt.Printf("Resolver convergence: %.0f%%\n", data["propagation_percentage"])
fmt.Printf("All configured resolvers match: %v\n", data["fully_propagated"])
}
require 'net/http'
require 'json'
uri = URI("https://domscan.net/v1/dns/propagation?domain=example.com&type=A")
request = Net::HTTP::Get.new(uri)
request["X-API-Key"] = ENV.fetch("DOMSCAN_API_KEY")
response = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https") { |http| http.request(request) }
data = JSON.parse(response.body)
# Legacy response field names are retained for API compatibility.
puts "Resolver convergence: #{data['propagation_percentage']}%"
puts "All configured resolvers match: #{data['fully_propagated']}"
レスポンス例
{
"domain": "example.com",
"record_type": "A",
"measurement_scope": "configured_recursive_resolvers",
"percentage_basis": "resolver_convergence",
"propagation_percentage": 100,
"fully_propagated": true,
"consistent": true,
"unique_values": ["93.184.216.34"],
"results": [
{
"server": {
"name": "Cloudflare 1.1.1.1",
"ip": "1.1.1.1",
"provider": "Cloudflare",
"location": "Global anycast",
"country": "GLOBAL",
"scope": "global-anycast",
"doh_endpoint": "https://cloudflare-dns.com/dns-query"
},
"success": true,
"records": ["93.184.216.34"],
"ttl": 86400,
"response_time_ms": 12
},
{
"server": {
"name": "Google Public DNS",
"ip": "8.8.8.8",
"provider": "Google",
"location": "Global anycast",
"country": "GLOBAL",
"scope": "global-anycast",
"doh_endpoint": "https://dns.google/resolve"
},
"success": true,
"records": ["93.184.216.34"],
"ttl": 86400,
"response_time_ms": 15
}
],
"summary": {
"total_servers": 2,
"successful": 2,
"failed": 0
}
}
GET
/v1/dns/servers
比較に使用する2つの公開再帰DoHサービス、CloudflareとGoogleを一覧表示します。どちらもグローバルエニーキャストリゾルバーであり、地域別プローブや権威DNSサーバーではありません。
レスポンス例
{
"measurement_scope": "configured_recursive_resolvers",
"geographic_vantage": false,
"servers": [
{
"name": "Cloudflare 1.1.1.1",
"ip": "1.1.1.1",
"provider": "Cloudflare",
"location": "Global anycast",
"country": "GLOBAL",
"scope": "global-anycast",
"doh_endpoint": "https://cloudflare-dns.com/dns-query"
},
{
"name": "Google Public DNS",
"ip": "8.8.8.8",
"provider": "Google",
"location": "Global anycast",
"country": "GLOBAL",
"scope": "global-anycast",
"doh_endpoint": "https://dns.google/resolve"
}
],
"total": 2
}
レスポンスフィールド
| フィールド | タイプ |
|---|---|
measurement_scope |
string |
geographic_vantage |
boolean |
servers[] |
object[] |
servers[] |
object |
servers[].name |
string |
servers[].location |
string |
servers[].country |
string |
servers[].ip |
string |
servers[].provider |
string |
servers[].scope |
string |
servers[].doh_endpoint |
string |
servers[].documentation_url |
string |
servers[].format |
string |
total |
integer |
POST
/v1/dns/propagation/bulk
ボディパラメータ
| パラメータ | タイプ | 必須 |
|---|---|---|
| domains | string[] | 必須 |
| type | string | オプション |
| expected | string | オプション |
レスポンスフィールド
| フィールド | タイプ |
|---|---|
results[] |
unknown[] |
meta |
object |
meta.total |
integer |
meta.succeeded |
integer |
meta.failed |
integer |
meta.max_items |
integer |
meta.credits_per_item |
integer |
meta.duration_ms |
integer |
リクエスト例
curl -X POST "https://domscan.net/v1/dns/propagation/bulk" \
-H "Content-Type: application/json" \
-H "X-API-Key: $DOMSCAN_API_KEY" \
-d '{
"domains": [
"example.com",
"cloudflare.com"
],
"type": "A"
}'
レスポンス例
{
"results": [
null
],
"meta": {
"total": 1,
"succeeded": 1,
"failed": 1,
"max_items": 10,
"credits_per_item": 1,
"duration_ms": 1
}
}