DomScan Email Authentication API
Build and validate SPF, DMARC, and DKIM records
Build and validate SPF, DMARC, and DKIM records
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
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.curl "https://apis.io/api/v1/apis/domscan-email-authentication-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
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: DomScan Email Authentication API
description: DomScan is a domain intelligence API providing domain analysis tools.
version: 2.15.0
contact:
name: DomScan Support
url: https://domscan.net
email: support@domscan.net
termsOfService: https://domscan.net/legal/terms
license:
name: MIT
url: https://opensource.org/licenses/MIT
servers:
- url: https://domscan.net
description: Production server
security:
- apiKey: []
tags:
- name: Email Authentication
description: Build and validate SPF, DMARC, and DKIM records
paths:
/v1/tools/spf/build:
post:
tags:
- Email Authentication
summary: Build SPF record
description: Generate an SPF record from specified parameters
operationId: buildSpf
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- all
properties:
include:
type: array
items:
type: string
description: Domains to include
ip4:
type: array
items:
type: string
description: IPv4 addresses/ranges
ip6:
type: array
items:
type: string
description: IPv6 addresses/ranges
a:
type: boolean
description: Include A record
mx:
type: boolean
description: Include MX record
redirect:
type: string
description: Redirect to another domain
all:
type: string
enum:
- pass
- fail
- softfail
- neutral
description: Default policy
responses:
'200':
description: Generated SPF record
content:
application/json:
schema:
type: object
properties:
record:
type: string
dns_name:
type: string
record_type:
type: string
dns_lookups:
type: integer
valid:
type: boolean
warnings:
type: array
items:
type: string
explanation:
type: object
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'402':
$ref: '#/components/responses/PaymentRequired'
'429':
$ref: '#/components/responses/RateLimited'
x-domscan-credits:
model: per_request
default: 1
/v1/tools/spf/validate:
post:
tags:
- Email Authentication
summary: Validate SPF record
description: Validate an SPF record and check for issues
operationId: validateSpf
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
record:
type: string
description: SPF record to validate
domain:
type: string
description: Domain to fetch SPF record from (if record not provided)
responses:
'200':
description: SPF validation result
content:
application/json:
schema:
type: object
properties:
valid:
type: boolean
version:
type: string
mechanisms:
type: array
items:
type: object
dns_lookups:
type: integer
lookup_limit_exceeded:
type: boolean
policy:
type: string
issues:
type: array
items:
type: string
warnings:
type: array
items:
type: string
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'402':
$ref: '#/components/responses/PaymentRequired'
'429':
$ref: '#/components/responses/RateLimited'
x-domscan-credits:
model: per_request
default: 1
/v1/tools/spf/flatten:
post:
tags:
- Email Authentication
summary: Flatten SPF record
description: Flatten SPF includes to IP addresses to reduce DNS lookups
operationId: flattenSpf
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- domain
properties:
domain:
type: string
description: Domain to flatten SPF for
responses:
'200':
description: Flattened SPF record
content:
application/json:
schema:
type: object
properties:
domain:
type: string
original_record:
type: string
flattened_record:
type: string
original_lookups:
type: integer
flattened_lookups:
type: integer
resolved_ips:
type: object
warnings:
type: array
items:
type: string
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'402':
$ref: '#/components/responses/PaymentRequired'
'429':
$ref: '#/components/responses/RateLimited'
x-domscan-credits:
model: per_request
default: 2
/v1/tools/dmarc/build:
post:
tags:
- Email Authentication
summary: Build DMARC record
description: Generate a DMARC record from specified parameters
operationId: buildDmarc
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- policy
properties:
policy:
type: string
enum:
- none
- quarantine
- reject
description: DMARC policy
subdomain_policy:
type: string
enum:
- none
- quarantine
- reject
percentage:
type: integer
minimum: 0
maximum: 100
rua:
type: array
items:
type: string
description: Aggregate report addresses
ruf:
type: array
items:
type: string
description: Forensic report addresses
adkim:
type: string
enum:
- relaxed
- strict
aspf:
type: string
enum:
- relaxed
- strict
responses:
'200':
description: Generated DMARC record
content:
application/json:
schema:
type: object
properties:
record:
type: string
dns_name:
type: string
record_type:
type: string
valid:
type: boolean
explanation:
type: object
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'402':
$ref: '#/components/responses/PaymentRequired'
'429':
$ref: '#/components/responses/RateLimited'
x-domscan-credits:
model: per_request
default: 1
/v1/tools/dmarc/validate:
post:
tags:
- Email Authentication
summary: Validate DMARC record
description: Validate a DMARC record and check for issues
operationId: validateDmarc
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
record:
type: string
description: DMARC record to validate
domain:
type: string
description: Domain to fetch DMARC record from (if record not provided)
responses:
'200':
description: DMARC validation result
content:
application/json:
schema:
type: object
properties:
valid:
type: boolean
version:
type:
- string
- 'null'
policy:
type:
- string
- 'null'
subdomain_policy:
type:
- string
- 'null'
percentage:
type: integer
rua:
type: array
items:
type: string
ruf:
type: array
items:
type: string
strength:
type: string
enum:
- strong
- moderate
- weak
- monitoring
issues:
type: array
items:
type: string
warnings:
type: array
items:
type: string
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'402':
$ref: '#/components/responses/PaymentRequired'
'429':
$ref: '#/components/responses/RateLimited'
x-domscan-credits:
model: per_request
default: 1
/v1/tools/dkim/check:
get:
tags:
- Email Authentication
summary: Check DKIM selector
description: Check a specific DKIM selector for a domain
operationId: checkDkim
parameters:
- name: domain
in: query
required: true
schema:
type: string
description: Domain to check
- name: selector
in: query
required: true
schema:
type: string
description: DKIM selector name
responses:
'200':
description: DKIM check result
content:
application/json:
schema:
type: object
properties:
domain:
type: string
selector:
type: string
dns_name:
type: string
exists:
type: boolean
valid:
type: boolean
record:
type: string
key_type:
type: string
key_size:
type: integer
issues:
type: array
items:
type: string
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'402':
$ref: '#/components/responses/PaymentRequired'
'429':
$ref: '#/components/responses/RateLimited'
x-domscan-credits:
model: per_request
default: 1
/v1/tools/dkim/discover:
get:
tags:
- Email Authentication
summary: Discover DKIM selectors
description: Discover common DKIM selectors for a domain
operationId: discoverDkim
parameters:
- name: domain
in: query
required: true
schema:
type: string
description: Domain to scan
responses:
'200':
description: DKIM discovery result
content:
application/json:
schema:
type: object
properties:
domain:
type: string
selectors_checked:
type: array
items:
type: string
selectors_found:
type: array
items:
type: object
properties:
selector:
type: string
dns_name:
type: string
exists:
type: boolean
record:
type:
- string
- 'null'
record_type:
type:
- string
- 'null'
enum:
- TXT
- CNAME
cname_targets:
type: array
items:
type: string
key_type:
type:
- string
- 'null'
key_size:
type:
- integer
- 'null'
provider_hint:
type:
- string
- 'null'
valid:
type: boolean
revoked:
type: boolean
weak:
type: boolean
hash_algorithms:
type: array
items:
type: string
service_type:
type:
- string
- 'null'
flags:
type: array
items:
type: string
issues:
type: array
items:
type: string
total_found:
type: integer
common_providers_detected:
type: array
items:
type: string
providers_detected:
type: array
items:
type: string
valid_selector_count:
type: integer
weak_selector_count:
type: integer
revoked_selector_count:
type: integer
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'402':
$ref: '#/components/responses/PaymentRequired'
'429':
$ref: '#/components/responses/RateLimited'
x-domscan-credits:
model: per_request
default: 2
components:
responses:
Unauthorized:
description: 'Authentication required. All API endpoints require a valid API key (x-api-key header or Authorization: Bearer) or an active session cookie.'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error:
code: AUTH_REQUIRED
message: 'Authentication required. Provide an API key via x-api-key header or Authorization: Bearer header.'
docs: https://domscan.net/docs/authentication
get_key: https://domscan.net/login
PaymentRequired:
description: Insufficient credits for this request
headers:
X-Credits-Remaining:
schema:
type: integer
description: Credits remaining on your API key
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error:
code: INSUFFICIENT_CREDITS
message: Insufficient credits. This endpoint costs 2 credits but you have 0. Purchase more at https://domscan.net/billing or wait for your monthly reset.
credits_remaining: 0
credits_required: 2
purchase_url: https://domscan.net/billing
RateLimited:
description: Rate limit exceeded. Free accounts can sustain 120 requests per minute per account with a burst capacity of 60. Free bulk traffic is additionally limited to 20 requests per minute per account across all bulk endpoints and 100 per minute per IPv4 address or IPv6 /56 network. Paid accounts can sustain 600 requests per minute with a burst capacity of 120.
headers:
Retry-After:
schema:
type: integer
description: Seconds to wait before retrying
X-RateLimit-Plan:
schema:
type: string
enum:
- free
- paid
description: The account plan whose policy was applied.
X-RateLimit-Limit:
schema:
type: integer
description: The immediate burst capacity, or the active bulk fixed-window limit when a bulk-specific limit is exceeded.
X-RateLimit-Remaining:
schema:
type: integer
example: 0
description: Immediate burst tokens remaining, or requests remaining in the active bulk fixed window.
X-RateLimit-Policy:
schema:
type: string
description: Machine-readable summary of the active tier and limit policy.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error:
code: RATE_LIMITED
message: Rate limit exceeded. Please wait before making more requests.
BadRequest:
description: Bad request - invalid parameters
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error:
code: BAD_REQUEST
message: Invalid domain format
suggestion: Domain must be a valid format like example.com
schemas:
ErrorResponse:
type: object
description: Standard error response format
properties:
error:
type: object
properties:
code:
type: string
description: Error code for programmatic handling
example: INVALID_DOMAIN
type:
type: string
enum:
- authentication_error
- credits_error
- permission_error
- not_found_error
- conflict_error
- rate_limit_error
- timeout_error
- validation_error
- upstream_error
- api_error
- request_error
description: Stable error category used by official SDK subclasses
message:
type: string
description: Human-readable error message
example: Invalid domain format
status:
type: integer
minimum: 400
maximum: 599
description: HTTP status repeated in the JSON error for queue and log processors
retryable:
type: boolean
description: Whether retrying can be appropriate after applying retry guidance
request_id:
type: string
description: Request identifier matching the X-Request-Id response header
suggestion:
type: string
description: Suggestion for fixing the error
details:
type: object
description: Optional structured context for the error
additionalProperties: true
retry_after:
type: integer
minimum: 0
description: Seconds to wait before retrying when the error is temporary
example: 300
docs_url:
type: string
description: Link to relevant documentation
example: /docs#parameters
required:
- type
- code
- message
- status
- retryable
- request_id
- docs_url
securitySchemes:
apiKey:
type: apiKey
in: header
name: x-api-key
description: 'API key for authentication. Get yours free at https://domscan.net. Also accepts Authorization: Bearer header.'
sessionCookie:
type: apiKey
in: cookie
name: session
description: Active DomScan browser session. Used by account-management endpoints.
externalDocs:
description: Full API Documentation
url: https://domscan.net/docs
x-rapidapi-product: domscan
x-domscan-rate-limits:
free:
general:
scope: account
sustained_requests_per_minute: 120
burst_capacity: 60
shared_across_api_keys_and_sessions: true
bulk:
scope: all bulk endpoints combined
account_requests_per_minute: 20
network_requests_per_minute: 100
ipv6_network_prefix: 56
paid:
general:
scope: API key for key-authenticated requests; IP for browser sessions
sustained_requests_per_minute: 600
burst_capacity: 120
free_bulk_budget_applies: false
response:
status: 429
retry_header: Retry-After
headers_on_every_authenticated_response:
- X-RateLimit-Plan
- X-RateLimit-Limit
- X-RateLimit-Remaining
- X-RateLimit-Policy
burst_headers:
- X-RateLimit-Limit
- X-RateLimit-Remaining
policy_header: X-RateLimit-Policy
x-domscan-response-metadata:
compatibility: additive response headers; established JSON success bodies are unchanged
headers:
X-Request-Id: Unique request identifier for logs and support
X-API-Version: DomScan API release version
X-Response-Time: Server processing duration in milliseconds
X-Credits-Requested: Credits requested before refund settlement
X-Credits-Charged: Credits retained after settlement
X-Credits-Refunded: Credits returned during settlement
X-Credits-Remaining: Authenticated account balance after the request
X-Data-Freshness: fresh, cached, stale, mixed, or unknown
X-RateLimit-Limit: Active burst capacity
X-RateLimit-Remaining: Remaining burst capacity
X-RateLimit-Plan: Active plan, or not_applicable before authentication
X-RateLimit-Policy: Machine-readable active rate policy