Skip to main content

Disputes API

Submit and manage disputes for incorrect or outdated reputation scores.

Submit a Dispute

POST /api/v1/dispute
{
"walletAddress": "0x1234...",
"category": "DEFI_LENDING",
"reason": "IncorrectData",
"description": "My Aave v3 positions on Arbitrum are not being counted.",
"evidence": "https://arbiscan.io/tx/0xabc..."
}

Validation

FieldRules
walletAddressRequired, valid Ethereum address
categoryScoreCategory enum value
reasonDisputeReason enum value
descriptionRequired, 10–2,000 characters
evidenceOptional, max 5,000 characters

Dispute Reasons

InaccurateScore, MissingActivity, IncorrectCategory, DataOutdated, WrongWallet, FraudulentData, ComplianceError, Other

Response

{
"id": "a1b2c3d4-...",
"walletAddress": "0x1234...",
"category": "DEFI_LENDING",
"reason": "IncorrectData",
"status": "Pending",
"description": "My Aave v3 positions on Arbitrum are not being counted.",
"evidence": "https://arbiscan.io/tx/0xabc...",
"createdAt": "2026-02-27T12:00:00Z"
}

Get Dispute

GET /api/v1/dispute/{id}

Returns the full dispute object by GUID.


List Disputes for Wallet

GET /api/v1/dispute/wallet/{address}

Response

{
"address": "0x1234...",
"count": 2,
"disputes": [...]
}

Update Dispute Status

PUT /api/v1/dispute/{id}/status

Admin endpoint for updating dispute status.

{
"status": "Resolved",
"resolutionNotes": "Score recalculated with Arbitrum data.",
"resolvedBy": "admin@crowdproof.id",
"revisedScore": 780
}

Validation

FieldRules
statusDisputeStatus enum value
resolutionNotesOptional, max 2,000 characters
resolvedByOptional, max 200 characters
revisedScoreOptional, integer 0–1,000

Escalate Dispute

POST /api/v1/dispute/{id}/escalate

Escalates a dispute to on-chain governance when the off-chain resolution is unsatisfactory.

{
"reason": "Unresolved after 14 days, original data still incorrect."
}

Validation

FieldRules
reasonRequired, 10–2,000 characters

Escalated disputes are reviewed by GOVERNANCE_ROLE holders via the ReputationOracle contract.


Withdraw Dispute

POST /api/v1/dispute/{id}/withdraw
{
"walletAddress": "0x1234..."
}

Only the original submitter can withdraw a dispute. Returns 204 No Content equivalent on success.


Dispute Lifecycle

Pending → Under Review → Evidence Requested → Resolved / Rejected

Escalated (on-chain governance)