Attestra
Endpoints

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.

On this page