Texas Veteran Certified BusinessTexas VetHUB Vendor
One OpenAPI contract for three calls. Request a classical signature or a hybrid ECDSA P-256 + ML-DSA-65 envelope, anchor a SHA-384 (96 hex characters) hybrid of those signatures on Hedera Consensus Service, and read the timestamp back with verify. Agents hold API keys, not signing keys. Every sign request is written to the audit log. A hash shows a document has not changed since it was sealed. It does not prove who signed it.

HashSign ledger
Hedera · topic 0.0.9001
documents.upload()
Digest computed on-device · 248 KB · contract.pdf
documents.sign()
pqcMode · hybrid ECDSA + ML-DSA-65 · key_invoice_bot
documents.verify()
0.0.45291@1726580598.441002113 · consensus 2.9 s
Interactive playground
The preview opens on a hybrid sign request (pqc_mode=True). Paste a key, switch languages, and run the mock flow to see the SignedPayload and the Hedera proof shape. No live topic submit happens from this page.
from hashsign import HashSignClient, HashSignError
client = HashSignClient(api_key="hs_live_your_key")
try:
# The SHA-384 seal (96 hex characters) is computed in this process. The file stays on the device until you send or share it.
document = client.documents.upload(
"contract.pdf",
metadata={"agentId": "invoice-bot"},
)
# pqc_mode requests classical + ML-DSA-65. HCS stores SHA-384 (96 hex characters) of both.
signed = client.documents.sign(document.id, pqc_mode=True)
proof = client.documents.verify(document.id)
except HashSignError as exc:
raise SystemExit(f"signing failed: {exc}")
print(signed.payload.algorithm, signed.payload.signer_key_id)
print(signed.payload.pqc.algorithm, signed.payload.pqc.hybrid_anchor)
print(proof.topic_id, proof.hedera_transaction_id, proof.verified)SDK payload preview · SignedPayload
Response shape from the OpenAPI contract when pqcMode is set: algorithm hybrid-ecdsa-ml-dsa, plus an ml-dsa-65 object whose hybridAnchor is SHA-384 (96 hex characters) of the two signatures.
{
"documentId": "doc_01JXYZ",
"sha384": "47f05d367b0c32e438fb63e6cf4a5f35c2aa2f90dc7543f8a41a0f95ce8a40a313ab5cf36134a2068c4c969cb50db776",
"signedAt": "2026-09-19T12:00:01.002Z",
"signerKeyId": "key_invoice_bot",
"signature": "9c21ed25519c0ffee0123456789abcdeffedcba9876543210abcdef01234567",
"algorithm": "hybrid-ecdsa-ml-dsa",
"agentLogoUri": "ipfs://bafybeia008befe96d31f1b2f19c7844c4e98c37bc4bac3df0276669d",
"agentBrandHash": "a008befe96d31f1b2f19c7844c4e98c37bc4bac3df0276669d9b9f24e24d7812fc0942e3f440df5ff21790e51a1b9af2",
"pqc": {
"enabled": true,
"algorithm": "ml-dsa-65",
"signature": "d1lthm65abababababababababababababababababababababababababababab",
"hybridAnchor": "a540d42e455459c4b2cd542f46726f903bcbe8dc9cb7d2ee8ff9cc99dcdf4e1d5765642064ad3c9a1f4d9e6ec63ec171"
}
}Live proof simulator
The document stays on the device until you send or share it. Only the SHA-384 seal (96 hex characters) is anchored. Optional cloud review runs only when you tap it. The consensus receipt on this page is simulated.
Drop any file to hash it
The document stays on the device until you send or share it. Only the SHA-384 seal (96 hex characters) is anchored. Optional cloud review runs only when you tap it.
Click or drag & drop · up to 512 MBHedera Consensus Service · simulated
DraftYour HCS transaction proof will appear here.
Architecture
Specified in packages/shared/openapi.yaml and implemented by the Python SDK. The portal preview uses the same payload shape.
documents.sign accepts pqcMode. With that flag, or a key that sets requirePqcSignatures, the OpenAPI contract returns a classical Ed25519 or ECDSA P-256 signature plus an ML-DSA-65 (Dilithium) signature. Hedera stores a SHA-384 (96 hex characters) hybrid anchor of the two signatures so the topic message stays within the 1024-byte HCS limit. The Python SDK sends the flag; it does not bundle a lattice library.
Agents authenticate with scoped read, write, and sign keys and call upload, sign, and verify. The SHA-384 seal (96 hex characters) is computed in the agent runtime. The document stays on the device until you send or share it. Only that seal is anchored. Optional cloud review runs only when you tap it. Each signing request is appended to the audit log.
The SHA-384 seal (96 hex characters), or the SHA-384 hybrid anchor when post-quantum mode is on, is submitted to Hedera Consensus Service. The example topic on this page is 0.0.9001. Consensus finality is a few seconds. verify returns the transaction id and timestamp anyone can recompute.
The portal, Python SDK, and TypeScript types all implement the same OpenAPI 3.1 contract in packages/shared/openapi.yaml.