Documentation
API Reference
The full customer-callable endpoint catalogue. Public read endpoints need no API key and are browser-callable cross-origin. Pro and Enterprise endpoints take an Authorization: Bearer <key> header.
Base URL
https://api.verdict.finance/api/v1Machine-readable spec at /openapi.json. Agent index at /llms.txt. Full API reference for agents at /llms-full.txt.
Identifiers
Entity detail and scorecard endpoints accept either the slug or the UUID id; the per-entity data endpoints (domains, questions, rubric, evidence, history) take the slug. Slugs can change when an entity is renamed. An entity keeps its external_ids and its id across a rename, so integrations that store Verdict data long-term should key on external_ids or id, not on slug.
A provider key that is absent has simply not been mapped. Where we have checked and no counterpart exists, the entity carries a <provider>_note key explaining why, with the provider key itself still absent. So defillama_note present and defillama missing means "checked, there is nothing to link to", not "not yet done". Treat any unrecognised key as free-form metadata and pass it through.
Protocols
- GET
https://api.verdict.finance/api/v1/protocolsPublicList rated protocols
- GET
https://api.verdict.finance/api/v1/protocols/{slug}PublicGet one protocol (slug or UUID)
- GET
https://api.verdict.finance/api/v1/protocols/{slug}/scorecardsPublicGrade + composite; domain breakdowns stripped for anon/Free (full version history on Pro). Per-answer detail and computed gates are not on this list route; use the by-id scorecard route below.
- GET
https://api.verdict.finance/api/v1/protocols/{slug}/domainsProDomain scores breakdown
- GET
https://api.verdict.finance/api/v1/protocols/{slug}/questionsEnterprisePer-question scores + rationale, plus each question's weight, the top-level domain_weights map, and scorecard_version / scorecard_published_at
- GET
https://api.verdict.finance/api/v1/protocols/{slug}/historyProFull rating history with reasoning
- GET
https://api.verdict.finance/api/v1/protocols/{slug}/rubricEnterpriseFull rubric (per-question criteria), with per-question weight + domain_weights
- GET
https://api.verdict.finance/api/v1/protocols/{slug}/evidenceEnterpriseEvidence + reasoning trails, with per-question weight + domain_weights
- GET
https://api.verdict.finance/api/v1/scorecards/{scorecard_id}EnterpriseOne scorecard by its UUID, carrying the full per-answer array (the per-answer detail omitted from the list route above)
Chains
- GET
https://api.verdict.finance/api/v1/chainsPublicList rated chains
- GET
https://api.verdict.finance/api/v1/chains/{slug}PublicGet one chain (slug or UUID)
- GET
https://api.verdict.finance/api/v1/chains/{slug}/scorecardsPublicGrade + composite; domain breakdowns stripped for anon/Free (full version history on Pro). Per-answer detail and computed gates are not on this list route; use the by-id scorecard route below.
- GET
https://api.verdict.finance/api/v1/chains/{slug}/domainsProDomain scores breakdown
- GET
https://api.verdict.finance/api/v1/chains/{slug}/questionsEnterprisePer-question scores + rationale, plus each question's weight, the top-level domain_weights map, and scorecard_version / scorecard_published_at
- GET
https://api.verdict.finance/api/v1/chains/{slug}/historyProFull rating history with reasoning
- GET
https://api.verdict.finance/api/v1/chains/{slug}/rubricEnterpriseFull rubric (per-question criteria), with per-question weight + domain_weights
- GET
https://api.verdict.finance/api/v1/chains/{slug}/evidenceEnterpriseEvidence + reasoning trails, with per-question weight + domain_weights
- GET
https://api.verdict.finance/api/v1/chain-scorecards/{scorecard_id}EnterpriseOne scorecard by its UUID, carrying the full per-answer array (the per-answer detail omitted from the list route above)
mvc_gates populate for chains only; the other entity types return null for that field.
Tokens
- GET
https://api.verdict.finance/api/v1/tokensPublicList rated tokens
- GET
https://api.verdict.finance/api/v1/tokens/{slug}PublicGet one token (slug or UUID)
- GET
https://api.verdict.finance/api/v1/tokens/{slug}/scorecardsPublicGrade + composite; domain breakdowns stripped for anon/Free (full version history on Pro). Per-answer detail and computed gates are not on this list route; use the by-id scorecard route below.
- GET
https://api.verdict.finance/api/v1/tokens/{slug}/domainsProDomain scores breakdown
- GET
https://api.verdict.finance/api/v1/tokens/{slug}/questionsEnterprisePer-question scores + rationale, plus each question's weight, the top-level domain_weights map, and scorecard_version / scorecard_published_at
- GET
https://api.verdict.finance/api/v1/tokens/{slug}/historyProFull rating history with reasoning
- GET
https://api.verdict.finance/api/v1/tokens/{slug}/rubricEnterpriseFull rubric (per-question criteria), with per-question weight + domain_weights
- GET
https://api.verdict.finance/api/v1/tokens/{slug}/evidenceEnterpriseEvidence + reasoning trails, with per-question weight + domain_weights
- GET
https://api.verdict.finance/api/v1/token-scorecards/{scorecard_id}EnterpriseOne scorecard by its UUID, carrying the full per-answer array (the per-answer detail omitted from the list route above)
Oracles
- GET
https://api.verdict.finance/api/v1/oraclesPublicList rated oracles
- GET
https://api.verdict.finance/api/v1/oracles/{slug}PublicGet one oracle (slug or UUID)
- GET
https://api.verdict.finance/api/v1/oracles/{slug}/scorecardsPublicGrade + composite; domain breakdowns stripped for anon/Free (full version history on Pro). Per-answer detail and computed gates are not on this list route; use the by-id scorecard route below.
- GET
https://api.verdict.finance/api/v1/oracles/{slug}/domainsProDomain scores breakdown
- GET
https://api.verdict.finance/api/v1/oracles/{slug}/questionsEnterprisePer-question scores + rationale, plus each question's weight, the top-level domain_weights map, and scorecard_version / scorecard_published_at
- GET
https://api.verdict.finance/api/v1/oracles/{slug}/historyProFull rating history with reasoning
- GET
https://api.verdict.finance/api/v1/oracles/{slug}/rubricEnterpriseFull rubric (per-question criteria), with per-question weight + domain_weights
- GET
https://api.verdict.finance/api/v1/oracles/{slug}/evidenceEnterpriseEvidence + reasoning trails, with per-question weight + domain_weights
- GET
https://api.verdict.finance/api/v1/oracle-scorecards/{scorecard_id}EnterpriseOne scorecard by its UUID, carrying the full per-answer array (the per-answer detail omitted from the list route above)
Vaults
- GET
https://api.verdict.finance/api/v1/vaultsPublicList rated vaults
- GET
https://api.verdict.finance/api/v1/vaults/{slug}PublicGet one vault (slug or UUID)
- GET
https://api.verdict.finance/api/v1/vaults/{slug}/scorecardsPublicGrade + composite; domain breakdowns stripped for anon/Free (full version history on Pro). Per-answer detail and computed gates are not on this list route; use the by-id scorecard route below.
- GET
https://api.verdict.finance/api/v1/vaults/{slug}/domainsProDomain scores breakdown
- GET
https://api.verdict.finance/api/v1/vaults/{slug}/questionsEnterprisePer-question scores + rationale, plus each question's weight, the top-level domain_weights map, and scorecard_version / scorecard_published_at
- GET
https://api.verdict.finance/api/v1/vaults/{slug}/historyProFull rating history with reasoning
- GET
https://api.verdict.finance/api/v1/vaults/{slug}/rubricEnterpriseFull rubric (per-question criteria), with per-question weight + domain_weights
- GET
https://api.verdict.finance/api/v1/vaults/{slug}/evidenceEnterpriseEvidence + reasoning trails, with per-question weight + domain_weights
- GET
https://api.verdict.finance/api/v1/vault-scorecards/{scorecard_id}EnterpriseOne scorecard by its UUID, carrying the full per-answer array (the per-answer detail omitted from the list route above)
Organisations
- GET
https://api.verdict.finance/api/v1/organisationsPublicList rated organisations (curators, etc.)
- GET
https://api.verdict.finance/api/v1/organisations/{slug}PublicGet one organisations (curators, etc.) (slug or UUID)
- GET
https://api.verdict.finance/api/v1/organisations/{slug}/scorecardsPublicGrade + composite; domain breakdowns stripped for anon/Free (full version history on Pro). Per-answer detail and computed gates are not on this list route; use the by-id scorecard route below.
- GET
https://api.verdict.finance/api/v1/organisations/{slug}/domainsProDomain scores breakdown
- GET
https://api.verdict.finance/api/v1/organisations/{slug}/questionsEnterprisePer-question scores + rationale, plus each question's weight, the top-level domain_weights map, and scorecard_version / scorecard_published_at
- GET
https://api.verdict.finance/api/v1/organisations/{slug}/historyProFull rating history with reasoning
- GET
https://api.verdict.finance/api/v1/organisations/{slug}/rubricEnterpriseFull rubric (per-question criteria), with per-question weight + domain_weights
- GET
https://api.verdict.finance/api/v1/organisations/{slug}/evidenceEnterpriseEvidence + reasoning trails, with per-question weight + domain_weights
- GET
https://api.verdict.finance/api/v1/organisation-scorecards/{scorecard_id}EnterpriseOne scorecard by its UUID, carrying the full per-answer array (the per-answer detail omitted from the list route above)
Bridges
- GET
https://api.verdict.finance/api/v1/bridgesPublicList rated bridges
- GET
https://api.verdict.finance/api/v1/bridges/{slug}PublicGet one bridge (slug or UUID)
- GET
https://api.verdict.finance/api/v1/bridges/{slug}/scorecardsPublicGrade + composite; domain breakdowns stripped for anon/Free (full version history on Pro). Per-answer detail and computed gates are not on this list route; use the by-id scorecard route below.
- GET
https://api.verdict.finance/api/v1/bridges/{slug}/domainsProDomain scores breakdown
- GET
https://api.verdict.finance/api/v1/bridges/{slug}/questionsEnterprisePer-question scores + rationale, plus each question's weight, the top-level domain_weights map, and scorecard_version / scorecard_published_at
- GET
https://api.verdict.finance/api/v1/bridges/{slug}/historyProFull rating history with reasoning
- GET
https://api.verdict.finance/api/v1/bridges/{slug}/rubricEnterpriseFull rubric (per-question criteria), with per-question weight + domain_weights
- GET
https://api.verdict.finance/api/v1/bridges/{slug}/evidenceEnterpriseEvidence + reasoning trails, with per-question weight + domain_weights
- GET
https://api.verdict.finance/api/v1/bridge-scorecards/{scorecard_id}EnterpriseOne scorecard by its UUID, carrying the full per-answer array (the per-answer detail omitted from the list route above)
A bridge is rated on its own domain set: four universal domains plus one per category it carries, so domain_weights on the Enterprise routes returns that bridge's active domains renormalised to 100. Two bridges with different categories are scored on different rubrics, and neither is scored on the full catalogue. On external data: DefiLlama TVL resolves for roughly 9 of our 14 rated bridges, because bridge-specific volume sits behind DefiLlama's paid bridges API, so deployment breadth (the chains array) is the more reliable display metric. Bridge payloads also carry structured security fields, served on the public tier on both the list and the single-bridge route. signer_count is the size of the signing set, signing_threshold the number of signatures a message requires, and has_message_attestation a boolean for whether messages carry an attestation step. pause_mechanism is a prose description of the emergency-pause path and who holds it, so treat it as text to display rather than an enum to switch on. validator_set_owner embeds the organisation operating the validator set as {id, slug, name}. Null on the signer fields is a fact about the design rather than missing data: a bridge with no fixed signing set has nothing to report there, since IBC verifies with light clients and Across settles against a HubPool owner rather than a signing committee. Where validator_set_owner is populated it points at an organisation record staged for publication, so the embedded id and slug do not resolve against /organisations yet; they will once that family publishes.
Methodology
- GET
https://api.verdict.finance/api/v1/methodologyPublicMethodology metadata + question / domain counts + grade ladder
Score composition (Enterprise), level 1: within a domain, each SCORED question contributes weight_i x (score_i / max_score_i), and the domain_score is that total divided by the sum of those same weights. Questions served with a null score are excluded and the remaining weights renormalise, so a domain whose questions do not all apply is still scored out of what does. A null score with confidence not_applicable is the marker: the question was ruled out for this entity, and it is excluded exactly as a whole non-firing domain is. Level 2: composite = sum over domains of domain_score_d x domain_weight_d, where domain_score_d is the 0-to-1 fraction from level 1 and domain_weight_d is the percentage-point weight read from the domain_weights map on the same response. (If you carry domain scores as percentages instead, divide the result by 100.) That map is per-entity, not per-type: it is the set that entity was actually scored on, and it always sums to 100. Bridges are the case where this matters most, since each one fires only the category domains it carries; a stablecoin token and an LST or LRT vault likewise carry an extra domain and rebalanced weights. The headline composite_score and grade may then be reduced by dependency drag (D2); the intrinsic pair carries the un-notched values.
Quantum Readiness
- GET
https://api.verdict.finance/api/v1/quantum-readinessPublicPost-quantum readiness league table for 70+ chains: QRI score, band 1-7 with label, migration stage, hybrid-signature status and danger flag per row, plus rows_skipped. Each row carries matched_chain_slug: the Verdict chain slug when we track that chain, else null.
- GET
https://api.verdict.finance/api/v1/chains/{slug}/quantum-readinessPublicOne chain's quantum readiness by Verdict chain slug. Availability is data: unknown chains and chains the source has not assessed return HTTP 200 with available: false and a reason.
Companion data sourced from LayerQu (https://layerqu.com/dashboard/), re-served with attribution on every payload; it never feeds Verdict grades. matched_chain_slug means the chain exists in Verdict's database (drafts included), not that it is rated. Every available payload carries as_of (snapshot time). stale: true appears only when the upstream refresh failed and an expired snapshot is served; available: false with a reason means nothing could be served.
Incidents
- GET
https://api.verdict.finance/api/v1/incidentsPublicHack incidents, newest first by detected_at. Filters: slug (exact), since (ISO datetime), min_status (rumored, corroborated or confirmed; default confirmed), limit (default 50, max 200), offset. Returns items plus total.
A feed of hack incidents aggregated from public hack-reporting sources, with each item carrying the sources it was corroborated from. Incidents carry a confidence tier in status: corroborated, then confirmed. The feed serves confirmed only by default, so it lags the first rumour of an exploit by design and reads exactly as it did before tiers existed. Pass min_status=corroborated to opt into multi-source leads that have not yet reached confirmation; the floor of two independent sources applies at every served tier, and any other value of min_status is a 422. Scope is protocols. Every incident at or above the requested tier is listed, including ones at protocols Verdict does not rate: matched_protocol tells you which is which, and slug is null where there is no matching rated protocol. Matching happens when the incident is received and re-runs when an incident escalates and its payload improves, a slug arriving with the confirmation being the common case, so matched_protocol is true as of the incident's current tier. It is still never retroactive the other way: an incident stored before its protocol was rated is not re-matched because Verdict's coverage grew. An escalating incident keeps its incident_id and refreshes its detected_at, so it reappears at the top of a since poll at its new tier. Key on incident_id, expect the same id at successive tiers, and treat the tier as monotonic: it never goes down in the feed. Where an incident does match a rated protocol, that entity may be flagged under review on its own record. A rating change is never automatic. Re-rating is always a human decision, so treat an incident as a signal to look rather than as a downgrade that has already happened. Two stored fields are never served: the ingest nonce and any victim addresses. Filtering with since is how a polling consumer catches up without re-reading the feed; percent-encode the timestamp if it carries a +00:00 offset.
Pro Utility
- GET
https://api.verdict.finance/api/v1/export.csvProBulk CSV export. Required params: entity (singular or plural, e.g. chain or chains; one of protocol, chain, token, oracle, vault, organisation, bridge) and fields (comma-separated from: slug, name, grade, letter_grade, composite_score, domain_scores, last_rated_at). Published entities only. Includes a hidden __export_id watermark column.
- GET
https://api.verdict.finance/api/v1/export.jsonProBulk JSON export. Same params as export.csv: entity (singular or plural) and fields (slug, name, grade, letter_grade, composite_score, domain_scores, last_rated_at). Published entities only. Returns an array of records with the requested fields plus __export_id.
- GET
https://api.verdict.finance/api/v1/compareEnterpriseMulti-entity comparison. Required params: entity, ids (each id a slug OR a UUID), fields. Returns each entity's grade, composite_score, domain_scores and last_rated_at from its latest published scorecard.
- GET
https://api.verdict.finance/api/v1/alert-rulesProList alert rules
- POST
https://api.verdict.finance/api/v1/alert-rulesProCreate alert rule
- DELETE
https://api.verdict.finance/api/v1/alert-rules/{rule_id}ProDelete alert rule
The bulk export quota is 5 per rolling 24 hours at every tier, including Enterprise; it does not scale. Standard request rate limits do scale with tier: 300 per minute (Free), 1,000 (Pro), 10,000 (Enterprise).