Verb

Security

What stops it breaking your product?

Four things, and none of them is the model behaving well. Reads and writes are separate, and anything that changes data stops to show your user a confirmation card with the real values on it. The assistant can only call tools you declared in your own repository, so it has no capability you did not write down. It runs as the signed-in user, never as an administrator, so your API makes the same authorisation decision it always did. And every call is logged with what actually ran and what came back.

What it promises

It doesn’t touch money.

No checkout, no payments, no card data. Not a setting you switch off. It is simply not something Verb does, and it never will be.

Nothing changes without a yes.

Anything that edits or deletes shows your user exactly what is about to happen, in plain language, with the real details. They confirm, or it does not happen.

It never claims work it didn’t do.

When something fails, it says so. Your user gets an honest “that didn’t work” instead of a confident lie, and you hear about it before they do.

Every action has a real name on it.

A complete log of what was done, who asked for it, when, and whether it actually worked. It names the person, never “the AI agent did this”, so “what happened to this account?” is one search away.

Everything below names a mechanism rather than a promise, so you can check it against the product rather than take our word for it.

Here with a security checklist? Skip to what is in place.

Reads and writes are separate, and only reads run unattended

Every tool you declare is classified read, write or destructive. Reads execute. Anything that changes data stops and shows the person a card naming the actual action and the actual values, “cancel order 1041” rather than “confirm action?”, and nothing happens until they click it. A declined card is not retried.

It can only do what you wrote down

Capabilities come from a verb.md file in your repository, reviewed in a diff like any other code. There is no general internet access, no database connection and no way for the assistant to reach past that list. A tool you never described does not exist as far as it is concerned, however the question is phrased.

It acts as the user, never as an administrator

Tools run in that user's browser against your API with the credential they already hold. Verb is never given a wider key of its own, so your existing authorisation is the authorisation. An anonymous visitor is read-only by default and every write is refused until your backend vouches for who is asking.

It only answers on domains you have proven you own

A site key is public: it ships in your page source. So the check that matters is the origin one. It answers only on verified domains, and a request from anywhere else is refused before a model is called, which is what makes a copied script tag worthless.

Tool results are data, not instructions

Everything returned by your API is fenced and declared untrusted to the model, so content that reads like a command is reported rather than obeyed. And because a write still stops at a confirmation card a human has to click, a successful injection still cannot finish a destructive action by itself.

Every call is on the record

Who asked, which tool ran, the arguments it ran with, what came back, and whether the result was verified rather than merely claimed. That log is yours, in your dashboard, alongside the conversations themselves. An action reported as done that did not happen is the one outcome the whole design exists to prevent.

A test site that stays on your computer

Every site has a test site whose key only answers on localhost. It runs your actions for real against your development app, so you watch the assistant use your actual API before your users can reach it, and anything that changes data still asks first.

Tenants are separated in the database, not just in queries

Conversation data sits behind Postgres row-level security, so a query that forgets its tenant returns nothing rather than returning somebody else's rows. The failure mode is deliberately the visible one.

In place today

Every control below is running in production right now, with what it means and how it works.

Common questions

What stops the AI from deleting my production data?

Every tool is classified as read, write or destructive, and only reads run on their own. Anything that changes data stops and shows the user a confirmation card naming the exact action and its real arguments, and nothing runs until they click it. The assistant also cannot invent a capability: it can only call tools you have written into your own verb.md file, so an action you never described does not exist for it.

Can the AI assistant see data the user is not allowed to see?

No. Tools run in the user's own browser against your own API, carrying whatever credential that user already has. Verb never holds a second, wider key, so your API makes exactly the same authorisation decision it makes for every other request from that person. If they cannot see it without Verb, they cannot see it with Verb.

What happens if someone copies our script tag onto another site?

Nothing works. A site key only answers on domains you have verified, and requests from any other origin are refused before a model is ever called. The key is public by construction, because it ships in your page source, which is precisely why the domain check is what actually holds.

Can a prompt injection make the assistant run a destructive tool?

Tool results are fenced and declared to the model as untrusted data rather than instructions, so text arriving from your API that reads like a command is reported rather than followed. The stronger guarantee is structural: a write still stops at the confirmation card, which a human reads and clicks, so a successful injection still cannot complete a destructive action on its own.

Do you train models on our data?

No. Your data is not used to train anything, by us or by the model provider on our behalf. Conversations belong to your users and are visible to you in your dashboard, and Verb's internal staff view deliberately does not show them.

Can we test it before our users see it?

Every site comes with a test site alongside it: its own key, its own log, and a Test badge on the widget. Its key only answers on localhost, so it runs inside your app on your own computer, against your development data, and never reaches your users. Anything that changes data still asks for a yes first.

Found something here that does not hold, or holding a security questionnaire you need filled in? Write to vishnu.ps@askverb.com and you will reach the person who built it.