Domain Security Audit API | SSL Expiry, DMARC, Domain Expiry avatar

Domain Security Audit API | SSL Expiry, DMARC, Domain Expiry

Pricing

from $10.00 / 1,000 results

Go to Apify Store
Domain Security Audit API | SSL Expiry, DMARC, Domain Expiry

Domain Security Audit API | SSL Expiry, DMARC, Domain Expiry

Summary-first portfolio monitor for SSL expiry, DMARC/SPF/DKIM, domain expiry/ownership, and security headers with remediation-ready outputs.

Pricing

from $10.00 / 1,000 results

Rating

0.0

(0)

Developer

太郎 山田

太郎 山田

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

22 minutes ago

Last modified

Share

Summary-first portfolio monitor for SSL expiry, DMARC/SPF/DKIM, domain expiry/ownership, and security headers with remediation-ready outputs.

Store Quickstart

  • Start with store-input.example.json for the free / starter smallest useful run: 2 domains in, one executive summary + remediation list out in the Apify OUTPUT record (or local output/result.json), plus per-domain dataset rows.
  • Then pick a template in store-input.templates.json:
    • Free / starter lane
      • Starter Quickstart (2 Domains -> Summary + Remediation List) — fastest proof of value with no webhook or reputation key
    • Paid expansion lanes
      • Portfolio Watch (Advanced Recurring | SSL, DMARC, Expiry, Headers) — broader scheduled sweeps across managed domains
      • Webhook Remediation Queue (Advanced Delivery) — send the executive summary + alert queue to your own endpoint
      • Renewal Watchlist (Recurring SSL + Domain Expiry) — focus on renewal windows and ownership drift
      • Security Audit + Web Risk (Advanced Add-on) — layer optional Google Web Risk on top

Key Features

  • 🔗 URL-first workflow — Bulk-process thousands of URLs per run with parallel fetching
  • 📊 Structured output — Every URL returns consistent, dataset-ready rows for downstream use
  • 🛡️ Rate-limit aware — Exponential backoff and concurrency throttling keep you off block lists
  • 📡 Webhook delivery — Push results to Slack, Discord, or any HTTP endpoint for real-time alerts
  • 💰 No external APIs — Reads public data — zero API-key costs, zero vendor lock-in

Use Cases

WhoWhy
DevelopersAutomate recurring data fetches without building custom scrapers
Data teamsPipe structured output into analytics warehouses
Ops teamsMonitor changes via webhook alerts
Product managersTrack competitor/market signals without engineering time

Input

FieldTypeDefaultDescription
domainsarrayprefilledFree / starter quickstart: begin with 2-3 domains for a fast first success. Paid expansion: grow into larger recurring p
portinteger443Port used for SSL/TLS expiry and trust checks across the portfolio.
expiryWarningDaysinteger30Flag certificates or domains that expire within this many days.
followRedirectsbooleantrueFollow redirects before scoring the final site's security headers.
checkDkimbooleantrueProbe common selectors so the first run catches missing DKIM alongside SPF and DMARC.
dkimSelectorsarrayOptional DKIM selectors to check instead of the built-in defaults.
deliverystring"dataset"Free / starter path: dataset keeps the first run low-friction and still writes the full summary to OUTPUT. Paid expansio
webhookUrlstringAdvanced delivery only: required when delivery is webhook. The payload includes the executive summary, flattened remedia

Input Example

{
"domains": [
"example.com",
"github.com"
],
"expiryWarningDays": 30,
"delivery": "dataset",
"snapshotKey": "domain-security-audit-quickstart",
"concurrency": 2
}

Output

FieldTypeDescription
metaobject
alertsarray
resultsarray
alerts[].domainstring
alerts[].severitystring
alerts[].componentstring
alerts[].typestring
alerts[].messagestring
alerts[].policynull

Output Example

