개발자 참고자료

기술 스택 감지

DomScan API로 빠른 HTTP 검사, 샌드박스 JavaScript 렌더링, 범위가 제한된 동일 출처 다중 페이지 분석으로 공개 웹사이트를 구동하는 기술을 확인하세요.

기술 스택 감지

빠른 HTTP 검사, 샌드박스 JavaScript 렌더링, 범위가 제한된 동일 출처 다중 페이지 분석으로 공개 웹사이트를 구동하는 기술을 확인하세요. 대상 목록이 크면 동기식 대량 스캔이나 지속 저장되는 비동기 작업을 사용할 수 있습니다.

GET /v1/tech

쿼리 매개변수

매개변수유형설명
url 선택 사항 string 분석할 전체 공개 HTTP(S) URL입니다. URL과 domain을 모두 제공하면 URL이 우선합니다.
domain 선택 사항 string 분석할 공개 도메인 또는 HTTP(S) URL입니다. URL 또는 domain 중 하나를 제공하세요.
mode 선택 사항 string
허용된 값 fastrendereddeep
기본값 fast
스캔 모드: fast는 3크레딧, rendered는 6크레딧, deep은 9크레딧입니다.
max_pages 선택 사항 integer
기본값 3
deep 모드에서 분석할 최대 동일 출처 페이지 수를 1에서 5 사이로 지정합니다. 기본값은 3입니다.
skip_cache 선택 사항 string
허용된 값 1
1로 설정하여 캐시를 우회하고 새 스캔을 강제합니다. fast 모드에만 적용되며, rendered 및 deep 결과는 캐시되지 않습니다.

기술 카테고리

카테고리예시
cdnCloudflare, Fastly, Akamai, CloudFront
cmsWordPress, Drupal, Shopify, Squarespace
analyticsGoogle Analytics, Mixpanel, Segment
frameworkReact, Vue.js, Angular, Next.js
servernginx, Apache, IIS, LiteSpeed
hostingAWS, Google Cloud, Azure, Vercel
platformGitHub, Medium, Substack, GitBook

예제 요청

curl -H "X-API-Key: your-api-key" "https://domscan.net/v1/tech?url=https%3A%2F%2Fwordpress.example%2F"   -H "x-api-key: YOUR_API_KEY"
const domscanFetch = (url, options = {}) =>
  fetch(url, {
    ...options,
    headers: { ...options.headers, "X-API-Key": "your-api-key" },
  });

const response = await domscanFetch(
  "https://domscan.net/v1/tech?url=https%3A%2F%2Fwordpress.example%2F",
  { headers: { "x-api-key": "YOUR_API_KEY" } }
);
const data = await response.json();

for (const tech of data.technologies) {
  console.log(`${tech.id}: ${tech.confidence_score}/100`);
}
import requests

domscan = requests.Session()
domscan.headers.update({"X-API-Key": "your-api-key"})

response = domscan.get(
    "https://domscan.net/v1/tech",
    params={"url": "https://wordpress.example/"},
    headers={"x-api-key": "YOUR_API_KEY"}
)
data = response.json()

for tech in data['technologies']:
    print(f"{tech['id']}: {tech['confidence_score']}/100")

예제 응답

{
  "url": "https://wordpress.example/",
  "technologies": [
    {
      "id": "wordpress",
      "name": "WordPress",
      "category": "cms",
      "version": "6.8.2",
      "version_kind": "product",
      "confidence": "high",
      "confidence_score": 98,
      "evidence": "Meta: generator",
      "evidence_details": [
        {
          "source": "meta",
          "key": "generator",
          "matched": "WordPress 6.8.2"
        }
      ],
      "source_count": 1,
      "caveats": [
        "generator_can_be_removed_or_spoofed",
        "asset_paths_can_be_rewritten"
      ],
      "reference": {
        "website": "https://wordpress.org/",
        "source_url": "https://developer.wordpress.org/reference/functions/get_the_generator/",
        "source_owner": "WordPress.org",
        "source_kind": "official_docs",
        "access": "public",
        "access_method": "target_response_inspection",
        "cost": "none",
        "terms_status": "public_source_reviewed_factual_signature",
        "expected_freshness": "reverify_on_source_or_signature_change",
        "maintenance_risk": "medium",
        "runtime_rate_limits": "not_applicable_no_source_request",
        "fallback_behavior": "unmatched_or_unavailable_signal_is_not_detected",
        "last_verified": "2026-07-15"
      }
    }
  ],
  "detection_summary": {
    "detected_count": 1,
    "category_count": 1,
    "categories": [
      "cms"
    ],
    "high_confidence_count": 1,
    "medium_confidence_count": 0,
    "low_confidence_count": 0,
    "versioned_count": 1,
    "evidence_sources": {
      "header": 0,
      "html": 0,
      "asset_url": 0,
      "network_url": 0,
      "javascript": 0,
      "meta": 1,
      "cookie": 0,
      "url": 0
    },
    "catalog_size": 522,
    "catalog_category_count": 87,
    "summary_field_count": 1
  },
  "summary": {
    "cms": "WordPress"
  },
  "meta": {
    "title": "Example WordPress site",
    "description": "A reserved example response for the technology detection contract.",
    "canonical_url": "https://wordpress.example/",
    "language": "en",
    "favicon": "https://wordpress.example/favicon.ico",
    "open_graph": {
      "title": null,
      "description": null,
      "image": null,
      "url": null,
      "type": null,
      "site_name": null,
      "locale": null
    },
    "twitter_card": {
      "card": null,
      "site": null,
      "creator": null,
      "title": null,
      "description": null,
      "image": null
    },
    "author": null,
    "generator": "WordPress 6.8.2",
    "theme_color": null,
    "manifest_url": null,
    "robots": "index, follow"
  },
  "headers": {
    "content-type": "text/html; charset=UTF-8"
  },
  "ssl": {
    "enabled": true
  },
  "analysis": {
    "status": "complete",
    "requested_url": "https://wordpress.example/",
    "final_url": "https://wordpress.example/",
    "response_status": 200,
    "redirect_count": 0,
    "relay_used": false,
    "signals_checked": [
      "url",
      "header",
      "cookie",
      "html",
      "asset_url",
      "meta"
    ],
    "signals_unavailable": [],
    "html_characters_analyzed": 412,
    "html_bytes_analyzed": 412,
    "html_byte_limit": 1000000,
    "html_truncated": false,
    "response_body_truncated": false,
    "mode": "fast",
    "rendered": false,
    "javascript_executed": false,
    "pages_requested": 1,
    "pages_analyzed": 1,
    "page_limit": 1,
    "network_requests_observed": 0,
    "page_limit_reached": false,
    "resource_limit_reached": false,
    "redirected_to_different_host": false,
    "no_detection_reason": null,
    "recommended_mode": null,
    "pages": [
      {
        "url": "https://wordpress.example/",
        "status": 200,
        "html_truncated": false,
        "network_requests_observed": 0
      }
    ]
  },
  "total_time_ms": 128,
  "checked_at": "2026-07-15T10:30:00Z",
  "_meta": {
    "served_by": "pop=MAD country=ES",
    "analysis_status": "ok",
    "response_status": 200,
    "cache_status": "miss",
    "stale": false
  }
}

응답 필드

필드 유형
cache_age_s integer
url string
technologies[] object[]
technologies[] object
technologies[].id string
technologies[].name string
technologies[].category string
technologies[].version string
technologies[].version_kind string
technologies[].confidence string
technologies[].confidence_score integer
technologies[].evidence string
technologies[].evidence_details[] object[]
technologies[].evidence_details[] object
technologies[].evidence_details[].source string
technologies[].evidence_details[].key string
technologies[].evidence_details[].matched string
technologies[].evidence_details[].page_url string
technologies[].source_count integer
technologies[].caveats[] string[]
technologies[].reference object
technologies[].reference.website string
technologies[].reference.source_url string
technologies[].reference.source_owner string
technologies[].reference.source_kind string
technologies[].reference.access string
technologies[].reference.access_method string
technologies[].reference.cost string
technologies[].reference.terms_status string
technologies[].reference.expected_freshness string
technologies[].reference.maintenance_risk string
technologies[].reference.runtime_rate_limits string
technologies[].reference.fallback_behavior string
technologies[].reference.last_verified string
detection_summary object
detection_summary.detected_count integer
detection_summary.category_count integer
detection_summary.categories[] string[]
detection_summary.high_confidence_count integer
detection_summary.medium_confidence_count integer
detection_summary.low_confidence_count integer
detection_summary.versioned_count integer
detection_summary.evidence_sources object
detection_summary.evidence_sources.header integer
detection_summary.evidence_sources.html integer
detection_summary.evidence_sources.asset_url integer
detection_summary.evidence_sources.network_url integer
detection_summary.evidence_sources.javascript integer
detection_summary.evidence_sources.meta integer
detection_summary.evidence_sources.cookie integer
detection_summary.evidence_sources.url integer
detection_summary.catalog_size integer
detection_summary.catalog_category_count integer
detection_summary.summary_field_count integer
summary object
summary.cdn string
summary.server string
summary.framework string
summary.cms string
summary.hosting string
summary.platform string
summary.analytics[] string[]
headers object
meta object
ssl object
ssl.enabled boolean
analysis object
analysis.status string
analysis.requested_url string
analysis.final_url string
analysis.response_status integer
analysis.redirect_count integer
analysis.relay_used boolean
analysis.signals_checked[] string[]
analysis.signals_unavailable[] string[]
analysis.html_characters_analyzed integer
analysis.html_bytes_analyzed integer
analysis.html_byte_limit integer
analysis.html_truncated boolean
analysis.response_body_truncated boolean
analysis.mode string
analysis.rendered boolean
analysis.javascript_executed boolean
analysis.pages_requested integer
analysis.pages_analyzed integer
analysis.page_limit integer
analysis.network_requests_observed integer
analysis.page_limit_reached boolean
analysis.resource_limit_reached boolean
analysis.redirected_to_different_host boolean
analysis.no_detection_reason string | null
analysis.recommended_mode string | null
analysis.pages[] object[]
analysis.pages[] object
analysis.pages[].url string
analysis.pages[].status integer
analysis.pages[].html_truncated boolean
analysis.pages[].network_requests_observed integer
total_time_ms integer
checked_at string
_meta object
_meta.served_by string
_meta.analysis_status string
_meta.response_status integer
_meta.cache_status string
_meta.stale boolean
_meta.cached_at string

빠른 대량 감지

POST /v1/tech/bulk는 입력 순서를 유지한 fast 스캔을 최대 10개 실행합니다. 유효한 대상은 각각 3크레딧, 잘못된 대상은 0크레딧이며 업스트림 오류는 항목별로 환불됩니다.

POST /v1/tech/bulk
curl -H "X-API-Key: your-api-key" -X POST "https://domscan.net/v1/tech/bulk"   -H "x-api-key: YOUR_API_KEY"   -H "content-type: application/json"   -d '{"targets":["example.com",{"url":"https://shop.example.com/","reference":"shop"}]}'

비동기 스캔 작업

POST /v1/tech/jobs는 fast, rendered 또는 deep 모드에서 최대 100개의 대상을 받습니다. 작업은 멱등 생성, 소유자에게만 허용되는 폴링, 서명된 결과 페이지네이션, 취소, 항목별 환불을 지원합니다. 전체 결과는 48시간 후 만료됩니다.

POST /v1/tech/jobs
GET /v1/tech/jobs
GET /v1/tech/jobs/:job_id
GET /v1/tech/jobs/:job_id/results
DELETE /v1/tech/jobs/:job_id
curl -H "X-API-Key: your-api-key" -X POST "https://domscan.net/v1/tech/jobs"   -H "x-api-key: YOUR_API_KEY"   -H "Idempotency-Key: scan-batch-2026-07-15"   -H "content-type: application/json"   -d '{"mode":"deep","max_pages":3,"targets":["example.com","shop.example.com"]}'

curl -H "X-API-Key: your-api-key" "https://domscan.net/v1/tech/jobs?limit=25"   -H "x-api-key: YOUR_API_KEY"

curl -H "X-API-Key: your-api-key" "https://domscan.net/v1/tech/jobs/tsj_JOB_ID"   -H "x-api-key: YOUR_API_KEY"

curl -H "X-API-Key: your-api-key" "https://domscan.net/v1/tech/jobs/tsj_JOB_ID/results?limit=25"   -H "x-api-key: YOUR_API_KEY"

# next page, using next_cursor from the previous response
curl -H "X-API-Key: your-api-key" "https://domscan.net/v1/tech/jobs/tsj_JOB_ID/results?limit=25&cursor=NEXT_CURSOR"   -H "x-api-key: YOUR_API_KEY"

curl -H "X-API-Key: your-api-key" -X DELETE "https://domscan.net/v1/tech/jobs/tsj_JOB_ID"   -H "x-api-key: YOUR_API_KEY"
참고: 작업 목록과 작업 결과는 불투명한 서명된 커서로 페이지 나뉩니다. 응답에서 next_cursor를 읽고 cursor 매개변수로 다시 전달하여 다음 페이지를 요청합니다. 커서는 계정과 단일 작업에 연결되어 있으므로 다른 곳에서 편집하거나 재사용할 수 없습니다.
GET /v1/hosting 크레딧: 3

쿼리 매개변수

매개변수 유형 필수
domain string 필수

응답 필드

필드 유형
domain string
hosting object
hosting.provider string
hosting.provider_id string
hosting.confidence number
hosting.region string
hosting.detection_method string
cdn object
cdn.detected boolean
cdn.provider string
cdn.provider_id string
cdn.confidence number
cdn.detection_method string
cdn.features[] string[]
waf object
waf.detected boolean
waf.provider string
waf.provider_id string
waf.confidence number
waf.detection_method string
dns_provider object
dns_provider.provider string
dns_provider.provider_id string
dns_provider.nameservers[] string[]
dns_provider.confidence number
dns_providers[] object[]
dns_providers[] object
dns_providers[].provider_id string
dns_providers[].provider string
email_provider object
email_provider.provider string
email_provider.provider_id string
email_provider.mx_records[] string[]
email_provider.confidence number
ssh object
ssh.host string
ssh.port integer
ssh.reachable boolean
ssh.banner string | null
ssh.algorithms[] string[]
ssh.weak_algorithms[] string[]
ssh.keys[] object[]
ssh.keys[] object
ssh.keys[].host string
ssh.keys[].algorithm string
ssh.keys[].key_size integer | null
ssh.keys[].fingerprint_sha256 string | null
ssh.keys[].weak boolean
ssh.keys[].weak_reasons[] string[]
ssh.error string | null
ssh.checked_at string
provider_summary object
provider_summary.cache_status string
provider_summary.provider_count integer
provider_summary.detected_surfaces[] string[]
provider_summary.confidence string
provider_summary.confidence_score integer
provider_summary.hosting_provider string | null
provider_summary.cdn_provider string | null
provider_summary.waf_provider string | null
provider_summary.dns_provider_count integer
provider_summary.email_provider string | null
provider_summary.ssh_exposed boolean | null
provider_summary.evidence[] object[]
provider_summary.evidence[] object
provider_summary.evidence[].surface string
provider_summary.evidence[].provider string
provider_summary.evidence[].confidence number | null
provider_summary.evidence[].method string | null
ip_info object
ip_info.ipv4[] string[]
ip_info.ipv6[] string[]
checked_at string
check_duration_ms integer
meta object
meta.cached boolean

예제 요청

curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/hosting?domain=example.com"
const response = await fetch("https://domscan.net/v1/hosting?domain=example.com", {
  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/hosting?domain=example.com",
    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/hosting?domain=example.com", 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/hosting?domain=example.com")
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": "github.com",
  "hosting": {
    "provider": "Microsoft Azure",
    "provider_id": "azure",
    "confidence": 0.86,
    "detection_method": "ip_range"
  },
  "cdn": {
    "detected": true,
    "provider": "Fastly",
    "provider_id": "fastly",
    "confidence": 0.94,
    "detection_method": "headers"
  },
  "waf": {
    "detected": false,
    "confidence": 0.2,
    "detection_method": "headers"
  },
  "dns_provider": {
    "provider": "AWS Route 53",
    "provider_id": "route53",
    "nameservers": [
      "ns-1283.awsdns-32.org",
      "ns-1707.awsdns-21.co.uk"
    ],
    "confidence": 0.9
  },
  "email_provider": {
    "provider": "Google Workspace",
    "provider_id": "google_workspace",
    "mx_records": [
      "aspmx.l.google.com"
    ],
    "confidence": 0.95
  },
  "ssh": {
    "host": "github.com",
    "port": 22,
    "reachable": true,
    "banner": "SSH-2.0-babeld",
    "algorithms": [
      "ssh-ed25519",
      "ecdsa-sha2-nistp256"
    ],
    "weak_algorithms": [],
    "keys": [
      {
        "host": "github.com",
        "algorithm": "ssh-ed25519",
        "key_size": 256,
        "fingerprint_sha256": "SHA256:+DiY3wvvV6TuJJhbpZisF/Ym7N3QKXNoZk6sJ2x2d2s",
        "weak": false,
        "weak_reasons": []
      }
    ],
    "error": null,
    "checked_at": "2026-04-18T21:00:00Z"
  },
  "provider_summary": {
    "cache_status": "miss",
    "provider_count": 4,
    "detected_surfaces": [
      "hosting",
      "cdn",
      "dns",
      "email",
      "ssh"
    ],
    "confidence": "high",
    "confidence_score": 92,
    "hosting_provider": "Microsoft Azure",
    "cdn_provider": "Fastly",
    "waf_provider": null,
    "dns_provider_count": 1,
    "email_provider": "Google Workspace",
    "ssh_exposed": true,
    "evidence": [
      {
        "surface": "hosting",
        "provider": "Microsoft Azure",
        "confidence": 0.86,
        "method": "ip_range"
      },
      {
        "surface": "cdn",
        "provider": "Fastly",
        "confidence": 0.94,
        "method": "headers"
      },
      {
        "surface": "dns",
        "provider": "AWS Route 53",
        "confidence": 0.9,
        "method": "ns"
      },
      {
        "surface": "email",
        "provider": "Google Workspace",
        "confidence": 0.95,
        "method": "mx"
      },
      {
        "surface": "ssh",
        "provider": "public-ssh",
        "confidence": 90,
        "method": "edge-relay"
      }
    ]
  },
  "ip_info": {
    "ipv4": [
      "140.82.121.4"
    ],
    "ipv6": []
  },
  "checked_at": "2026-04-18T21:00:00Z",
  "check_duration_ms": 156
}

HTTP 상태 코드

  • 200 성공
  • 400 잘못된 요청
  • 401 인증되지 않음
  • 402 결제 필요
  • 429 요청 과다
POST /v1/hosting/bulk 크레딧: 3/item

쿼리 매개변수

매개변수 유형 필수
dry_run string
허용된 값 true
선택 사항

본문 매개변수

매개변수 유형 필수
domains 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/hosting/bulk" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $DOMSCAN_API_KEY" \
  -d '{
  "domains": [
    "example.com",
    "cloudflare.com"
  ]
}'
const response = await fetch("https://domscan.net/v1/hosting/bulk", {
  method: "POST",
  headers: { "X-API-Key": process.env.DOMSCAN_API_KEY, "Content-Type": "application/json" },
  body: JSON.stringify({
    "domains": [
      "example.com",
      "cloudflare.com"
    ]
  }),
});
const data = await response.json();
console.log(data);
import os
import requests

response = requests.post(
    "https://domscan.net/v1/hosting/bulk",
    headers={"X-API-Key": os.environ["DOMSCAN_API_KEY"]},
    json={
        "domains": [
            "example.com",
            "cloudflare.com",
        ],
    },
)
print(response.json())
package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
	"strings"
)

func main() {
	body := strings.NewReader(`{
	  "domains": [
	    "example.com",
	    "cloudflare.com"
	  ]
	}`)
	req, err := http.NewRequest(http.MethodPost, "https://domscan.net/v1/hosting/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/hosting/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"
  ]
})

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 상태 코드

  • 200 성공
  • 400 잘못된 요청
  • 401 인증되지 않음
  • 402 결제 필요
  • 409 HTTP 409
  • 422 HTTP 422
  • 429 요청 과다
GET /v1/parking 크레딧: 2

쿼리 매개변수

매개변수 유형 필수
domain string 필수

응답 필드

필드 유형
domain string
classification object
classification.status string
classification.reason string
classification.evidence object
classification.evidence.source string
classification.evidence.method string
classification.evidence.observed_at string
classification.evidence.detail string
classification.checked_at string
is_parked boolean | null
is_for_sale boolean | null
parking_provider string | null
aftermarket_listings[] object[]
aftermarket_listings[] object
aftermarket_listings[].platform string
aftermarket_listings[].detected_via string
signals[] object[]
signals[] object
signals[].type string
signals[].detail string
signals[].provider string
confidence number
checked_at string
check_duration_ms integer

예제 요청

curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/parking?domain=example.com"
const response = await fetch("https://domscan.net/v1/parking?domain=example.com", {
  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/parking?domain=example.com",
    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/parking?domain=example.com", 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/parking?domain=example.com")
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": "parked-example.com",
  "is_parked": true,
  "is_for_sale": false,
  "parking_provider": "Sedo",
  "aftermarket_listings": [
    {
      "platform": "Sedo",
      "detected_via": "dns"
    }
  ],
  "signals": [
    {
      "type": "nameserver",
      "detail": "NS record: ns1.sedoparking.com",
      "provider": "Sedo"
    },
    {
      "type": "nameserver",
      "detail": "NS record: ns2.sedoparking.com",
      "provider": "Sedo"
    }
  ],
  "confidence": 0.85,
  "checked_at": "2026-10-09T10:15:30.000Z",
  "check_duration_ms": 842
}

HTTP 상태 코드

  • 200 성공
  • 400 잘못된 요청
  • 401 인증되지 않음
  • 402 결제 필요
  • 429 요청 과다
GET /v1/agent-readiness 크레딧: 3

쿼리 매개변수

매개변수 유형 필수
url string 선택 사항
domain string 선택 사항
skip_cache string
허용된 값 1
선택 사항

응답 필드

필드 유형
cache_age_s integer
requested_url string
final_url string
checked_at string
outcome string
fetch_state string
http_status integer | null
summary object
summary.coverage string
summary.detected_signals integer
summary.total_signals integer
summary.score integer | null
summary.rating string
summary.confidence integer
summary.passed_checks integer
summary.warning_checks integer
summary.failed_checks integer
summary.unknown_checks integer
summary.not_applicable_checks integer
signals object
signals.webmcp object
signals.webmcp.status string
signals.webmcp.validation string
signals.webmcp.method string
signals.webmcp.checked_url string | null
signals.webmcp.http_status integer | null
signals.webmcp.evidence[] string[]
signals.webmcp.caveats[] string[]
signals.remote_mcp object
signals.remote_mcp.status string
signals.remote_mcp.validation string
signals.remote_mcp.method string
signals.remote_mcp.checked_url string | null
signals.remote_mcp.http_status integer | null
signals.remote_mcp.evidence[] string[]
signals.remote_mcp.caveats[] string[]
signals.openapi object
signals.openapi.status string
signals.openapi.validation string
signals.openapi.method string
signals.openapi.checked_url string | null
signals.openapi.http_status integer | null
signals.openapi.evidence[] string[]
signals.openapi.caveats[] string[]
signals.llms_txt object
signals.llms_txt.status string
signals.llms_txt.validation string
signals.llms_txt.method string
signals.llms_txt.checked_url string | null
signals.llms_txt.http_status integer | null
signals.llms_txt.evidence[] string[]
signals.llms_txt.caveats[] string[]
signals.api_catalog object
signals.api_catalog.status string
signals.api_catalog.validation string
signals.api_catalog.method string
signals.api_catalog.checked_url string | null
signals.api_catalog.http_status integer | null
signals.api_catalog.evidence[] string[]
signals.api_catalog.caveats[] string[]
signals.mcp_server_card object
signals.mcp_server_card.status string
signals.mcp_server_card.validation string
signals.mcp_server_card.method string
signals.mcp_server_card.checked_url string | null
signals.mcp_server_card.http_status integer | null
signals.mcp_server_card.evidence[] string[]
signals.mcp_server_card.caveats[] string[]
signals.agent_skills object
signals.agent_skills.status string
signals.agent_skills.validation string
signals.agent_skills.method string
signals.agent_skills.checked_url string | null
signals.agent_skills.http_status integer | null
signals.agent_skills.evidence[] string[]
signals.agent_skills.caveats[] string[]
signals.oauth object
signals.oauth.status string
signals.oauth.validation string
signals.oauth.method string
signals.oauth.checked_url string | null
signals.oauth.http_status integer | null
signals.oauth.evidence[] string[]
signals.oauth.caveats[] string[]
signals.markdown object
signals.markdown.status string
signals.markdown.validation string
signals.markdown.method string
signals.markdown.checked_url string | null
signals.markdown.http_status integer | null
signals.markdown.evidence[] string[]
signals.markdown.caveats[] string[]
signals.web_bot_auth object
signals.web_bot_auth.status string
signals.web_bot_auth.validation string
signals.web_bot_auth.method string
signals.web_bot_auth.checked_url string | null
signals.web_bot_auth.http_status integer | null
signals.web_bot_auth.evidence[] string[]
signals.web_bot_auth.caveats[] string[]
signals.sitemap_markdown object
signals.sitemap_markdown.status string
signals.sitemap_markdown.validation string
signals.sitemap_markdown.method string
signals.sitemap_markdown.checked_url string | null
signals.sitemap_markdown.http_status integer | null
signals.sitemap_markdown.evidence[] string[]
signals.sitemap_markdown.caveats[] string[]
signals.agent_guide object
signals.agent_guide.status string
signals.agent_guide.validation string
signals.agent_guide.method string
signals.agent_guide.checked_url string | null
signals.agent_guide.http_status integer | null
signals.agent_guide.evidence[] string[]
signals.agent_guide.caveats[] string[]
foundations object
dimensions object
dimensions.discoverability object
dimensions.discoverability.score integer | null
dimensions.discoverability.confidence integer
dimensions.discoverability.passed integer
dimensions.discoverability.warned integer
dimensions.discoverability.failed integer
dimensions.discoverability.unknown integer
dimensions.discoverability.not_applicable integer
dimensions.discoverability.checks[] string[]
dimensions.content object
dimensions.content.score integer | null
dimensions.content.confidence integer
dimensions.content.passed integer
dimensions.content.warned integer
dimensions.content.failed integer
dimensions.content.unknown integer
dimensions.content.not_applicable integer
dimensions.content.checks[] string[]
dimensions.access_policy object
dimensions.access_policy.score integer | null
dimensions.access_policy.confidence integer
dimensions.access_policy.passed integer
dimensions.access_policy.warned integer
dimensions.access_policy.failed integer
dimensions.access_policy.unknown integer
dimensions.access_policy.not_applicable integer
dimensions.access_policy.checks[] string[]
dimensions.capabilities object
dimensions.capabilities.score integer | null
dimensions.capabilities.confidence integer
dimensions.capabilities.passed integer
dimensions.capabilities.warned integer
dimensions.capabilities.failed integer
dimensions.capabilities.unknown integer
dimensions.capabilities.not_applicable integer
dimensions.capabilities.checks[] string[]
checks object
recommendations[] object[]
recommendations[] object
recommendations[].code string
recommendations[].severity string
meta object
meta.cached boolean
meta.fetch_path string
meta.duration_ms integer
meta.probe_count integer
meta.body_truncated boolean
meta.source_version string
meta.last_verified string
meta.rubric_version string
meta.max_probes integer

예제 요청

curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/agent-readiness?url=https%3A%2F%2Fexample.com&domain=example.com&skip_cache=1"
const response = await fetch("https://domscan.net/v1/agent-readiness?url=https%3A%2F%2Fexample.com&domain=example.com&skip_cache=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/agent-readiness?url=https%3A%2F%2Fexample.com&domain=example.com&skip_cache=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/agent-readiness?url=https%3A%2F%2Fexample.com&domain=example.com&skip_cache=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/agent-readiness?url=https%3A%2F%2Fexample.com&domain=example.com&skip_cache=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))

예제 응답

{
  "requested_url": "https://www.example.com/",
  "final_url": "https://www.example.com/",
  "checked_at": "2026-10-09T10:15:30.000Z",
  "outcome": "partial",
  "fetch_state": "ok",
  "http_status": 200,
  "summary": {
    "coverage": "multi_channel",
    "detected_signals": 3,
    "total_signals": 12,
    "score": 78,
    "rating": "good",
    "confidence": 95,
    "passed_checks": 18,
    "warning_checks": 12,
    "failed_checks": 2,
    "unknown_checks": 2,
    "not_applicable_checks": 8
  },
  "signals": {
    "webmcp": {
      "status": "unknown",
      "validation": "runtime_required",
      "method": "static_html",
      "checked_url": "https://www.example.com/",
      "http_status": 200,
      "evidence": [],
      "caveats": [
        "runtime_observation_required"
      ]
    },
    "remote_mcp": {
      "status": "not_detected",
      "validation": "not_applicable",
      "method": "oauth_protected_resource_metadata",
      "checked_url": "https://www.example.com/.well-known/oauth-protected-resource/mcp",
      "http_status": 404,
      "evidence": [
        "exact_missing_response"
      ],
      "caveats": [
        "custom_or_unauthenticated_endpoints_not_checked"
      ]
    },
    "openapi": {
      "status": "detected",
      "validation": "confirmed",
      "method": "service_description",
      "checked_url": "https://www.example.com/openapi.json",
      "http_status": 200,
      "evidence": [
        "openapi_document_validated"
      ],
      "caveats": []
    },
    "llms_txt": {
      "status": "detected",
      "validation": "confirmed",
      "method": "well_known_path",
      "checked_url": "https://www.example.com/llms.txt",
      "http_status": 200,
      "evidence": [
        "markdown_h1",
        "markdown_links_1"
      ],
      "caveats": []
    },
    "api_catalog": {
      "status": "detected",
      "validation": "confirmed",
      "method": "rfc9727_api_catalog",
      "checked_url": "https://www.example.com/.well-known/api-catalog",
      "http_status": 200,
      "evidence": [
        "service_descriptions_1",
        "api_catalog_link_header"
      ],
      "caveats": []
    },
    "mcp_server_card": {
      "status": "not_detected",
      "validation": "not_applicable",
      "method": "mcp_server_card",
      "checked_url": null,
      "http_status": null,
      "evidence": [
        "bounded_candidates_missing"
      ],
      "caveats": []
    },
    "agent_skills": {
      "status": "not_detected",
      "validation": "not_applicable",
      "method": "agent_skills_index",
      "checked_url": "https://www.example.com/.well-known/agent-skills/index.json",
      "http_status": 404,
      "evidence": [
        "exact_missing_response"
      ],
      "caveats": []
    },
    "oauth": {
      "status": "not_detected",
      "validation": "not_applicable",
      "method": "oauth_server_metadata",
      "checked_url": null,
      "http_status": null,
      "evidence": [
        "bounded_candidates_missing"
      ],
      "caveats": []
    },
    "markdown": {
      "status": "not_detected",
      "validation": "not_applicable",
      "method": "accept_content_negotiation",
      "checked_url": "https://www.example.com/",
      "http_status": 200,
      "evidence": [
        "html_returned_for_markdown_accept"
      ],
      "caveats": []
    },
    "web_bot_auth": {
      "status": "not_detected",
      "validation": "not_applicable",
      "method": "web_bot_auth_directory",
      "checked_url": "https://www.example.com/.well-known/http-message-signatures-directory",
      "http_status": 404,
      "evidence": [
        "exact_missing_response"
      ],
      "caveats": []
    },
    "sitemap_markdown": {
      "status": "not_detected",
      "validation": "not_applicable",
      "method": "markdown_sitemap",
      "checked_url": null,
      "http_status": null,
      "evidence": [
        "bounded_candidates_missing"
      ],
      "caveats": []
    },
    "agent_guide": {
      "status": "not_detected",
      "validation": "not_applicable",
      "method": "public_agent_guide",
      "checked_url": null,
      "http_status": null,
      "evidence": [
        "bounded_candidates_missing"
      ],
      "caveats": []
    }
  },
  "foundations": {
    "https": {
      "state": "pass",
      "evidence": [
        "https"
      ]
    },
    "indexable": {
      "state": "pass",
      "evidence": [
        "no_noindex_directive"
      ]
    },
    "robots": {
      "state": "pass",
      "evidence": [
        "robots_allows_crawl"
      ]
    },
    "title": {
      "state": "pass",
      "evidence": [
        "title_present"
      ]
    },
    "meta_description": {
      "state": "pass",
      "evidence": [
        "meta_description_present"
      ]
    },
    "canonical": {
      "state": "warn",
      "evidence": [
        "canonical_missing"
      ]
    },
    "language": {
      "state": "pass",
      "evidence": [
        "html_lang_present"
      ]
    },
    "structured_data": {
      "state": "warn",
      "evidence": [
        "json_ld_not_detected"
      ]
    },
    "labeled_forms": {
      "state": "pass",
      "evidence": [
        "no_form_controls"
      ]
    },
    "origin_isolation": {
      "state": "unknown",
      "evidence": [
        "origin_agent_cluster_not_declared"
      ]
    },
    "webmcp_permission": {
      "state": "pass",
      "evidence": [
        "tools_permission_default_self"
      ]
    }
  },
  "dimensions": {
    "discoverability": {
      "score": 84,
      "confidence": 100,
      "passed": 8,
      "warned": 1,
      "failed": 2,
      "unknown": 0,
      "not_applicable": 1,
      "checks": [
        "https",
        "http_response",
        "redirect_chain",
        "html_content_type",
        "indexable",
        "robots_access",
        "sitemap_xml",
        "sitemap_lastmod",
        "target_discoverable",
        "llms_txt",
        "sitemap_markdown",
        "api_catalog_link"
      ]
    },
    "content": {
      "score": 67,
      "confidence": 100,
      "passed": 5,
      "warned": 8,
      "failed": 0,
      "unknown": 0,
      "not_applicable": 2,
      "checks": [
        "title",
        "meta_description",
        "open_graph",
        "canonical",
        "language",
        "structured_data",
        "heading_structure",
        "content_density",
        "form_controls",
        "markdown_negotiation",
        "markdown_alternate",
        "code_languages",
        "api_schema_link",
        "glossary_context",
        "public_agent_guide"
      ]
    },
    "access_policy": {
      "score": 88,
      "confidence": 100,
      "passed": 2,
      "warned": 1,
      "failed": 0,
      "unknown": 0,
      "not_applicable": 2,
      "checks": [
        "ai_bot_access",
        "explicit_ai_policy",
        "content_signals",
        "agent_content_directives",
        "web_bot_auth"
      ]
    },
    "capabilities": {
      "score": 83,
      "confidence": 75,
      "passed": 3,
      "warned": 2,
      "failed": 0,
      "unknown": 2,
      "not_applicable": 3,
      "checks": [
        "webmcp",
        "remote_mcp",
        "openapi",
        "api_catalog",
        "mcp_server_card",
        "agent_skills",
        "oauth_discovery",
        "service_description_link",
        "origin_isolation",
        "webmcp_permission"
      ]
    }
  },
  "checks": {
    "https": {
      "id": "https",
      "dimension": "discoverability",
      "state": "pass",
      "weight": 3,
      "method": "document_analysis",
      "checked_url": "https://www.example.com/",
      "http_status": 200,
      "evidence": [
        "https"
      ],
      "caveats": [],
      "reference": "HTTPS",
      "maturity": "standard"
    },
    "http_response": {
      "id": "http_response",
      "dimension": "discoverability",
      "state": "pass",
      "weight": 3,
      "method": "document_analysis",
      "checked_url": "https://www.example.com/",
      "http_status": 200,
      "evidence": [
        "http_status_200"
      ],
      "caveats": [],
      "reference": "HTTP semantics",
      "maturity": "standard"
    },
    "llms_txt": {
      "id": "llms_txt",
      "dimension": "discoverability",
      "state": "pass",
      "weight": 2,
      "method": "well_known_path",
      "checked_url": "https://www.example.com/llms.txt",
      "http_status": 200,
      "evidence": [
        "markdown_h1",
        "markdown_links_1"
      ],
      "caveats": [],
      "reference": "llms.txt proposal",
      "maturity": "proposal"
    }
  },
  "recommendations": [
    {
      "code": "ADD_CANONICAL",
      "severity": "medium"
    },
    {
      "code": "ADD_STRUCTURED_DATA",
      "severity": "low"
    },
    {
      "code": "PUBLISH_MCP_METADATA",
      "severity": "medium"
    }
  ],
  "meta": {
    "cached": false,
    "fetch_path": "primary",
    "duration_ms": 1840,
    "probe_count": 22,
    "body_truncated": false,
    "source_version": "2026-08-28",
    "last_verified": "2026-08-28",
    "rubric_version": "2026-08-28.3",
    "max_probes": 32
  }
}

HTTP 상태 코드

  • 200 성공
  • 400 잘못된 요청
  • 401 인증되지 않음
  • 402 결제 필요
  • 429 요청 과다
  • 502 잘못된 게이트웨이
GET /v1/robots 크레딧: 1

쿼리 매개변수

매개변수 유형 필수
url string 선택 사항
domain string 선택 사항
user_agent string
기본값 *
선택 사항
path string 선택 사항
skip_cache string
허용된 값 1
선택 사항

응답 필드

필드 유형
cache_age_s integer
classification object
classification.status string
classification.reason string
classification.evidence object
classification.evidence.source string
classification.evidence.method string
classification.evidence.observed_at string
classification.evidence.detail string
classification.checked_at string
domain string
url string
robots_url string
status string
checked_at string
fetch object
fetch.checked_url string
fetch.http_status integer | null
fetch.final_url string | null
fetch.via_proxy boolean | null
fetch.redirect_count integer | null
fetch.content_type string | null
fetch.bytes integer | null
fetch.truncated boolean
fetch.error string | null
sitemaps[] string[]
groups[] object[]
groups[] object
groups[].user_agents[] string[]
groups[].rules[] object[]
groups[].rules[] object
groups[].rules[].type string
groups[].rules[].path string
groups[].rules[].line integer
groups[].crawl_delay number | null
other_directives[] object[]
other_directives[] object
other_directives[].name string
other_directives[].count integer
other_directives[].standard boolean
test object
test.user_agent string
test.path string
test.allowed boolean | null
test.matched_rule object
test.matched_rule.type string
test.matched_rule.path string
test.matched_rule.line integer
test.matched_group string | null
test.matched_user_agents[] string[]
test.reason string
ai_crawlers[] object[]
ai_crawlers[] object
ai_crawlers[].user_agent string
ai_crawlers[].owner string
ai_crawlers[].purpose string
ai_crawlers[].root_access string
ai_crawlers[].group string | null
issues[] object[]
issues[] object
issues[].code string
issues[].count integer
issues[].lines[] integer[]
caveats[] string[]
summary object
summary.groups integer
summary.rules integer
summary.allow_rules integer
summary.disallow_rules integer
summary.sitemaps integer
summary.issues integer
summary.lines integer
summary.ai_crawlers_allowed integer
summary.ai_crawlers_disallowed integer
summary.ai_crawlers_partial integer
summary.ai_crawlers_unknown integer
summary.ai_crawlers_with_specific_group integer
meta object
meta.cached boolean
meta.duration_ms integer
meta.source_version string

예제 요청

curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/robots?url=https%3A%2F%2Fexample.com&domain=example.com&user_agent=GPTBot&path=%2Fadmin%2Fsettings&skip_cache=1"
const response = await fetch("https://domscan.net/v1/robots?url=https%3A%2F%2Fexample.com&domain=example.com&user_agent=GPTBot&path=%2Fadmin%2Fsettings&skip_cache=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/robots?url=https%3A%2F%2Fexample.com&domain=example.com&user_agent=GPTBot&path=%2Fadmin%2Fsettings&skip_cache=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/robots?url=https%3A%2F%2Fexample.com&domain=example.com&user_agent=GPTBot&path=%2Fadmin%2Fsettings&skip_cache=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/robots?url=https%3A%2F%2Fexample.com&domain=example.com&user_agent=GPTBot&path=%2Fadmin%2Fsettings&skip_cache=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",
  "url": "https://example.com/",
  "robots_url": "https://example.com/robots.txt",
  "status": "found",
  "checked_at": "2026-10-09T10:15:30.000Z",
  "fetch": {
    "checked_url": "https://example.com/robots.txt",
    "http_status": 200,
    "final_url": "https://example.com/robots.txt",
    "via_proxy": true,
    "redirect_count": 0,
    "content_type": "text/plain; charset=utf-8",
    "bytes": 180,
    "truncated": false,
    "error": null
  },
  "sitemaps": [
    "https://example.com/sitemap.xml"
  ],
  "groups": [
    {
      "user_agents": [
        "GPTBot",
        "CCBot"
      ],
      "rules": [
        {
          "type": "disallow",
          "path": "/",
          "line": 3
        }
      ],
      "crawl_delay": null
    },
    {
      "user_agents": [
        "*"
      ],
      "rules": [
        {
          "type": "disallow",
          "path": "/admin/",
          "line": 6
        },
        {
          "type": "allow",
          "path": "/admin/public$",
          "line": 7
        }
      ],
      "crawl_delay": 10
    }
  ],
  "other_directives": [
    {
      "name": "host",
      "count": 1,
      "standard": false
    }
  ],
  "test": {
    "user_agent": "GPTBot",
    "path": "/admin/settings",
    "allowed": false,
    "matched_rule": {
      "type": "disallow",
      "path": "/",
      "line": 3
    },
    "matched_group": "specific",
    "matched_user_agents": [
      "GPTBot"
    ],
    "reason": "matched_disallow"
  },
  "ai_crawlers": [
    {
      "user_agent": "GPTBot",
      "owner": "openai",
      "purpose": "training",
      "root_access": "disallowed",
      "group": "specific"
    },
    {
      "user_agent": "OAI-SearchBot",
      "owner": "openai",
      "purpose": "search",
      "root_access": "partial",
      "group": "wildcard"
    },
    {
      "user_agent": "ChatGPT-User",
      "owner": "openai",
      "purpose": "user_fetch",
      "root_access": "partial",
      "group": "wildcard"
    },
    {
      "user_agent": "ClaudeBot",
      "owner": "anthropic",
      "purpose": "training",
      "root_access": "partial",
      "group": "wildcard"
    },
    {
      "user_agent": "Claude-SearchBot",
      "owner": "anthropic",
      "purpose": "search",
      "root_access": "partial",
      "group": "wildcard"
    },
    {
      "user_agent": "Claude-User",
      "owner": "anthropic",
      "purpose": "user_fetch",
      "root_access": "partial",
      "group": "wildcard"
    },
    {
      "user_agent": "Google-Extended",
      "owner": "google",
      "purpose": "training_control",
      "root_access": "partial",
      "group": "wildcard"
    },
    {
      "user_agent": "PerplexityBot",
      "owner": "perplexity",
      "purpose": "search",
      "root_access": "partial",
      "group": "wildcard"
    },
    {
      "user_agent": "Perplexity-User",
      "owner": "perplexity",
      "purpose": "user_fetch",
      "root_access": "partial",
      "group": "wildcard"
    },
    {
      "user_agent": "CCBot",
      "owner": "common_crawl",
      "purpose": "training",
      "root_access": "disallowed",
      "group": "specific"
    },
    {
      "user_agent": "Bytespider",
      "owner": "bytedance",
      "purpose": "training",
      "root_access": "partial",
      "group": "wildcard"
    },
    {
      "user_agent": "Applebot-Extended",
      "owner": "apple",
      "purpose": "training_control",
      "root_access": "partial",
      "group": "wildcard"
    },
    {
      "user_agent": "meta-externalagent",
      "owner": "meta",
      "purpose": "training",
      "root_access": "partial",
      "group": "wildcard"
    },
    {
      "user_agent": "Amazonbot",
      "owner": "amazon",
      "purpose": "search",
      "root_access": "partial",
      "group": "wildcard"
    }
  ],
  "issues": [
    {
      "code": "crawl_delay_nonstandard",
      "count": 1,
      "lines": [
        8
      ]
    },
    {
      "code": "nonstandard_directive",
      "count": 1,
      "lines": [
        10
      ]
    }
  ],
  "caveats": [],
  "summary": {
    "groups": 2,
    "rules": 3,
    "allow_rules": 1,
    "disallow_rules": 2,
    "sitemaps": 1,
    "issues": 2,
    "lines": 12,
    "ai_crawlers_allowed": 0,
    "ai_crawlers_disallowed": 2,
    "ai_crawlers_partial": 12,
    "ai_crawlers_unknown": 0,
    "ai_crawlers_with_specific_group": 2
  },
  "meta": {
    "cached": false,
    "duration_ms": 184,
    "source_version": "2026-10-09"
  }
}

HTTP 상태 코드

  • 200 성공
  • 400 잘못된 요청
  • 401 인증되지 않음
  • 402 결제 필요
  • 429 요청 과다
  • 502 잘못된 게이트웨이
POST /v1/robots/test 크레딧: 1

본문 매개변수

매개변수 유형 필수
robots_txt string 선택 사항
url string 선택 사항
urls string[] 필수
user_agents string[] 선택 사항

응답 필드

필드 유형
source string
url string | null
robots_url string | null
status string
checked_at string
summary object
summary.tests integer
summary.allowed integer
summary.disallowed integer
summary.unknown integer
summary.groups integer
summary.rules integer
summary.issues integer
user_agents[] object[]
user_agents[] object
user_agents[].user_agent string
user_agents[].allowed integer
user_agents[].disallowed integer
user_agents[].unknown integer
results[] object[]
results[] object
results[].url string
results[].path string
results[].user_agent string
results[].token string
results[].allowed boolean | null
results[].reason string
results[].matched_rule object
results[].matched_rule.type string
results[].matched_rule.path string
results[].matched_rule.line integer
results[].matched_group string | null
results[].matched_user_agents[] string[]
results[].vendor object
results[].vendor.allowed boolean | null
results[].vendor.reason string
results[].vendor.matched_rule object
results[].vendor.matched_rule.type string
results[].vendor.matched_rule.path string
results[].vendor.matched_rule.line integer
results[].vendor.matched_group string
sitemaps[] string[]
issues[] object[]
issues[] object
issues[].code string
issues[].count integer
issues[].lines[] integer[]
caveats[] string[]
fetch object
fetch.checked_url string
fetch.http_status integer | null
fetch.final_url string | null
fetch.via_proxy boolean | null
fetch.redirect_count integer | null
fetch.content_type string | null
fetch.bytes integer | null
fetch.truncated boolean
fetch.error string | null
meta object
meta.cached boolean
meta.duration_ms integer

예제 요청

curl -X POST "https://domscan.net/v1/robots/test" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $DOMSCAN_API_KEY" \
  -d '{
  "robots_txt": "User-agent: GPTBot\nDisallow: /\n\nUser-agent: *\nDisallow: /admin/\nAllow: /admin/public",
  "urls": [
    "/blog/post-1",
    "/admin/public"
  ],
  "user_agents": [
    "Googlebot",
    "GPTBot"
  ]
}'
const response = await fetch("https://domscan.net/v1/robots/test", {
  method: "POST",
  headers: { "X-API-Key": process.env.DOMSCAN_API_KEY, "Content-Type": "application/json" },
  body: JSON.stringify({
    "robots_txt": "User-agent: GPTBot\nDisallow: /\n\nUser-agent: *\nDisallow: /admin/\nAllow: /admin/public",
    "urls": [
      "/blog/post-1",
      "/admin/public"
    ],
    "user_agents": [
      "Googlebot",
      "GPTBot"
    ]
  }),
});
const data = await response.json();
console.log(data);
import os
import requests

response = requests.post(
    "https://domscan.net/v1/robots/test",
    headers={"X-API-Key": os.environ["DOMSCAN_API_KEY"]},
    json={
        "robots_txt": "User-agent: GPTBot\nDisallow: /\n\nUser-agent: *\nDisallow: /admin/\nAllow: /admin/public",
        "urls": [
            "/blog/post-1",
            "/admin/public",
        ],
        "user_agents": [
            "Googlebot",
            "GPTBot",
        ],
    },
)
print(response.json())
package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
	"strings"
)

