Skip to main content

Documentation Index

Fetch the complete documentation index at: https://kleros-mintlify-changelog-2026-05-12-1778458371.mintlify.app/llms.txt

Use this file to discover all available pages before exploring further.

Query Examples

Common GraphQL queries for fetching data from Kleros subgraphs.

V2 Core Queries (Arbitrum)

Always use the decentralized network endpoint for production queries. Get the subgraph ID from the Studio pages listed in Subgraph Endpoints and construct the URL as https://gateway.thegraph.com/api/{API_KEY}/subgraphs/id/{SUBGRAPH_ID}.

Fetch Courts

Key fields: minStake (in wei), feeForJuror (juror reward per vote), timesPerPeriod (array of 4 phase durations in seconds).
{
  courts(first: 20, orderBy: id) {
    id
    hiddenVotes
    minStake
    alpha
    feeForJuror
    jurorsForCourtJump
    timesPerPeriod
    parent { id }
    policy { policy }
    numberDisputes
    numberStakedJurors
    stakedJurors {
      id
    }
  }
}

Fetch Recent Disputes

Key fields: externalDisputeID (your app’s ID), templateId (links to DisputeTemplateRegistry), ruled (finalized), currentRuling (active ruling option).
{
  disputes(first: 10, orderBy: createdAtBlock, orderDirection: desc) {
    id
    arbitrated { id }
    court { id }

    period
    ruled
    currentRuling
    tied
    overridden
    lastPeriodChange
    nbRounds
    nbChoices
    externalDisputeID
    templateId
    rounds {
      nbVotes
      totalFeesForJurors
      drawnJurors { juror { id } }
    }
  }
}

Fetch Dispute by External ID

Use externalDisputeID to correlate an on-chain dispute with your app’s internal ID (emitted in DisputeRequest):
query GetDisputeByExternalID($externalId: BigInt!) {
  disputes(where: { externalDisputeID: $externalId }) {
    id
    period
    ruled
    currentRuling
    tied
    templateId
  }
}

Fetch Juror Stakes for a Specific Address

{
  jurorTokensPerCourts(where: { juror: "0xYOUR_ADDRESS_LOWERCASE" }) {
    court { id }
    staked
    locked
  }
}

Fetch Juror’s Active Draws

query GetJurorDraws($juror: String!) {
  draws(where: { juror: $juror, vote_not: null }, first: 20) {
    dispute { id period currentRuling }
    round { id nbVotes }
    vote { choice }
  }
}

Curate Queries (V1)

Fetch Registered Items from a Light Curate List

{
  litems(
    first: 10
    where: {
      status: Registered
      registryAddress: "0xYOUR_LIST_ADDRESS_LOWERCASE"
    }
    orderBy: latestRequestResolutionTime
    orderDirection: desc
  ) {
    itemID
    data
    props {
      type
      label
      description
      value
    }
  }
}

Fetch Items in Challenge Period

{
  litems(
    first: 10
    where: {
      status_in: [RegistrationRequested, ClearingRequested]
      registryAddress: "0xYOUR_LIST_ADDRESS_LOWERCASE"
      disputed: false
    }
    orderBy: latestRequestSubmissionTime
    orderDirection: asc
  ) {
    itemID
    status
    props {
      label
      value
    }
    requests(first: 1, orderBy: submissionTime, orderDirection: desc) {
      submissionTime
      requester
    }
  }
}

Fetch Item Details with Request History

query ItemDetails($id: ID!) {
  item(id: $id) {
    data
    requests(orderBy: submissionTime, orderDirection: desc) {
      requestType
      disputed
      disputeID
      submissionTime
      resolved
      requester
      challenger
      rounds(orderBy: creationTime, orderDirection: desc) {
        appealPeriodStart
        appealPeriodEnd
        ruling
        hasPaidRequester
        hasPaidChallenger
      }
    }
  }
}
Item IDs in the subgraph use the format <itemID>@<listAddress>:
const compoundId = `${itemID}@${tcrAddress.toLowerCase()}`;
const result = useQuery(ITEM_DETAILS_QUERY, { variables: { id: compoundId } });

Address Tag Registries (Gnosis Chain)

Batched query to fetch address tags from the three Kleros address tag registries on Gnosis Chain:
{
  contractDomainTags: litems(
    where: {
      status_in: [Registered, ClearingRequested]
      registryAddress: "0x CONTRACT_DOMAIN_TAG_REGISTRY"
    }
    first: 1000
  ) {
    props { label value }
  }
  addressTags: litems(
    where: {
      status_in: [Registered, ClearingRequested]
      registryAddress: "0x ADDRESS_TAG_REGISTRY"
    }
    first: 1000
  ) {
    props { label value }
  }
}
Endpoint: https://thegraph.com/hosted-service/subgraph/kleros/legacy-curate-xdai

Proof of Humanity

Check Registration Status

{
  submission(id: "0xADDRESS_LOWERCASE") {
    registered
    name
    creationTime
    status
    requests(first: 1, orderBy: creationTime, orderDirection: desc) {
      evidence {
        URI
      }
    }
  }
}
Alternatively, call isRegistered(address) directly on the PoH contract at 0xC5E9dDebb09Cd64DfaCab4011A0D5cEDaf7c9BDb.

Tips

  • Addresses must be lowercase in all queries. The subgraph stores them as bytes and does not understand checksummed addresses.
  • Items with status ClearingRequested are still registered until the removal request is finalized. Include them when fetching “active” items.
  • The Graph hosted service has a 1000 item limit per query. For registries with more items, paginate using skip or id_gt.
  • Light Curate entities are prefixed with l (e.g., litems, lrequests). Classic Curate uses unprefixed entities (items, requests).

Further Reading

Subgraph Endpoints

Full list of subgraph URLs

Light Curate Integration

Full Light Curate developer guide