Skip to main content

What a Capsule Is

A Capsule is not text stored on-chain. It is a governance object with identity, structured claims, evidence commitments, lifecycle state, economic routing, and distribution eligibility. Every Capsule has a permanent ID and a permanent history.

Full JSON Schema

The live payload shape from GET /capsules/:id:
{
  "ok": true,
  "found": true,
  "source": "rust-api",
  "capsuleId": "1",

  "capsule": {
    "id": "1",
    "outletSlug": "the-bay-tribune",
    "articleSlug": "city-council-budget-vote",
    "title": "City Council Approves $42M Infrastructure Budget",
    "metadataURI": "ipfs://QmXoypizjW3WknFiJnKLwHCnL72vedxjQkDDP1mXWo6uco",
    "contentHash": "0x9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08",
    "submitter": "0xJournalistWalletAddress",
    "status": "accepted",
    "capsuleType": "original",
    "policyId": "1",
    "trustedPublisherAtSubmit": false,
    "yesVotes": "1250000000000000000000",
    "noVotes": "250000000000000000000",
    "weightedYes": "3750",
    "weightedNo": "500",
    "weightedParticipation": "4250",
    "opensAt": "1704153600",
    "closesAt": "1704412800",
    "acceptedAt": "1704380000",
    "finalizedAt": "1704380100",
    "finalizedArticleId": "1",
    "rootCapsuleId": null,
    "parentCapsuleId": null,
    "revisionNumber": 0,
    "finalizedBy": "0xFinalizerAddress"
  },

  "policy": {
    "note": "Bridge-backed. Direct Rust getter pending finalization.",
    "policyId": "1",
    "approvalThreshold": 60,
    "quorumThreshold": 5,
    "votingWindowSeconds": 259200
  },

  "outlet": {
    "outletId": "1",
    "outletMetadataURI": "ipfs://Qm...",
    "outletSlug": "the-bay-tribune",
    "outletWallet": "0xOutletWalletAddress",
    "status": "active"
  },

  "content": {
    "capsuleId": "1",
    "contentHash": "0x9f86d0...",
    "contentType": "article",
    "contentURI": "https://baytribune.com/city-council-budget-vote",
    "createdAt": "1704153600",
    "createdBy": "0xJournalistWalletAddress",
    "exists": true,
    "language": "en",
    "metadataURI": "ipfs://Qm...",
    "outletId": "1",
    "outletMetadataURI": "ipfs://Qm...",
    "outletSlug": "the-bay-tribune",
    "outletWallet": "0xOutletWalletAddress",
    "status": "published",
    "subtitle": "7-2 vote approves major road and water upgrades",
    "summary": "The city council voted Tuesday to approve a $42M infrastructure package...",
    "title": "City Council Approves $42M Infrastructure Budget",
    "visibility": "public"
  },

  "evidence": [
    {
      "active": true,
      "capsuleId": "1",
      "contentHash": "0xdef456...",
      "createdAt": "1704153600",
      "evidenceId": "1",
      "evidenceType": "archived_page",
      "isPrimary": true,
      "label": "Council session archive - Jan 2 2024",
      "mimeType": "text/html",
      "submittedBy": "0xJournalistWalletAddress",
      "uri": "https://archive.org/web/20240102/https://citycouncil.gov/session-jan-2"
    },
    {
      "active": true,
      "capsuleId": "1",
      "contentHash": "0xghi789...",
      "createdAt": "1704153600",
      "evidenceId": "2",
      "evidenceType": "transcript",
      "isPrimary": false,
      "label": "Meeting transcript - Infrastructure budget discussion",
      "mimeType": "text/plain",
      "submittedBy": "0xJournalistWalletAddress",
      "uri": "https://vault.presschain.io/evidence/abc123"
    }
  ],

  "contributors": [
    {
      "active": true,
      "attributionURI": "https://presschain.io/journalist/0x...",
      "capsuleId": "1",
      "contributionType": "author",
      "contributorId": "1",
      "createdAt": "1704153600",
      "displayName": "Maya Chen",
      "role": 2,
      "shareBps": 7000,
      "wallet": "0xMayaWalletAddress"
    },
    {
      "active": true,
      "attributionURI": "https://presschain.io/journalist/0x...",
      "capsuleId": "1",
      "contributionType": "editor",
      "contributorId": "2",
      "createdAt": "1704153600",
      "displayName": "David Okafor",
      "role": 3,
      "shareBps": 3000,
      "wallet": "0xDavidWalletAddress"
    }
  ],

  "revision": {
    "capsuleId": "1",
    "changeSummaryURI": null,
    "createdAt": "1704153600",
    "createdBy": "0xJournalistWalletAddress",
    "current": true,
    "currentCapsuleId": "1",
    "history": [],
    "parentCapsuleId": null,
    "revisionFeePaid": "0",
    "revisionNumber": 0,
    "revisionReason": null,
    "rootCapsuleId": "1",
    "status": "current"
  }
}