func main() {
	body := strings.NewReader(`{
	  "robots_txt": "User-agent: GPTBot\nDisallow: /\n\nUser-agent: *\nDisallow: /admin/\nAllow: /admin/public",
	  "urls": [
	    "/blog/post-1",
	    "/admin/public"
	  ],
	  "user_agents": [
	    "Googlebot",
	    "GPTBot"
	  ]
	}`)
	req, err := http.NewRequest(http.MethodPost, "https://domscan.net/v1/robots/test", 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/robots/test")
request = Net::HTTP::Post.new(uri)
request["X-API-Key"] = ENV.fetch("DOMSCAN_API_KEY")
request["Content-Type"] = "application/json"
request.body = JSON.generate({
  "robots_txt" => "User-agent: GPTBot\nDisallow: /\n\nUser-agent: *\nDisallow: /admin/\nAllow: /admin/public",
  "urls" => [
    "/blog/post-1",
    "/admin/public"
  ],
  "user_agents" => [
    "Googlebot",
    "GPTBot"
  ]
})

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))

예제 응답

{
  "source": "provided",
  "url": null,
  "robots_url": null,
  "status": "found",
  "checked_at": "2026-10-13T10:00:00.000Z",
  "summary": {
    "tests": 4,
    "allowed": 2,
    "disallowed": 2,
    "unknown": 0,
    "groups": 2,
    "rules": 3,
    "issues": 0
  },
  "user_agents": [
    {
      "user_agent": "Googlebot",
      "allowed": 2,
      "disallowed": 0,
      "unknown": 0
    },
    {
      "user_agent": "GPTBot",
      "allowed": 0,
      "disallowed": 2,
      "unknown": 0
    }
  ],
  "results": [
    {
      "url": "/blog/post-1",
      "path": "/blog/post-1",
      "user_agent": "Googlebot",
      "token": "Googlebot",
      "allowed": true,
      "reason": "no_matching_rule",
      "matched_rule": null,
      "matched_group": "wildcard",
      "matched_user_agents": [
        "*"
      ],
      "vendor": null
    },
    {
      "url": "/admin/public",
      "path": "/admin/public",
      "user_agent": "Googlebot",
      "token": "Googlebot",
      "allowed": true,
      "reason": "matched_allow",
      "matched_rule": {
        "type": "allow",
        "path": "/admin/public",
        "line": 6
      },
      "matched_group": "wildcard",
      "matched_user_agents": [
        "*"
      ],
      "vendor": null
    },
    {
      "url": "/blog/post-1",
      "path": "/blog/post-1",
      "user_agent": "GPTBot",
      "token": "GPTBot",
      "allowed": false,
      "reason": "matched_disallow",
      "matched_rule": {
        "type": "disallow",
        "path": "/",
        "line": 2
      },
      "matched_group": "specific",
      "matched_user_agents": [
        "GPTBot"
      ],
      "vendor": null
    },
    {
      "url": "/admin/public",
      "path": "/admin/public",
      "user_agent": "GPTBot",
      "token": "GPTBot",
      "allowed": false,
      "reason": "matched_disallow",
      "matched_rule": {
        "type": "disallow",
        "path": "/",
        "line": 2
      },
      "matched_group": "specific",
      "matched_user_agents": [
        "GPTBot"
      ],
      "vendor": null
    }
  ],
  "sitemaps": [],
  "issues": [],
  "caveats": [],
  "fetch": null,
  "meta": {
    "cached": false,
    "duration_ms": 2
  }
}

HTTP 상태 코드

  • 200 성공
  • 400 잘못된 요청
  • 401 인증되지 않음
  • 402 결제 필요
  • 409 HTTP 409
  • 422 HTTP 422
  • 429 요청 과다
GET /v1/sitemaps 크레딧: 2

쿼리 매개변수

매개변수 유형 필수
url string 선택 사항
domain string 선택 사항
sitemap string 선택 사항
max_sitemaps integer
기본값 5
선택 사항

응답 필드

필드 유형
classification object
classification.status string
classification.reason string
classification.evidence object
classification.evidence.source string
classification.evidence.method string
classification.evidence.observed_at string
classification.evidence.detail string
classification.checked_at string
url string
domain string
origin string
status string
checked_at string
fetch object
fetch.checked_url string
fetch.http_status integer | null
fetch.final_url string | null
fetch.via_proxy boolean | null
robots_txt object
robots_txt.status string
robots_txt.url string
robots_txt.http_status integer | null
robots_txt.declared_sitemaps[] object[]
robots_txt.declared_sitemaps[] object
robots_txt.declared_sitemaps[].url string
robots_txt.declared_sitemaps[].same_site boolean
sitemaps[] object[]
sitemaps[] object
sitemaps[].url string
sitemaps[].source string
sitemaps[].parent string | null
sitemaps[].status string
sitemaps[].http_status integer | null
sitemaps[].final_url string | null
sitemaps[].via_proxy boolean | null
sitemaps[].content_type string | null
sitemaps[].bytes integer | null
sitemaps[].type string | null
sitemaps[].url_count integer
sitemaps[].child_sitemap_count integer
sitemaps[].lastmod object
sitemaps[].lastmod.newest string | null
sitemaps[].lastmod.oldest string | null
sitemaps[].lastmod.with_lastmod_ratio number | null
sitemaps[].extensions object
sitemaps[].extensions.images boolean
sitemaps[].extensions.videos boolean
sitemaps[].extensions.news boolean
sitemaps[].extensions.hreflang boolean
sitemaps[].counts object
sitemaps[].counts.invalid_loc integer
sitemaps[].counts.missing_loc integer
sitemaps[].counts.loc_too_long integer
sitemaps[].counts.cross_host_urls integer
sitemaps[].counts.protocol_mismatch_urls integer
sitemaps[].counts.duplicate_urls integer
sitemaps[].counts.invalid_lastmod integer
sitemaps[].counts.future_lastmod integer
sitemaps[].counts.cross_site_child_sitemaps integer
sitemaps[].issues[] string[]
sitemaps[].sample_urls[] string[]
totals object
totals.sitemaps_checked integer
totals.sitemaps_discovered integer
totals.urls_counted integer
totals.budget_exhausted boolean
freshness object
freshness.newest_lastmod string | null
freshness.days_since_newest integer | null
issues[] string[]
caveats[] string[]

예제 요청

curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/sitemaps?url=https%3A%2F%2Fexample.com&domain=example.com&sitemap=https%3A%2F%2Fexample.com%2Fsitemap_index.xml&max_sitemaps=5"
const response = await fetch("https://domscan.net/v1/sitemaps?url=https%3A%2F%2Fexample.com&domain=example.com&sitemap=https%3A%2F%2Fexample.com%2Fsitemap_index.xml&max_sitemaps=5", {
  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/sitemaps?url=https%3A%2F%2Fexample.com&domain=example.com&sitemap=https%3A%2F%2Fexample.com%2Fsitemap_index.xml&max_sitemaps=5",
    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/sitemaps?url=https%3A%2F%2Fexample.com&domain=example.com&sitemap=https%3A%2F%2Fexample.com%2Fsitemap_index.xml&max_sitemaps=5", 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/sitemaps?url=https%3A%2F%2Fexample.com&domain=example.com&sitemap=https%3A%2F%2Fexample.com%2Fsitemap_index.xml&max_sitemaps=5")
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))

예제 응답

{
  "url": "https://example.com/",
  "domain": "example.com",
  "origin": "https://example.com",
  "status": "found",
  "checked_at": "2026-10-09T12:00:00.000Z",
  "fetch": {
    "checked_url": "https://example.com/robots.txt",
    "http_status": 200,
    "final_url": "https://example.com/robots.txt",
    "via_proxy": true
  },
  "robots_txt": {
    "status": "found",
    "url": "https://example.com/robots.txt",
    "http_status": 200,
    "declared_sitemaps": [
      {
        "url": "https://example.com/sitemap_index.xml",
        "same_site": true
      },
      {
        "url": "https://sitemaps.example.net/example.xml",
        "same_site": false
      }
    ]
  },
  "sitemaps": [
    {
      "url": "https://example.com/sitemap_index.xml",
      "source": "robots",
      "parent": null,
      "status": "ok",
      "http_status": 200,
      "final_url": "https://example.com/sitemap_index.xml",
      "via_proxy": true,
      "content_type": "application/xml; charset=utf-8",
      "bytes": 412,
      "type": "sitemapindex",
      "url_count": 0,
      "child_sitemap_count": 2,
      "lastmod": {
        "newest": "2026-10-01T00:00:00.000Z",
        "oldest": "2026-10-01T00:00:00.000Z",
        "with_lastmod_ratio": 1
      },
      "extensions": {
        "images": false,
        "videos": false,
        "news": false,
        "hreflang": false
      },
      "counts": {
        "invalid_loc": 0,
        "missing_loc": 0,
        "loc_too_long": 0,
        "cross_host_urls": 0,
        "protocol_mismatch_urls": 0,
        "duplicate_urls": 0,
        "invalid_lastmod": 0,
        "future_lastmod": 0,
        "cross_site_child_sitemaps": 0
      },
      "issues": [],
      "sample_urls": [
        "https://example.com/posts.xml",
        "https://example.com/pages.xml"
      ]
    },
    {
      "url": "https://example.com/posts.xml",
      "source": "index_child",
      "parent": "https://example.com/sitemap_index.xml",
      "status": "ok",
      "http_status": 200,
      "final_url": "https://example.com/posts.xml",
      "via_proxy": true,
      "content_type": "application/xml",
      "bytes": 18234,
      "type": "urlset",
      "url_count": 120,
      "child_sitemap_count": 0,
      "lastmod": {
        "newest": "2026-10-05T00:00:00.000Z",
        "oldest": "2024-03-11T00:00:00.000Z",
        "with_lastmod_ratio": 0.975
      },
      "extensions": {
        "images": true,
        "videos": false,
        "news": false,
        "hreflang": true
      },
      "counts": {
        "invalid_loc": 0,
        "missing_loc": 0,
        "loc_too_long": 0,
        "cross_host_urls": 0,
        "protocol_mismatch_urls": 2,
        "duplicate_urls": 1,
        "invalid_lastmod": 3,
        "future_lastmod": 0,
        "cross_site_child_sitemaps": 0
      },
      "issues": [
        "protocol_mismatch",
        "duplicate_urls",
        "invalid_lastmod"
      ],
      "sample_urls": [
        "https://example.com/blog/a",
        "https://example.com/blog/b",
        "https://example.com/blog/c",
        "http://example.com/blog/d",
        "https://example.com/blog/e"
      ]
    },
    {
      "url": "https://example.com/pages.xml",
      "source": "index_child",
      "parent": "https://example.com/sitemap_index.xml",
      "status": "unknown",
      "http_status": 429,
      "final_url": "https://example.com/pages.xml",
      "via_proxy": true,
      "content_type": "text/html",
      "bytes": 162,
      "type": null,
      "url_count": 0,
      "child_sitemap_count": 0,
      "lastmod": {
        "newest": null,
        "oldest": null,
        "with_lastmod_ratio": null
      },
      "extensions": {
        "images": false,
        "videos": false,
        "news": false,
        "hreflang": false
      },
      "counts": {
        "invalid_loc": 0,
        "missing_loc": 0,
        "loc_too_long": 0,
        "cross_host_urls": 0,
        "protocol_mismatch_urls": 0,
        "duplicate_urls": 0,
        "invalid_lastmod": 0,
        "future_lastmod": 0,
        "cross_site_child_sitemaps": 0
      },
      "issues": [
        "rate_limited"
      ],
      "sample_urls": []
    }
  ],
  "totals": {
    "sitemaps_checked": 3,
    "sitemaps_discovered": 4,
    "urls_counted": 120,
    "budget_exhausted": false
  },
  "freshness": {
    "newest_lastmod": "2026-10-05T00:00:00.000Z",
    "days_since_newest": 4
  },
  "issues": [
    "cross_site_sitemap_declared",
    "protocol_mismatch",
    "duplicate_urls",
    "invalid_lastmod",
    "rate_limited"
  ],
  "caveats": [
    "counts_cover_fetched_files_only",
    "cross_site_sitemaps_not_fetched"
  ]
}

HTTP 상태 코드

  • 200 성공
  • 400 잘못된 요청
  • 401 인증되지 않음
  • 402 결제 필요
  • 429 요청 과다
  • 502 잘못된 게이트웨이
GET /v1/onpage 크레딧: 2-6

쿼리 매개변수

매개변수 유형 필수
url string 필수
render boolean 선택 사항

응답 필드

필드 유형
url string
final_url string
status string
reason string | null
checked_at string
fetch object
fetch.http_status integer | null
fetch.final_url string
fetch.content_type string | null
fetch.bytes integer
fetch.truncated boolean
fetch.redirect_count integer
fetch.duration_ms integer
fetch.rendered boolean
score integer | null
meta object
meta.title string | null
meta.title_length integer
meta.description string | null
meta.description_length integer
meta.canonical string | null
meta.canonical_self_referencing boolean | null
meta.canonical_header string | null
meta.robots string | null
meta.googlebot string | null
meta.x_robots_tag string | null
meta.indexable boolean
meta.googlebot_noindex boolean
meta.nofollow boolean
meta.meta_refresh string | null
meta.duplicate_meta_tags[] string[]
meta.lang string | null
meta.viewport string | null
meta.favicon string | null
meta.open_graph object
meta.open_graph.title string | null
meta.open_graph.description string | null
meta.open_graph.image string | null
meta.open_graph.url string | null
meta.open_graph.type string | null
meta.twitter object
meta.twitter.card string | null
meta.twitter.title string | null
meta.twitter.description string | null
meta.twitter.image string | null
headings object
headings.h1[] string[]
headings.counts object
headings.counts.h1 integer
headings.counts.h2 integer
headings.counts.h3 integer
headings.counts.h4 integer
headings.counts.h5 integer
headings.counts.h6 integer
headings.outline[] object[]
headings.outline[] object
headings.outline[].level integer
headings.outline[].text string
content object
content.word_count integer
content.text_bytes integer
content.html_bytes integer
content.text_to_html_ratio number
links object
links.total integer
links.internal integer
links.external integer
links.nofollow integer
links.empty_anchor integer
links.unresolvable integer
images object
images.total integer
images.missing_alt integer
images.empty_alt integer
images.missing_dimensions integer
images.lazy_loaded integer
resources object
resources.scripts integer
resources.inline_scripts integer
resources.stylesheets integer
resources.iframes integer
resources.mixed_content integer
resources.render_blocking_scripts integer | null
resources.render_blocking_stylesheets integer | null
structured_data object
structured_data.json_ld integer
structured_data.microdata integer
structured_data.rdfa integer
structured_data.types[] string[]
hreflang object
hreflang.count integer
checks[] object[]
checks[] object
checks[].id string
checks[].status string
checks[].severity string
checks[].value unknown
issues[] string[]
caveats[] string[]

예제 요청

curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/onpage?url=https%3A%2F%2Fexample.com&render=false"
const response = await fetch("https://domscan.net/v1/onpage?url=https%3A%2F%2Fexample.com&render=false", {
  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/onpage?url=https%3A%2F%2Fexample.com&render=false",
    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/onpage?url=https%3A%2F%2Fexample.com&render=false", 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/onpage?url=https%3A%2F%2Fexample.com&render=false")
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))

예제 응답

