PROVINGX
Developer guide

AI authorization at the model boundary

Provingx is how your whole team and its agents share one company AI key, safely: your app keeps using its existing OpenAI-compatible client, Provingx sits in the request path, authorizes or denies the call before upstream execution — carrying who made it and which team — and signs the resulting evidence. It is not a generic model gateway or tracing library.

AuthorizeEvery call is checked against policy before it reaches the model.
DenyStop killed, unsafe, or over-budget agents.
AccountAttach user, team, purpose, risk label, tokens, and cost.
ProveEd25519-sign every call; anyone verifies with your public key.
Fast pathThis guide has 76 features across 5 sections — most people only ever need these 3.
1
Get your key
Copy your key from Settings — it's how Provingx knows which org is calling.
2
Point your client at Provingx
Change your base URL to api.provingx.com/v1. Everything else about your existing OpenAI/Anthropic client stays the same.
3
Add one header
X-Provingx-Agent names who's calling. That's the minimum to see a real signed decision.
See the actual code below ↓
Section 01 of 058 features

Start here

Point an existing client at Provingx and get a signed decision back — the request shape, the headers that carry identity, and the sandbox to try it in.

Start here · Feature 01 of 08

Quickstart

The gist
The fastest way to get Provingx actually running: point your existing AI calls at Provingx instead of directly at OpenAI or Anthropic, and add one identifying header. Within minutes you get a real, authorized call back with a signed proof attached.

Change the model base URL, keep your upstream provider key in your runtime, send the Provingx key as authorization context, and label traffic with agent identity, sponsor, risk, purpose, and budget.

proxy-quickstart.sh
export OPENAI_BASE_URL=https://api.provingx.com/v1
export PROVINGX_API_KEY=prvn_live_...
export OPENAI_API_KEY=$YOUR_PROVIDER_KEY

curl https://api.provingx.com/v1/chat/completions \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "Content-Type: application/json" \
  -H "X-Provingx-Key: $PROVINGX_API_KEY" \
  -H "X-Provingx-Agent: finance-report-agent" \
  -H "X-Provingx-User: finance-owner@yourco.com" \
  -H "X-Provingx-Team: finance" \
  -H "X-Provingx-Purpose: monthly close report" \
  -H "X-Provingx-Max-Cost-USD: 0.50" \
  -H "X-Provingx-Prompt-Mode: off" \
  -d '{"model":"gpt-4o-mini","messages":[{"role":"user","content":"Summarize the monthly close"}]}'
One line in that snippet outlives the call: X-Provingx-Max-Cost-USD seeds a brand-new agent's permanent passport cap the first time it is seen — here, $0.50 for finance-report-agent, written as a signed revision attributed to system:proxy_cost_cap_header. A later call cannot raise or change it; only PUT /api/agents/{id}/passport can. Drop the header if you would rather set the budget deliberately, and see Governance headers for what each of the others does.

If you do not want application runtimes or deployment code to hold an OpenAI/Anthropic key, paste the provider key once in the encrypted vault. After that, calls send only prvn_live_...; Provingx injects the upstream key server-side only after authorization passes.

secretless-provider-vault.sh
# 1) Store the upstream key once from Fleet Control or API
curl https://api.provingx.com/api/control/provider-keys \
  -H "X-API-Key: prvn_live_..." \
  -H "Content-Type: application/json" \
  -X PUT \
  -d '{"provider":"openai","api_key":"sk-your-openai-key"}'

# 2) Existing model client sends only the Provingx key
curl https://api.provingx.com/v1/chat/completions \
  -H "Authorization: Bearer prvn_live_..." \
  -H "Content-Type: application/json" \
  -H "X-Provingx-Agent: finance-report-agent" \
  -H "X-Provingx-User: finance-owner@yourco.com" \
  -H "X-Provingx-Team: finance" \
  -H "X-Provingx-Purpose: monthly close report" \
  -d '{"model":"gpt-4o-mini","messages":[{"role":"user","content":"Summarize the monthly close"}]}'