Sign your agent's requests
By the end of this page your agent has a verified identity, and you know exactly how its requests will carry a valid Web Bot Auth signature.
mwp CLI and JavaScript SDK referenced at the end
ship from a separate open-source repo; where they aren't published yet, this page says so plainly.
step 1 of 3Claim your agent's identity
Sign in and claim a handle from the dashboard. The handle is your agent's name on the public record — it can never be recycled, so pick one you'll keep.
Beta access is currently invite-only — your email has to be on the allowlist to sign in.
step 2 of 3Generate keys in your browser
From your agent's page, choose Generate keypair. Your browser creates an Ed25519 keypair with WebCrypto, shows the private key once for you to download as an encrypted keystore, and posts only the public key to MoltWeb. The private key never touches our servers — the registration endpoint accepts nothing but the public JWK.
POST /app/agents/my-research-agent/keys
{
"jwk": { "kty": "OKP", "crv": "Ed25519", "x": "oD0Hwoc…3Yd-CLA" }
}
✓ Key registered · agent now Active
✓ Directory live: my-research-agent.id.moltweb.app/.well-known/http-message-signatures-directory
In the keystore file you just downloaded, encrypted under your passphrase. MoltWeb never sees it. If you lose it, the key is gone — rotate to a new one from the dashboard. There is no recovery, by design.
Check that your card is live
Your registration publishes two public documents: the key directory verifiers fetch, and the human-readable Agent Card. Confirm both resolve — no tooling required:
- Directory:
https://my-research-agent.id.moltweb.app/.well-known/http-message-signatures-directory→ a JWK Set containing your active key. - Card: look up your handle in the registry and confirm the operator, status, and key history read correctly.
What you're looking at — a JWK Set
A JWK (JSON Web Key,
RFC 7517) is the standard way to publish a
cryptographic key as plain JSON instead of a PEM blob — the same format OAuth and OpenID providers use
for their token-signing keys. Your directory serves a JWK Set: a keys
array with one entry per active key.
"keys": [{
"kty": "OKP", // key type — Octet Key Pair, the Edwards-curve family
"crv": "Ed25519", // the curve — the only algorithm web-bot-auth uses
"x": "Z4g0oIt9…XxSwI", // your 32-byte public key, base64url-encoded
"kid": "Fp4KSbVY…QmlM", // key ID — the RFC 7638 thumbprint of this key
"use": "sig", // signing only, never encryption
"nbf": 1781228851 // not valid before this Unix time (activation)
}]
}
When your agent signs a request, the signature's
keyid parameter carries this kid. A verifier
fetches your directory, picks the matching entry, decodes x, and checks the
Ed25519 signature with it. Note what's not here: the private key. The directory is public by
design — it only ever contains the half of the keypair the whole world is supposed to see.
step 3 of 3Sign your requests
Signing happens in your runtime — MoltWeb hosts the public side, never the signing side. Two ways
to do it; both follow the open web-bot-auth profile of RFC 9421.
Option A — the SDK (your code, your runtime)
The JavaScript/TypeScript SDK lives in a separate open-source repo. When published, it's a few lines:
const fetch = signedFetch({
agent: "my-research-agent",
keystore: "./data/keystore.json", // the file you downloaded in step 2
});
await fetch("https://shop.example.com/products/feed");
// → Signature, Signature-Input, Signature-Agent headers added automatically
Option B — sign it yourself
The profile is small and fully specified. You cover
@authority and signature-agent, set
created/expires/keyid/tag="web-bot-auth",
and emit three headers. Published test vectors let you confirm your implementation byte-for-byte against
ours.
Signature-Input: sig1=("@authority" "signature-agent");created=…;expires=…;keyid="…";tag="web-bot-auth"
Signature: sig1=:<base64 ed25519 signature>:
Confirm it works
Point a signed request at the verification echo at
check.moltweb.net — it fetches your directory, rebuilds the signature
base, and tells you exactly what it saw:
Done. Your agent now introduces itself cryptographically everywhere it goes. Sites running Cloudflare, Akamai, AWS WAF, and other Web Bot Auth verifiers can confirm exactly who's calling — and your card answers for you.