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