What "Hybrid" actually means
Same Merkle root, two independent attestations. At batch time, the worker computes the Merkle tree from the queued records and submits the root to BOTH chains in the same batching pass:
- Primary: Hyperledger Fabric (your network) — internal audit trail
- Secondary: Polygon (public) — externally verifiable
Both chains store the same Merkle root. A verifier on either chain reconstructs the root the same way (sorted-pair Keccak-256) and gets the identical hash. If the hashes match, the record was untouched. If they don't, you know which chain disagreed and can act on it.
When Hybrid is the right call
- Banking: Fabric for inter-bank audit; Polygon proof handed to the borrower / regulator
- Pharma: Fabric for sponsor + CRO; Polygon proof for FDA / EMA inspection
- Government: Fabric for inter-agency records; Polygon proof for FOIA / citizen access
- Supply chain: Fabric for partner consortium; Polygon proof for end-customer scan-to-verify
- Legal: Fabric for matter records; Polygon proof for opposing counsel
Prerequisites
- A working Fabric setup — complete the Fabric Setup (BYO) guide first
- A Polygon project wallet — Anchora auto-generates this when you create the project
- Optional: a small MATIC balance for gas (~$0.01 covers ~1,500 batches of 256 records each)
Step 1: Switch the project to "Hybrid"
Open Project Settings → Blockchain. Change Anchoring Strategy from Private (Fabric) to Hybrid (Fabric + Polygon). Pick the secondary chain — Polygon Amoy (testnet) or Polygon Mainnet.
Existing records anchored under the old strategy stay where they are. Only new records (queued after the switch) follow the Hybrid path.
Step 2: Fund the wallet (Polygon side only)
From Wallet, top up the project wallet with MATIC. Amoy is free (testnet faucet); Mainnet needs a real on-ramp. A typical Hybrid customer at 1M records/month spends ~$7/month on gas — Anchora batches up to 256 records per transaction, so per-record cost is ~$0.000007.
Step 3: Anchor a record
The API call is identical to single-chain anchoring. The strategy is decided server-side by your project config, not by the request:
curl -X POST https://api.anchora.co.in/v1/anchor \
-H "Authorization: Bearer dcp_live_..." \
-H "X-Project-Id: <projectId>" \
-H "Content-Type: application/json" \
-d '{
"data": {"orderId": "ORD-001", "amount": 100.50},
"hashOnly": true,
"webhookUrl": "https://your-app.com/anchora-webhook"
}'
Step 4: Understand the webhook payload
A Hybrid record's webhook carries BOTH chain anchors in one delivery — primary fields at top level, secondary inside dualAnchor:
{
"type": "ANCHORED",
"hash": "e90e818fbf...",
"recordId": "507f1f77bcf86cd799439012",
"chainType": "fabric",
"networkId": "fabric-byo",
"blockNumber": null,
"transactionHash": "aea1e2167553e7e3...",
"batchId": "4",
"anchoredAt": "2026-05-12T11:00:44.940Z",
"merkleProof": [],
"dualAnchor": {
"chainType": "evm",
"networkId": "polygon-amoy",
"batchId": 114,
"blockNumber": 38228377,
"transactionHash": "0x6bc51454f711b1348e49ad...",
"merkleProof": [],
"anchoredAt": "2026-05-12T11:00:45.122Z"
}
}
Receivers should branch on chainType at the top level for primary display, then surface dualAnchor as the secondary attestation. Example UI:
// Render two verification links side-by-side
const primaryLink = payload.chainType === 'fabric'
? `/internal-audit/batch/${payload.batchId}`
: `https://amoy.polygonscan.com/tx/${payload.transactionHash}`;
const secondaryLink = payload.dualAnchor
? (payload.dualAnchor.chainType === 'evm'
? `https://amoy.polygonscan.com/tx/${payload.dualAnchor.transactionHash}`
: `/internal-audit/batch/${payload.dualAnchor.batchId}`)
: null;
Step 5: Verify on both chains
/v1/verify returns independent verification verdicts for primary and secondary. Both verified: true means both chains stored the same Merkle root and your data wasn't tampered with.
{
"success": true,
"verified": true,
"status": "VERIFIED",
"blockchainVerified": true,
"chainType": "fabric",
"networkId": "fabric-byo",
"batchId": "4",
"onChainMerkleRoot": "0xe90e818...",
"dualAnchor": {
"verified": true,
"chainType": "evm",
"networkId": "polygon-amoy",
"batchId": 114,
"onChainMerkleRoot": "0xe90e818..."
}
}
Reading the verdicts
| verified | dualAnchor.verified | Meaning |
|---|---|---|
true |
true |
Both chains agree. Data is untampered. |
true |
null |
Primary OK, secondary chain reader unavailable. Retry shortly. |
true |
false |
Tampering or chain divergence — secondary root differs. Investigate. |
false |
— | Primary data tampered. |
Reliability: dual-anchor retry
If the secondary chain fails at batch time (RPC blip, gas spike, peer timeout), the worker:
- Commits the primary anchor — your record is valid the moment Fabric confirms
- Schedules a retry for the secondary, hourly, up to 5 attempts
- Back-fills
record.dualAnchoron success and delivers a webhook with the complete shape - Marks
secondaryStatus: failedafter 5 attempts. The Console surfaces this as an actionable alert.
During the retry window, /v1/verify returns dualAnchor.verified: null with reason batch-not-found. This is not tampering — it's a pending secondary write.
Cost considerations
Hybrid pays gas on the EVM side only. Fabric has no gas. So the cost equation is identical to running Public alone:
- 10K records/month ≈ $0.07/month gas
- 1M records/month ≈ $7/month gas
- 100M records/month ≈ $700/month gas
If you're already running Fabric (Private), upgrading to Hybrid roughly equals "add Polygon gas to your existing cost."
Downgrading from Hybrid
You can switch from Hybrid back to Private (drop Polygon) or Public (drop Fabric) at any time. Existing Hybrid records keep both anchors. New records follow the new strategy.