Campaign API v2 · Clusters
Catalog every cluster. Pull full evidence only when you need it.
Cluster Catalog pages lightweight persisted summaries. Cluster Intelligence adds bounded forensic interpretation. Cluster Evidence pages stored funding or graph evidence without re-scoring it. Cluster Members provides complete stored membership through a separate opaque cursor. Cluster Case Export packages the same stored investigation as JSON, CSV, or a read-only Markdown brief.
Catalog
Enumerate persisted clusters without batch-recomputing forensic intelligence.
Intelligence
Stored grouping, support confidence, inferred archetype and bounded previews.
Evidence
Page canonical funding or stored graph evidence while preserving persisted risk semantics.
Members
Page complete stored membership with a 100 default and 500 maximum page size.
Opaque cursors
Catalog, member, funding-evidence and graph-evidence cursors are scope-specific position tokens.
Authorization
Campaign, analysis, cluster and owner scope are verified independently of every cursor and export request.
1. Cluster Catalog
Enumerate all persisted clusters. Support confidence and archetypes are intentionally deferred to detail calls.
curl "https://triproofprotocol.com/api/v2/campaigns/CAMPAIGN_ID/analyses/ANALYSIS_ID/clusters?limit=100" -H "Authorization: Bearer YOUR_API_KEY"
# Each row links to Intelligence and Members.
# Continue with pagination.nextCursor when hasMore is true.2. Cluster Intelligence
Open only the cluster that needs forensic interpretation. Large arrays remain bounded previews.
curl https://triproofprotocol.com/api/v2/campaigns/CAMPAIGN_ID/analyses/ANALYSIS_ID/clusters/CLUSTER_LABEL -H "Authorization: Bearer YOUR_API_KEY"3. Cluster Evidence
Use `lane=funding` or `lane=graph`. `riskBearing` is copied from stored evidence and never promoted by the API.
# Canonical funding evidence
curl "https://triproofprotocol.com/api/v2/campaigns/CAMPAIGN_ID/analyses/ANALYSIS_ID/clusters/CLUSTER_LABEL/evidence?lane=funding&limit=100" -H "Authorization: Bearer YOUR_API_KEY"
# Stored graph evidence
curl "https://triproofprotocol.com/api/v2/campaigns/CAMPAIGN_ID/analyses/ANALYSIS_ID/clusters/CLUSTER_LABEL/evidence?lane=graph&limit=100" -H "Authorization: Bearer YOUR_API_KEY"
# A cursor belongs to one lane only. Pass pagination.nextCursor back unchanged.4. Cluster Members
Use `pagination.nextCursor` to enumerate every stored member without a massive response.
curl "https://triproofprotocol.com/api/v2/campaigns/CAMPAIGN_ID/analyses/ANALYSIS_ID/clusters/CLUSTER_LABEL/members?limit=250" -H "Authorization: Bearer YOUR_API_KEY"
# Continue only when pagination.nextCursor is non-null:
curl "https://triproofprotocol.com/api/v2/campaigns/CAMPAIGN_ID/analyses/ANALYSIS_ID/clusters/CLUSTER_LABEL/members?limit=250&cursor=OPAQUE_CURSOR" -H "Authorization: Bearer YOUR_API_KEY"SDK end-to-end cluster workflow
Inspect bounded or paginated resources first, then call `exportCampaignClusterCase()` for the final read-only handoff package.
let clusterCursor: string | undefined
do {
const catalog = await triProof.listCampaignClusters(
campaignId,
analysisId,
{ limit: 100, cursor: clusterCursor },
)
for (const cluster of catalog.clusters) {
const intelligence = await triProof.getCampaignClusterIntelligence(
campaignId,
analysisId,
cluster.clusterLabel,
)
let evidenceCursor: string | undefined
do {
const evidencePage = await triProof.listCampaignClusterEvidence(
campaignId,
analysisId,
cluster.clusterLabel,
{ lane: "funding", limit: 100, cursor: evidenceCursor },
)
for (const item of evidencePage.evidence) {
console.log(item.kind, item.riskBearing)
}
evidenceCursor = evidencePage.pagination.nextCursor ?? undefined
} while (evidenceCursor)
let memberCursor: string | undefined
do {
const page = await triProof.listCampaignClusterMembers(
campaignId,
analysisId,
cluster.clusterLabel,
{ limit: 250, cursor: memberCursor },
)
for (const member of page.members) {
console.log(member.walletAddress, member.storedStatus, member.teamReview)
}
memberCursor = page.pagination.nextCursor ?? undefined
} while (memberCursor)
const caseBrief = await triProof.exportCampaignClusterCase(
campaignId,
analysisId,
cluster.clusterLabel,
"markdown",
)
console.log(intelligence.support.confidence, caseBrief.length)
}
clusterCursor = catalog.pagination.nextCursor ?? undefined
} while (clusterCursor)Cluster resource boundaries
Catalog lists persisted `Cluster` rows. Intelligence remains read-only forensic interpretation. Evidence pages stored canonical funding relationships or stored graph edges and preserves their existing `riskBearing` state. Members reads the stored `WalletAnalysis.clusterId` assignment only. Case Export packages these already-stored investigation surfaces and carries a `read-only-no-recompute` boundary. None of these resources recompute membership, wallet risk, campaign policy, reviewer state, or a common-control conclusion. Evidence scans are bounded per request and lane-specific cursors control scan position only.