Guide: two-sided verification (agreements)
Most authorization is one-sided: one human authorizes one action. Agreements, escrow handoffs, and consents need both parties bound to one artifact — "party A and party B each verifiably consented to exactly this content, at these moments," with the guarantee that neither side's copy differs by a byte.
Scope. Provenance produces cryptographic execution proof: evidence of intent and attribution that complements your agreement workflow. Your e-signature or contract tool handles document storage, rendering and envelope routing, and your counsel decides how the evidence is used.
How it works
-
Create an agreement over the content hash (the content itself never leaves you):
const { agreementId, signingLinks } = await prov.agreements.create({ contentHash, // sha-256 of your canonicalized document contentDescription: "Services agreement", parties: [{ label: "Provider", email }, { label: "Client", email }], mode: "parallel", // or "sequential" — B activates after A signs }); -
Each party opens their signing link (a scoped bearer for that party only). The page shows the description and the content hash, with a "verify your copy" widget — the signer hashes their copy locally and confirms it matches.
-
Sign = a WebAuthn biometric assertion over (agreement_id ‖ content_hash ‖ party_id), server-verified against the signer's device. Because the signature binds all three, a swapped party or a byte-different copy can never complete the original agreement. Both signed → completed; either declines → declined; expiry → expired.
Proof
On completion, a completion receipt (an ES256 JWS over the agreement record and each party's signing evidence, with per-signer hardware tier) verifies offline against the JWKS, including on the public verify page. The content is referenced by hash only, never included.
const { token, verifyUrl } = await prov.agreements.receipt(agreementId);
Notes
- Signers need not be Provenance customers — the link authenticates them for that one agreement. A signer with an enrolled device gets a hardware-tier note on their signature.
- Sequential (escrow/handoff) mode: party B's link activates only after A signs — "shipped → received."
- Webhooks: subscribe
agreement.completed/agreement.declined. - Pricing: agreements are Growth+ and metered per completion (
agreement_completed); a Developer account can create a monthly Developer allowance of agreements.