V1 API Reference

Kalvora Indexer API

Access indexed blockchain data from the Kalvora network. Transactions, blocks, tokens, wallets, governance, DEX, staking, and more.

Alpha documentationThese endpoint schemas are currently in Alpha and may contain inaccuracies or incomplete payload parameters. If you encounter any structural divergence while integrating, please report it to us so we can resolve it swiftly.
https://api.kalscan.io/v1
GET onlyJSON responses

Governance

On-chain governance proposals, voting results, stage history, pre-governance council review, and token governance configuration.

Status values

ValueCodeMeaning
passed0Passed at its final stage
failed1Failed / denied
passed_stage2Passed the current stage, more stages remain
active3Open for voting
pending4Waiting for the voting period to start
cancelled7, 9Cancelled by a contract update, or by the proposer
pending_results8Stage matured, indexed result still pending

Codes 5 and 6 were fast_passed and no_pass_fast. Fast quorum was removed from the Kalvora protocol. Both numbers are permanently retired so persisted values never shift meaning, and no proposal can ever report them again. There is no fast-quorum status, filter, or configuration field.

pending_results is derived in the response and is not accepted by the stored-status filter. The API also adjusts statuses against real time: pendingactive once validFrom passes, and activepending_results once maturesAt passes.

Pre-governance and the proposal phase

A governance contract may declare an optional council review that runs before public voting. Proposals and stages on such contracts carry a derived phase:

ValueMeaning
PRE_GOVERNANCEUnder council review; not open for public voting
REGULAR_GOVERNANCEPromoted into the contract's regular governance pipeline
PASSEDPassed at its final stage
FAILEDFailed
CANCELLEDCancelled by the proposer or by a contract update

phase is derived at read time — it is never stored, no status code encodes it, and it is not accepted by the stored-status filter.

Read phaseAvailable first. Phase derivation is activated per deployment. While it is off, phaseAvailable is false and the phase key is absent from the payload entirely — not null, not empty, not a default. In that state fall back to plain status display; do not infer that a stored proposal is open for public voting, and do not render "unknown".

REGULAR_GOVERNANCE is reported only on positive evidence of promotion (a recorded stage ≥ 2, or a passed-stage result), so a proposal still at stage 1 reads PRE_GOVERNANCE even if its council window has already elapsed. While a proposal is in PRE_GOVERNANCE its validFrom and maturesAt are provisional: they describe the public voting window it would get if the council promotes it.

Proposals inside their council review window are excluded from the votable-proposals listing and from a contract's activeProposals count, regardless of the gate — both answer "what is open for public voting right now". The full proposals listing is history and still returns them, flagged by phase. Council votes stay in the ordinary votes ledger and are never aggregated into proposal results.

The approved tally in the governance config counts final-stage proposals with status 0 only. It previously also counted the retired fast-pass code.

List Proposals

GET/v1/governance?request=proposals

Paginated list of governance proposals with current voting stage. Supports multi-symbol filtering.

Parameters

ParameterTypeRequiredDescription
requeststringRequired`proposals` or `list`
limitintOptionalNumber of results (1–100)
offsetintOptionalPagination offset
symbolstringOptionalFilter by governed contract mint ID(s), comma-separated
statusstringOptionalFilter: passed, failed, passed_stage, active, pending, cancelled
sortstringOptionalSort: created_at, title, status, matures_at, votes, percentage, active_time_left, vote_value_desc, support_desc, contract_asc, created_desc, closes_asc
orderstringOptionalSort direction: asc or desc

Usage & Credits

This endpoint consumes 25 credits per request against your active API tier.

Notes

  • `phase` is present only when `phaseAvailable` is true; while the gate is off the key is omitted entirely. `phaseAvailable` describes the deployment, not the page, so it is returned even for an empty result page.
  • This listing is the full indexed history, so a proposal under council review can appear here with `phase: PRE_GOVERNANCE`. Treat that phase as not open for public voting: the answers to "what is open right now" — `votableProposals` and a contract's `activeProposals` count — exclude it.

Response

json
{
  "found": "integer",
  "proposals": [
    {
      "hash": "string",
      "stageNumber": "integer",
      "lastStage": "boolean *",
      "symbol": "string",
      "creator": "string",
      "title": "string",
      "synopsis": "string",
      "body": "string",
      "options": [
        {
          "name": "string",
          "curEquiv": "float",
          "percentage": "float",
          "votes": "object",
          "transactions *": [
            {
              "type": "string",
              "hash": "string"
            }
          ]
        }
      ],
      "resultUpdated": "integer",
      "result": "string",
      "createdAt": "integer",
      "validFrom": "integer",
      "maturesAt": "integer",
      "phase": "string *"
    }
  ],
  "phaseAvailable": "boolean"
}

Proposal Details

GET/v1/governance?request=details

Full proposal detail with all voting stages and projected future stages. Performs live validator sync for active proposals.

Parameters

ParameterTypeRequiredDescription
requeststringRequired`details` or `proposal`
hashstringRequiredProposal hash

