Every API here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for apis
7 MCP tools reach this
find_apisBrowse and filter every API in the catalog.
get_api_artifactsOne API's artifacts, grouped by type.
get_openapiThe primary OpenAPI for this API.
find_similar_apisAPIs that look like this one.
apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
resolveTurn a domain, URL or GitHub org into the provider it belongs to.
find_cohortsEvery scored population of providers in the catalog.
All 92 tools →
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/intodns-ai:intodns-ai-scan-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we
store it to create your key and to recognise you if you sign in with another
provider. See our Privacy Policy and
Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: IntoDNS.AI Scan API
description: Public DNS security and email deliverability analysis API. Analyze SPF, DKIM, DMARC, DNSSEC, MTA-STS, BIMI, SMTP STARTTLS, FCrDNS, blacklists, and more with deterministic results and optional AI explanations.
version: 2.0.0
contact:
name: IntoDNS.AI Support
url: https://intodns.ai
email: support@cobytes.com
license:
name: Proprietary
url: https://intodns.ai/terms
servers:
- url: https://intodns.ai/api
description: Production server
security: []
tags:
- name: Scan
description: Domain scanning operations
paths:
/scan/quick:
get:
tags:
- Scan
summary: Quick domain scan
description: Perform a fast security overview of a domain covering DNS, email, and basic security checks.
operationId: quickScan
parameters:
- name: domain
in: query
required: true
description: Domain name to scan (e.g., example.com)
schema:
type: string
example: example.com
responses:
'200':
description: Scan completed successfully
content:
application/json:
schema:
$ref: '#/components/schemas/QuickScanResult'
'400':
description: Invalid domain name
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
/scan/nis2:
get:
tags:
- Scan
summary: NIS2 quickscan
description: Compute a NIS2 readiness indicator from the DNS and email layer. Maps the quickscan evidence onto NIS2 Article 21.2 measures (a–j) and returns a weighted 0-100 score, per-measure status, evidence rows, critical gaps, and fix suggestions. Evidence that is not applicable for a given domain (e.g. DNSSEC on a TLD that does not support it) is excluded from the measure's score and reduces the measure's effective weight in the total. The result is a readiness indicator only — full NIS2 compliance also requires audit of web applications, supply chain, organisational processes, and training.
operationId: nis2Quickscan
parameters:
- name: domain
in: query
required: true
description: Domain name to scan (e.g., example.com).
schema:
type: string
example: example.com
- name: lang
in: query
required: false
description: Language for the standard caveat text. Defaults to English.
schema:
type: string
enum:
- en
- nl
example: en
responses:
'200':
description: NIS2 scorecard returned successfully
content:
application/json:
schema:
type: object
properties:
domain:
type: string
scannedAt:
type: string
format: date-time
total:
type: integer
minimum: 0
maximum: 100
status:
type: string
enum:
- compliant
- partial
- non-compliant
- unscannable
measures:
type: array
items:
type: object
properties:
id:
type: string
enum:
- a
- b
- c
- d
- e
- f
- g
- h
- i
- j
label:
type: string
description:
type: string
weight:
type: integer
score:
type: integer
minimum: 0
maximum: 100
status:
type: string
enum:
- pass
- warning
- fail
- not-applicable
evidence:
type: array
items:
type: object
properties:
checkId:
type: string
label:
type: string
result:
type: string
enum:
- pass
- fail
- missing
- not-applicable
detail:
type: string
fixes:
type: array
items:
type: string
criticalGaps:
type: array
items:
type: string
enum:
- a
- b
- c
- d
- e
- f
- g
- h
- i
- j
caveat:
type: string
'400':
description: Invalid domain name
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
/scan/deep:
post:
tags:
- Scan
summary: Deep security scan
description: Comprehensive security analysis using Internet.nl infrastructure. This is an asynchronous operation.
operationId: deepScan
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/DeepScanRequest'
responses:
'200':
description: Scan started successfully
content:
application/json:
schema:
$ref: '#/components/schemas/DeepScanResponse'
'400':
description: Invalid request
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
/report/everything:
get:
tags:
- Scan
summary: Everything report
description: Generate a bookmarkable full DNS and email security report as JSON or Markdown. Includes quick scan, DNS records, DNSSEC, SPF lookup graph, DKIM, DMARC, BIMI logo/certificate checks, MTA-STS, SMTP STARTTLS, FCrDNS, blacklists, sender requirements, and web security signals.
operationId: everythingReport
parameters:
- name: domain
in: query
required: true
description: Domain to report on
schema:
type: string
example: example.com
- name: format
in: query
required: false
description: Response format
schema:
type: string
enum:
- json
- markdown
default: json
responses:
'200':
description: Everything report generated
content:
application/json:
schema:
$ref: '#/components/schemas/EverythingReport'
text/markdown:
schema:
type: string
/report/snapshot:
get:
tags:
- Scan
summary: Create Everything report snapshot (legacy GET compatibility)
description: Backward-compatible GET variant for existing browser, MCP, and agent clients. New integrations should use POST. Successful responses include Deprecation and Link headers pointing to the canonical POST operation.
operationId: createReportSnapshotLegacyGet
deprecated: true
parameters:
- name: domain
in: query
required: true
description: Domain to snapshot
schema:
type: string
example: example.com
- name: format
in: query
required: false
description: Response format
schema:
type: string
enum:
- json
- markdown
default: json
responses:
'201':
description: Report snapshot created
content:
application/json:
schema:
$ref: '#/components/schemas/EverythingReport'
text/markdown:
schema:
type: string
post:
tags:
- Scan
summary: Create Everything report snapshot
description: Canonical method for creating a free fixed Everything Report evidence snapshot with timestamp, content hash, and stable JSON/Markdown retrieval URL. No signup or API key is required; generous abuse protection may return HTTP 429 with Retry-After.
operationId: createReportSnapshot
parameters:
- name: domain
in: query
required: true
description: Domain to snapshot
schema:
type: string
example: example.com
- name: format
in: query
required: false
description: Response format
schema:
type: string
enum:
- json
- markdown
default: json
responses:
'201':
description: Report snapshot created
content:
application/json:
schema:
$ref: '#/components/schemas/EverythingReport'
text/markdown:
schema:
type: string
/report/snapshot/{snapshotId}:
get:
tags:
- Scan
summary: Read Everything report snapshot
description: Retrieve a previously created free fixed Everything Report evidence snapshot.
operationId: readReportSnapshot
parameters:
- name: snapshotId
in: path
required: true
description: Snapshot identifier returned by /report/snapshot
schema:
type: string
- name: format
in: query
required: false
description: Response format
schema:
type: string
enum:
- json
- markdown
default: json
responses:
'200':
description: Report snapshot
content:
application/json:
schema:
$ref: '#/components/schemas/EverythingReport'
text/markdown:
schema:
type: string
'404':
description: Snapshot not found
components:
schemas:
EverythingReport:
type: object
properties:
domain:
type: string
generatedAt:
type: string
format: date-time
reportUrl:
type: string
summary:
type: object
sections:
type: object
citations:
type: array
items:
type: object
machineReadable:
type: object
evidence:
type: object
properties:
liveReportUrl:
type: string
snapshotCreateUrl:
type: string
snapshotUrl:
type: string
snapshotMarkdownUrl:
type: string
snapshotId:
type: string
contentHash:
type: string
formatVersion:
type: string
retentionPolicy:
type: string
enum:
- indefinite
description: Stored snapshots have no automatic expiry.
retentionNotice:
type: string
description: Operational exceptions to the snapshot retention policy.
DeepScanResponse:
type: object
properties:
success:
type: boolean
scan_id:
type: string
status:
type: string
enum:
- running
- completed
- failed
estimated_time:
type: integer
description: Estimated completion time in seconds
QuickScanResult:
type: object
properties:
success:
type: boolean
domain:
type: string
score:
type: integer
minimum: 0
maximum: 100
categories:
type: object
properties:
dns:
$ref: '#/components/schemas/CategoryScore'
email:
$ref: '#/components/schemas/CategoryScore'
security:
$ref: '#/components/schemas/CategoryScore'
critical_issues:
type: integer
warnings:
type: integer
timestamp:
type: string
format: date-time
DeepScanRequest:
type: object
required:
- domain
- type
properties:
domain:
type: string
example: example.com
type:
type: string
enum:
- web
- mail
example: web
Error:
type: object
properties:
success:
type: boolean
example: false
error:
type: object
properties:
code:
type: string
example: INVALID_DOMAIN
message:
type: string
example: The provided domain is not valid
details:
type: string
CategoryScore:
type: object
properties:
score:
type: integer
minimum: 0
maximum: 100
issues:
type: integer
securitySchemes:
SessionCookie:
type: apiKey
in: cookie
name: __Secure-authjs.session-token
description: Auth.js JWT session established by signing in at https://intodns.ai/login. On HTTPS the cookie is HttpOnly, Secure, SameSite=Lax, Path=/. Local HTTP development uses authjs.session-token without Secure. Auth.js manages cookies and numbered chunks when needed. This is browser session authentication, not an API key or bearer token; do not construct tokens or share session cookies with AI assistants. OpenAPI 3 represents cookie authentication with type apiKey.
x-access:
authentication: None for public diagnostics; POST /ai/explain and POST /ai/fix require a signed-in free account using an Auth.js session cookie.
publicEndpoints: Public DNS, email, blacklist, quick-scan, Everything Report, report snapshot, and record generator endpoints are free and available without signup or API keys for normal diagnostic use. Generous abuse protection may return HTTP 429 with Retry-After for bursts and write-style snapshot creation.
canonicalApiOrigin: https://intodns.ai/api
invalidApiOrigins:
- https://api.intodns.io
- https://intodns.io/api-docs/v1
invalidApiExamples:
- https://api.intodns.io/v1/domain/{domain}
- https://api.intodns.io/v1/domain/example.com
llmDiscovery: 'LLM discovery files are static and cacheable: /llms.txt, /llms-full.txt, /llms.json, /llm/api.md.'
protection: Costly write-style or AI/raw-message endpoints may return HTTP 429 with Retry-After if abuse protection triggers.