Your agent just made a choice for you. Maybe it searched the whole market. Maybe it only searched the sellers who pay it. Stub is the receipt that lets you see which.
Proves the agent is who it says. Every serious agent has this already. It cannot tell you what the agent did with that trust.
Proves whose side it was on. Whether a commission, a partner deal, or a placement fee shaped the answer you got.
Eight fields. Signed once by the operator when the agent acts, witnessed by the registry every time it is checked.
{
operator: "Nimbus Assistant", who runs the agent
principal: "2a1ba6c6…", who it acted for, as a salted
hash. no personal data
reaches the registry
requested: "find me a flight", what was asked
done: "booked one", what actually happened
value_moved: "£280, 12% commission", who got paid
not_disclosed: [ "only partner airlines
were searched" ], the field that shows
whose side it was on
issued_at: "2026-07-20T…",
signature: Ed25519, operator key forge this and you
have signed a confession
}
After it acts, your agent emits a signed stub: what it was asked, what it did, what value moved, and what it was not told. To issue a valid one, the operator has to declare the agent's mandate.
The served party checks the stub without trusting the agent, the company that built it, or us. The check is witnessed by the registry with a signature the operator cannot forge.
Stubs resolve at the registry, not the seller's own server. A receipt you verify on the seller's machine proves nothing. Neutrality is the product.
AI-referred orders on Shopify grew thirteenfold in a year, and more than half of those sessions land straight on a product page. The agent did not suggest a category. It named the product.
Every major US card network is building agent payment rails. Mastercard has a live consumer product, Visa and Amex are piloting and shipping developer kits, and Google and Shopify put an open standard behind agent checkout.
OpenAI, with 900 million weekly users, pulled back from in-chat checkout to focus on product discovery instead. Discovery is the layer where an agent decides what you see. It is where paid influence lives, and today there is no way to audit it.
Search results got labels in 2002. Drug company payments to doctors became a public database in 2010. Sponsored posts got tagged in 2016. Financial advisers have declared their conflicts for decades. Every channel that ever stood between a person and their money ended up having to say who was paying it, and not one of them volunteered. Agents are the newest channel, the money is already moving through it, and this is the first one where the agent decides rather than suggests.
Your users are already asking whose side your agent is on. Today you can only tell them. Stub lets you show them. Three steps, once each, then one call per action. In JavaScript and Python.
# one line npm install @getstub/agent
One package. No config file. Works with any agent framework, because a stub is just the record of an action, not a wrapper around your loop.
import { Stub, influenced } from '@getstub/agent' const stub = new Stub({ operator: 'Acme Shopping Agent', // this is the honest part. you say who // pays you and what you search. // policy level, approved once. which // conflict classes exist in your business. declared: { paid_by: 'the user, subscription', conflicts: ['commission'] } }) // keys are generated and registered for you.
The mandate is policy level and set once: who pays you, and which kinds of conflict exist in your business at all. It is the sentence your company can approve one time. What applied to each specific action travels on the stub itself, and your code fills that in.
// your ranking code already knows when a // boost or commission applied. pass it through. const inf = [] if (pick.paid_placement) inf.push(influenced.placement(pick.seller)) if (pick.commission_pct) inf.push(influenced.commission(pick.commission_pct+'%')) const receipt = await stub.issue({ principal: user.id, // hashed on your side, never leaves as itself requested: task.prompt, done: result.summary, value_moved: payment, not_disclosed: inf // empty = nothing applied, and you signed that }) // hand receipt.url to your user. // they can check it. you're done. show('Verify this action → ' + receipt.url)
One call per action. You get back a link your user can open to see what happened and whose side you were on. It resolves at the registry, not on your servers, so nobody has to take your word for it.
A live mark for your site, your docs, your README. Stub draws it from your own receipts, so you cannot set it and neither can we, and it goes quiet on its own if you stop issuing.
For the people your agent serves, it is the difference between your account of what happened and the record itself, resolving somewhere you do not control.
Nothing extra to install. It comes on when you have earned it. What the Mark means →
Six runnable agents with Stub wired in at the line where the ranking happens. Clone one, run the tests, read the receipts it produces. They are references, not products in use, and each one says so.
A shopping agent that ranks a catalogue, surfaces one product, and runs an ACP checkout. The receipt is issued at the choice, upstream of checkout, where placement fees and commission actually shape the answer.
The lowest level version. A model, two tools, and a loop. Once you can see where the receipt goes here, you can place it in any framework, because every framework wraps this shape.
A read-only check server any agent can add, so the person being served can verify a receipt. Plus the operator pattern: your own MCP tools issuing receipts from your ranking code, where the flags live.
The same integration inside a framework agent. LangChain orchestrates the model and the tool calls. Your tool still does the ranking, so the receipt still comes from your code.
The biggest agent surface in JavaScript. The SDK runs the tool loop for you, and the receipt sits inside your tool, issued where the ranking happens.
An agent recommending a life policy, where the cheapest option is ranked last because it pays nothing. The gap costs the customer about a thousand pounds over the term. Same primitive, higher stakes.
A stub is not a log line. It marks a finished action a person would want to hold your agent accountable for. Put one at the moments where your agent chose, and something a commission or a partner deal could have swayed. Not on every tool call.
Two questions every builder asks before integrating.
Your ranking code already knows when a boost, a commission, or a partner filter applied, because it applied them. The stub reads the same flags at the same line and passes them through. That is why it scales: your system already tracks a million commercial relationships, or the ranking could not work at all.
The mandate you declare at registration stays small on purpose. Who pays you, and which conflict classes exist in your business. The sentence a company approves once. What applied to a specific action travels on the stub, filled by code.
Nothing personal reaches us. You pass your internal user id, the client hashes it on your side with a salt only you hold, and the registry rejects anything that is not an opaque digest.
user.id, the real one2a1ba6c6…If a user asks to be forgotten, drop their mapping to the salt and every digest of theirs becomes permanently meaningless, while the record stays append only. Keep free text about the action, not the person; the client warns you in development if something looks like an email or a phone number.
On our side the list is short. No cookies, no analytics on this site, and no contact form collecting details into a database. Write to us and it is an ordinary email, held in an inbox like any other, deleted on request.
Stub carries the influence your system computes: the boosts, commissions, and filters that exist as flags in code. If a model absorbed a bias that no flag anywhere records, a receipt cannot surface it, and we are not going to pretend otherwise.
This is the resolver. Paste a stub ID and it verifies the signature, shows what the agent did and whose side it was on, and records the check. The receipt lives at the registry, where the operator cannot edit it after the fact, and that independence is the reason it is worth reading at all.
Operators appear here by issuing. Their mandate is on the record, every stub they sign is checkable, and there is no other way onto this list.
An agent we built. It reads new work on AI agents and trust, selects three things worth your time, and publishes two editions daily. Every edition carries a receipt you can check, and proves production readiness.
Morning edition ranks on source. Evening edition ranks on what people are discussing.
Read Field NotesNobody has priced a receipt registry for agents before, including us. Until real operators run real volume through it, any number we put here would be a guess, so we are keeping it simple while we learn what this is worth.
No card required. No sales call.
Every change we ship, dated and public.
A question, an integration you are planning, something broken, or you want to be one of the first ten. Write to us and you will get a reply from a person.
Design partner conversations, integration questions, or anything we can improve or add to our roadmap. We read everything.
Stub is a registry. Operators issue signed records of agent actions, the registry stores and serves them, and countersigns every check made against them. That is the whole service.
A receipt proves what an operator signed. It does not prove that what they signed is true, and it is not an endorsement of any agent, operator, product, or purchase. Stub is not advice, escrow, insurance, or a guarantee of any kind.
The registry, this site, and the client library are provided as is and as available, without warranties of any kind, express or implied, including fitness for a particular purpose. We work to keep the service accurate and available, and we do not guarantee either.
To the fullest extent permitted by law, Stub's total liability arising from your use of the service is limited to the amount you paid us in the twelve months before the claim.
You are responsible for what you sign: your mandate, your disclosures, and the content of every record. Keep personal data out of the free text fields; the client hashes user identifiers for you and the registry rejects raw ones, and the rest is on you.
You hold your own keys and your own salt. We cannot recover either for you.
Attempts to break the registry's integrity, or knowingly issuing false records, may result in revoked access. Records already signed stay on the record.
Receipts contain no personal data. If you write to us, we hold that email so we can reply, and delete it on request. The full note is in the privacy section of this site.
These terms will evolve as Stub does. Changes are announced on the changelog, dated and public. Continued use after a change means acceptance.
Anything unclear, write to hello@getstub.dev. A person reads it.