What an Agined receipt attests, how it is built, signed, timed and stored, which tools observe and which record reported facts, what a receipt does not prove, and what you still trust us for.
Last updated November 7, 2026.
This statement describes how Agined Attestor, operated by Avonao, Inc., issues receipts: the signed records returned by every tool call, scheduled check and watch. It applies to production receipts and to receipts issued with the free test key. It is version 1.6 of the statement and describes receipt format version "1".
Read it with the Verifier Terms, which say what anyone may rely on, Key management, Verifying receipts and Format versions and long-term verification. The technical reference is in the documentation: Receipts and Verifying receipts.
In plain language: a receipt is a small JSON document that Agined signs. It says which tool ran, when, and what the tool did or was told. Anyone can check the signature with our public key, without asking us.
Every receipt is a JSON object with these members:
| Member | What it holds | Signed |
|---|---|---|
version | The format version, always "1" today | Yes |
receiptId | A 26-character ULID in Crockford base32. Its first 48 bits are the issue time in milliseconds, the rest is random | Yes |
issuedAt | The time of signing in UTC, ISO 8601 with milliseconds and a Z | Yes |
type | The tool that issued it, for example agent.call | Yes |
signatureKeyId | The id of the key that signed it, 22 characters | Yes |
body | The tool's own fields; body.type must equal type | Yes |
environment | Present and set to "test" only for receipts issued with the free test key | Yes |
signature | The Ed25519 signature, base64url without padding, 86 characters | It is the signature |
redacted, redaction | Present only on a receipt the customer has redacted | No; a redacted receipt no longer verifies |
A receipt names no workspace, account or person in its envelope. It holds whatever the tool's body records: hashes of content, and readable metadata such as destination URLs, labels, DNS answers, certificate hashes or, for commit.attest, the commit author's name and email. The canonical form of a receipt is at most 4,096 bytes; a call that would produce a larger one is refused with 413 receipt_too_large.
The difference matters more than anything else on this page. There are three kinds of fact:
Many receipts hold more than one kind. The tables below say which part is which. Receipt bodies of the tools that carry an assertion member say it in the receipt itself: "agined" or "agined-observed" when Agined observed, checked or computed the fact, "customer" when the body records what the customer, or a party the customer named, sent us. A customer record can contain a separate block, such as aginedChecked or observed, with the facts Agined checked itself. Each tool's documentation page states what its receipts prove and do not prove.
| Type | What Agined does | Facts in the receipt |
|---|---|---|
agent.call | Makes the agent's HTTP request to the destination and records the request and response. In its report form, signs the facts of a call the customer made itself | Observed (relay); reported (report form) |
llm.attest | Records the hashes of a prompt and a response, the model and the provider the customer names | Reported |
agent.boundary | Checks the agent.call receipts in the workspace's own region for a time window against forbidden rules, and commits to the set it checked by a Merkle root | Computed from Agined's own relay records. It covers only calls relayed through Agined in that region |
agent.plan | Signs the plan the customer submits before the work, then lists every relayed call outside the plan | Plan reported; deviations computed from Agined's own relay records |
refusal.attest | Records that an agent declined or stopped an action, why and who decided, and checks that linked receipts exist in the workspace | Reported; the links are checked |
handoff.attest | Records a delegation from one agent to another and checks that the delegated scope only narrowed along the chain | Reported; the chain and the narrowing are checked |
agentcard.watch | Fetches an agent's published A2A agent card on a schedule and signs it and each change | Observed |
approval.attest | Verifies a person's passkey (WebAuthn) signature over one exact action and decision, and signs the result with the raw assertion and public key | The action is reported; the signature check is Agined's. It does not identify the person |
botauth.verify | Fetches the signer's key directory and verifies a request's Web Bot Auth signature | Checked and observed |
eval.attest | Signs a model evaluation run committed before results exist, its batches and a Merkle root over every item | Reported; counts and the root are computed by Agined |
guardrail.attest | Records a decision of the customer's guardrail or safety classifier with the policy version | Reported |
mandate.witness | Verifies an agent-payment mandate against its issuer's keys as fetched at that moment, and compares the cart the customer describes with the mandate's limits | Signature check observed and checked; cart reported |
mcp.session | Records a hash-chained transcript of the MCP frames the customer's client or proxy submits; frame contents are not stored | Reported |
model.attest | Records the weights, configuration and licence hashes the customer submits, and optionally compares them with the public Hugging Face hub | Reported; the hub comparison is observed |
rag.attest | Records what a retrieval step returned and checks the link to the llm.attest receipt that used it | Reported; the link is checked |
tee.verify | Verifies the signature and certificate chain of an AMD SEV-SNP or Intel TDX attestation report the customer submits and signs the measurements. Revocation and TCB-status collateral are not checked, and the receipt says so | Checked |
| Type | What Agined does | Facts in the receipt |
|---|---|---|
content.attest | Records a content hash the customer submits | Reported |
dataset.snapshot | Records the contents, schema, licences and sources of a dataset, committed by a Merkle root | Reported; the root is computed by Agined when it builds it |
disclosure.attest | Records that a page fired a beacon for a registered disclosure text in a language for a session, at Agined's receive time | Reported (served, not seen); the receive time is Agined's |
page.provenance | Fetches a public page itself and signs the redirect chain, status, selected headers and hashes of the HTML and its text | Observed |
provenance.check | Parses a media file the customer submits and signs what can be said about its origin, such as whether a C2PA manifest is present | Checked |
reading.attest | Verifies a device's signature and counter order on a sensor reading when it arrives | The reading is the device's statement; the signature check, counter order and receive time are Agined's |
| Type | What Agined does | Facts in the receipt |
|---|---|---|
monitor.http | Runs scheduled checks of a URL and signs state changes and an hourly digest | Observed |
api.witness | Calls an API itself, with a credential the customer stored with us if needed, and signs the status, the body hash and the time | Observed |
apispec.watch | Fetches a published API description and sorts each change into breaking and non-breaking by fixed rules | Observed |
catalog.snapshot | Fetches a public sitemap or product feed and signs it item by item | Observed |
heartbeat.attest | Receives a scheduled job's ping and signs its arrival; signs an absence when a ping is missed | Ping content reported; arrival time, on-time verdict and absences observed |
optout.snapshot | Fetches what a domain publishes about AI and text-and-data-mining use, and signs it and each change. In register mode, signs a rightsholder's own reservation as their statement | Observed; register mode reported |
sla.certify | Computes a monthly availability certificate from every check Agined recorded for one of the customer's monitors | Computed from Agined's own check records |
status.capture | Fetches a vendor's public status page and signs each change | Observed |
terms.watch | Fetches a vendor's terms, privacy policy or DPA and signs paragraph-level hashes and each edit | Observed |
| Type | What Agined does | Facts in the receipt |
|---|---|---|
webhook.deliver | Delivers the customer's payload to the endpoint and records the outcome. In its report form, signs the facts of a delivery the customer made itself | Observed (delivery); reported (report form) |
email.dkim_notarize | Verifies the DKIM signatures of an email the customer submits against the keys published in DNS at that moment | Checked and observed |
inbound.receipt | Receives mail at an Agined-hosted address and signs its hash, the envelope sender's hash and the DKIM verdicts on arrival | Observed |
report.receipt | Signs the hash of an encrypted anonymous report and tracks the acknowledgement and feedback deadlines | The submission is reported; deadline verdicts are Agined's |
| Type | What Agined does | Facts in the receipt |
|---|---|---|
dns.watch | Watches DNS records through public resolvers and signs changes | Observed |
tls.watch | Watches a host's certificate chain and signs changes, by hash | Observed |
backup.attest | Records each backup and restore test the customer reports and compares a restore with an earlier backup receipt | Reported; the comparison is computed |
control.snapshot | Looks for a token in DNS or on the site and signs that the workspace controlled the domain, and signs a loss of control | Observed |
posture.watch | Fetches a host's security headers, security.txt, CAA and DNSSEC signals and signs them and each change | Observed |
rdap.watch | Fetches a domain's registry record over RDAP and signs it and each change | Observed |
residency.attest | States the region that processed the request and the jurisdiction of the signing key | Agined's own statement about its deployment, not checked by anyone outside Agined |
| Type | What Agined does | Facts in the receipt |
|---|---|---|
commit.attest | Records the commit metadata the customer's CI or git hook submits | Reported |
cra.report | Records the steps of an EU Cyber Resilience Act Article 14 case and signs each deadline as met or missed | Steps reported; deadline verdicts by Agined's record time |
lockfile.snapshot | Records the dependency set of a commit; reads npm lockfiles itself and checks the link to a commit.attest receipt | Reported; parsing and the link are checked |
registry.watch | Fetches what a public package or image registry says about a dependency and signs each change | Observed |
sbom.notarize | Binds an SBOM's canonical hash to a product version and timestamps later VEX status changes | Reported; the canonical hash is computed |
| Type | What Agined does | Facts in the receipt |
|---|---|---|
consent.record | Records consent grants, updates and withdrawals per salted subject, in a chain | Reported |
decision.attest | Records the outcome of an identity, age or KYC check per salted subject, without the personal data | Reported |
erasure.attest | Records the steps of a data-subject erasure case and signs the response deadline as met or missed | Steps reported; deadline verdicts by Agined's record time |
esign.evidence | Binds the hash of a signed document to the hash of the e-signature vendor's audit trail | Reported |
exam.integrity | Records the commitment to an exam paper before release and each candidate's submission | Reported; whether a submission was within the window is decided by Agined's receive time |
terms.accept | Records which version of the customer's terms each salted subject accepted, and when that version went live | Reported |
| Type | What Agined does | Facts in the receipt |
|---|---|---|
draw.fair | Records the entrants and rules before a public drand randomness round exists, then derives and signs the winners from that round | Commitment reported; the derivation is computed and anyone can repeat it |
invoice.attest | Records the hash of an e-invoice, its format and the sender and receiver identifiers the customer submits | Reported |
payment.event | Receives a Stripe or Adyen webhook, checks the provider signature on arrival and signs the result; a bad signature is recorded, not dropped | Arrival and signature check observed; the event content is the provider's statement |
Some tools issue more than one receipt type, for example an enrolment, a deadline verdict or a digest; each tool's documentation page names them. Every type uses the same envelope, keys and signing.
Each regional service also signs a daily self-attestation of its own activity, of type platform.self-attestation.
Bodies of relayed requests and responses are hashed, not stored, unless the customer turns on response-body retention. The same holds for the content the other tools receive to hash: documents, prompts, frames, mail, files and page HTML are hashed and not stored, except where a tool's documentation says that it returns or keeps something. A hash proves that matching bytes existed at the time; it does not show what they were.
signature member is serialized in the RFC 8785 canonical JSON form (JCS): keys sorted, no whitespace, UTF-8.If a region has no signing key, the call fails with 503 signing_unprovisioned. If the key cannot be used, it fails with 503 signer_unavailable. The service never signs with another region's key, never signs with a local key in production, and never returns an unsigned receipt.
issuedAt is read from the clock of the Cloudflare Worker that signs the receipt, at the moment of signing. The time in receiptId comes from a separate reading of the same clock and can differ from issuedAt by a few milliseconds.
No third-party timestamp authority (RFC 3161) countersigns receipts, and we make no statement about the accuracy of the clock beyond that it is the server's own time. If the exact time matters to you, rely on issuedAt as Agined's statement of when it signed, and combine it with other evidence where the stakes justify it.
Seven Ed25519 keys sign receipts, one for each data region, shared by all workspaces in that region. They are held as encrypted Cloudflare Worker secrets, and only the receipt service uses them. No API route returns a private key. Production and test receipts are signed by the same keys; test receipts are told apart by "environment": "test".
Key ids, the published key set, rotation and what happens if a key is compromised are described on the Key management page.
Receipts are stored in the data region chosen for the workspace. The database is append-only for receipts: triggers refuse changes, and a deletion passes only through an audited route, which is the customer's own deletion, a redaction or the retention job.
Receipts are customer data. Receipts, and everything recorded about them, are stored on Cloudflare in that region for a workspace on the Free, Starter, Pro, Pro+ or Team plan; on Free and Starter in the region's shared Cloudflare D1 database, and on Pro, Pro+ and Team in the workspace's own separate store on Cloudflare, one per workspace, with strict tenant isolation. For a workspace on the Scale or Enterprise plan, or with the isolation add-on, they are stored in the workspace's own Amazon Aurora database on Amazon Web Services, in the AWS region the workspace chose. When a workspace moves to Scale or Enterprise or buys the isolation add-on, its existing receipts are moved into that database. When it moves back to a plan on Cloudflare D1, its receipts are copied back into the D1 database of its region and checked, and the Aurora database is retired after the grace period. No receipt, receipt hash or batch of receipts is stored anywhere else. Each receipt is signed, so a change to a stored receipt breaks its signature, and the chains described below show a record removed from the middle of a chain.
On the Scale and Enterprise plans and with the isolation add-on, the hash of each receipt is also filed in a write-once ledger copy in the same database as the receipt, the workspace's own Amazon Aurora database. Once an hour, receipts from the hour that has closed are filed in batches of at most 2,000; each batch is one row holding the hash-only entries and a Merkle root over them, signed with the Ed25519 key of the workspace's region that signs its receipts. The entry for a receipt holds its id, its type, the SHA-256 of the signed receipt, its signature and key id, its issue time, its region and the date until which it is kept; it holds no account, label, URL or body. Database triggers refuse any change to a batch, and refuse its deletion before that date, which is seven years after the end of the batch's hour. A receipt deleted earlier, by the customer, by the retention window or on an erasure request, therefore keeps its hash-only entry until that date. The copy is in a database Agined operates and is not an independent witness: database triggers do not bind the database's owner, who could remove a trigger. Receipts stored in Cloudflare D1, on the Free to Team plans, have no write-once copy.
Some tools keep a chain: consent records, terms acceptances, identity-check decisions, erasure and reporting cases, exam submissions, approvals and MCP sessions. Each record in a chain names the previous receipt and the hash of its body, so a record cannot be removed from the middle of a chain without breaking the links. People in these chains are identified by a salted hash (an HMAC with a salt kept per workspace), not by a name or an address. The salt is kept with the workspace data and is returned only to that workspace, so the customer can link a hash back to its own user; a party holding only the receipt cannot.
Receipts are kept for the plan's retention window and then deleted: Free 7 days, Starter 30, Pro 90, Pro+ 180, Team 365, Scale 730; Enterprise has no automatic deletion unless the contract sets one. A customer can shorten the window. Deleting an account does not delete receipts before their window ends. An SBOM that a customer asks sbom.notarize to keep (escrow) is stored in the workspace's data region for ten years, in storage locked so that no one, including Agined, can delete it earlier, also when its receipts, the workspace or the account are deleted. A copy of a receipt held outside Agined still verifies after we have deleted ours.
A customer can redact fields of a stored receipt. The redacted copy records which fields were removed and when, and no longer verifies, because the signed bytes have changed. A copy taken before the redaction still verifies. The Privacy Policy and Retention and erasure give the detail.
A valid signature proves:
issuedAt when it signed.It does not prove:
Verification needs no cooperation from us, but it does not remove all trust. You still trust:
| You trust | Why | If it fails |
|---|---|---|
| That the public key you verify against is ours | A signature proves who holds a key, not whose key it is | A substituted key makes forgeries look valid. Pin the key id out of band |
| That our signing keys are used only by the receipt service | The service signs what its code decides to sign | A misused key could sign events that never happened |
| That we observe honestly when a tool observes | Those receipts say Agined saw this | A compromised Agined could sign a false observation |
| Our clock | issuedAt is our server time at signing | A skewed clock gives a wrong issuedAt |
issuedAt is always the time of signing. We do not issue receipts with an earlier or later time.receiptId.| Version | Effective | Change |
|---|---|---|
| 1.0 | October 28, 2026 | First published version |
| 1.1 | October 29, 2026 | Every tool in the catalogue in section 3, with the observed, checked and reported parts of each; redirects followed by the capture tools; chained records and salted subject hashes |
| 1.2 | October 29, 2026 | The ten-year locked SBOM escrow |
| 1.3 | November 6, 2026 | Receipts and everything recorded about them stored in Cloudflare D1 in the workspace's region; signing keys held as encrypted Cloudflare Worker secrets |
| 1.4 | November 6, 2026 | Receipts are customer data: Cloudflare D1 on the Free plan, the workspace's own Amazon Aurora database in the matching AWS region on a paid plan, and moved there on upgrade |
| 1.5 | November 6, 2026 | The hourly write-once ledger copy of each paid-plan receipt's hash, kept in the workspace's own Amazon Aurora database for seven years; Free-plan receipts have none |
| 1.6 | November 7, 2026 | The workspace's own Amazon Aurora database, and the hourly write-once copy of each receipt's hash in it, apply only to the Scale and Enterprise plans and the isolation add-on; Free to Team keep receipts in Cloudflare D1, in a separate D1 database for each workspace on Pro, Pro+ and Team, and have no write-once copy |
| 1.7 | November 7, 2026 | Seven Cloudflare regions (US West, US East, Europe Central, Europe West, Europe North, Asia-Pacific, Oceania); on Pro, Pro+ and Team receipts are kept in the workspace's own separate store on Cloudflare, one per workspace, not in a D1 database of its own |
Questions: support@agined.com. Security concerns about a receipt or a key: security@agined.com.