SSL Certificate Checker API

Check the SSL/TLS certificate of any domain: days to expiry, issuer, SANs, hostname match, chain, OCSP stapling, TLS version, cipher and old protocols.

GETPOSThttps://apibox.io.vn/v1/ssl-check
Network & Validation▶ Try it online

Give a host (domain or IP, optional :port) and the API opens a TLS connection from our edge and reads the certificates the server presents. It returns the leaf certificate (subject, issuer, serial, validity dates and days_remaining, SANs, key type and size, signature algorithm, DV / OV / EV level, key usages, OCSP / CA issuer / CRL URLs, SHA-256 and SHA-1 fingerprints), the chain with each signature checked against the next certificate, the negotiated TLS version, cipher suite, key exchange group and ALPN, and the stapled OCSP status (good / revoked) when the server sends one. With protocols (on by default for one host) it also tests whether TLS 1.0, 1.1, 1.2 and 1.3 are accepted.

A summary says whether the certificate is valid for the name, and warnings lists problems in plain codes: expired, expires_soon (within warn_days, default 30), hostname_mismatch, self_signed, incomplete_chain (an intermediate the server does not send, detected by fetching the issuer from the AIA URL), weak_signature_algorithm, weak_key, legacy_protocol_enabled, revoked. A normal certificate-validating HTTPS request is made as well (https_request), which reflects trust in the usual root stores. hosts checks up to 10 domains at once and returns a short summary per domain.

Honest limits: our edge runs on Cloudflare Workers, which cannot open raw connections to Cloudflare IP ranges. For sites behind Cloudflare (and when the connection times out) the response says source: "certificate_transparency": the certificates listed are the currently valid ones published in Certificate Transparency logs (Cert Spotter, crt.sh) for that name, not necessarily the one served, plus the live HTTPS check. Allowed ports: 443, 8443 and the usual implicit-TLS ports (465, 993, 995, 636…); private and internal addresses are refused.

Parameters