{
  "url": "https://example.com/shoes/trail-runner",
  "final_url": "https://example.com/shoes/trail-runner",
  "status": "ok",
  "reason": null,
  "checked_at": "2026-10-13T12:00:00.000Z",
  "fetch": {
    "http_status": 200,
    "final_url": "https://example.com/shoes/trail-runner",
    "content_type": "text/html",
    "bytes": 3535,
    "truncated": false,
    "redirect_count": 0,
    "duration_ms": 412,
    "rendered": false
  },
  "score": 87,
  "meta": {
    "title": "Trail Running Shoes for Rocky Terrain | Example Outdoor",
    "title_length": 55,
    "description": "Lightweight trail running shoes with a grippy outsole, rock plate and breathable mesh. Free returns within 30 days on every pair.",
    "description_length": 129,
    "canonical": "https://example.com/shoes/trail-runner",
    "canonical_self_referencing": true,
    "canonical_header": null,
    "robots": "index, follow",
    "googlebot": null,
    "x_robots_tag": null,
    "indexable": true,
    "googlebot_noindex": false,
    "nofollow": false,
    "meta_refresh": null,
    "duplicate_meta_tags": [],
    "lang": "en",
    "viewport": "width=device-width, initial-scale=1",
    "favicon": "/favicon.ico",
    "open_graph": {
      "title": "Trail Running Shoes for Rocky Terrain",
      "description": null,
      "image": "https://example.com/images/trail-runner.jpg",
      "url": null,
      "type": null
    },
    "twitter": {
      "card": "summary_large_image",
      "title": null,
      "description": null,
      "image": null
    }
  },
  "headings": {
    "h1": [
      "Trail Running Shoes for Rocky Terrain"
    ],
    "counts": {
      "h1": 1,
      "h2": 1,
      "h3": 0,
      "h4": 1,
      "h5": 0,
      "h6": 0
    },
    "outline": [
      {
        "level": 1,
        "text": "Trail Running Shoes for Rocky Terrain"
      },
      {
        "level": 2,
        "text": "Why runners choose these trail running shoes"
      },
      {
        "level": 4,
        "text": "Sizing"
      }
    ]
  },
  "content": {
    "word_count": 122,
    "text_bytes": 780,
    "html_bytes": 3535,
    "text_to_html_ratio": 0.221
  },
  "links": {
    "total": 7,
    "internal": 5,
    "external": 2,
    "nofollow": 1,
    "empty_anchor": 1,
    "unresolvable": 0
  },
  "images": {
    "total": 3,
    "missing_alt": 1,
    "empty_alt": 0,
    "missing_dimensions": 2,
    "lazy_loaded": 0
  },
  "resources": {
    "scripts": 1,
    "inline_scripts": 0,
    "stylesheets": 1,
    "iframes": 0,
    "mixed_content": 1,
    "render_blocking_scripts": 0,
    "render_blocking_stylesheets": 1
  },
  "structured_data": {
    "json_ld": 2,
    "microdata": 1,
    "rdfa": 0,
    "types": [
      "AggregateRating",
      "Brand",
      "BreadcrumbList",
      "ListItem",
      "Offer",
      "Product",
      "Rating",
      "Review"
    ]
  },
  "hreflang": {
    "count": 3
  },
  "checks": [
    {
      "id": "mixed_content",
      "status": "fail",
      "severity": "high",
      "value": 1
    },
    {
      "id": "heading_hierarchy",
      "status": "warn",
      "severity": "low",
      "value": 1
    },
    {
      "id": "word_count",
      "status": "warn",
      "severity": "medium",
      "value": 122
    },
    {
      "id": "images_alt",
      "status": "warn",
      "severity": "medium",
      "value": 1
    },
    {
      "id": "title_present",
      "status": "pass",
      "severity": "high"
    },
    {
      "id": "h1_present",
      "status": "pass",
      "severity": "high",
      "value": 1
    },
    {
      "id": "render_blocking_resources",
      "status": "warn",
      "severity": "low",
      "value": 1
    }
  ],
  "issues": [
    "mixed_content",
    "heading_hierarchy",
    "word_count",
    "images_alt",
    "images_dimensions",
    "empty_anchor_text",
    "render_blocking_resources"
  ],
  "caveats": []
}

HTTP 상태 코드

  • 200 성공
  • 400 잘못된 요청
  • 401 인증되지 않음
  • 402 결제 필요
  • 429 요청 과다
GET /v1/onpage/render-diff 크레딧: 7

쿼리 매개변수

매개변수 유형 필수
url string 필수

응답 필드

필드 유형
url string
final_url string
status string
reason string | null
checked_at string
raw object
raw.fetch object
raw.fetch.http_status integer | null
raw.fetch.final_url string
raw.fetch.content_type string | null
raw.fetch.bytes integer
raw.fetch.truncated boolean
raw.fetch.redirect_count integer
raw.fetch.duration_ms integer
raw.fetch.rendered boolean
raw.signals object
raw.signals.title string | null
raw.signals.meta_description string | null
raw.signals.canonical string | null
raw.signals.robots string | null
raw.signals.noindex boolean
raw.signals.h1[] string[]
raw.signals.word_count integer
raw.signals.internal_links integer
raw.signals.external_links integer
raw.signals.structured_data_types[] string[]
raw.signals.hreflang_count integer
raw.signals.lang string | null
rendered object
rendered.fetch object
rendered.fetch.http_status integer | null
rendered.fetch.final_url string
rendered.fetch.content_type string | null
rendered.fetch.bytes integer
rendered.fetch.truncated boolean
rendered.fetch.redirect_count integer
rendered.fetch.duration_ms integer
rendered.fetch.rendered boolean
rendered.signals object
rendered.signals.title string | null
rendered.signals.meta_description string | null
rendered.signals.canonical string | null
rendered.signals.robots string | null
rendered.signals.noindex boolean
rendered.signals.h1[] string[]
rendered.signals.word_count integer
rendered.signals.internal_links integer
rendered.signals.external_links integer
rendered.signals.structured_data_types[] string[]
rendered.signals.hreflang_count integer
rendered.signals.lang string | null
js_dependence string | null
rendered_word_share number | null
differences[] object[]
differences[] object
differences[].field string
differences[].change string
differences[].impact string
differences[].raw unknown
differences[].rendered unknown
issues[] string[]

예제 요청

curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/onpage/render-diff?url=https%3A%2F%2Fexample.com"
const response = await fetch("https://domscan.net/v1/onpage/render-diff?url=https%3A%2F%2Fexample.com", {
  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/onpage/render-diff?url=https%3A%2F%2Fexample.com",
    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/onpage/render-diff?url=https%3A%2F%2Fexample.com", 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/onpage/render-diff?url=https%3A%2F%2Fexample.com")
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))

예제 응답

{
  "url": "https://example.com/shoes/trail-runner",
  "final_url": "https://example.com/shoes/trail-runner",
  "status": "ok",
  "reason": null,
  "checked_at": "2026-10-13T12:00:00.000Z",
  "raw": {
    "fetch": {
      "http_status": 200,
      "final_url": "https://example.com/shoes/trail-runner",
      "content_type": "text/html",
      "bytes": 183,
      "truncated": false,
      "redirect_count": 0,
      "duration_ms": 380,
      "rendered": false
    },
    "signals": {
      "title": "Example Outdoor",
      "meta_description": null,
      "canonical": null,
      "robots": "noindex",
      "noindex": true,
      "h1": [],
      "word_count": 0,
      "internal_links": 0,
      "external_links": 0,
      "structured_data_types": [],
      "hreflang_count": 0,
      "lang": "en"
    }
  },
  "rendered": {
    "fetch": {
      "http_status": 200,
      "final_url": "https://example.com/shoes/trail-runner",
      "content_type": "text/html",
      "bytes": 3535,
      "truncated": false,
      "redirect_count": 0,
      "duration_ms": 4210,
      "rendered": true
    },
    "signals": {
      "title": "Trail Running Shoes for Rocky Terrain | Example Outdoor",
      "meta_description": "Lightweight trail running shoes with a grippy outsole, rock plate and breathable mesh. Free returns within 30 days on every pair.",
      "canonical": "https://example.com/shoes/trail-runner",
      "robots": "index, follow",
      "noindex": false,
      "h1": [
        "Trail Running Shoes for Rocky Terrain"
      ],
      "word_count": 122,
      "internal_links": 5,
      "external_links": 2,
      "structured_data_types": [
        "AggregateRating",
        "Brand",
        "BreadcrumbList",
        "ListItem",
        "Offer",
        "Product",
        "Rating",
        "Review"
      ],
      "hreflang_count": 3,
      "lang": "en"
    }
  },
  "js_dependence": "high",
  "rendered_word_share": 1,
  "differences": [
    {
      "field": "title",
      "change": "changed_by_js",
      "impact": "high",
      "raw": "Example Outdoor",
      "rendered": "Trail Running Shoes for Rocky Terrain | Example Outdoor"
    },
    {
      "field": "meta_description",
      "change": "added_by_js",
      "impact": "medium",
      "raw": null,
      "rendered": "Lightweight trail running shoes with a grippy outsole, rock plate and breathable mesh. Free returns within 30 days on every pair."
    },
    {
      "field": "canonical",
      "change": "added_by_js",
      "impact": "high",
      "raw": null,
      "rendered": "https://example.com/shoes/trail-runner"
    },
    {
      "field": "robots",
      "change": "changed_by_js",
      "impact": "high",
      "raw": "noindex",
      "rendered": "index, follow"
    },
    {
      "field": "noindex",
      "change": "removed_by_js",
      "impact": "high",
      "raw": true,
      "rendered": false
    }
  ],
  "issues": [
    "robots_changed_by_js",
    "canonical_changed_by_js",
    "h1_requires_js",
    "content_requires_js",
    "links_require_js",
    "structured_data_changed_by_js"
  ]
}

HTTP 상태 코드

  • 200 성공
  • 400 잘못된 요청
  • 401 인증되지 않음
  • 402 결제 필요
  • 429 요청 과다
GET /v1/structured-data 크레딧: 2-6

쿼리 매개변수

매개변수 유형 필수
url string 필수
render boolean 선택 사항

응답 필드

필드 유형
url string
final_url string
status string
reason string | null
checked_at string
fetch object
fetch.http_status integer | null
fetch.final_url string
fetch.content_type string | null
fetch.bytes integer
fetch.truncated boolean
fetch.redirect_count integer
fetch.duration_ms integer
fetch.rendered boolean
summary object
summary.json_ld integer
summary.microdata integer
summary.rdfa integer
summary.total_items integer
summary.valid_items integer
summary.errors integer
summary.warnings integer
types[] string[]
block_errors[] string[]
items[] object[]
items[] object
items[].format string
items[].types[] string[]
items[].properties[] string[]
items[].values object
items[].children[] object[]
items[].children[] object
items[].children[].format string
items[].children[].types[] string[]
items[].children[].properties[] string[]
items[].children[].values object
items[].children[].children[] object[]
items[].children[].children[] object
items[].children[].path string
items[].children[].status string
items[].children[].errors[] object[]
items[].children[].errors[] object
items[].children[].errors[].code string
items[].children[].errors[].property string
items[].children[].warnings[] object[]
items[].children[].warnings[] object
items[].children[].warnings[].code string
items[].children[].warnings[].property string
items[].path string
items[].status string
items[].errors[] object[]
items[].errors[] object
items[].errors[].code string
items[].errors[].property string
items[].warnings[] object[]
items[].warnings[] object
items[].warnings[].code string
items[].warnings[].property string

예제 요청

curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/structured-data?url=https%3A%2F%2Fexample.com&render=false"
const response = await fetch("https://domscan.net/v1/structured-data?url=https%3A%2F%2Fexample.com&render=false", {
  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/structured-data?url=https%3A%2F%2Fexample.com&render=false",
    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/structured-data?url=https%3A%2F%2Fexample.com&render=false", 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/structured-data?url=https%3A%2F%2Fexample.com&render=false")
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))

예제 응답

{
  "url": "https://example.com/shoes/trail-runner",
  "final_url": "https://example.com/shoes/trail-runner",
  "status": "ok",
  "reason": null,
  "checked_at": "2026-10-13T12:00:00.000Z",
  "fetch": {
    "http_status": 200,
    "final_url": "https://example.com/shoes/trail-runner",
    "content_type": "text/html",
    "bytes": 3535,
    "truncated": false,
    "redirect_count": 0,
    "duration_ms": 412,
    "rendered": false
  },
  "summary": {
    "json_ld": 2,
    "microdata": 1,
    "rdfa": 0,
    "total_items": 9,
    "valid_items": 3,
    "errors": 1,
    "warnings": 5
  },
  "types": [
    "AggregateRating",
    "Brand",
    "BreadcrumbList",
    "ListItem",
    "Offer",
    "Product",
    "Rating",
    "Review"
  ],
  "block_errors": [],
  "items": [
    {
      "format": "json-ld",
      "types": [
        "Product"
      ],
      "properties": [
        "name",
        "image",
        "sku",
        "brand",
        "offers",
        "aggregateRating"
      ],
      "values": {
        "name": "Trail Runner 2",
        "image": "https://example.com/images/trail-runner.jpg",
        "sku": "TR-2"
      },
      "children": [
        {
          "format": "json-ld",
          "types": [
            "Brand"
          ],
          "properties": [
            "name"
          ],
          "values": {
            "name": "Example Outdoor"
          },
          "children": [],
          "path": "json_ld[0].children[0]",
          "status": "unchecked",
          "errors": [],
          "warnings": []
        },
        {
          "format": "json-ld",
          "types": [
            "Offer"
          ],
          "properties": [
            "price",
            "priceCurrency",
            "availability"
          ],
          "values": {
            "price": "129.00",
            "priceCurrency": "EUR",
            "availability": "https://schema.org/InStock"
          },
          "children": [],
          "path": "json_ld[0].children[1]",
          "status": "warnings",
          "errors": [],
          "warnings": [
            {
              "code": "missing_recommended",
              "property": "url"
            }
          ]
        },
        {
          "format": "json-ld",
          "types": [
            "AggregateRating"
          ],
          "properties": [
            "ratingValue",
            "reviewCount"
          ],
          "values": {
            "ratingValue": "4.6",
            "reviewCount": "87"
          },
          "children": [],
          "path": "json_ld[0].children[2]",
          "status": "warnings",
          "errors": [],
          "warnings": [
            {
              "code": "missing_recommended",
              "property": "bestRating"
            }
          ]
        }
      ],
      "path": "json_ld[0]",
      "status": "warnings",
      "errors": [],
      "warnings": [
        {
          "code": "missing_recommended",
          "property": "description"
        }
      ]
    },
    {
      "format": "json-ld",
      "types": [
        "BreadcrumbList"
      ],
      "properties": [
        "itemListElement"
      ],
      "values": {},
      "children": [
        {
          "format": "json-ld",
          "types": [
            "ListItem"
          ],
          "properties": [
            "position",
            "name",
            "item"
          ],
          "values": {
            "position": "1",
            "name": "Shoes",
            "item": "https://example.com/shoes"
          },
          "children": [],
          "path": "json_ld[1].children[0]",
          "status": "valid",
          "errors": [],
          "warnings": []
        },
        {
          "format": "json-ld",
          "types": [
            "ListItem"
          ],
          "properties": [
            "name"
          ],
          "values": {
            "name": "Trail Runner 2"
          },
          "children": [],
          "path": "json_ld[1].children[1]",
          "status": "errors",
          "errors": [
            {
              "code": "missing_required",
              "property": "position"
            }
          ],
          "warnings": [
            {
              "code": "missing_recommended",
              "property": "item"
            }
          ]
        }
      ],
      "path": "json_ld[1]",
      "status": "valid",
      "errors": [],
      "warnings": []
    }
  ]
}

HTTP 상태 코드

  • 200 성공
  • 400 잘못된 요청
  • 401 인증되지 않음
  • 402 결제 필요
  • 429 요청 과다
GET /v1/keyword-density 크레딧: 2-6

쿼리 매개변수

매개변수 유형 필수
url string 필수
render boolean 선택 사항
keywords string 선택 사항
top integer
기본값 20
선택 사항
include_stopwords boolean 선택 사항

응답 필드

필드 유형
url string
final_url string
status string
reason string | null
checked_at string
fetch object
fetch.http_status integer | null
fetch.final_url string
fetch.content_type string | null
fetch.bytes integer
fetch.truncated boolean
fetch.redirect_count integer
fetch.duration_ms integer
fetch.rendered boolean
language string | null
total_words integer
unique_words integer
stopwords_removed boolean
keywords object
keywords.one_word[] object[]
keywords.one_word[] object
keywords.one_word[].keyword string
keywords.one_word[].count integer
keywords.one_word[].density number
keywords.two_words[] object[]
keywords.two_words[] object
keywords.two_words[].keyword string
keywords.two_words[].count integer
keywords.two_words[].density number
keywords.three_words[] object[]
keywords.three_words[] object
keywords.three_words[].keyword string
keywords.three_words[].count integer
keywords.three_words[].density number
targets[] object[]
targets[] object
targets[].keyword string
targets[].count integer
targets[].density number
targets[].in_title boolean
targets[].in_meta_description boolean
targets[].in_h1 boolean
targets[].in_headings boolean
targets[].in_url boolean
targets[].in_first_100_words boolean
caveats[] string[]

예제 요청

curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/keyword-density?url=https%3A%2F%2Fexample.com&render=false&keywords=launch%2Cgrid&top=20&include_stopwords=false"
const response = await fetch("https://domscan.net/v1/keyword-density?url=https%3A%2F%2Fexample.com&render=false&keywords=launch%2Cgrid&top=20&include_stopwords=false", {
  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/keyword-density?url=https%3A%2F%2Fexample.com&render=false&keywords=launch%2Cgrid&top=20&include_stopwords=false",
    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/keyword-density?url=https%3A%2F%2Fexample.com&render=false&keywords=launch%2Cgrid&top=20&include_stopwords=false", 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/keyword-density?url=https%3A%2F%2Fexample.com&render=false&keywords=launch%2Cgrid&top=20&include_stopwords=false")
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))

예제 응답

{
  "url": "https://example.com/shoes/trail-runner",
  "final_url": "https://example.com/shoes/trail-runner",
  "status": "ok",
  "reason": null,
  "checked_at": "2026-10-13T12:00:00.000Z",
  "fetch": {
    "http_status": 200,
    "final_url": "https://example.com/shoes/trail-runner",
    "content_type": "text/html",
    "bytes": 3535,
    "truncated": false,
    "redirect_count": 0,
    "duration_ms": 412,
    "rendered": false
  },
  "language": "en",
  "total_words": 122,
  "unique_words": 86,
  "stopwords_removed": true,
  "keywords": {
    "one_word": [
      {
        "keyword": "shoes",
        "count": 5,
        "density": 4.1
      },
      {
        "keyword": "trail",
        "count": 5,
        "density": 4.1
      },
      {
        "keyword": "running",
        "count": 5,
        "density": 4.1
      }
    ],
    "two_words": [
      {
        "keyword": "trail running",
        "count": 5,
        "density": 4.1
      },
      {
        "keyword": "running shoes",
        "count": 4,
        "density": 3.28
      },
      {
        "keyword": "rocky terrain",
        "count": 3,
        "density": 2.46
      }
    ],
    "three_words": [
      {
        "keyword": "trail running shoes",
        "count": 4,
        "density": 3.28
      }
    ]
  },
  "targets": [
    {
      "keyword": "trail running shoes",
      "count": 4,
      "density": 3.28,
      "in_title": true,
      "in_meta_description": true,
      "in_h1": true,
      "in_headings": true,
      "in_url": false,
      "in_first_100_words": true
    }
  ],
  "caveats": []
}

HTTP 상태 코드

  • 200 성공
  • 400 잘못된 요청
  • 401 인증되지 않음
  • 402 결제 필요
  • 429 요청 과다
GET /v1/links 크레딧: 2-6

쿼리 매개변수

매개변수 유형 필수
url string 필수
render boolean 선택 사항
check boolean 선택 사항
type string
허용된 값 allinternalexternal
기본값 all
선택 사항
limit integer
기본값 200
선택 사항

응답 필드

필드 유형
url string
final_url string
status string
reason string | null
checked_at string
fetch object
fetch.http_status integer | null
fetch.final_url string
fetch.content_type string | null
fetch.bytes integer
fetch.truncated boolean
fetch.redirect_count integer
fetch.duration_ms integer
fetch.rendered boolean
summary object
summary.total integer
summary.internal integer
summary.external integer
summary.nofollow integer
summary.empty_anchor integer
summary.unique_urls integer
summary.external_domains integer
links[] object[]
links[] object
links[].url string
links[].text string
links[].type string
links[].rel[] string[]
links[].nofollow boolean
links[].image_alt string | null
has_more boolean
check object
check.unique_targets integer
check.checked integer
check.not_checked integer
check.ok integer
check.redirect integer
check.broken integer
check.unknown integer
check.unchecked integer
check.skipped integer
check.results[] object[]
check.results[] object
check.results[].url string
check.results[].state string
check.results[].http_status integer | null
check.results[].final_url string | null
check.results[].redirect_count integer
check.results[].reason string | null

예제 요청

예제 응답

{
  "url": "https://example.com/shoes/trail-runner",
  "final_url": "https://example.com/shoes/trail-runner",
  "status": "ok",
  "reason": null,
  "checked_at": "2026-10-13T12:00:00.000Z",
  "fetch": {
    "http_status": 200,
    "final_url": "https://example.com/shoes/trail-runner",
    "content_type": "text/html",
    "bytes": 3535,
    "truncated": false,
    "redirect_count": 0,
    "duration_ms": 412,
    "rendered": false
  },
  "summary": {
    "total": 7,
    "internal": 5,
    "external": 2,
    "nofollow": 1,
    "empty_anchor": 1,
    "unique_urls": 7,
    "external_domains": 2
  },
  "links": [
    {
      "url": "https://example.com/",
      "text": "Home",
      "type": "internal",
      "rel": [],
      "nofollow": false,
      "image_alt": null
    },
    {
      "url": "https://example.com/shoes",
      "text": "Shoes",
      "type": "internal",
      "rel": [],
      "nofollow": false,
      "image_alt": null
    },
    {
      "url": "https://example.com/missing-page",
      "text": "Old sale",
      "type": "internal",
      "rel": [],
      "nofollow": false,
      "image_alt": null
    }
  ],
  "has_more": true,
  "check": {
    "unique_targets": 7,
    "checked": 7,
    "not_checked": 0,
    "ok": 4,
    "redirect": 1,
    "broken": 1,
    "unknown": 1,
    "unchecked": 0,
    "skipped": 0,
    "results": [
      {
        "url": "https://example.com/",
        "http_status": 200,
        "final_url": "https://example.com/",
        "redirect_count": 0,
        "state": "ok",
        "reason": null
      },
      {
        "url": "https://example.com/shoes",
        "http_status": 200,
        "final_url": "https://example.com/shoes",
        "redirect_count": 1,
        "state": "redirect",
        "reason": null
      },
      {
        "url": "https://example.com/missing-page",
        "http_status": 404,
        "final_url": "https://example.com/missing-page",
        "redirect_count": 0,
        "state": "broken",
        "reason": "http_404"
      },
      {
        "url": "https://partner.example.org/fit-guide",
        "http_status": 403,
        "final_url": "https://partner.example.org/fit-guide",
        "redirect_count": 0,
        "state": "unknown",
        "reason": "blocked"
      }
    ]
  }
}

HTTP 상태 코드

  • 200 성공
  • 400 잘못된 요청
  • 401 인증되지 않음
  • 402 결제 필요
  • 429 요청 과다
GET /v1/hreflang 크레딧: 3

쿼리 매개변수

매개변수 유형 필수
url string 필수
max_alternates integer
기본값 10
선택 사항

응답 필드

필드 유형
url string
final_url string
status string
reason string | null
checked_at string
fetch object
fetch.http_status integer | null
fetch.final_url string
fetch.content_type string | null
fetch.bytes integer
fetch.truncated boolean
fetch.redirect_count integer
fetch.duration_ms integer
fetch.rendered boolean
lang string | null
entries[] object[]
entries[] object
entries[].hreflang string
entries[].href string
entries[].url string | null
entries[].source string
entries[].valid_code boolean
entries[].issues[] string[]
self_reference boolean
x_default boolean
issues[] string[]
return_links object
return_links.alternates integer
return_links.checked integer
return_links.not_checked integer
return_links.confirmed integer
return_links.missing integer
return_links.code_mismatch integer
return_links.not_found integer
return_links.unknown integer
return_links.results[] object[]
return_links.results[] object
return_links.results[].url string
return_links.results[].hreflang[] string[]
return_links.results[].state string
return_links.results[].http_status integer | null
return_links.results[].final_url string | null
return_links.results[].canonical string | null
return_links.results[].lang string | null
return_links.results[].issues[] string[]

예제 요청

curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/hreflang?url=https%3A%2F%2Fexample.com&max_alternates=10"
const response = await fetch("https://domscan.net/v1/hreflang?url=https%3A%2F%2Fexample.com&max_alternates=10", {
  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/hreflang?url=https%3A%2F%2Fexample.com&max_alternates=10",
    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/hreflang?url=https%3A%2F%2Fexample.com&max_alternates=10", 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/hreflang?url=https%3A%2F%2Fexample.com&max_alternates=10")
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))

예제 응답

{
  "url": "https://example.com/shoes/trail-runner",
  "final_url": "https://example.com/shoes/trail-runner",
  "status": "ok",
  "reason": null,
  "checked_at": "2026-10-13T12:00:00.000Z",
  "fetch": {
    "http_status": 200,
    "final_url": "https://example.com/shoes/trail-runner",
    "content_type": "text/html",
    "bytes": 3535,
    "truncated": false,
    "redirect_count": 0,
    "duration_ms": 412,
    "rendered": false
  },
  "lang": "en",
  "entries": [
    {
      "hreflang": "en",
      "href": "https://example.com/shoes/trail-runner",
      "url": "https://example.com/shoes/trail-runner",
      "source": "html",
      "valid_code": true,
      "issues": []
    },
    {
      "hreflang": "es-ES",
      "href": "https://example.com/es/zapatillas/trail-runner",
      "url": "https://example.com/es/zapatillas/trail-runner",
      "source": "html",
      "valid_code": true,
      "issues": []
    },
    {
      "hreflang": "x-default",
      "href": "https://example.com/shoes/trail-runner",
      "url": "https://example.com/shoes/trail-runner",
      "source": "html",
      "valid_code": true,
      "issues": []
    }
  ],
  "self_reference": true,
  "x_default": true,
  "issues": [],
  "return_links": {
    "alternates": 1,
    "checked": 1,
    "not_checked": 0,
    "confirmed": 1,
    "missing": 0,
    "not_found": 0,
    "unknown": 0,
    "results": [
      {
        "url": "https://example.com/es/zapatillas/trail-runner",
        "hreflang": [
          "es-ES"
        ],
        "http_status": 200,
        "final_url": "https://example.com/es/zapatillas/trail-runner",
        "canonical": "https://example.com/es/zapatillas/trail-runner",
        "lang": "es",
        "issues": [],
        "state": "confirmed"
      }
    ]
  }
}

HTTP 상태 코드

  • 200 성공
  • 400 잘못된 요청
  • 401 인증되지 않음
  • 402 결제 필요
  • 429 요청 과다
GET /v1/ads-txt 크레딧: 2-5

쿼리 매개변수

매개변수 유형 필수
url string 필수
file string
허용된 값 ads.txtapp-ads.txt
기본값 ads.txt
선택 사항
verify_sellers boolean 선택 사항

응답 필드

필드 유형
domain string
file string
url string
checked_at string
status string
reason string | null
fetch object
fetch.http_status integer | null
fetch.final_url string | null
fetch.bytes integer
fetch.truncated boolean
summary object
summary.records integer
summary.direct integer
summary.reseller integer
summary.ad_systems integer
summary.records_truncated boolean
summary.no_authorized_sellers boolean
variables object
records[] object[]
records[] object
records[].line integer
records[].ad_system string
records[].account_id string
records[].relationship string
records[].certification_authority_id string | null
issues[] object[]
issues[] object
issues[].code string
issues[].count integer
issues[].lines[] integer[]
sellers object
sellers.systems_total integer
sellers.systems_checked integer
sellers.confirmed integer
sellers.confidential integer
sellers.type_mismatch integer
sellers.seller_not_found integer
sellers.unknown integer
sellers.systems[] object[]
sellers.systems[] object
sellers.systems[].ad_system string
sellers.systems[].sellers_json string
sellers.systems[].reason string | null
sellers.systems[].records_checked integer
sellers.results[] object[]
sellers.results[] object
sellers.results[].ad_system string
sellers.results[].account_id string
sellers.results[].relationship string
sellers.results[].state string
sellers.results[].seller_type string | null
sellers.results[].seller_name string | null
sellers.results[].seller_domain string | null
sellers.results[].match string | null

예제 요청

curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/ads-txt?url=https%3A%2F%2Fexample.com&file=ads.txt&verify_sellers=false"
const response = await fetch("https://domscan.net/v1/ads-txt?url=https%3A%2F%2Fexample.com&file=ads.txt&verify_sellers=false", {
  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/ads-txt?url=https%3A%2F%2Fexample.com&file=ads.txt&verify_sellers=false",
    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/ads-txt?url=https%3A%2F%2Fexample.com&file=ads.txt&verify_sellers=false", 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/ads-txt?url=https%3A%2F%2Fexample.com&file=ads.txt&verify_sellers=false")
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",
  "file": "ads.txt",
  "url": "https://example.com/ads.txt",
  "checked_at": "2026-10-13T12:00:00.000Z",
  "status": "found",
  "reason": null,
  "fetch": {
    "http_status": 200,
    "final_url": "https://example.com/ads.txt",
    "bytes": 20603,
    "truncated": false
  },
  "summary": {
    "records": 2,
    "direct": 1,
    "reseller": 1,
    "ad_systems": 2,
    "records_truncated": false,
    "no_authorized_sellers": false
  },
  "variables": {
    "ownerdomain": [
      "example.com"
    ]
  },
  "records": [
    {
      "line": 3,
      "ad_system": "google.com",
      "account_id": "pub-1234567890",
      "relationship": "DIRECT",
      "certification_authority_id": "f08c47fec0942fa0"
    },
    {
      "line": 4,
      "ad_system": "openx.com",
      "account_id": "537120563",
      "relationship": "RESELLER",
      "certification_authority_id": null
    }
  ],
  "issues": [
    {
      "code": "duplicate_record",
      "count": 1,
      "lines": [
        9
      ]
    }
  ],
  "sellers": {
    "systems_total": 2,
    "systems_checked": 2,
    "confirmed": 1,
    "confidential": 0,
    "type_mismatch": 0,
    "seller_not_found": 0,
    "unknown": 1,
    "systems": [
      {
        "ad_system": "google.com",
        "sellers_json": "unknown",
        "reason": "too_large",
        "records_checked": 1
      },
      {
        "ad_system": "openx.com",
        "sellers_json": "ok",
        "reason": null,
        "records_checked": 1
      }
    ],
    "results": [
      {
        "ad_system": "google.com",
        "account_id": "pub-1234567890",
        "relationship": "DIRECT",
        "state": "unknown",
        "seller_type": null,
        "seller_name": null,
        "seller_domain": null,
        "match": null
      },
      {
        "ad_system": "openx.com",
        "account_id": "537120563",
        "relationship": "RESELLER",
        "state": "confirmed",
        "seller_type": "INTERMEDIARY",
        "seller_name": "Example Exchange",
        "seller_domain": "exchange.example",
        "match": "exact"
      }
    ]
  }
}

HTTP 상태 코드

  • 200 성공
  • 400 잘못된 요청
  • 401 인증되지 않음
  • 402 결제 필요
  • 429 요청 과다
GET /v1/duplicate-content 크레딧: 5

쿼리 매개변수

매개변수 유형 필수
urls string 필수

응답 필드

필드 유형
status string
checked_at string
threshold number
pages[] object[]
pages[] object
pages[].url string
pages[].final_url string
pages[].status string
pages[].reason string | null
pages[].http_status integer | null
pages[].title string | null
pages[].meta_description string | null
pages[].h1 string | null
pages[].canonical string | null
pages[].word_count integer
pages[].comparable boolean
pages[].comparison_reason string | null
pairs[] object[]
pairs[] object
pairs[].a string
pairs[].b string
pairs[].similarity number | null
pairs[].containment number | null
pairs[].near_duplicate boolean | null
pairs[].comparable boolean
pairs[].canonicalized boolean
pairs[].same_final_url boolean
pairs[].reason string | null
clusters[] string[][]
clusters[][] string[]
duplicates object
duplicates.titles[] object[]
duplicates.titles[] object
duplicates.titles[].value string
duplicates.titles[].urls[] string[]
duplicates.meta_descriptions[] object[]
duplicates.meta_descriptions[] object
duplicates.meta_descriptions[].value string
duplicates.meta_descriptions[].urls[] string[]
duplicates.h1[] object[]
duplicates.h1[] object
duplicates.h1[].value string
duplicates.h1[].urls[] string[]
summary object
summary.pages integer
summary.readable integer
summary.unknown integer
summary.comparable_pairs integer
summary.unknown_pairs integer
summary.same_final_url_pairs integer
summary.near_duplicate_pairs integer
summary.uncanonicalized_near_duplicates integer

예제 요청

curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/duplicate-content?urls=https%3A%2F%2Fexample.com"
const response = await fetch("https://domscan.net/v1/duplicate-content?urls=https%3A%2F%2Fexample.com", {
  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/duplicate-content?urls=https%3A%2F%2Fexample.com",
    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/duplicate-content?urls=https%3A%2F%2Fexample.com", 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/duplicate-content?urls=https%3A%2F%2Fexample.com")
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))

