Quickstart

Zero to certificate in 5 minutes

Prova has a single endpoint. Send it a reasoning chain. Get back a certificate. No account required to start -- use the public demo key. If your agent framework already tracks an explicit argument graph, skip extraction and post directly to POST /verify/structured for faster results and guaranteed confidence_score: 100.

1. Send your first verification

The demo key works immediately. It allows 10 verifications per IP address. Create a free account for 500/month.

curlbash
curl -X POST https://api.prova.cobound.dev/verify \
  -H "Content-Type: application/json" \
  -d '{
    "reasoning": "Step 1: The applicant has stable income, which means they can make payments. Step 2: Since they can make payments, the risk is low. Step 3: Therefore, approve the loan."
  }'

2. Read the certificate

The response is a certificate JSON. The two fields that matter most:

responsejson
{
  "certificate_id": "PRV-2026-A7X4",
  "timestamp": "2026-03-27T14:32:01Z",
  "verdict": "VALID",
  "confidence_score": 97,
  "prova_version": "1.0.0",
  "validator_version": "0.1.0",
  "argument_graph": { "nodes": [...], "edges": [...] },
  "failure": null,
  "certificate_url": "https://prova.cobound.dev/certificate/PRV-2026-A7X4",
  "sha256": "e3b0c44..."
}

verdict: VALID means the reasoning structure is sound. verdict: INVALID means a structural failure was detected — check the failure field for the exact location and type.

3. Python integration

pythonpython
import requests

response = requests.post(
    "https://api.prova.cobound.dev/verify",
    headers={"Authorization": "Bearer YOUR_API_KEY"},
    json={
        "reasoning": """
            Step 1: The patient has a fever above 38.5°C.
            Step 2: A fever above 38.5°C indicates possible infection.
            Step 3: Possible infection requires antibiotic evaluation.
            Step 4: Therefore, order a blood culture and antibiotic review.
        """,
        "retain": True,
        "metadata": {"model": "gpt-4o", "pipeline": "medical-triage"}
    }
)

cert = response.json()
print(cert["verdict"])           # VALID or INVALID
print(cert["certificate_id"])    # PRV-2026-XXXX
print(cert["certificate_url"])   # share this link

if cert["verdict"] == "INVALID":
    failure = cert["failure"]
    print(f"Failure type: {failure['type']}")
    print(f"Location: {failure['location']}")
    print(f"Description: {failure['description']}")

4. JavaScript / TypeScript integration

typescripttypescript
const response = await fetch('https://api.prova.cobound.dev/verify', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': `Bearer ${process.env.PROVA_API_KEY}`,
  },
  body: JSON.stringify({
    reasoning: agentDecisionLog,    // any string
    retain: true,
    metadata: {
      pipeline: 'loan-approval-v2',
      model: 'claude-sonnet-4-6',
    },
  }),
})

const cert = await response.json()

if (cert.verdict === 'INVALID') {
  // Log the certificate URL — it's permanent and shareable
  console.error('Invalid reasoning:', cert.certificate_url)
  // Optionally block the decision
  throw new Error(`AI reasoning failed Prova check: ${cert.failure?.type}`)
}

// Store the certificate ID alongside your decision record
await db.decisions.create({
  decision_id: yourDecisionId,
  prova_certificate_id: cert.certificate_id,
  prova_certificate_url: cert.certificate_url,
})

5. CLI usage

terminalbash
# Install
pip install prova-validator

# Verify from a file
prova verify reasoning.txt

# Verify from stdin
echo "Since X is true, Y follows, therefore Z." | prova verify -

# JSON output
prova verify reasoning.txt --format json

# With domain hint for failure consequence mapping
prova verify reasoning.txt --domain medical

# Exit codes:
#   0 = VALID
#   1 = INVALID
#   2 = ERROR

Next steps