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 already separate the user from the acting agent with the act claim. AG9 adds signed evidence that the agent is registered and, when required, freshly authorized by the verified human.
{
"sub": "auth0|user-alice",
"aud": "https://api.example.com",
"act": {
"sub": "agent-client-id",
"ag9_level": "fresh-approval",
"ag9_attestation_method": "human_authorization",
"ag9_audience": "oauth-obo-token-exchange",
"ag9_action_hash": "sha256-base64url-action-digest",
"ag9_human_id": "registered-human-id",
"ag9_device_id": "registered-agent-device-id",
"ag9_attestation_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'