Skip to content

Verification

Verify a fiscal402.receipt

VERIFIED means cryptographic integrity of a fiscal402.receipt under Fiscal402 rules. It does not mean tax-authority acceptance. Verifier source is public; not published to npm.

What VERIFIED means

A local verifier recomputes the canonical payload, checks the stored SHA-256 digest, verifies the Ed25519 signature against JWKS, and optionally matches the bound UBL bytes. If those checks pass, the outcome is VERIFIED.

Fiscal402 receipts use Ed25519 signatures. Receipt version 1.0.0 binds the exact UBL UTF-8 artifact using SHA-256. Canonicalization is fiscal402.sorted-json/1.

What it does not mean

How signature verification works

  1. receipt + JWKS + optional UBL
  2. recompute fiscal402.sorted-json/1
  3. SHA-256 of canonical UTF-8
  4. Ed25519 over the hex digest
  5. VERIFIED / INVALID / UNKNOWN_KEY / ARTIFACT_MISMATCH
CheckPass condition
receipt_schemaspec fiscal402.receipt and spec_version 1.0.0
canonical_payloadrecomputed hash equals stored hash
signing_keyJWKS kid matches signature.key_id
signatureEd25519 valid over the hex digest string
ubl_sha256SHA-256 of exact UBL bytes matches, if UBL provided

JWKS URL

Production keys: https://api.fiscal402.com/.well-known/jwks.json. Current kid: receipt-ed25519-v1.

Artifact hash verification

UBL is hashed as the exact generated UTF-8 bytes. Identifier sha256-utf8-bytes. There is no XML C14N. Re-serializing equivalent XML with different whitespace is a different artifact.

Sanitized verification bundle

Example report

verify.json

{
  "verified": true,
  "result": "VERIFIED",
  "receipt_schema": "SUPPORTED",
  "canonicalization": "fiscal402.sorted-json/1",
  "canonical_payload": "MATCH",
  "signing_key": "JWKS_MATCH",
  "signature": "VALID",
  "ubl_sha256": "MATCH",
  "settlement_reference": "PRESENT",
  "notes": [
    "verified means Fiscal402 receipt integrity, not tax-authority acceptance."
  ]
}

Source-only verifier status

The independent verifier lives in the public repository https://github.com/Fiscal402/Fiscal402. Clone the repository and run the local CLI. @fiscal402/verify is not published to npm. Do not claim npm installation yet.

Last updated 11 September 2026