Docs · API
Proof verification
The only endpoint that checks a signature. It answers whether a specific request really came from a registered site.
Endpoint
All five are required. A missing one is still a registry outcome: malformed in the body, with HTTP 200. The one case where this endpoint does not produce an outcome is unavailable replay protection, covered at the bottom of this page.
What is checked, in order
- All five parameters present and
tsnumeric. - The host is not on the blocklist.
- The site exists.
- Its state permits verification —
suspended,inactiveandformerare refused here, before any cryptography runs. - A credential is on file for the site.
- The timestamp is inside the window and the signature is valid for the exact message.
- The nonce has not been used before, and is consumed now.
- The host matches one of the site's allowed domains.
The order matters when reading a result: a site_suspended answer means the signature was never examined.
Response
id, name, canonical_domain, status. Absent for unknown_site, malformed and blacklisted.{
"result": "verified_signed",
"host": "demo.liorith.net",
"ts": 1756800000,
"site": {
"id": "demo",
"name": "Liorith Demo",
"canonical_domain": "demo.liorith.net",
"status": "active"
}
}Only two results mean yes
verified_signed is the full yes. valid_deprecated is a yes with a caveat: the signature is good, but the entry is on its way out. Treat everything else as no.
site object came back. It is present for refusals too — host_mismatch, replay and site_suspended all carry one.When verification cannot run
Replay protection needs the nonce store. If it is unreachable, the endpoint answers 503 with Retry-After instead of a result.
That is on purpose: without a consumed nonce, a captured proof could be replayed for the rest of its two-minute life. An outage must not quietly downgrade what a verification means, so it refuses to answer at all.