When it fires
POST /v1/markets/{id}/disputes was called for a market that has no resolution proposal in a disputable state. The detail field says which case you hit:
- “no pending proposal”: nothing has been proposed yet, so there is nothing to dispute.
- “settlement has begun”, “already finalized” or “already cancelled”: the proposal has moved past
proposed, so the right to dispute has ended.
DISPUTE_WINDOW_CLOSED, and one whose disputes have already been reviewed with DISPUTE_DECIDED; both are 409. The filing is checked atomically against the live settlement state, so even if the market’s resolution object showed proposed when you read it, a filing that races settlement is refused rather than recorded against a settled market.
Why it happens
- The market is still trading, and no resolution has been proposed yet.
- Settlement began, or the proposal was finalized or cancelled, before your request arrived, possibly between your read of the market and your POST.
How to fix
- Check the market’s settlement state with
GET /v1/markets/{id}. Theresolutionobject carriessettlementStatusandfinalizableAt(nullwhen no proposal is pending). - If the market has no proposal yet, wait for one. Its dispute window opens when it is proposed and ends at
finalizableAt. - Once settlement begins the outcome is final; there is no late-dispute path through the API.