scan

Scan

Force a fresh scan of body.domain, persist, and return the report.

Anonymous allowed. Cache-first explanations (no fresh LLM call) and the A8 next_steps block, same as GET /v1/report. "Force" is bounded by the same scan_dedup_window_minutes reuse the web POST /scan applies — see api/pipeline.py::run_scan_pipeline for why that bound belongs on this path too.

post/scan

Request

  • Base URL: https://dnsdoctor.dev/api/v1
  • URL: https://dnsdoctor.dev/api/v1/scan
  • Auth: none required

Request body

domainstring required

Response

Successful Response

domainstring required
scanned_atstring date-time
explanations_pendingboolean
dns_provider_keystring nullable
not_registeredboolean
agent_scannedboolean
indexableboolean required

Thin-page shield: worth indexing only if mail-capable AND substantive.

Mail-capable = any of mx/spf/dmarc observed a record; substantive = at least _MIN_RESOLVED_CHECKS checks resolved (non-TEMPERROR). NXDOMAIN, parked, and garbage domains fail the first gate; half-broken scans fail the second. Non-indexable reports stay fully viewable — they are only noindex + sitemap-excluded. Serializes into report_json; older persisted JSON without the key still validates (computed on read).

dns_providerobject nullable required

The serialized assist-only NS provider, looked up by key at read time.

Mirrors the domain-row dns_provider object: the key is stored, the full object (display name, console URL, guide anchor, collision note) is resolved from the DNS_PROVIDERS table on serialize, so a URL/copy fix never needs a re-scan. A key that no longer exists in the table (or None) serializes as None — the report page then omits the provider mention.

Changes

No recorded changes to this operation across all 2 revisions of this API.