SSL/TLS Certificate Scraper avatar

SSL/TLS Certificate Scraper

Pricing

$9.00 / 1,000 delivered monitoring result rows

Go to Apify Store
SSL/TLS Certificate Scraper

SSL/TLS Certificate Scraper

Monitor SSL certificates. No API key / no login. Open Input → leave defaults → Start (1 domain ≈ USD 0.009/row): https://console.apify.com/actors/LoRcTFSLQ2q3SiTGz/input

Pricing

$9.00 / 1,000 delivered monitoring result rows

Rating

0.0

(0)

Developer

naoki anzai

naoki anzai

Maintained by Community

Actor stats

0

Bookmarked

5

Total users

0

Monthly active users

5 days ago

Last modified

Share

SSL Certificate Monitor API | Expiry, Issuer & TLS Coverage

What you get: one row per domain with the certificate's issuer, validity dates, days left, protocol, SANs and fingerprint, plus a severity (critical / high / watch / info) and a one-line brief of what needs attention.

Sample output from a real run (2026-10-18, default input, 3 rows):

domainseverityissuervalidToprotocolbrief
expired.badssl.comcriticalCOMODO CA LimitedApr 12 2015TLSv1.22 alert(s): Certificate expired 4207 days ago
github.cominfoSectigo LimitedNov 29 2026TLSv1.3Certificate looks healthy
google.cominfoGoogle Trust ServicesDec 21 2026TLSv1.3Certificate looks healthy

That run was 3 result rows × $0.009 = $0.027 (there is no separate start fee). Later runs with the same snapshotKey only write rows for certificates that changed or need attention, so a stable portfolio costs $0.

Open Input (leave defaults → Start) Paid first run ≈ USD 0.009/row (1 domain). Keep reports, exports, and movement options off for the first run. Open Console Input (deep link above) and run this JSON.

{
"domains": [
"example.com"
],
"port": 443,
"expiryWarningDays": 90,
"concurrency": 1,
"delivery": "dataset",
"snapshotKey": "ssl-wave-l",
"dryRun": false
}

Paste domain and Start.

Maintain robust security posture across your infrastructure by using this tool to continuously monitor SSL/TLS certificates for expiration and configuration drift. When you need to extract security details from thousands of websites, relying on manual checks or heavy web browser rendering is inefficient. By validating connections directly at the protocol level, this SSL monitor delivers lightning-fast scraped results, making it the ideal solution for DevSecOps teams handling massive URL lists.

Run scheduled audits to proactively detect expiring certificates before browsers block access to your web pages or search engines penalize your organic results. You can scrape critical data points to extract issuer organization names, pinpoint self-signed certs, and verify active protocol versions across your entire domain portfolio. Beyond standard TLS validation, you can enable optional Google Web Risk checks using your API key to identify websites flagged for malware, phishing, or social engineering.

Every time you execute the scraper, it extracts highly structured results, including precise expiry timestamps, SHA-256 fingerprint hashes, and full certificate chain coverage. Export the scraped details or integrate them with your email and incident management tools to ensure immediate alerts when any website security status changes.

Store Quickstart

  • Start with store-input.example.json for a reliable dataset run across three known domains.
  • If that matches your workflow, switch to store-input.templates.json and pick one of:
  • Quickstart (Dataset) for first-run validation
  • Portfolio Watch for larger domain sets
  • Webhook Alert for operational notifications

Use with Apify MCP

Exact actor: taroyamada/ssl-certificate-monitor

Sample input JSON:

{
"domains": [
"google.com"
],
"port": 443,
"expiryWarningDays": 90,
"concurrency": 3,
"delivery": "dataset",
"snapshotKey": "ssl-certificate-snapshots"
}

Key Features

  • 🔒 Direct TLS inspection — Connects at the protocol level, not through HTTP
  • ⏰ Expiry warnings — Configurable alert threshold (default: 30 days)
  • 🔄 Certificate rotation detection — Tracks fingerprint changes between runs
  • 🔍 Issuer change alerts — Detect when a certificate's issuer changes (potential security issue)
  • 🛡️ Optional Google Web Risk lookup — Commercially usable reputation/threat checks with your own Google Cloud API key
  • ❌ Invalid cert detection — Catches expired, self-signed, and misconfigured certificates

Use Cases

WhoWhy
DevOps teamsPrevent certificate expiry outages across all domains
Security teamsDetect unauthorized certificate changes
MSPsMonitor client SSL certificates at scale
SEO agenciesVerify client sites have valid HTTPS

Input

FieldTypeDefaultDescription
domainsarrayprefilledList of domains to check SSL certificates for (e.g. ['example.com', 'github.com']). Maximum 200 per run.
portinteger443Port to connect on (default 443).
expiryWarningDaysinteger30Alert when certificate expires within this many days.
deliverystring"dataset"How to deliver results. 'dataset' saves to Apify Dataset (recommended), 'webhook' sends to a URL.
webhookUrlstring—Required when delivery is 'webhook'.
snapshotKeystring"ssl-cert-snapshots"Key name for storing snapshots (used for change detection between runs).
concurrencyinteger5Maximum number of parallel requests. Higher = faster but may trigger rate limits.
dryRunbooleanfalseIf true, runs without saving results or sending webhooks. Useful for testing.