{
"meta": {
"executiveSummary": {
"overallStatus": "attention_needed",
"brief": "1 of 2 domains needs action. Highest-risk issue: 5 alert(s): DMARC record is missing.",
"recommendedCadence": "daily",
"topDomains": [
{
"domain": "example.com",
"severity": "high",
"trustScore": 41,
"brief": "5 alert(s): DMARC record is missing."
}
]
},
"runProfile": {
"tier": "starter",
"label": "Starter first-success path"
},
"usageAdvisories": {
"summary": "1 usage/recovery advisory signal active for this run.",
"signals": [
{
"id": "starter_portfolio_boundary",
"limit": "3 domains in the starter quickstart"
}
]
},
"upgradeSuggestions": [
{
"type": "schedule",
"templateId": "portfolio_watch",
"cadence": "daily",
"title": "Promote this baseline to a recurring portfolio watch"
}
],
"nextWorkflow": {
"type": "same_actor_template",
"id": "action_needed_webhook",
"title": "Next best step: Webhook Remediation Queue"
}
},
"alerts": [
{
"domain": "example.com",
"severity": "high",
"component": "dns",
"type": "dmarc_missing_or_weak",
"message": "DMARC record is missing."
},
{
"domain": "example.com",
"severity": "high",
"component": "rdap",
"type": "domain_expiring_soon",
"message": "Domain expires in 28 days"
}
],
"results": [
{
"domain": "example.com",
"severity": "high",
"recommendedActions": [
"Publish an enforced DMARC policy (quarantine or reject) with aggregate reporting.",
"Renew the domain registration before the expiry window closes.",
"Add the missing critical security headers (HSTS, CSP, X-Content-Type-Options, X-Frame-Options)."
]
}
]
}

API Usage

Run this actor programmatically using the Apify API. Replace YOUR_API_TOKEN with your token from Apify Console → Settings → Integrations.

cURL

curl -X POST "https://api.apify.com/v2/acts/taroyamada~domain-trust-monitor/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "domains": [ "example.com", "github.com" ], "expiryWarningDays": 30, "delivery": "dataset", "snapshotKey": "domain-security-audit-quickstart", "concurrency": 2 }'

Python

from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("taroyamada/domain-trust-monitor").call(run_input={
"domains": [
"example.com",
"github.com"
],
"expiryWarningDays": 30,
"delivery": "dataset",
"snapshotKey": "domain-security-audit-quickstart",
"concurrency": 2
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

JavaScript / Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });
const run = await client.actor('taroyamada/domain-trust-monitor').call({
"domains": [
"example.com",
"github.com"
],
"expiryWarningDays": 30,
"delivery": "dataset",
"snapshotKey": "domain-security-audit-quickstart",
"concurrency": 2
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Tips & Limitations

  • Keep concurrency ≤ 5 when auditing production sites to avoid WAF rate-limit triggers.
  • Use webhook delivery for recurring cron runs — push only deltas to downstream systems.
  • Enable dryRun for cheap validation before committing to a paid cron schedule.
  • Results are dataset-first; use Apify API run-sync-get-dataset-items for instant JSON in CI pipelines.
  • Run a tiny URL count first, review the sample, then scale up — pay-per-event means you only pay for what you use.

FAQ

Is there a rate limit?

Built-in concurrency throttling keeps requests polite. For most public APIs this actor can run 1–10 parallel requests without issues.

What happens when the input URL is unreachable?

The actor records an error row with the failure reason — successful URLs keep processing.

Can I schedule recurring runs?

Yes — use Apify Schedules to run this actor on a cron (hourly, daily, weekly). Combine with webhook delivery for change alerts.

Does this actor respect robots.txt?

Yes — requests use a standard User-Agent and honor site rate limits. For aggressive audits, set a higher concurrency only on your own properties.

Can I integrate with Google Sheets or Airtable?

Use webhook delivery with a Zapier/Make/n8n catcher, or call the Apify REST API from Apps Script / Airtable automations.

URL/Link Tools cluster — explore related Apify tools:

Cost

Pay Per Event:

  • actor-start: $0.01 (flat fee per run)
  • dataset-item: $0.003 per output item

Example: 1,000 items = $0.01 + (1,000 × $0.003) = $3.01

No subscription required — you only pay for what you use.