Verigrant › Guide for websites
Give your website an agent front
Agents already visit your site. This page is how to give them a door of their own and keep your pages for people: generate an agent front from the site you already have, publish its service file, put the gate in front of your pages, read the verdict on each visitor, and get found in the directory. A site goes from its website to a live front in fifteen minutes. The guide for businesses covers sealed orders and applications.
1. Three ways in
-
Run the generator
verigrant sitereads your site into a draft agent front, lets you review it, publishes the file and serves the door. Sections 2 and 3. - Install the gate A sidecar beside nginx, Caddy or Traefik, or a package for Express, Next.js and Cloudflare Workers, that sorts each visitor and points registered agents to your front. Sections 4 and 5. It works with or without a front of your own.
- Let Verigrant host it The hosted door generates, serves and keeps your front, and holds sealed data until you pull it. It goes live on its own day, after the registry, the directory and Connect. This page says where that matters.
All of it is open source under the Apache License 2.0 and none of it is on a public
registry yet. Write to support@verigrant.com
to get the verigrant CLI, vg-gate, vg-service-grant,
@verigrant/verify and @verigrant/gate.
2. Run the generator
verigrant site init --domain example.com
verigrant site verify
verigrant site scan https://example.com
verigrant site review
verigrant site publish --out /var/www/html
verigrant site serve
-
init makes your keys and prints your proof.
It writes a state directory,
.verigrant-siteby default or--state, holding the site's grant signing key and its box key, readable by the owner only and never printed. It prints the one DNS line or the one file that proves your domain: a TXT record at_verigrant-door.example.comholdingverigrant-door-verification=<token>, or the same line inhttps://example.com/.well-known/verigrant-door-verification.txt. It never overwrites a configuration that exists, so keys are never replaced by accident. - verify checks the proof. The record first, then the file, and records which held. A proof counts for thirty days. The scan checks it again, live, before reading a page, so a line written by hand into the configuration admits nothing.
-
scan reads your site into a draft.
Your robots file, per host, and it obeys it; your sitemap, or links from the start
page two levels deep; each page's schema.org markup and OpenGraph tags; Shopify and
WooCommerce products, Google Merchant, RSS and Atom feeds, or one you name with
--feed. It waits a second between requests, longer when your robots file asks, and reads at most 200 pages unless you raise it. Products, services, menu items, events, jobs, courses, rooms and articles become collections with search, list, get, availability and quote. Every form becomes an action, except search boxes and sign in forms. Card and password inputs are never accepted. Fields that look sensitive are sealed by default, and so is anything the scan cannot place. -
review is your approval.
It serves a page on
127.0.0.1:8827with a token it prints, and nothing else can reach it. Switch operations on and off, edit fields, terms and limits, and approve. Nothing is published that you did not approve. An owner who editeddraft.jsonby hand runsverigrant site review --approve. -
publish writes the files.
.well-known/verigrant-service.json, the front;verigrant-connectors.json; andverigrant-snapshot.json, the items with their date.--outwrites them to your web root as well. -
Connect live data where it matters.
verigrant site connect products --feed https://example.com/products.jsonpoints a collection at a product feed.--jsonwith--mapreads a JSON API you already have,--csva file on the server, and--sql-envwith--viewa read only Postgres view, with the database URL read from an environment variable and never written down. A collection with a connector answers live; without one it answers from the snapshot, with its date. -
Keep it current.
verigrant site scan https://example.com --updateon a schedule keeps your reviewed draft, refreshes the snapshot and records what changed in the change feed.--watch 3600does the same every hour from one process.
Everything the scan reads is data. Each string is cleaned and capped, nothing read from
a page becomes an operation, an action kind or a path, and a page written to steer an
agent is carried as a description and changes nothing else. Pages with no structured
data can be labelled by a language model with your own key, with
--label; it is off by default.
3. Publish the service file, and serve the door
-
The file is the door's address
An agent fetches
/.well-known/verigrant-service.jsonfrom your origin. It names your business, your collections, your operations and actions with their fields and modes, your change feed, your limits per tier and level, your terms per purpose, and your public keys. A front written for the first version of the format still reads it. -
Say what you allow
Terms per purpose:
allow,deny, or a price. The generator starts you with assist, search and research allowed and training denied. A purpose your terms do not name is refused. Limits per tier and level set the calls a minute and a day, and a level with no limits is a level you do not serve, which is how you set your minimum. -
serve runs the door
On
127.0.0.1:8826, behind your own proxy: the front, the token exchange at/agent/v1/token, each operation at/agent/v1/<id>and the change feed at/agent/v1/changes. Give it Verigrant's pass key set with--pass-keys, saved fromhttps://verigrant.com/api/.well-known/verigrant-pass-keys.json, and it trades a person's pass for your grant.--previewanswers without a grant on loopback so you can try the front first. -
Where level one lives today
The generator's own
servetakes passes. The level one exchange, where a registered agent trades its agent ID for your grant, clear actions and the MCP endpoint are in the open source door library,vg-service-grant, which a site in Rust puts behind its own listener over the files the generator published;serveanswers those three paths with 501 and says so. The hosted door serves all of them, on its own day. - Where clear actions arrive At a door that takes them, by signed webhook at an https address on a public host, by email, or in the door's own inbox, set per front. A webhook or a mail that fails leaves the intake in the inbox, so nothing is lost. The agent gets a receipt signed with your grant key.
4. Install the gate
The gate sits in front of your pages. People get the page. Verified search crawlers get
the page unless you say otherwise. A registered agent gets HTTP 409 and a
Link header pointing to your front. Automation that will not say who it is
gets 401 and the same pointer. A visitor who may be a person but looks automated gets a
small proof of work for its browser to do once per session.
-
Fetch the files it reads.
Verigrant's agent ID key set from
https://verigrant.com/.well-known/verigrant-agentid-keys.json, the pass key set if you take passes, and the Google and Bing crawler ranges.deploy/gate/refresh-files.shdoes it from cron, hourly, and the gate notices a changed file within a minute. -
Write gate.json.
Your domain, your front's address, the file paths and your policy: the purposes you
allow, the lowest level per purpose, what turns a warning into a refusal, whether
crawlers and agents get pages, the proof of work difficulty, the rate limits by network
and session, and the trap paths. Every field has a default and an unknown field is an
error.
deploy/gate/gate.jsonis a worked example. -
Run it beside your proxy.
vg-gate --config gate.jsonlistens on127.0.0.1:8822and refuses any other address. nginx usesauth_requestagainst/auth/nginxwith/renderfor the refusal page; Caddy usesforward_authand TraefikforwardAuthagainst/auth. The example configurations and a systemd unit are indeploy/gate/. -
Or use the package.
@verigrant/gateis the same gate as Express and Node middleware, Next.js middleware and route handler wrappers, and a Cloudflare Worker, built on@verigrant/verify. No dependencies, and it never calls Verigrant.
Paths under /.well-known/ and /robots.txt are never gated, so
your front stays reachable. A page that pulls dozens of images and scripts should serve
those outside the gate, or raise the network limit, because every gated request counts.
The example configurations have not yet been run behind a real nginx, Caddy or
Traefik on our side; the gate was tested against its HTTP contract.
5. Read the verdict
One decision looks at each request and returns a verdict. The gate adds it to every
request it lets through as three headers, and replaces any the visitor sent under the
same names: X-Verigrant-Class, X-Verigrant-Verdict, the verdict
JSON in base64url, and X-Verigrant-Agent.
-
The classes
person,search_crawler,agent,agent_for_personwhen a pass rides on the same request,unannounced_automation, andunknownwhen there is not enough signal. -
What makes an agent an agent
A credential that verifies offline under Verigrant's key set, addressed to your site,
a Web Bot Auth signature by the key the credential names, a fresh nonce, and a status
list entry that reads valid. Anything wrong makes it unannounced automation with the
reason, such as
agent_id_expired,agent_id_revoked,replayedorwrong_site. -
The warnings
network_undeclared,fingerprint_changed,rate_exceeded,purpose_not_allowedandupstream_bot_score_low. Your policy'srefuse_onturns any of them into a refusal; by default only a purpose you do not allow is refused. -
The log
Every request that carries an agent ID is written to
requests.login the gate's state directory, exactly as the agent signed it, each line signed by the gate's own key over a hash chained to the line before. It stays on your server, and it is what you report an agent with.
Two settings to leave alone for now
egress_only refuses every agent that did not come through Verigrant's
egress, which goes live on its own day; set today it refuses every agent. And an
agent whose status list the gate cannot fetch is refused by default, so revocation
fails closed; a site that turns status_list_required off leaves
revocation to the credential's day.
6. See your visitors, get found, and report
-
The hosted dashboard
A registered institution presses "Opt in to the hosted dashboard" under Agent visits in its Verigrant workspace. Then
verigrant site serve --report-visits https://verigrant.com/api, with your relying party credential inVERIGRANT_RELYING_PARTY_CREDENTIAL, posts one aggregate record a day per operator, level and purpose: the operations called, the actions taken and the outcomes, as counts. Verigrant refuses a record with anything else in it, so an email address, a request body or an agent id cannot be posted. Opting out stops new posts at once; the counts already posted stay with your organization. A door you run without opting in sends nothing. What Verigrant holds for an institution is in the privacy policy, and the terms of service say who agrees to what. -
The directory listing
Under Agent visits, list your site: a name, a description, up to eight categories, a
location, your front's address, and the levels and purposes you accept. It becomes
public when you prove the site, with a TXT record at
_verigrant-directory.example.comholdingverigrant-directory-verification=<token>or the same line athttps://example.com/.well-known/verigrant-directory-verification.txt, and press "Check the proof now". Verigrant rechecks daily; a proof that is gone delists you, and the listing returns when you publish it again. The front's address must be on your own site. Agents search it atGET https://verigrant.com/api/directory/search. -
Report an agent
POST https://verigrant.com/api/agent-registry/abuse-reportswith the agent, your site, a contact, a category and up to twenty lines from your signed log. Verigrant checks each line against the agent's keys, so a forged line never counts. A report counts as from your site when it carries your relying party credential and your site is proven, by a listing or a registered domain; otherwise it is kept as claimed and unproven. An upheld report warns, rate limits or revokes the agent or its whole operator, across every site.
7. What is not live yet
- The hosted door Goes live on its own day. Until then you serve your front yourself, and level one needs the door library behind your own listener, as section 3 says.
-
The egress
Goes live on its own day. Do not set
egress_onlybefore it. - Email delivery from the generator's door An action set to arrive by email waits in the inbox until a mailer is wired in. The receipt says so.
- Selling priced access You can price a purpose, and an agent is refused with the price's address. Nothing collects the price yet.
- Python Planned. Rust and TypeScript are what ship.
- A price The generator, the gate, the dashboard and a directory listing have no price and are not billed. Sealed orders and applications are the business guide's, with its prices.