Usage & Credits

This endpoint consumes 100 credits per request against your active API tier.

Notes

  • The top-level `phase` mirrors the current stage's derived phase. Both it and the per-stage `phase` are omitted while `phaseAvailable` is false, and projected (not yet stored) stages never carry one.

Response

json
{
  "hash": "string",
  "symbol": "string",
  "creator": "string",
  "title": "string",
  "synopsis": "string",
  "body": "string",
  "options": [ "string" ],
  "createdAt": "integer",
  "stages": [
    {
      "stageNumber": "integer",
      "lastStage": "boolean",
      "options": [
        {
          "name": "string",
          "curEquiv": "float",
          "percentage": "float",
          "votes": "object",
          "transactions *": [
            {
              "type": "string",
              "hash": "string"
            }
          ]
        }
      ],
      "resultUpdated": "integer",
      "result": "string",
      "validFrom": "integer",
      "maturesAt": "integer",
      "phase": "string *"
    }
  ],
  "phase": "string *",
  "phaseAvailable": "boolean"
}

Errors

StatusCondition
400Missing hash/proposalHash parameter
404Proposal not found

Governance Config

GET/v1/governance?request=config

Governance configuration for a token: type, stages, cycle timing, quorum, and pre-governance council setup.

Parameters

ParameterTypeRequiredDescription
requeststringRequiredMust be `config`
symbolstringRequiredGoverned contract mint ID

Usage & Credits

This endpoint consumes 25 credits per request against your active API tier.

Notes

  • `threshold` is a percentage multiplied by 100 (`7500` means 75%). `preGovernance.threshold` and `preGovernance.regularQuorum` are scaled so `10000` means 100%, returned exactly as the governance contract stored them.
  • `preGovernance` is omitted entirely when the contract declares no council review, and each of its fields is omitted rather than zeroed when unset — a stored `0` threshold is a meaningful value.
  • `activeProposals` counts only proposals open for public voting, so a proposal still inside its council review window is not included.

Response

json
{
  "type": "string",
  "activeProposals": "integer",
  "totalProposals": "integer",
  "threshold": "integer",
  "quorum": "integer",
  "preGovernance *": {
    "votingInstrument": "string *",
    "days": "integer *",
    "threshold": "integer *",
    "regularQuorum": "integer *"
  },
  "durationDays": "integer *",
  "durationMonths": "integer *",
  "startCycleUnix": "integer *",
  "endCycleUnix": "integer *",
  "numberStages": "integer *",
  "currentStageNumber": "integer *",
  "stages *": [
    {
      "stageNumber": "integer",
      "isBreak": "boolean",
      "period": "string",
      "length": "integer",
      "maxAllowed": "integer *",
      "startsAt": "integer *",
      "endsAt": "integer *"
    }
  ],
  "approved": "integer",
  "denied": "integer",
  "firstTimeUnix": "integer",
  "optionProposalsAlwaysWinner": "boolean *"
}

PREGOV Authorization

GET/v1/governance?request=pregovAuthorization

Whether one wallet currently holds an active council token (PREGOV SBT) for one governed contract. Wallet-scoped and authenticated, in the same class as auditDetails and votes: send credentials in the Authorization header, never in the query string.

Parameters

ParameterTypeRequiredDescription
requeststringRequiredMust be `pregovAuthorization`
symbolstringRequiredGoverned contract mint ID
addressstringRequiredWallet address to check

Usage & Credits

This endpoint consumes 25 credits per request against your active API tier.

Notes

  • `preGovernanceEnabled` reports whether the contract declares pre-governance at all. `votingInstrument` is the council instrument's contract ID, or `null` when none is configured.
  • `state` is `AUTHORIZED` when the wallet holds at least one active, unrevoked, unexpired council item, otherwise `NO_PREGOV`. `activeItems` counts those items and `votingWeight` is their exact decimal sum as a string, so no floating-point parsing is required.
  • `councilSize` is the number of active council holders network-wide, excluding burn addresses.
  • Zero minted council tokens is a valid answer, not an error. The genesis state returns `200` with `state: NO_PREGOV`, `activeItems: 0`, `votingWeight: "0"`, and `councilSize: 0` — never a 404.
  • Council items are soulbound and never transferred. Validity and expiry are evaluated at read time, so an expired item stops counting without any sweep. The response is a single row and is not paginated.
  • Responses are wallet-specific and are emitted with `Cache-Control: private, no-store` and `Vary: Authorization`. The wallet address still appears in the request URL, so do not treat this endpoint as anonymous.

Response

json
{
  "symbol": "string",
  "address": "string",
  "preGovernanceEnabled": "boolean",
  "votingInstrument": "string | null",
  "state": "NO_PREGOV | AUTHORIZED",
  "activeItems": "integer",
  "votingWeight": "string",
  "councilSize": "integer"
}

Errors

StatusCondition
400Missing symbol or address
400Credentials supplied in the query string instead of the Authorization header
503Authorization service is unavailable
500Database query failed