Threat intel pipeline running

Developers

One GET gets you a domain record with no key. Everything else on this page says where the rest of the documentation is.

issued.live publishes three things about a domain: registration data where we hold it, Certificate Transparency observations, and DNS. The corpus covers more than 420 million domains and grows as the logs and the zone feeds move. Every field is an observation with a date on it.

Which API do I want?

PlanWhat it coversCostDocumentation
Free Domain lookups, /api/stats and /api/feed. 1,000 requests a day per client address, resetting at 00:00 UTC. No account, no key. $0 /developers/api
Basic The same endpoints with the daily cap lifted, metered at 60 requests a minute, plus the daily downloadable files as csv.zst and json.zst. $29 a month /developers/feeds
Pro Everything in Basic at 300 requests a minute, plus reverse IP and range lookups, pattern search, batch lookup, certificate and SPKI pivots, JA4X fingerprints, DNS per vantage point and the provisioning feed. $149 a month /developers/pro

Free calls are capped at 1,000 a day per client address and the count resets at 00:00 UTC; inside the last 100, replies carry an X-RateLimit-Warning header so a client learns of the cap before it meets it. Basic calls the same endpoints as the free tier with the cap lifted, so the public API page is its reference too. Full plan comparison and limits are on pricing.

Quickstart: one call, no key

One HTTP GET returns the current record for a domain. Paste the call into a shell and it works as it stands.

$ curl https://issued.live/github.com

The response:

{
  "domain": "github.com",
  "registered": "2007-10-09T18:20:50Z",
  "expires": "2026-10-09T18:20:50Z",
  "ssl_expires": "2026-12-26T23:59:59Z",
  "ssl_cert": "9F53ECDDF913AFBA5678C924A95149D2",
  "ssl_issuer": "Amazon",
  "ip": "140.82.113.4",
  "last_update": "2026-09-14T08:07:30Z",
  "first_cert_seen": null,
  "tracked": false
}

One URL serves both representations, and four things decide which. The .json suffix or ?format=json asks for JSON outright; an Accept header naming application/json and not text/html asks for it too; failing both, a User-Agent beginning curl, Wget, HTTPie, python-requests, Go-http-client, libwww-perl, axios or okhttp gets JSON. Everything else gets the HTML page, a browser included.

Subdomains fold to their registrable domain, so www.github.com and github.com return one record. A null means we hold no value for that field.

Where the reference lives

Public API: free lookups and the Basic plan

/developers/api documents the domain lookup in full: every response field, the error codes, the rate-limit headers and worked examples in curl, PHP, Node.js, Python, Go and more.

Pro API: reverse IP, search and certificate pivots

/developers/pro covers the keyed endpoints under /api/v1: reverse IP and CIDR lookups, pattern search, batch lookup, certificate and SPKI pivots, and the newly registered domain feed.

Feeds and files: daily downloads

/developers/feeds lists the downloadable files with their columns and schedule: a daily delta of what changed, and a periodic full snapshot for seeding a new system. Paging an API for the whole corpus costs both sides more than one download.

Markdown, llms.txt and MCP

Append .md to a domain record or a prose page for a markdown representation. A language model quotes that far more accurately than a page wrapped in navigation and CSS.

$ curl -sS https://issued.live/github.com.md

/llms.txt maps what is worth fetching. Markdown URLs are noindex and canonicalize to the HTML page, so they stand as a second representation of one document. The site root answers curl issued.live with a short plain-text usage summary, so an agent that lands there can read what to do next.

MCP server at POST /mcp

issued.live speaks the Model Context Protocol at https://issued.live/mcp, as JSON-RPC 2.0 over HTTP POST. The server is stateless and mints no session id, so every request stands alone and there is nothing to resume.

$ curl -sS -X POST https://issued.live/mcp \
    -H "Content-Type: application/json" \
    -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

Three tools work with no key: lookup_domain, recent_certificates and corpus_stats. Three take a key on the MCP request itself: domains_on_ip, domains_in_range and new_domains. A keyed tool called without one answers HTTP 200 with a tool error naming the fix, which a model can read out loud.

Authentication

The free surface takes no credential at all. Domain lookups, /api/stats and /api/feed answer any client and never return 401. Send a User-Agent that identifies you, so we have a way to reach you if something you run causes a problem.

Paid endpoints read the key from the Authorization header as Bearer <key>. A missing or unrecognized key returns 401 with WWW-Authenticate: Bearer realm="issued.live" and the body {"error":"unauthorized","message":"Supply a key as: Authorization: Bearer <key>"}. Sign in at login to read your key once a plan is active, and pricing lists what each plan opens up.

$ curl -sS -H "Authorization: Bearer $ISSUED_KEY" \
    https://issued.live/api/v1/ip/140.82.113.4

If a limit blocks legitimate work, or something documented here behaves differently in practice, tell us.

↑ Top