EIP-191 signer (e.g. viem account.signMessage).
Expected origin (e.g. "https://ps.example.com").
HTTP method (e.g. "GET").
Request URI/path (e.g. "/v1/data/instagram.profile").
Optionalbody?: Uint8Array<ArrayBufferLike>Optional request body — when present, used to compute bodyHash.
Optionaliat?: numberIssued-at (unix seconds). Defaults to now.
Optionalexp?: numberExpiry (unix seconds). Defaults to iat + 300. Verifiers reject a window
longer than 15 minutes after iat (see verifyWeb3Signed).
OptionalgrantId?: stringOptional grant id, attached as the grantId claim.
Optionalnonce?: stringOptional uniqueness claim, attached as the nonce claim (a uuid is the
intended shape; the Personal Server bounds it at 128 characters).
A payload is otherwise fully determined by
{ aud, bodyHash, exp, grantId, iat, method, uri }, so two identical
requests signed inside the same second produce the same bytes. On the
routes that keep a replay store (the MCP and write-session handshakes
and delegated writes) the Personal Server refuses the second as a
replay; with a nonce the replay key becomes (signer, nonce) instead,
which is what lets a poll loop send the same request twice. The nonce
is then single use itself: re-using one is a replay even when the rest
of the payload changed. Plain data reads keep no replay store; their
exposure is bounded by the lifetime cap.
OptionalbodyHash?: stringPre-computed bodyHash claim — overrides body.
The full header value ("Web3Signed <base64url>.<sig>").
Build a Web3Signed Authorization header value.