Input Example

{
"domains": ["google.com", "github.com", "expired.badssl.com"],
"expiryWarningDays": 30,
"concurrency": 5,
"delivery": "dataset"
}

Input Examples

Example: Single host SSL audit

{
"domains": [
"example.com"
],
"port": 443
}

Example: Bulk monitoring with expiry alerts

{
"domains": [
"google.com",
"github.com",
"example.com"
],
"expiryWarningDays": 90,
"emitUnchanged": false
}

Example: Recurring watch with its own snapshot

{
"domains": [
"github.com",
"gitlab.com"
],
"snapshotKey": "my-ssl-portfolio",
"enableReputationLookup": false
}

Output

The first run with a new snapshotKey writes one row per domain. Later runs with the same snapshotKey write only certificates that are new, changed, or need attention; stable checks produce 0 dataset rows and 0 result charges (the run summary is still in the free OUTPUT record). Set emitUnchanged=true when you want a row for every certificate on every run.

FieldTypeDescription
domainstringDomain checked
statusstringinitial, changed, ok or error
certobjectsubject, issuer, issuerOrg, validFrom, validTo, serialNumber, fingerprint, bits, altNames, authorized, protocol
changesobject[]What changed since the last run
warningsobject[]expired, expiring_soon, auth_error, … with daysLeft
severitystringcritical, high, watch or info
alertCountintegerNumber of warnings
briefstringOne-line summary
reputationobject or nullGoogle Web Risk result when enableReputationLookup is on
checkedAttimestampWhen the check ran

Output Example

Row from a real run on example.com with expiryWarningDays: 90 (2026-10-18):

{
"domain": "example.com",
"status": "initial",
"cert": {
"subject": "CN=example.com",
"subjectCN": "example.com",
"issuer": "CN=Cloudflare TLS Issuing ECC CA 3, O=SSL Corporation, C=US",
"issuerOrg": "SSL Corporation",
"validFrom": "Sep 26 22:49:11 2026 GMT",
"validTo": "Dec 25 22:56:35 2026 GMT",
"bits": 256,
"altNames": [
"example.com",
"*.example.com"
],
"authorized": true,
"protocol": "TLSv1.3"
},
"changes": [],
"warnings": [
{
"type": "expiring_soon",
"message": "Certificate expires in 68 days",
"daysLeft": 68
}
],
"checkedAt": "2026-10-18T11:45:47.376Z",
"severity": "watch",
"alertCount": 1,
"brief": "1 alert(s): Certificate expires in 68 days",
"error": null,
"reputation": null
}

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~ssl-certificate-monitor/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "domains": ["google.com", "github.com", "expired.badssl.com"], "expiryWarningDays": 30, "concurrency": 5, "delivery": "dataset" }'

Python

from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("taroyamada/ssl-certificate-monitor").call(run_input={
"domains": ["google.com", "github.com", "expired.badssl.com"],
"expiryWarningDays": 30,
"concurrency": 5,
"delivery": "dataset"
})
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/ssl-certificate-monitor').call({
"domains": ["google.com", "github.com", "expired.badssl.com"],
"expiryWarningDays": 30,
"concurrency": 5,
"delivery": "dataset"
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Security cluster — Adjacent actors

Most defensive-security audits cover multiple layers on the same domains. The actors below pair naturally with this one:

Tips & Limitations

  • Schedule weekly runs against your production domains to catch config drift.
  • Use webhook delivery to pipe findings into your SIEM (Splunk, Datadog, Elastic).
  • For CI integration, block releases on critical severity findings using exit codes.
  • Combine with ssl-certificate-monitor for layered cert + headers coverage.
  • Findings include links to official remediation docs — share with dev teams via the webhook payload.

FAQ

Is running this against a third-party site legal?

Passive public-header scanning is generally permitted, but follow your own compliance policies. Only scan sites you have authorization for.

How often should I scan?

Weekly for production domains; daily if you have high config-change velocity.

Can I export to a compliance tool?

Use webhook delivery or Dataset API — formats map well to Drata, Vanta, OneTrust import templates.

Is this a penetration test?

No — this actor performs passive compliance scanning only. No exploitation, fuzzing, or auth bypass.

Does this qualify as a SOC2 control?

This actor produces evidence artifacts suitable for SOC2 CC7.1 (continuous monitoring). It is not itself a SOC2 certification.

Cost

Pay Per Event (current Store prices):

  • Result row: $0.009 per row written to the default dataset (no separate start fee)

Example: 1,000 rows = 1,000 × $0.009 = $9.00

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

⭐ Was this helpful?

If this actor saved you time, please leave a ★ rating on Apify Store. It takes 10 seconds, helps other developers discover it, and keeps updates free.

Bug report or feature request? Open an issue on the Issues tab of this actor.