Keep a signed record of what your model said.
When an AI output is challenged, a log line is not evidence. Record the input, the output and the model version at generation time. Invoance hashes each part, signs the record, and returns an ID you can verify against later.
One record format for every model.
Invoance never calls a model and holds no provider credentials. You post the exchange with three context fields, and the record is hashed and signed the same way whether the answer came from a hosted API or a model you run yourself.
model_provider: "openai"model_name: "gpt-4.1"model_version: "2026-01-01"payload_hashf06b3a9e…11d27c58Signed · same record shape| type | What is being attested, for example output |
|---|---|
payload.input | The prompt or request |
payload.output | The model's response |
| context | model_provider, model_name, model_version |
| subject | Optional user_id, session_id and your own keys |
trace_id | Optional. Attach to a trace of the full workflow |
import { InvoanceClient } from "invoance";
const client = new InvoanceClient();
const result = await client.attestations.ingest({
type: "output",
input: "What is the company refund policy?",
output: "Our refund policy allows returns within 30 days...",
modelProvider: "openai",
modelName: "gpt-4.1",
modelVersion: "2026-01-01",
subject: { userId: "user_7b1c", sessionId: "sess_4f9a" },
});
console.log(result.attestation_id, result.payload_hash);
- Separate hashes for input, output and the full payload.
- An Ed25519 signature bound to your organization.
- A verify endpoint and a public proof page per attestation.
- Works with any provider. Invoance never calls the model.
Customer-facing answers
Show what the assistant told a customer on a given date.
Automated decisions
Credit, claims and eligibility outputs that may be appealed.
Agent runs
Attach each step to a trace and seal the run when it ends.
Call your model as usual
Invoance sits beside the call, not in front of it. No proxy, no added latency on the model path.
Post the exchange
Input, output, provider, model name and version.
Hash and sign
input_hash, output_hash and payload_hash are computed, then the record is signed.
Verify later
Anyone holding the text can confirm it matches the attested hashes.
Does this prove the output was correct?
Do you sit in the request path to the model?
Can we attest without storing the text?
Send your first record.
Free on the Developer plan.