API الخاص بـ مقارنة محللات DNS
قارن إجابات محللي DNS العامين العوديين لدى Cloudflare وGoogle. هذان مزودا DoH يعملان بنظام global-anycast، وليسا نقطتي قياس جغرافيتين أو خادمي أسماء authoritative. استخدم هذا المرجع لاختيار عملية ودمج عقد الاستجابة الموثق.
العمليات
GET /v1/dns/propagation
GET
/v1/dns/propagation
الرصيد: 2
معاملات الاستعلام
| المعامل | النوع | مطلوب |
|---|---|---|
| domain | string | مطلوب |
| type |
string
القيم المسموحة
AAAAACNAMEMXTXTNSSOA
الافتراضي
A
|
اختياري |
| expected | string | اختياري |
حقول الرد
| الحقل | النوع |
|---|---|
domain |
string |
record_type |
string |
expected_value |
string | null |
measurement_scope |
string |
percentage_basis |
string |
propagation_percentage |
number |
fully_propagated |
boolean |
consistent |
boolean |
unique_values[] |
string[] |
results[] |
object[] |
results[] |
object |
results[].server |
object |
results[].server.name |
string |
results[].server.ip |
string |
results[].server.provider |
string |
results[].server.location |
string |
results[].server.country |
string |
results[].server.scope |
string |
results[].server.doh_endpoint |
string |
results[].server.documentation_url |
string |
results[].server.format |
string |
results[].success |
boolean |
results[].records[] |
string[] |
results[].ttl |
integer | null |
results[].response_time_ms |
integer |
results[].error |
string | null |
checked_at |
string |
total_duration_ms |
integer |
summary |
object |
summary.total_servers |
integer |
summary.successful |
integer |
summary.failed |
integer |
summary.matching_expected |
integer |
propagation_summary |
object |
propagation_summary.measurement_scope |
string |
propagation_summary.percentage_basis |
string |
propagation_summary.resolver_count |
integer |
propagation_summary.successful_count |
integer |
propagation_summary.failed_count |
integer |
propagation_summary.propagation_percentage |
number |
propagation_summary.fully_propagated |
boolean |
propagation_summary.consistent |
boolean |
propagation_summary.unique_value_count |
integer |
propagation_summary.matching_expected_count |
integer |
propagation_summary.expected_value_present |
boolean | null |
propagation_summary.countries_checked |
integer |
propagation_summary.providers_checked |
integer |
propagation_summary.locations_checked |
integer |
propagation_summary.slowest_resolver |
string | null |
propagation_summary.slowest_response_ms |
integer | null |
propagation_summary.fastest_response_ms |
integer | null |
propagation_summary.disagreement_count |
integer |
propagation_summary.confidence |
string |
meta |
object |
meta.served_by |
string |
طلب مثال
curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/dns/propagation?domain=example.com&type=A&expected=192.0.2.1"const response = await fetch("https://domscan.net/v1/dns/propagation?domain=example.com&type=A&expected=192.0.2.1", {
headers: { "X-API-Key": process.env.DOMSCAN_API_KEY },
});
const data = await response.json();
console.log(data);import os
import requests
response = requests.get(
"https://domscan.net/v1/dns/propagation?domain=example.com&type=A&expected=192.0.2.1",
headers={"X-API-Key": os.environ["DOMSCAN_API_KEY"]},
)
print(response.json())package main
import (
"fmt"
"io"
"net/http"
"os"
)
func main() {
req, err := http.NewRequest(http.MethodGet, "https://domscan.net/v1/dns/propagation?domain=example.com&type=A&expected=192.0.2.1", nil)
if err != nil {
panic(err)
}
req.Header.Set("X-API-Key", os.Getenv("DOMSCAN_API_KEY"))
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
data, err := io.ReadAll(resp.Body)
if err != nil {
panic(err)
}
fmt.Println(resp.Status, string(data))
}require "json"
require "net/http"
uri = URI("https://domscan.net/v1/dns/propagation?domain=example.com&type=A&expected=192.0.2.1")
request = Net::HTTP::Get.new(uri)
request["X-API-Key"] = ENV.fetch("DOMSCAN_API_KEY")
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.pretty_generate(JSON.parse(response.body))مثال الرد
{
"domain": "example.com",
"record_type": "A",
"expected_value": "192.0.2.10",
"measurement_scope": "configured_recursive_resolvers",
"percentage_basis": "expected_value_match",
"propagation_percentage": 100,
"fully_propagated": true,
"consistent": true,
"unique_values": [
"192.0.2.10"
],
"results": [
{
"server": {
"name": "Cloudflare 1.1.1.1",
"ip": "1.1.1.1",
"location": "Global anycast",
"country": "GLOBAL",
"provider": "Cloudflare",
"scope": "global-anycast",
"doh_endpoint": "https://cloudflare-dns.com/dns-query",
"documentation_url": "https://developers.cloudflare.com/1.1.1.1/encryption/dns-over-https/make-api-requests/dns-json/",
"format": "dns-json"
},
"success": true,
"records": [
"192.0.2.10"
],
"ttl": 300,
"response_time_ms": 38
},
{
"server": {
"name": "Google Public DNS",
"ip": "8.8.8.8",
"location": "Global anycast",
"country": "GLOBAL",
"provider": "Google",
"scope": "global-anycast",
"doh_endpoint": "https://dns.google/resolve",
"documentation_url": "https://developers.google.com/speed/public-dns/docs/doh/json",
"format": "dns-json"
},
"success": true,
"records": [
"192.0.2.10"
],
"ttl": 300,
"response_time_ms": 52
}
],
"checked_at": "2026-10-09T10:15:30.000Z",
"total_duration_ms": 61,
"summary": {
"total_servers": 2,
"successful": 2,
"failed": 0,
"matching_expected": 2
},
"propagation_summary": {
"measurement_scope": "configured_recursive_resolvers",
"percentage_basis": "expected_value_match",
"resolver_count": 2,
"successful_count": 2,
"failed_count": 0,
"propagation_percentage": 100,
"fully_propagated": true,
"consistent": true,
"unique_value_count": 1,
"matching_expected_count": 2,
"expected_value_present": true,
"countries_checked": 1,
"providers_checked": 2,
"locations_checked": 1,
"slowest_resolver": "Google Public DNS",
"slowest_response_ms": 52,
"fastest_response_ms": 38,
"disagreement_count": 0,
"confidence": "high"
}
}
رموز حالة HTTP
200OK400طلب غير صالح401غير مصرح402الدفع مطلوب429طلبات كثيرة جداً
POST /v1/dns/propagation/bulk
POST
/v1/dns/propagation/bulk
الرصيد: 2/item
معاملات الاستعلام
| المعامل | النوع | مطلوب |
|---|---|---|
| dry_run |
string
القيم المسموحة
true
|
اختياري |
معاملات متن الطلب
| المعامل | النوع | مطلوب |
|---|---|---|
| domains | string[] | مطلوب |
| type |
string
القيم المسموحة
AAAAACNAMEMXTXTNSSOA
الافتراضي
A
|
اختياري |
| 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"
}'const response = await fetch("https://domscan.net/v1/dns/propagation/bulk", {
method: "POST",
headers: { "X-API-Key": process.env.DOMSCAN_API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({
"domains": [
"example.com",
"cloudflare.com"
],
"type": "A"
}),
});
const data = await response.json();
console.log(data);import os
import requests
response = requests.post(
"https://domscan.net/v1/dns/propagation/bulk",
headers={"X-API-Key": os.environ["DOMSCAN_API_KEY"]},
json={
"domains": [
"example.com",
"cloudflare.com",
],
"type": "A",
},
)
print(response.json())package main
import (
"fmt"
"io"
"net/http"
"os"
"strings"
)
func main() {
body := strings.NewReader(`{
"domains": [
"example.com",
"cloudflare.com"
],
"type": "A"
}`)
req, err := http.NewRequest(http.MethodPost, "https://domscan.net/v1/dns/propagation/bulk", body)
if err != nil {
panic(err)
}
req.Header.Set("X-API-Key", os.Getenv("DOMSCAN_API_KEY"))
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
data, err := io.ReadAll(resp.Body)
if err != nil {
panic(err)
}
fmt.Println(resp.Status, string(data))
}require "json"
require "net/http"
uri = URI("https://domscan.net/v1/dns/propagation/bulk")
request = Net::HTTP::Post.new(uri)
request["X-API-Key"] = ENV.fetch("DOMSCAN_API_KEY")
request["Content-Type"] = "application/json"
request.body = JSON.generate({
"domains" => [
"example.com",
"cloudflare.com"
],
"type" => "A"
})
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.pretty_generate(JSON.parse(response.body))مثال الرد
{
"results": [
{
"input": "example",
"data": {}
}
],
"meta": {
"total": 1,
"succeeded": 1,
"failed": 1,
"max_items": 10,
"credits_per_item": 1,
"duration_ms": 1
}
}
رموز حالة HTTP
200OK400طلب غير صالح401غير مصرح402الدفع مطلوب409HTTP 409422HTTP 422429طلبات كثيرة جداً
GET /v1/dns/servers
GET
/v1/dns/servers
الرصيد: 0
حقول الرد
| الحقل | النوع |
|---|---|
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 |
meta |
object |
meta.served_by |
string |
طلب مثال
curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/dns/servers"const response = await fetch("https://domscan.net/v1/dns/servers", {
headers: { "X-API-Key": process.env.DOMSCAN_API_KEY },
});
const data = await response.json();
console.log(data);import os
import requests
response = requests.get(
"https://domscan.net/v1/dns/servers",
headers={"X-API-Key": os.environ["DOMSCAN_API_KEY"]},
)
print(response.json())package main
import (
"fmt"
"io"
"net/http"
"os"
)
func main() {
req, err := http.NewRequest(http.MethodGet, "https://domscan.net/v1/dns/servers", nil)
if err != nil {
panic(err)
}
req.Header.Set("X-API-Key", os.Getenv("DOMSCAN_API_KEY"))
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
data, err := io.ReadAll(resp.Body)
if err != nil {
panic(err)
}
fmt.Println(resp.Status, string(data))
}require "json"
require "net/http"
uri = URI("https://domscan.net/v1/dns/servers")
request = Net::HTTP::Get.new(uri)
request["X-API-Key"] = ENV.fetch("DOMSCAN_API_KEY")
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.pretty_generate(JSON.parse(response.body))مثال الرد
{
"servers": [
{
"name": "Cloudflare 1.1.1.1",
"ip": "1.1.1.1",
"location": "Global anycast",
"country": "GLOBAL",
"provider": "Cloudflare",
"scope": "global-anycast",
"doh_endpoint": "https://cloudflare-dns.com/dns-query",
"documentation_url": "https://developers.cloudflare.com/1.1.1.1/encryption/dns-over-https/make-api-requests/dns-json/",
"format": "dns-json"
},
{
"name": "Google Public DNS",
"ip": "8.8.8.8",
"location": "Global anycast",
"country": "GLOBAL",
"provider": "Google",
"scope": "global-anycast",
"doh_endpoint": "https://dns.google/resolve",
"documentation_url": "https://developers.google.com/speed/public-dns/docs/doh/json",
"format": "dns-json"
}
],
"total": 2,
"measurement_scope": "configured_recursive_resolvers",
"geographic_vantage": false
}
رموز حالة HTTP
200OK401غير مصرح429طلبات كثيرة جداً