Auditvec Credit Risk API

Model-agnostic governance for credit decisions

We plug into your scorer and return calibrated probabilities, routed decisions, plain-language reasons, optional precedent, and a stable audit trail.

Governance First

Calibrated probability,coverage_pct, policy & gray-band gates, and a routed decision (APPROVE / DENY / REVIEW).

Explainable, Privacy-Safe

Plain-language reasons plus an optional neutral precedent_panel, no model internals exposed.

Drop-in on any model

Works with your scorer (GBDT, NN, LLM over HTTP).
Your model stays yours, we add calibration, routing, audit and guardrails

Demo

Validated on UCI German Credit (frozen):

AUC 0.771 • Brier 0.169 • ECE@10 0.077 • MCC 0.440 @ thr 0.42 • p95 93–117 ms

In production, your scorer’s accuracy stays yours. Auditvec layers calibration, routing, coverage, reasons, and audit on top.

Ping & Version
API=https://risk.auditvec.com
										KEY=YOUR_KEY
										
										# Health (public)
										curl -s $API/ping
										
										# Version (keyed)
										curl -s -H "X-API-Key: $KEY" $API/version
Classify (plain)
API=https://risk.auditvec.com
											KEY=YOUR_KEY
											
											curl -s -X POST "$API/classify?explain=plain" \
											-H "Content-Type: application/json" \
											-H "X-API-Key: $KEY" \
											-d '{
											"data": {
											"duration": 24,
											"credit_amount": 2500,
											"age": 35,
											"installment_rate": 2,
											"residence_since": 3,
											"existing_credits_count": 1,
											"dependents": 1,
											"status": "A12",
											"credit_history": "A32",
											"purpose": "A43",
											"savings": "A62",
											"employment_length": "A74",
											"personal_status_sex": "A92",
											"other_debtors": "A101",
											"property": "A122",
											"other_plans": "A143",
											"housing": "A152",
											"job": "A172",
											"telephone": "A191",
											"foreign_worker": "A201"
											}
											}'
Response (plain)
{"p_raw_gbdt":0.316,"p_bad_calibrated":0.411,"coverage_pct":100.0,"router":{"gate_policy":"PASS","gate_cov":"OK","gate_gray":"CLEAR","final_decision":"APPROVE"},"plain_summary":{"decision":"APPROVE","reason_lines":["status strongly increased risk","residence since strongly decreased risk","purpose strongly decreased risk","short credit history moderately increased risk"]},"policy":{"status":"PASS","violations":[],"flags":[]},"audit_id":"5abd5baab671"}
Classify (precedent panel)
API=https://risk.auditvec.com
											KEY=YOUR_KEY
											
											curl -s -X POST "$API/classify?explain=plain" \
											-H "Content-Type: application/json" \
											-H "X-API-Key: $KEY" \
											-d '{
											"data": {
											"duration": 24,
											"credit_amount": 2500,
											"age": 35,
											"installment_rate": 2,
											"residence_since": 3,
											"existing_credits_count": 1,
											"dependents": 1,
											"status": "A12",
											"credit_history": "A32",
											"purpose": "A43",
											"savings": "A62",
											"employment_length": "A74",
											"personal_status_sex": "A92",
											"other_debtors": "A101",
											"property": "A122",
											"other_plans": "A143",
											"housing": "A152",
											"job": "A172",
											"telephone": "A191",
											"foreign_worker": "A201"
											},
											"include_precedent": true,
											"panel_size": 11
											}'
Response (precedent panel)
{"p_bad_calibrated":0.411,"coverage_pct":100.0,"router":{"gate_policy":"PASS","gate_cov":"OK","gate_gray":"CLEAR","final_decision":"APPROVE"},"plain_summary":{"decision":"APPROVE","reason_lines":["status strongly increased risk","residence since strongly decreased risk","purpose strongly decreased risk"]},"precedent_panel":{"label":"good","confidence":0.75,"coverage":1.0},"audit_id":"5abd5baab671"}

Get a demo key

window.dqOnTurnstileCompleted = (token) => { const f = document.getElementById('dqForm'); if (!f) return; const input = f.querySelector('input[name="cf-turnstile-response"]'); if (input) input.value = token; }; // Fill context fields immediately (function(){ const f = document.getElementById('dqForm'); if (!f) return; const p = f.querySelector('input[name="page_url"]'); const u = f.querySelector('input[name="user_agent"]'); if (p) p.value = location.href; if (u) u.value = navigator.userAgent; })();

We use your work email only to issue a demo key and prevent abuse (rate limits & disposable-email checks). No newsletters, no sharing. PrivacyDelete anytime.