Field Reference

capsule.*

FieldTypeDescription
idstringUnique capsule ID
outletSlugstringPublishing outlet identifier
articleSlugstringURL-friendly article identifier
titlestringArticle title
metadataURIstringIPFS URI for extended metadata
contentHashbytes32SHA-256 of article content
submitteraddressJournalist wallet at submission
statusstringpending, accepted, rejected, finalized, superseded
capsuleTypestringoriginal, correction, retraction, supporting
policyIdstringAcceptance policy governing this capsule
trustedPublisherAtSubmitboolWhether outlet had trusted publisher status
yesVotesstringRaw weighted yes vote bigint
noVotesstringRaw weighted no vote bigint
weightedYesstringComputed weighted yes score
weightedNostringComputed weighted no score
weightedParticipationstringTotal weighted participation
opensAtstringUnix timestamp - voting window open
closesAtstringUnix timestamp - voting window close
acceptedAtstringUnix timestamp - acceptance confirmed
finalizedAtstringUnix timestamp - on-chain finalization
finalizedArticleIdstringArticle ID post-finalization
rootCapsuleIdstring|nullOriginal capsule (for revisions)
parentCapsuleIdstring|nullDirect parent capsule
revisionNumbernumber0 = original
finalizedByaddressWallet that called finalize

evidence[*]

FieldTypeDescription
evidenceIdstringUnique evidence item ID
evidenceTypestringarchived_page, transcript, document, media, data
isPrimaryboolWhether this is a primary evidence item
labelstringHuman-readable description
mimeTypestringMIME type of the evidence file
contentHashstringSHA-256 of the evidence file
uristringLocation of the evidence file
submittedByaddressWallet that submitted this evidence
activeboolWhether evidence is active

contributors[*]

FieldTypeDescription
contributorIdstringUnique contributor ID
walletaddressContributor’s wallet
displayNamestringPublic display name
rolenumberRole ID (1=Journalist, 2=Reporter, 3=Editor…)
contributionTypestringauthor, editor, researcher, reviewer
shareBpsnumberRevenue share in basis points (out of 10000)
attributionURIstringPublic attribution profile URL
activeboolWhether contribution is active

revision.*

FieldDescription
currentCapsuleIdThe authoritative current version
rootCapsuleIdThe original in the revision chain
parentCapsuleIdDirect parent (for multi-step corrections)
revisionNumberDepth in revision chain (0 = original)
revisionReasonPlain-language explanation of correction
changeSummaryURILink to detailed change log
historyArray of all prior capsule IDs in chain

Status Values

StatusMeaning
pendingVoting window open
acceptedPassed acceptance - canonical
rejectedFailed quorum or approval threshold
finalizedOn-chain record written, distribution active
supersededReplaced by a newer revision Capsule

Integrity Labels

LabelApplied By
cleanDefault - no disputes
verifiedCourt confirmed accuracy
contestedActive dispute in progress
unresolvedCourt concluded, no clear verdict
misleadingCourt found material inaccuracy
fraudulentCourt found deliberate deception
correctedAuthor published accepted correction
retracted_by_authorAuthor-initiated retraction

Policy (Bridge-Backed)

Policy objects are currently served via Bridge middleware. Direct Rust tuple decoding is being finalized. Use /outlets/:slug and /capsules/:id Bridge routes as the authoritative policy source.
Default policy: 60% approval threshold, 5% quorum, 72-hour window (259200 seconds).