Palm-backed authorization patterns are first, followed by carrier adapters and challenge-based flows.
AG9 can issue a fresh human authorization JWT after the registered owner scans with VeryAI Palm. The attestation is bound to a relying-party audience and an action hash, so a scan for one action cannot be replayed for another.
This is not OpenWallet-specific. OpenWallet, OAuth OBO, Cloudflare, gateways, and apps can all use the same AG9-signed proof.
POST /v1/human/attestation/init.attestation_jwt.POST https://api.ag9.ai/v1/human/attestation/init { "device_id": "registered-agent-device-id", "public_key": "base64-spki-public-key", "audience": "relying-party-or-integration-id", "action_hash": "sha256-base64url-action-digest", "action_description": "Authorize this specific action" }
api.ag9.aihuman_authorization_attestationveryai_oauth_palm
OAuth 2.0 Token Exchange and On-Behalf-Of flows preserve user identity and actor delegation with issuer-owned claims like sub and act. AG9 adds a separate namespaced claim after the issuer verifies a fresh AG9 Palm authorization JWT for the exact action hash.
sub, aud, and act as OAuth-owned identity claims.https://ag9.ai/attestation.{
"sub": "auth0|user-alice",
"aud": "https://api.example.com",
"act": {
"sub": "agent-client-id",
"act": { "sub": "upstream-app-client-id" }
},
"https://ag9.ai/attestation": {
"issuer": "api.ag9.ai",
"level": "fresh-approval",
"method": "human_authorization",
"attestation_method": "human_authorization",
"audience": "https://api.example.com",
"action_hash": "sha256-base64url-action-digest",
"human_id": "registered-human-id",
"device_id": "registered-agent-device-id",
"verification_method": "veryai_oauth_palm",
"jwt": "eyJhbGciOiJFZERTQSJ9..."
}
}
The policy pattern treats AG9 as an external attestation provider. A wallet or policy engine receives the action context plus AG9 JWTs, verifies the signatures and claims, then allows or denies the action.
ag9.capability.jwt proves the agent solved a live AG9 challenge.human.authorization.jwt proves the registered human approved this exact action.{
"required_attestations": ["ag9", "human"],
"ag9": {
"issuer": "api.ag9.ai",
"jwks_url": "https://api.ag9.ai/.well-known/jwks.json",
"subject": "agent_capability_attestation",
"max_age_seconds": 300
},
"human": {
"issuer": "api.ag9.ai",
"subject": "human_authorization_attestation",
"require_action_hash": true
}
}
aud, action_hash, signature, and freshness.
The signed agent owns its Web Bot Auth key directory. AG9 does not sign as the bot. AG9 signs capability and human authorization attestations that the bot carries alongside the Web Bot Auth signature.
Ag9-Attestation and Ag9-Human-Attestation.401 unknown public key.Bot type: Signed Agent Verification method: Request Signature / Web Bot Auth Validation instructions: https://ag9-demo-agent.vercel.app/.well-known/http-message-signatures-directory User-Agent header values: AG9AttestedAgent/1.0 (+https://ag9.ai/bot) User-Agent match pattern: AG9AttestedAgent
# Start Palm authorization for the crawltest request curl -X POST https://ag9-demo-agent.vercel.app/demo/crawltest # Open verification_url, scan with VeryAI, then retry curl -X POST \ 'https://ag9-demo-agent.vercel.app/demo/crawltest?human_session_id=SESSION_ID'