NameInTypeRequiredDefault
hostquerystringyesDomain or IP, optionally with :port or as a URL (https://example.com:8443/).
portquerynumberno443TLS port: 443, 8443, 465, 563, 636, 853, 989, 990, 992–995, 2083, 2087, 2096, 5061, 6697, 8883, 9443.
servernamequerystringnoSNI name to send when it differs from host (e.g. checking an IP).
protocolsquerybooleannotrueAlso test TLS 1.0 / 1.1 / 1.2 / 1.3 support (4 short handshakes). Off by default with hosts.
warn_daysquerynumberno30expires_soon warning threshold in days (1–365).
ctquerybooleannofalseAlso list the valid certificates found in Certificate Transparency logs.
hostsbody|queryarraynoUp to 10 hosts (array or comma-separated) for a bulk check; returns one summary per host.

Example

curl "https://apibox.io.vn/v1/ssl-check?host=github.com" \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "host": "github.com",
  "port": 443,
  "sni": "github.com",
  "addresses": [
    "20.205.243.166"
  ],
  "source": "live_handshake",
  "tls": {
    "version": "TLS 1.3",
    "cipher": "TLS_AES_128_GCM_SHA256",
    "key_exchange_group": "x25519",
    "alpn": "h2",
    "handshake_ms": 162,
    "ocsp_stapling": {
      "stapled": false
    }
  },
  "protocols": {
    "TLS 1.0": false,
    "TLS 1.1": false,
    "TLS 1.2": true,
    "TLS 1.3": true
  },
  "summary": {
    "observed": true,
    "valid": true,
    "hostname_match": true,
    "matched_name": "DNS:github.com",
    "days_remaining": 77,
    "expires_at": "2027-01-27T23:59:59Z",
    "issuer": "Sectigo Limited",
    "validation_level": "DV",
    "chain_length": 3,
    "chain_complete": null,
    "chain_issuer_checked": null
  },
  "certificate": {
    "subject": "CN=github.com",
    "issuer": "C=GB, O=Sectigo Limited, CN=Sectigo Public Server Authentication CA DV E36",
    "serial_number": "3E:1D:60:26:B4:B0:AE:A2:79:DC:A2:EF:BB:CE:D8:2B",
    "version": 3,
    "not_before": "2026-10-30T00:00:00Z",
    "not_after": "2027-01-27T23:59:59Z",
    "days_remaining": 77,
    "valid_now": true,
    "validity_days": 90,
    "san": {
      "dns": [
        "github.com",
        "www.github.com"
      ],
      "ip": [],
      "email": [],
      "uri": []
    },
    "public_key": {
      "algorithm": "EC",
      "curve": "P-256",
      "size": 256
    },
    "signature_algorithm": "ecdsa-with-SHA256",
    "is_ca": false,
    "self_signed": false,
    "validation_level": "DV",
    "extensions": {
      "key_usage": [
        "digitalSignature"
      ],
      "extended_key_usage": [
        "serverAuth"
      ],
      "ocsp_urls": [
        "http://ocsp.sectigo.com"
      ],
      "ca_issuer_urls": [
        "http://crt.sectigo.com/SectigoPublicServerAuthenticationCADVE36.crt"
      ],
      "sct_present": true
    },
    "fingerprints": {
      "sha256": "7D:C4:D8:5C:F1:E3:10:97:12:25:BC:9A:92:57:67:90:43:A2:43:D7:0A:3C:C2:A9:1C:C5:D3:89:89:2C:27:76",
      "sha1": "E6:52:C8:BD:1C:AF:D0:4A:44:23:9F:A8:DA:B0:C5:9D:EA:CB:79:EE"
    }
  },
  "chain": [
    {
      "index": 0,
      "subject": "CN=github.com",
      "issuer": "C=GB, O=Sectigo Limited, CN=Sectigo Public Server Authentication CA DV E36",
      "not_after": "2027-01-27T23:59:59Z",
      "days_remaining": 77,
      "signature_algorithm": "ecdsa-with-SHA256",
      "is_ca": false,
      "self_signed": false,
      "signed_by_next": true
    },
    {
      "index": 1,
      "subject": "C=GB, O=Sectigo Limited, CN=Sectigo Public Server Authentication CA DV E36",
      "issuer": "C=GB, O=Sectigo Limited, CN=Sectigo Public Server Authentication Root E46",
      "not_after": "2036-03-21T23:59:59Z",
      "days_remaining": 3418,
      "signature_algorithm": "ecdsa-with-SHA384",
      "is_ca": true,
      "self_signed": false,
      "signed_by_next": true
    },
    {
      "index": 2,
      "subject": "C=GB, O=Sectigo Limited, CN=Sectigo Public Server Authentication Root E46",
      "issuer": "C=US, ST=New Jersey, L=Jersey City, O=The USERTRUST Network, CN=USERTrust ECC Certification Authority",
      "not_after": "2038-01-18T23:59:59Z",
      "days_remaining": 4086,
      "signature_algorithm": "ecdsa-with-SHA384",
      "is_ca": true,
      "self_signed": false,
      "signed_by_next": null
    }
  ],
  "https_request": {
    "url": "https://github.com/",
    "ok": true,
    "status": 200,
    "ms": 177,
    "error": null,
    "hsts": "max-age=31536000; includeSubdomains; preload"
  },
  "warnings": [],
  "note": "Observed live: the certificates the server presented in a TLS handshake from our edge. …"
}

Use cases

  • Get warned before a certificate expires on a client site
  • Check that a new certificate is installed with its full chain
  • Audit servers that still accept TLS 1.0 / 1.1
  • Check the certificates of 10 domains in one call from a cron job

FAQ

Why does a site behind Cloudflare show certificate_transparency?

Cloudflare Workers cannot open TCP sockets to Cloudflare IP addresses, so the handshake is impossible there. The API then lists the valid certificates logged for the name in CT logs and confirms with a live HTTPS request.

Does "valid" mean browsers trust the certificate?

It means the certificate is in its validity period, matches the host name, is not self-signed, its chain signatures are correct and no missing intermediate was found. Root store trust is reflected by https_request.

Can I check mail or other TLS ports?

Yes for implicit TLS ports such as 465, 993, 995, 636 and 8443. STARTTLS (25, 587, 143) is not supported.

Related APIs

Start with 1,000 free requests every month. Get free API key →