Verify quorum
Verify a presentation against multiple oracle peers and receive a single attestation backed by their independent signatures.
POST /v1/verify-quorum
The request body is identical to Verify:
a W3C Verifiable Presentation, with the same optional nonce, issuedAt and
expiresAt fields.
What it returns, and why
A single node's signature is one party's word. This endpoint collects signatures from multiple, independently operated oracle peers instead. Each peer reads its own copy of the source chain and reaches its own conclusion about the presentation; the node you called does not tell the others what to think, it only collects what they say and counts how many agree. See what the collector does not do below for why that separation is enforced deliberately, not just as an implementation detail.
Response, 200
{
"attestation": {
"DID": "did:eid:4tARKz6hK5GuWr9fkdzsG1Bf9X3b3agzh7RPBdjdpLWapHRh",
"CredentialID": "0xfb898d4079eed14603bbca2a245278b45af1d2acad278c6c690e067bc9eaae2c",
"CredType": "0x...",
"Issuer": "0xe81fa0ecbf9c77cd095fbeb4687d78cbd98bd51092a2cc12d4276e1ade4a8e78",
"Status": "valid",
"SourceChain": "eid",
"IssuedAt": 1751360400,
"ExpiresAt": 1751360700,
"Nonce": [0, 17, 34, 51, 68, 85, 102, 119, 136, 153, 170, 187, 204, 221, 238, 255, 0, 17, 34, 51, 68, 85, 102, 119, 136, 153, 170, 187, 204, 221, 238, 255]
},
"signatures": ["0x...", "0x..."],
"signers": ["0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", "0x70997970C51812dc3A010C7d01b50e0d17dc79C8"],
"threshold": 2
}attestation is the same shape returned by Verify, built once from the
digest the peers agreed on. signatures and signers are ordered by
recovered signer address, ascending, which is not incidental: every
on-chain verifier requires that ordering, since it is what lets a contract
check distinctness in one pass instead of comparing every signature against
every other. See Verifying an attestation for why
the ordering exists and how it is enforced on each chain.
Response, 409: quorum not met
If no digest reaches the configured threshold, the endpoint returns 409
with the full picture of what happened, not a bare failure:
{
"error": "quorum not met: best agreement was 1 of 2 required",
"threshold": 2,
"agreed": 1,
"peers": [
{ "peer": "http://127.0.0.1:8081", "digest": "0x...", "status": "valid", "signer": "0x..." },
{ "peer": "http://127.0.0.1:8082", "error": "peer returned 502" }
]
}This is deliberate: the peers array names what every peer said, so a
disagreement is diagnosable rather than an opaque failure. A peer that
answered shows digest, status and signer; a peer that could not be
reached shows only error, since it has nothing else to report.
501 and 502
501 means this node is not configured as a collector at all: it has no
peer list to fan a request out to. 502 covers other failures during
collection that are not a plain disagreement, such as an error unrelated to
reaching threshold.
What the collector does not do
The collector never sends peers a finished attestation to counter-sign. Each peer receives the original presentation and freshness values and reads its own source chain from scratch, so N nodes produce N independent opinions. Forwarding a conclusion instead would make N nodes into one node wearing N hats: the resulting signatures would still verify on chain while proving nothing about independent agreement. See The oracle network for how peers are configured and how this constraint is enforced.
A peer that times out is treated as absent rather than waited on: surviving the slow or dead minority is the point of running a k-of-n quorum in the first place, and one unresponsive peer should not stall or fail a round the remaining peers could still satisfy.