예제 응답

{
  "status": "ok",
  "checked_at": "2026-10-13T12:00:00.000Z",
  "threshold": 0.8,
  "pages": [
    {
      "url": "https://example.com/a",
      "final_url": "https://example.com/a",
      "status": "ok",
      "reason": null,
      "http_status": 200,
      "title": "Trail shoes",
      "meta_description": "Shop trail shoes",
      "h1": "Trail shoes",
      "canonical": null,
      "word_count": 640,
      "comparable": true,
      "comparison_reason": null
    },
    {
      "url": "https://example.com/b",
      "final_url": "https://example.com/b",
      "status": "ok",
      "reason": null,
      "http_status": 200,
      "title": "Trail shoes",
      "meta_description": "Shop trail shoes",
      "h1": "Trail running shoes",
      "canonical": null,
      "word_count": 655,
      "comparable": true,
      "comparison_reason": null
    }
  ],
  "pairs": [
    {
      "a": "https://example.com/a",
      "b": "https://example.com/b",
      "similarity": 0.91,
      "containment": 0.96,
      "near_duplicate": true,
      "comparable": true,
      "canonicalized": false,
      "same_final_url": false,
      "reason": null
    }
  ],
  "clusters": [
    [
      "https://example.com/a",
      "https://example.com/b"
    ]
  ],
  "duplicates": {
    "titles": [
      {
        "value": "trail shoes",
        "urls": [
          "https://example.com/a",
          "https://example.com/b"
        ]
      }
    ],
    "meta_descriptions": [
      {
        "value": "shop trail shoes",
        "urls": [
          "https://example.com/a",
          "https://example.com/b"
        ]
      }
    ],
    "h1": []
  },
  "summary": {
    "pages": 2,
    "readable": 2,
    "unknown": 0,
    "comparable_pairs": 1,
    "unknown_pairs": 0,
    "same_final_url_pairs": 0,
    "near_duplicate_pairs": 1,
    "uncanonicalized_near_duplicates": 1
  }
}

HTTP 상태 코드

  • 200 성공
  • 400 잘못된 요청
  • 401 인증되지 않음
  • 402 결제 필요
  • 429 요청 과다
GET /v1/site-audit 크레딧: 10-35

쿼리 매개변수

매개변수 유형 필수
url string 필수
max_pages integer
허용된 값 102550
기본값 10
선택 사항

응답 필드

필드 유형
url string
status string
reason string | null
checked_at string
robots_txt string
max_pages integer
summary object
summary.pages_crawled integer
summary.pages_ok integer
summary.pages_not_found integer
summary.pages_unknown integer
summary.pages_not_html integer
summary.pages_redirect_only integer
summary.discovered_not_crawled integer
summary.blocked_by_robots integer
summary.near_duplicate_unknown_pairs integer
summary.average_score integer | null
summary.crawl_complete boolean
summary.duration_ms integer
issues object
issues.broken_internal_links[] object[]
issues.broken_internal_links[] object
issues.broken_internal_links[].url string
issues.broken_internal_links[].http_status integer | null
issues.broken_internal_links[].linked_from[] string[]
issues.internal_redirects[] object[]
issues.internal_redirects[] object
issues.internal_redirects[].url string
issues.internal_redirects[].final_url string
issues.internal_redirects[].linked_from[] string[]
issues.duplicate_titles[] object[]
issues.duplicate_titles[] object
issues.duplicate_titles[].value string
issues.duplicate_titles[].urls[] string[]
issues.duplicate_meta_descriptions[] object[]
issues.duplicate_meta_descriptions[] object
issues.duplicate_meta_descriptions[].value string
issues.duplicate_meta_descriptions[].urls[] string[]
issues.duplicate_h1[] object[]
issues.duplicate_h1[] object
issues.duplicate_h1[].value string
issues.duplicate_h1[].urls[] string[]
issues.near_duplicate_content[] object[]
issues.near_duplicate_content[] object
issues.near_duplicate_content[].a string
issues.near_duplicate_content[].b string
issues.near_duplicate_content[].similarity number
issues.noindex_pages[] string[]
issues.canonicalized_pages[] object[]
issues.canonicalized_pages[] object
issues.canonicalized_pages[].url string
issues.canonicalized_pages[].canonical string | null
issues.thin_pages[] object[]
issues.thin_pages[] object
issues.thin_pages[].url string
issues.thin_pages[].word_count integer | null
issues.onpage_checks[] object[]
issues.onpage_checks[] object
issues.onpage_checks[].check string
issues.onpage_checks[].pages integer
pages[] object[]
pages[] object
pages[].url string
pages[].final_url string
pages[].depth integer
pages[].status string
pages[].reason string | null
pages[].http_status integer | null
pages[].redirect_count integer
pages[].title string | null
pages[].word_count integer | null
pages[].score integer | null
pages[].indexable boolean | null
pages[].canonical string | null
pages[].internal_links integer
pages[].inlinks integer
pages[].issues[] string[]
pages[].redirect_only boolean
caveats[] string[]

예제 요청

curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/site-audit?url=https%3A%2F%2Fexample.com&max_pages=10"
const response = await fetch("https://domscan.net/v1/site-audit?url=https%3A%2F%2Fexample.com&max_pages=10", {
  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/site-audit?url=https%3A%2F%2Fexample.com&max_pages=10",
    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/site-audit?url=https%3A%2F%2Fexample.com&max_pages=10", 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/site-audit?url=https%3A%2F%2Fexample.com&max_pages=10")
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))

예제 응답

{
  "url": "https://example.com/",
  "status": "ok",
  "reason": null,
  "checked_at": "2026-10-13T12:00:00.000Z",
  "robots_txt": "rules",
  "max_pages": 10,
  "summary": {
    "pages_crawled": 10,
    "pages_ok": 9,
    "pages_not_found": 1,
    "pages_unknown": 0,
    "pages_not_html": 0,
    "pages_redirect_only": 0,
    "discovered_not_crawled": 34,
    "blocked_by_robots": 2,
    "near_duplicate_unknown_pairs": 3,
    "average_score": 88,
    "crawl_complete": false,
    "duration_ms": 14200
  },
  "issues": {
    "broken_internal_links": [
      {
        "url": "https://example.com/old-sale",
        "http_status": 404,
        "linked_from": [
          "https://example.com/"
        ]
      }
    ],
    "internal_redirects": [
      {
        "url": "https://example.com/shoes",
        "final_url": "https://example.com/shoes/",
        "linked_from": [
          "https://example.com/"
        ]
      }
    ],
    "duplicate_titles": [],
    "duplicate_meta_descriptions": [
      {
        "value": "shop trail shoes",
        "urls": [
          "https://example.com/a",
          "https://example.com/b"
        ]
      }
    ],
    "duplicate_h1": [],
    "near_duplicate_content": [
      {
        "a": "https://example.com/a",
        "b": "https://example.com/b",
        "similarity": 0.91
      }
    ],
    "noindex_pages": [],
    "canonicalized_pages": [],
    "thin_pages": [
      {
        "url": "https://example.com/contact",
        "word_count": 74
      }
    ],
    "onpage_checks": [
      {
        "check": "images_alt",
        "pages": 6
      }
    ]
  },
  "pages": [
    {
      "url": "https://example.com/",
      "final_url": "https://example.com/",
      "depth": 0,
      "status": "ok",
      "reason": null,
      "http_status": 200,
      "redirect_count": 0,
      "title": "Example Outdoor",
      "word_count": 820,
      "score": 91,
      "indexable": true,
      "canonical": "https://example.com/",
      "internal_links": 42,
      "inlinks": 0,
      "issues": [
        "images_alt"
      ],
      "redirect_only": false
    }
  ],
  "caveats": []
}

HTTP 상태 코드

  • 200 성공
  • 400 잘못된 요청
  • 401 인증되지 않음
  • 402 결제 필요
  • 429 요청 과다
GET /v1/screenshot 크레딧: 10

쿼리 매개변수

매개변수 유형 필수
url string 필수
device string
허용된 값 desktopmobile
기본값 desktop
선택 사항
full_page boolean 선택 사항
format string
허용된 값 pngjpegwebppdf
기본값 png
선택 사항
output string
허용된 값 jsonbinary
기본값 json
선택 사항

응답 필드

필드 유형
url string
final_url string
status string
reason string | null
checked_at string
http_status integer | null
redirect_count integer
duration_ms integer
resource_limit_reached boolean
capture object
capture.format string
capture.mime_type string
capture.device string
capture.full_page boolean
capture.width integer | null
capture.height integer | null
capture.bytes integer
capture.format_fallback string | null
capture.data_base64 string

예제 요청

curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/screenshot?url=https%3A%2F%2Fexample.com&device=desktop&full_page=false&format=png&output=json"
const response = await fetch("https://domscan.net/v1/screenshot?url=https%3A%2F%2Fexample.com&device=desktop&full_page=false&format=png&output=json", {
  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/screenshot?url=https%3A%2F%2Fexample.com&device=desktop&full_page=false&format=png&output=json",
    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/screenshot?url=https%3A%2F%2Fexample.com&device=desktop&full_page=false&format=png&output=json", 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/screenshot?url=https%3A%2F%2Fexample.com&device=desktop&full_page=false&format=png&output=json")
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))

예제 응답

{
  "url": "https://example.com/",
  "final_url": "https://example.com/",
  "status": "ok",
  "reason": null,
  "checked_at": "2026-10-13T12:00:00.000Z",
  "http_status": 200,
  "redirect_count": 0,
  "duration_ms": 4210,
  "resource_limit_reached": false,
  "capture": {
    "format": "png",
    "mime_type": "image/png",
    "device": "desktop",
    "full_page": false,
    "width": 1366,
    "height": 768,
    "bytes": 182340,
    "data_base64": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg=="
  }
}

HTTP 상태 코드

  • 200 성공
  • 400 잘못된 요청
  • 401 인증되지 않음
  • 402 결제 필요
  • 429 요청 과다
GET /v1/accessibility 크레딧: 8

쿼리 매개변수

매개변수 유형 필수
url string 필수
standard string
허용된 값 wcag2awcag2aawcag21aawcag22aa
선택 사항

응답 필드

필드 유형
url string
final_url string
status string
reason string | null
checked_at string
http_status integer | null
redirect_count integer
duration_ms integer
resource_limit_reached boolean
standard string | null
score integer | null
engine object
engine.name string
engine.version string | null
summary object
summary.violations integer
summary.affected_elements integer
summary.by_impact object
summary.by_impact.critical integer
summary.by_impact.serious integer
summary.by_impact.moderate integer
summary.by_impact.minor integer
summary.passes integer
summary.incomplete integer
summary.inapplicable integer
violations[] object[]
violations[] object
violations[].id string
violations[].impact string
violations[].help string
violations[].help_url string | null
violations[].wcag_level string | null
violations[].tags[] string[]
violations[].node_count integer
violations[].nodes[] object[]
violations[].nodes[] object
violations[].nodes[].target string
violations[].nodes[].html string
violations[].nodes[].failure_summary string
violations_truncated boolean
incomplete[] object[]
incomplete[] object
incomplete[].id string
incomplete[].impact string | null
incomplete[].help string
incomplete[].node_count integer

예제 요청

curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/accessibility?url=https%3A%2F%2Fexample.com&standard=wcag2a"
const response = await fetch("https://domscan.net/v1/accessibility?url=https%3A%2F%2Fexample.com&standard=wcag2a", {
  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/accessibility?url=https%3A%2F%2Fexample.com&standard=wcag2a",
    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/accessibility?url=https%3A%2F%2Fexample.com&standard=wcag2a", 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/accessibility?url=https%3A%2F%2Fexample.com&standard=wcag2a")
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))

예제 응답

{
  "url": "https://example.com/",
  "final_url": "https://example.com/",
  "status": "ok",
  "reason": null,
  "checked_at": "2026-10-13T12:00:00.000Z",
  "http_status": 200,
  "redirect_count": 0,
  "duration_ms": 4210,
  "resource_limit_reached": false,
  "score": 84,
  "engine": {
    "name": "axe-core",
    "version": "4.10.3"
  },
  "summary": {
    "violations": 2,
    "affected_elements": 8,
    "by_impact": {
      "critical": 1,
      "serious": 1,
      "moderate": 0,
      "minor": 0
    },
    "passes": 38,
    "incomplete": 1,
    "inapplicable": 41
  },
  "violations": [
    {
      "id": "image-alt",
      "impact": "critical",
      "help": "Images must have alternative text",
      "help_url": "https://dequeuniversity.com/rules/axe/4.10/image-alt",
      "wcag_level": "A",
      "tags": [
        "wcag2a",
        "wcag111"
      ],
      "node_count": 2,
      "nodes": [
        {
          "target": "main > img.hero",
          "html": "<img src=\"/hero.jpg\">",
          "failure_summary": "Element does not have an alt attribute"
        }
      ]
    }
  ],
  "incomplete": [
    {
      "id": "color-contrast",
      "impact": "serious",
      "help": "Elements must meet minimum color contrast ratio thresholds",
      "node_count": 3
    }
  ]
}

HTTP 상태 코드

  • 200 성공
  • 400 잘못된 요청
  • 401 인증되지 않음
  • 402 결제 필요
  • 429 요청 과다
GET /v1/cookie-scan 크레딧: 8

쿼리 매개변수

매개변수 유형 필수
url string 필수

응답 필드

필드 유형
url string
final_url string
status string
reason string | null
checked_at string
http_status integer | null
redirect_count integer
duration_ms integer
resource_limit_reached boolean
summary object
summary.cookies integer
summary.first_party_cookies integer
summary.third_party_cookies integer
summary.session_cookies integer
summary.persistent_cookies integer
summary.trackers integer
summary.third_party_domains integer
consent object
consent.cmp string | null
consent.tcf_api boolean
cookies[] object[]
cookies[] object
cookies[].name string
cookies[].domain string
cookies[].path string
cookies[].party string
cookies[].session boolean
cookies[].lifetime_days integer | null
cookies[].secure boolean
cookies[].http_only boolean
cookies[].same_site string | null
cookies[].size integer
cookies[].tracker object
cookies[].tracker.name string
cookies[].tracker.category string
trackers[] object[]
trackers[] object
trackers[].name string
trackers[].category string
trackers[].requests integer
trackers[].cookies integer
third_party_domains[] object[]
third_party_domains[] object
third_party_domains[].domain string
third_party_domains[].requests integer
storage object
storage.local_storage_keys integer
storage.session_storage_keys integer
findings[] string[]

예제 요청

예제 응답

{
  "url": "https://example.com/",
  "final_url": "https://example.com/",
  "status": "ok",
  "reason": null,
  "checked_at": "2026-10-13T12:00:00.000Z",
  "http_status": 200,
  "redirect_count": 0,
  "duration_ms": 4210,
  "resource_limit_reached": false,
  "summary": {
    "cookies": 2,
    "first_party_cookies": 1,
    "third_party_cookies": 1,
    "session_cookies": 1,
    "persistent_cookies": 1,
    "trackers": 1,
    "third_party_domains": 3
  },
  "consent": {
    "cmp": "onetrust",
    "tcf_api": true
  },
  "cookies": [
    {
      "name": "_ga",
      "domain": ".example.com",
      "path": "/",
      "party": "first",
      "session": false,
      "lifetime_days": 400,
      "secure": false,
      "http_only": false,
      "same_site": "Lax",
      "size": 30,
      "tracker": null
    },
    {
      "name": "IDE",
      "domain": ".doubleclick.net",
      "path": "/",
      "party": "third",
      "session": true,
      "lifetime_days": null,
      "secure": true,
      "http_only": true,
      "same_site": "None",
      "size": 60,
      "tracker": {
        "name": "Google Ads",
        "category": "advertising"
      }
    }
  ],
  "trackers": [
    {
      "name": "Google Analytics",
      "category": "analytics",
      "requests": 3
    }
  ],
  "third_party_domains": [
    {
      "domain": "google-analytics.com",
      "requests": 3
    }
  ],
  "storage": {
    "local_storage_keys": 4,
    "session_storage_keys": 1
  },
  "findings": [
    "trackers_load_before_consent",
    "third_party_cookies",
    "cookie_lifetime_over_13_months",
    "cookies_without_secure_flag"
  ]
}

