Introduction
Jatobá — document notarization with proof of existence anchored on multiple blockchains
Jatobá is a digital notarization platform. Every document gets a SHA-256 hash computed over its original bytes, which is then anchored simultaneously on two independent public networks:
- An attestation via Ethereum Attestation Service (EAS) on Optimism
- A record on a Clarity contract on Stacks, whose blocks settle on Bitcoin via Proof of Transfer
The file itself is stored encrypted (AES-256, server-side) on Cloudflare R2, optionally gzip-compressed at rest — the anchored hash always matches the original bytes. Each document receives a unique serial number (JAT-XXXXX, prefix configurable per tenant).
Base URL
The API is a Fastify server. All authenticated routes are prefixed with /api:
https://jatoba-web3-production.up.railway.app/apiIn development the interactive Scalar reference is available at /docs on the API host.
Core concepts
| Concept | Description |
|---|---|
| Document | A notarized record: file metadata, SHA-256, serial number, on-chain anchor status |
| Serial number | Unique human-readable ID (JAT-7K2M9), printed on certificates and QR codes |
| Dual anchoring | Fire-and-forget anchoring on Optimism (EAS) and Stacks after upload; each has its own status (pending / registered / failed) |
| Tenant | A personal workspace or a Clerk organization. Documents, serial prefixes, and acervo tokens are scoped per tenant |
| Acervo | A tenant's public archive feed of published documents |
| LGPD | Brazilian data-protection compliance: consent is required on every ingestion, deletion is self-service, and the hash survives deletion for integrity verification |
Ways to notarize
- Upload —
POST /api/documents/upload(multipart, up to 250 MB) - IPFS import —
POST /api/documents/import/ipfs(reference-only, the bytes stay on IPFS) - Web capture —
POST /api/captures/web(server-side headless browser captures a page into an evidence ZIP)
Verifying without an account
Anyone holding a file and a Jatobá certificate can verify it with no auth:
GET /api/public/verify?hash=<sha256>— compute the hash of your copy locally and check for a matchGET /api/public/documents/:serial— resolve the serial printed on the certificate