Base URL
Section titled “Base URL”https://stampapi.veristamp.in/api/v1POST /timestamp
Section titled “POST /timestamp”Submit a file hash for timestamping and receive a signed cryptographic receipt. The file itself is never transmitted — only the hash is sent.
Request
Section titled “Request”POST /api/v1/timestamp Content-Type: application/jsonHex-encoded SHA-256 digest of the file (64 hex characters).
Base64url-encoded random 16-byte nonce. Generate a fresh nonce per request to prevent brute-force matching of the leaf hash.
Original filename. Metadata only — not part of the cryptographic proof.
File size in bytes. Metadata only — not part of the cryptographic proof.
Example request
Section titled “Example request”{ "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "nonce": "xK9mP2vL8nQ4wR7j", "filename": "contract.pdf", "size": 2048576}Response (200 OK)
Section titled “Response (200 OK)”{ "receipt": { "veristamp_version": "1.0", "type": "veristamp.receipt", "receipt_id": "vst_r_7f3a2b1c", "issued_at": "2026-06-05T12:00:00.000Z", "hash": { "algorithm": "SHA-256", "value": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, "nonce": "xK9mP2vL8nQ4wR7j", "issuer": { "name": "Veristamp", "key_id": "vst_sign_2026_q2_01" }, "signature": { "algorithm": "Ed25519", "value": "aBcDeFgHiJkLmNoPqRsTuVwXyZ..." }, "verification": { "public_key_registry": "https://stamp.veristamp.in/.well-known/veristamp-keyring.json", "verifier": "https://stamp.veristamp.in/verify" }, "transparency": { "log": "https://stamp.veristamp.in/transparency", "current_root": "https://roots.veristamp.in/.well-known/veristamp-roots/current.json", "monthly_archive": "https://roots.veristamp.in/.well-known/veristamp-roots/2026-06.json", "yearly_archive": "https://roots.veristamp.in/.well-known/veristamp-roots/2026.json", "status": "pending_next_root" } }}Error responses
Section titled “Error responses”| Status | Code | Description |
|---|---|---|
400 | BAD_REQUEST | Invalid request body — not valid JSON or unrecognized fields |
400 | MISSING_NONCE | Nonce is missing or shorter than 16 bytes |
400 | INVALID_HASH_FORMAT | Hash is not a valid 64-character hex string |
400 | UNSUPPORTED_HASH_ALGORITHM | Only SHA-256 is supported |
429 | RATE_LIMITED | Returned by Cloudflare WAF before the Worker is invoked. |
503 | SERVICE_UNAVAILABLE | Internal service error — retry later |
Error responses follow a consistent format:
{ "error": { "code": "MISSING_NONCE", "message": "Human-readable description of the error" }}Keyring
Section titled “Keyring”The current keyring containing all active and retired public keys is available as a static file — no API call needed:
https://stamp.veristamp.in/.well-known/veristamp-keyring.jsonThe keyring supports conditional requests via ETag/If-None-Match headers and can be cached indefinitely for offline verification. See the Keyring reference for the full structure and verification guide.