Gravit Verifier API
The same verifier as the open source code and the sandbox, hosted for you. Every decision comes with a receipt signed by the service and chained to your previous receipts, so your auditor can check the whole history offline, without trusting us.
Paid plans: see below. The built in registry uses test keys; bring your own registry for real use.
Plans
| Plan | Calls per month | Price per 30 days | One year in advance (launch price) |
|---|---|---|---|
| Free | 1,000 | CHF 0 | CHF 0 |
| Pro | 100,000 | CHF 7 (about USD 8.50 / EUR 7.55) | CHF 60 (CHF 5 a month) (about USD 73 / EUR 65) |
| Enterprise | 10,000,000 | CHF 150 (about USD 182 / EUR 162) | CHF 1,440 (CHF 120 a month) (about USD 1,748 / EUR 1,553) |
| Custom | as agreed | Your own servers, a second operator, custom rules and service levels: our contact form | |
Paid in Bitcoin through BTCPay Server, straight to the Foundation's own wallet. Prices are in Swiss francs; USD and EUR amounts are approximate (ECB rate of 16 October 2026). No VAT is charged: the Foundation, a Swiss association, is not VAT registered. Paying extends your plan by 30 days per month bought, or by 365 days for a year; your key stays the same. A confirmation comes from our contact form; write there with any question about payment.
Money-back guarantee: not satisfied? Write to us through our contact form within 30 days of payment and we refund the full amount in Bitcoin. No questions asked.
1. Decide an artifact
curl https://gravitverifier.space/api/v1/verify \
-H "Authorization: Bearer $GRAVIT_API_KEY" -H "Content-Type: application/json" \
-d '{"artifact": {"artifact_id": "payment-4711", "claimed_state": "Verified Fact",
"context": {"evaluation_time": "2026-10-13T12:00:00Z", "freshness_max_age_seconds": 300},
"evidence": [ ...signed evidence records... ]}}'
The response contains result.decision (state, status, reason, decision_id), result.explanation
(rules and revisions applied, what independence rests on), result.graviteron, and the receipt with its signature.
Graviteron next to the decision says how strongly the counted evidence supports the claim (expected, from 0 to 1)
and how much evidence stands behind it (uncertainty; 1 means none). Keys of one operator count as one source.
For now every operator is trusted equally, so the calibration of this number is not yet established; the decision itself does
not depend on it. Method: evidence-measure.md.
2. Python
pip install "git+https://github.com/gravit-open-network-foundation/gravit-verifier-service#subdirectory=sdk/python"
from gravit_verifier_client import Client, verify_response, verify_export
gv = Client("gv_...")
res = gv.verify(artifact)
print(res["result"]["decision"]["final_epistemic_state"])
key = gv.service_key() # pin it once
print(verify_response(res, key, artifact)) # signature, result hash, request hash
print(verify_export(gv.export(), key)) # every receipt signed, chain unbroken
3. TypeScript
import { Client } from "gravit-verifier-client"; // source: sdk/typescript in the repository
const gv = new Client(process.env.GRAVIT_API_KEY);
const res = await gv.verify(artifact);
console.log(res.result.decision.final_epistemic_state, res.result.decision.status);
Endpoints
| Endpoint | What it does |
|---|---|
POST /api/v1/verify | Decide an artifact. Optional registry: your own verifier registry, its root signatures and trust root. |
GET /api/v1/decisions | Your decision history (limit, before_seq). |
GET /api/v1/decisions/{decision_id} | One decision with its receipt. |
GET /api/v1/export | All your receipts, signed and hash chained: hand this to your auditor. |
GET /api/v1/usage | Plan and use in the current month. |
GET /api/v1/service-key | The service's Ed25519 public key. No API key needed. |
POST /api/v1/gate | Capability Gate: may this capability be used for this exact action? Fail closed, with a receipt. |
GET /api/v1/status | Health and component versions. No API key needed. |
GET /api/v1/openapi.json | OpenAPI 3.1 description of the API. No API key needed. |
Capability Gate
For AI agents: list what is allowed, what is on the frontier and needs proof, and what is forbidden. Anything not
listed is unknown and blocked. A frontier capability is permitted for one action only, when you pass the decision_id
of a Verified Fact from /verify whose artifact_id is that action's hash.
g = gv.gate("pay", {"revision": "r1", "allowed": ["read"], "frontier": ["pay"], "forbidden": ["wipe"]},
action={"to": "acct_42", "amount": 250})
h = g["result"]["gate"]["action_hash"] # use as artifact_id when you verify the evidence
res = gv.verify({"artifact_id": h, "claimed_state": "Verified Fact", "evidence": [...]})
g = gv.gate("pay", policy, action={"to": "acct_42", "amount": 250}, decision_id=res["receipt"]["decision_id"])
print(g["result"]["gate"]["permitted"]) # True only for a Verified Fact about this exact action
Specification and tests: capability-gate.
Receipts you can check yourself
- The service passes your request to the verifier byte for byte, so signed numbers keep their exact form;
request_sha256records what was decided. result_sha256covers the exact result you received. The service signs the receipt with Ed25519.- Each receipt names the hash of the one before it. Removing or changing any entry later breaks the chain, and
verify_exportreports it. - The decision itself is reproducible: run the same artifact through the open source verifier at the same version and you get the same
decision_id.
Source
Service and clients: gravit-verifier-service. Verifier: verifier. Licence Apache-2.0.