What we do with your email
  • Check domain/MX and block disposable/relay addresses.
  • Enforce per-user rate limits and demo quota.
  • Support: we may email you only about your key or service issues.
  • No marketing, no resale. Demo keys auto-expire in 7 days.

Access Options

Choose a quick demo key or talk to us about a private pilot.

Tester Key

  • Plain-language reasons + audit fields (audit_id).

  • Rate/size limits; CORS allow-list.

  • No PII; sample dataset only.

  • Short-lived key; good for experiments

Paid Pilot

  • Governance router (policy / coverage / gray-band).

  • Optional neutral precedent_panel.

  • Audit exports (JSON/CSV), usage metering.

  • Tenant-scoped keys; edge controls (rate, size, CORS).

  • Your data/model stay private


Quick Answers

What does coverage_pct mean?

The share of neutral precedent support available for a decision (0–100). It reflects panel coverage; it doesn’t change your model’s probability.

Where is the demo hosted?

Cloud Run behind a Cloudflare edge (API keys, rate/size limits, CORS allow-list). Every call returns a deterministic audit_id.

How do I get access?

Use the “Request Demo Key” button above (tester key), or email [email protected] for a private pilot.


Auditvec - Demo on UCI German Credit

Terms of Use1. Demo only
The Auditvec Credit Risk API demo is provided “as is” for evaluation on a public dataset; it is not financial advice and must not be used for real credit decisions.
2. Acceptable use
No PII, no scraping, no abuse, no security testing without written permission.
3. Keys & limits
Demo keys are time-limited and rate-limited. We may revoke access at any time.
4. IP & content
We retain audit logs for abuse prevention.
5. No warranties; limitation of liability
To the maximum extent permitted by law, the service is provided without warranties and with limited liability.
Contact
Email: [email protected]

Privacy NoticeWho we are
Auditvec provides the Auditvec Credit Risk API demo.
Contact
Email: [email protected]
What we collect
When you request a tester key we collect your email and technical logs (IP address, user-agent, timestamps).
Why we use it
To send a demo key, prevent abuse, operate security, and understand high-level usage. Legal bases (EU/UK). Consent (sending the key), and legitimate interests (security, abuse prevention).
Retention
Emails and key issuance logs are kept ≤12 months (or sooner on request).
Sharing/Processors
Hosting (Carrd), edge/security (Cloudflare), email delivery (e.g., Postmark/Resend/SES), optional cookieless analytics (e.g., Plausible/Cloudflare). We don’t sell your data.
Cookies. We do not use marketing cookies. Any cookies set are strictly necessary for security.
International transfers
Data may be processed outside your country with appropriate safeguards (e.g., SCCs).
Your rights
Access, deletion, correction, and objection (where applicable).
Email: [email protected]
Updates
We’ll post changes here.
Last updated: October 1st, 2025

(async () => { const qs = new URLSearchParams(location.search); const t = qs.get('t'); const ok = document.getElementById('ok'); const er = document.getElementById('err'); if (!t) { er.style.display = 'block'; return; } try { const r = await fetch('https://api.auditvec.com/keys/redeem?t=' + encodeURIComponent(t), { method:'GET' }); if (!r.ok) { er.style.display = 'block'; return; } const { ok: okFlag, key, expiresAt } = await r.json().catch(() => ({})); if (!okFlag || !key) { er.style.display = 'block'; return; } const masked = key.slice(0,4) + '•'.repeat(Math.max(0, key.length-8)) + key.slice(-4); const kMasked = document.getElementById('kMasked'); const btnReveal= document.getElementById('btnReveal'); const btnCopy = document.getElementById('btnCopy'); const exp = document.getElementById('exp'); const curl = document.getElementById('curl'); let revealed = false; kMasked.textContent = masked; exp.textContent = 'Expires: ' + new Date(expiresAt).toLocaleString(); curl.textContent = `curl -H "X-API-Key: ${key}" https://risk.auditvec.com/ping`; btnReveal.onclick = () => { revealed = !revealed; kMasked.textContent = revealed ? key : masked; btnReveal.textContent = revealed ? 'Hide' : 'Reveal'; }; btnCopy.onclick = () => navigator.clipboard?.writeText(key); ok.style.display = 'block'; } catch { er.style.display = 'block'; } })();

We couldn’t issue a key

Please try again.

If it keeps failing, contact [email protected].
const map = { turnstile_failed: 'Challenge failed. Please retry.', invalid_email: 'That email looks invalid.', invalid_domain: 'Email domain has no MX records.', disposable: 'Disposable/relay emails are not allowed.', rate_limited: 'Too many requests. Please try again later.', quota_exceeded: 'Daily key quota reached. Try again tomorrow.' }; const code = new URLSearchParams(location.search).get('code') || ''; document.getElementById('msg').textContent = map[code] || 'Please try again.';