HTTP 상태 코드

  • 200 성공
  • 400 잘못된 요청
  • 401 인증되지 않음
  • 402 결제 필요
  • 429 요청 과다
GET /v1/page-weight 크레딧: 6

쿼리 매개변수

매개변수 유형 필수
url string 필수

응답 필드

필드 유형
url string
final_url string
status string
reason string | null
checked_at string
http_status integer | null
redirect_count integer
duration_ms integer
resource_limit_reached boolean
summary object
summary.requests integer
summary.blocked_requests integer
summary.total_bytes integer
summary.third_party_requests integer
summary.third_party_bytes integer
summary.transfer_bytes integer
by_type[] object[]
by_type[] object
by_type[].type string
by_type[].requests integer
by_type[].bytes integer
largest[] object[]
largest[] object
largest[].url string
largest[].type string
largest[].bytes integer
largest[].mime_type string | null
third_parties[] object[]
third_parties[] object
third_parties[].domain string
third_parties[].requests integer
third_parties[].bytes integer
render_blocking[] object[]
render_blocking[] object
render_blocking[].url string
render_blocking[].type string
timing object
timing.ttfb_ms number | null
timing.first_contentful_paint_ms number | null
timing.dom_content_loaded_ms number | null
timing.load_ms number | null
findings[] string[]

예제 요청

curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/page-weight?url=https%3A%2F%2Fexample.com"
const response = await fetch("https://domscan.net/v1/page-weight?url=https%3A%2F%2Fexample.com", {
  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/page-weight?url=https%3A%2F%2Fexample.com",
    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/page-weight?url=https%3A%2F%2Fexample.com", 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/page-weight?url=https%3A%2F%2Fexample.com")
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))

예제 응답

{
  "url": "https://example.com/",
  "final_url": "https://example.com/",
  "status": "ok",
  "reason": null,
  "checked_at": "2026-10-13T12:00:00.000Z",
  "http_status": 200,
  "redirect_count": 0,
  "duration_ms": 4210,
  "resource_limit_reached": false,
  "summary": {
    "requests": 86,
    "blocked_requests": 4,
    "total_bytes": 3412887,
    "third_party_requests": 22,
    "third_party_bytes": 1210554,
    "transfer_bytes": 3425100
  },
  "by_type": [
    {
      "type": "image",
      "requests": 31,
      "bytes": 1840221
    },
    {
      "type": "script",
      "requests": 28,
      "bytes": 1120334
    }
  ],
  "largest": [
    {
      "url": "https://example.com/hero.jpg",
      "type": "image",
      "bytes": 612004,
      "mime_type": "image/jpeg"
    }
  ],
  "third_parties": [
    {
      "domain": "googletagmanager.com",
      "requests": 3,
      "bytes": 310442
    }
  ],
  "render_blocking": [
    {
      "url": "https://example.com/styles.css",
      "type": "stylesheet"
    }
  ],
  "timing": {
    "ttfb_ms": 180,
    "first_contentful_paint_ms": 1240,
    "dom_content_loaded_ms": 1610,
    "load_ms": 3890
  },
  "findings": [
    "page_weight_over_3mb",
    "images_over_200kb",
    "render_blocking_resources"
  ]
}

HTTP 상태 코드

  • 200 성공
  • 400 잘못된 요청
  • 401 인증되지 않음
  • 402 결제 필요
  • 429 요청 과다
POST /v1/scrape 크레딧: 1-20/item

본문 매개변수

매개변수 유형 필수
url string 필수
mode string
허용된 값 standardresilientrenderedrendered_resilient
기본값 standard
선택 사항
output string
허용된 값 htmltextmarkdown
기본값 html
선택 사항

응답 필드

필드 유형
data object
data.url string
data.final_url string
data.status integer | null
data.outcome string
data.content_type string | null
data.content string
data.bytes integer
data.truncated boolean
data.redirect_count integer
data.attempt_count integer
data.duration_ms integer
data.fetched_at string
data.headers object
data.rendered boolean
billing object
billing.credits_charged integer
billing.credits_refunded integer
billing.credits_per_item integer
billing.credits_net integer
billing.policy string

예제 요청

curl -X POST "https://domscan.net/v1/scrape" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $DOMSCAN_API_KEY" \
  -d '{
  "url": "https://example.com/",
  "mode": "standard",
  "output": "markdown"
}'
const response = await fetch("https://domscan.net/v1/scrape", {
  method: "POST",
  headers: { "X-API-Key": process.env.DOMSCAN_API_KEY, "Content-Type": "application/json" },
  body: JSON.stringify({
    "url": "https://example.com/",
    "mode": "standard",
    "output": "markdown"
  }),
});
const data = await response.json();
console.log(data);
import os
import requests

response = requests.post(
    "https://domscan.net/v1/scrape",
    headers={"X-API-Key": os.environ["DOMSCAN_API_KEY"]},
    json={
        "url": "https://example.com/",
        "mode": "standard",
        "output": "markdown",
    },
)
print(response.json())
package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
	"strings"
)

func main() {
	body := strings.NewReader(`{
	  "url": "https://example.com/",
	  "mode": "standard",
	  "output": "markdown"
	}`)
	req, err := http.NewRequest(http.MethodPost, "https://domscan.net/v1/scrape", 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/scrape")
request = Net::HTTP::Post.new(uri)
request["X-API-Key"] = ENV.fetch("DOMSCAN_API_KEY")
request["Content-Type"] = "application/json"
request.body = JSON.generate({
  "url" => "https://example.com/",
  "mode" => "standard",
  "output" => "markdown"
})

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))

예제 응답

{
  "data": {
    "url": "https://example.com",
    "final_url": "https://example.com",
    "status": 1,
    "outcome": "success",
    "content_type": "domain",
    "content": "example",
    "bytes": 1,
    "truncated": false,
    "redirect_count": 1,
    "attempt_count": 1,
    "duration_ms": 1,
    "fetched_at": "2026-08-27T12:00:00Z",
    "headers": {},
    "rendered": false
  },
  "billing": {
    "credits_charged": 1,
    "credits_refunded": 1,
    "credits_per_item": 1,
    "credits_net": 1,
    "policy": "effort_based"
  }
}

HTTP 상태 코드

  • 200 성공
  • 400 잘못된 요청
  • 401 인증되지 않음
  • 402 결제 필요
  • 403 금지됨
  • 409 HTTP 409
  • 422 HTTP 422
  • 429 요청 과다
  • 503 서비스 이용 불가
POST /v1/scrape/jobs 크레딧: 1-20/item

본문 매개변수

매개변수 유형 필수
notify_webhook unknown 선택 사항
mode string
허용된 값 standardresilientrenderedrendered_resilient
기본값 standard
선택 사항
output string
허용된 값 htmltextmarkdown
기본값 html
선택 사항
urls unknown[] 필수

응답 필드

필드 유형
job object
job.id string
job.status string
job.mode string
job.output string
job.total integer
job.counts object
job.counts.pending integer
job.counts.processing integer
job.counts.succeeded integer
job.counts.failed integer
job.billing object
job.billing.credits_charged integer
job.billing.credits_refunded integer
job.billing.credits_per_item integer
job.billing.credits_net integer
job.billing.policy string
job.status_url string
job.results_url string
job.poll_after_ms integer | null
job.created_at string
job.started_at string | null
job.completed_at string | null
job.updated_at string
job.processing_deadline_at string
job.results_expires_at string
idempotent_replay boolean

예제 요청

curl -X POST "https://domscan.net/v1/scrape/jobs" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $DOMSCAN_API_KEY" \
  -d '{
  "mode": "resilient",
  "output": "text",
  "urls": [
    "https://example.com/",
    {
      "url": "https://example.org/",
      "reference": "page-2"
    }
  ]
}'
const response = await fetch("https://domscan.net/v1/scrape/jobs", {
  method: "POST",
  headers: { "X-API-Key": process.env.DOMSCAN_API_KEY, "Content-Type": "application/json" },
  body: JSON.stringify({
    "mode": "resilient",
    "output": "text",
    "urls": [
      "https://example.com/",
      {
        "url": "https://example.org/",
        "reference": "page-2"
      }
    ]
  }),
});
const data = await response.json();
console.log(data);
import os
import requests

response = requests.post(
    "https://domscan.net/v1/scrape/jobs",
    headers={"X-API-Key": os.environ["DOMSCAN_API_KEY"]},
    json={
        "mode": "resilient",
        "output": "text",
        "urls": [
            "https://example.com/",
            {
                "url": "https://example.org/",
                "reference": "page-2",
            },
        ],
    },
)
print(response.json())
package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
	"strings"
)

func main() {
	body := strings.NewReader(`{
	  "mode": "resilient",
	  "output": "text",
	  "urls": [
	    "https://example.com/",
	    {
	      "url": "https://example.org/",
	      "reference": "page-2"
	    }
	  ]
	}`)
	req, err := http.NewRequest(http.MethodPost, "https://domscan.net/v1/scrape/jobs", 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/scrape/jobs")
request = Net::HTTP::Post.new(uri)
request["X-API-Key"] = ENV.fetch("DOMSCAN_API_KEY")
request["Content-Type"] = "application/json"
request.body = JSON.generate({
  "mode" => "resilient",
  "output" => "text",
  "urls" => [
    "https://example.com/",
    {
      "url" => "https://example.org/",
      "reference" => "page-2"
    }
  ]
})

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))

예제 응답

{
  "job": {
    "id": "example-id",
    "status": "queued",
    "mode": "standard",
    "output": "html",
    "total": 1,
    "counts": {
      "pending": 1,
      "processing": 1,
      "succeeded": 1,
      "failed": 1
    },
    "billing": {
      "credits_charged": 1,
      "credits_refunded": 1,
      "credits_per_item": 1,
      "credits_net": 1,
      "policy": "effort_based"
    },
    "status_url": "https://example.com",
    "results_url": "https://example.com",
    "poll_after_ms": 1,
    "created_at": "2026-08-27T12:00:00Z",
    "started_at": "2026-08-27T12:00:00Z",
    "completed_at": "2026-08-27T12:00:00Z",
    "updated_at": "2026-08-27T12:00:00Z",
    "processing_deadline_at": "2026-08-27T12:00:00Z",
    "results_expires_at": "2026-08-27T12:00:00Z"
  },
  "idempotent_replay": false
}

HTTP 상태 코드

  • 202 수락됨
  • 400 잘못된 요청
  • 401 인증되지 않음
  • 402 결제 필요
  • 403 금지됨
  • 409 HTTP 409
  • 429 요청 과다
  • 503 서비스 이용 불가
GET /v1/scrape/jobs/:job_id 크레딧: 0

쿼리 매개변수

매개변수 유형 필수
job_id string 필수

응답 필드

필드 유형
job object
job.id string
job.status string
job.mode string
job.output string
job.total integer
job.counts object
job.counts.pending integer
job.counts.processing integer
job.counts.succeeded integer
job.counts.failed integer
job.billing object
job.billing.credits_charged integer
job.billing.credits_refunded integer
job.billing.credits_per_item integer
job.billing.credits_net integer
job.billing.policy string
job.status_url string
job.results_url string
job.poll_after_ms integer | null
job.created_at string
job.started_at string | null
job.completed_at string | null
job.updated_at string
job.processing_deadline_at string
job.results_expires_at string

예제 요청

curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/scrape/jobs/example"
const response = await fetch("https://domscan.net/v1/scrape/jobs/example", {
  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/scrape/jobs/example",
    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/scrape/jobs/example", 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/scrape/jobs/example")
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))

예제 응답

{
  "job": {
    "id": "example-id",
    "status": "queued",
    "mode": "standard",
    "output": "html",
    "total": 1,
    "counts": {
      "pending": 1,
      "processing": 1,
      "succeeded": 1,
      "failed": 1
    },
    "billing": {
      "credits_charged": 1,
      "credits_refunded": 1,
      "credits_per_item": 1,
      "credits_net": 1,
      "policy": "effort_based"
    },
    "status_url": "https://example.com",
    "results_url": "https://example.com",
    "poll_after_ms": 1,
    "created_at": "2026-08-27T12:00:00Z",
    "started_at": "2026-08-27T12:00:00Z",
    "completed_at": "2026-08-27T12:00:00Z",
    "updated_at": "2026-08-27T12:00:00Z",
    "processing_deadline_at": "2026-08-27T12:00:00Z",
    "results_expires_at": "2026-08-27T12:00:00Z"
  }
}

HTTP 상태 코드

  • 200 성공
  • 401 인증되지 않음
  • 404 찾을 수 없음
  • 429 요청 과다
GET /v1/scrape/jobs/:job_id/results 크레딧: 0

쿼리 매개변수

매개변수 유형 필수
job_id string 필수
limit integer
기본값 20
선택 사항
offset integer
기본값 0
선택 사항

응답 필드

필드 유형
job object
job.id string
job.status string
job.mode string
job.output string
job.total integer
job.counts object
job.counts.pending integer
job.counts.processing integer
job.counts.succeeded integer
job.counts.failed integer
job.billing object
job.billing.credits_charged integer
job.billing.credits_refunded integer
job.billing.credits_per_item integer
job.billing.credits_net integer
job.billing.policy string
job.status_url string
job.results_url string
job.poll_after_ms integer | null
job.created_at string
job.started_at string | null
job.completed_at string | null
job.updated_at string
job.processing_deadline_at string
job.results_expires_at string
results[] object[]
results[] object
results[].index integer
results[].url string
results[].reference string
results[].status string
results[].data object
results[].data.url string
results[].data.final_url string
results[].data.status integer | null
results[].data.outcome string
results[].data.content_type string | null
results[].data.content string
results[].data.bytes integer
results[].data.truncated boolean
results[].data.redirect_count integer
results[].data.attempt_count integer
results[].data.duration_ms integer
results[].data.fetched_at string
results[].data.headers object
results[].data.rendered boolean
results[].billing object
results[].billing.credits_charged integer
results[].billing.credits_refunded integer
results[].billing.credits_per_item integer
results[].billing.credits_net integer
results[].billing.policy string
pagination object

예제 요청

curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/scrape/jobs/example/results?limit=25&offset=0"
const response = await fetch("https://domscan.net/v1/scrape/jobs/example/results?limit=25&offset=0", {
  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/scrape/jobs/example/results?limit=25&offset=0",
    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/scrape/jobs/example/results?limit=25&offset=0", 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/scrape/jobs/example/results?limit=25&offset=0")
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))

예제 응답

{
  "job": {
    "id": "example-id",
    "status": "queued",
    "mode": "standard",
    "output": "html",
    "total": 1,
    "counts": {
      "pending": 1,
      "processing": 1,
      "succeeded": 1,
      "failed": 1
    },
    "billing": {
      "credits_charged": 1,
      "credits_refunded": 1,
      "credits_per_item": 1,
      "credits_net": 1,
      "policy": "effort_based"
    },
    "status_url": "https://example.com",
    "results_url": "https://example.com",
    "poll_after_ms": 1,
    "created_at": "2026-08-27T12:00:00Z",
    "started_at": "2026-08-27T12:00:00Z",
    "completed_at": "2026-08-27T12:00:00Z",
    "updated_at": "2026-08-27T12:00:00Z",
    "processing_deadline_at": "2026-08-27T12:00:00Z",
    "results_expires_at": "2026-08-27T12:00:00Z"
  },
  "results": [
    {
      "index": 1,
      "url": "https://example.com",
      "reference": "example",
      "status": "pending",
      "data": {
        "url": "https://example.com",
        "final_url": "https://example.com",
        "status": 1,
        "outcome": "success",
        "content_type": "domain",
        "content": "example",
        "bytes": 1,
        "truncated": false,
        "redirect_count": 1,
        "attempt_count": 1,
        "duration_ms": 1,
        "fetched_at": "2026-08-27T12:00:00Z",
        "headers": {},
        "rendered": false
      },
      "billing": {
        "credits_charged": 1,
        "credits_refunded": 1,
        "credits_per_item": 1,
        "credits_net": 1,
        "policy": "effort_based"
      }
    }
  ],
  "pagination": {}
}

HTTP 상태 코드

  • 200 성공
  • 400 잘못된 요청
  • 401 인증되지 않음
  • 404 찾을 수 없음
  • 410 HTTP 410
  • 429 요청 과다