VXP docs · draft 0.1
Examples and messages
One complete operation with every message, as the reference implementation produced it in a native-only run, and where to find more.
Every object on this page was captured from the reference implementation running as a native-only gateway (no Poppy, no PACT) with persistent keys, against a fictitious test store, in the evening run of 22 October
- Hosts are shown as
store.exampleandagent.example, and long tokens are shortened. The signed
files, their public material and every HTTP exchange of that run are in the site's downloads (native-run-2026-10-22-evening/). You can reproduce the run with reference/scripts/recorrido-nativo.test.ts.
1. Discovery#
GET /.well-known/vxp.jsoncaptured from the reference implementation
{
"protocol": "vxp",
"version": "0.1",
"organization": {
"name": "Ferretería Demo",
"domain": "store.example"
},
"issuer": "https://store.example/e/ferreteria-demo",
"endpoint": "https://store.example/e/ferreteria-demo/v1",
"capabilities": [
{
"id": "pedido.consultar",
"effect": "read",
"access": "delegated",
"admission": "static",
"authorization_details_type": "https://vxpprotocol.org/rar/capability"
},
{
"id": "pedido.reprogramar_despacho",
"effect": "write",
"access": "delegated",
"admission": "dynamic",
"authorization_details_type": "https://vxpprotocol.org/rar/capability",
"commitment_modes": [
"firm",
"conditional"
],
"outcome_proof": true
}
],
"limits": {
"max_revisions": 3,
"proposal_ttl_seconds": 900,
"max_accept_attempts": 3
},
"outcome_proof": {
"version": "0.1",
"trust": "issuer_metadata"
},
"status": "experimental",
"vxp": {
"version": "0.1",
"relationship": {
"authorization_details_type": "https://vxpprotocol.org/rar/relationship",
"company_initiated_actions": [
"despacho.proponer_cambio",
"incidencia.avisar",
"alerta.confirmar_o_bloquear"
]
},
"proof": {
"trust": "issuer_metadata"
}
}
}2. Session#
POST {issuer}/oauth/token · form fieldscaptured from the reference implementation
{
"grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer",
"client_id": "https://agent.example/agent.json",
"client_assertion_type": "urn:ietf:params:oauth:client-assertion-type:jwt-bearer",
"client_assertion": "eyJhbGciOi…",
"assertion": "eyJhbGciOi…"
}Token response · sessioncaptured from the reference implementation
{
"access_token": "nt_NzWl…",
"token_type": "DPoP",
"expires_in": 3600
}3. Asking without authority#
POST /v1/requests · body (Idempotency-Key set)captured from the reference implementation
{
"operation": "pedido.reprogramar_despacho",
"target": {
"order_ref": "P-1042"
},
"parameters": {
"delivery_date": "2026-10-28"
}
}202 authorization_requiredcaptured from the reference implementation
{
"request_id": "req_eSTKa7J-MERu",
"operation": "pedido.reprogramar_despacho",
"target": {
"order_ref": "P-1042"
},
"state": "authorization_required",
"projections": {
"poppy": null,
"a2a": "TASK_STATE_AUTH_REQUIRED"
},
"authorization": {
"error": "authorization_required",
"authorization_details": [
{
"type": "https://vxpprotocol.org/rar/capability",
"actions": [
"pedido.reprogramar_despacho"
],
"identifier": "P-1042"
}
],
"device_authorization_endpoint": "https://store.example/e/ferreteria-demo/oauth/device",
"resource": "https://store.example/e/ferreteria-demo/v1"
}
}The person approved on the store's page; the device authorization asked for exactly this, plus a relationship:
Device authorization · authorization_detailscaptured from the reference implementation
{
"authorization_details": "[{\"type\":\"https://vxpprotocol.org/rar/capability\",\"actions\":[\"pedido.reprogramar_despacho\"],\"identifier\":\"P-1042\"},{\"type\":\"https://vxpprotocol.org/rar/relationship\",\"actions\":[\"despacho.proponer_cambio\"],\"identifier\":\"relationship\",\"limits\":{\"max_per_day\":2,\"duration_seconds\":3600}}]"
}Token response after approvalcaptured from the reference implementation
{
"access_token": "nt_pt_q…",
"token_type": "DPoP",
"expires_in": 3600,
"authorization_details": [
{
"type": "https://vxpprotocol.org/rar/capability",
"actions": [
"pedido.reprogramar_despacho"
],
"identifier": "P-1042"
}
],
"relationships": [
{
"relationship_id": "rel_X9sUhyHhjsLp",
"state": "active",
"actions": [
"despacho.proponer_cambio"
],
"limits": {
"max_per_day": 2
},
"expires_at": "2026-10-22T23:30:29.000Z",
"agreement": "eyJhbGciO…"
}
]
}4. The same request, re-evaluated#
POST /v1/requests (same Idempotency-Key) · 201captured from the reference implementation
{
"request_id": "req_eSTKa7J-MERu",
"state": "proposed",
"projections": {
"poppy": "proposed",
"a2a": "TASK_STATE_INPUT_REQUIRED"
},
"operation_id": "op_XzdILOmlgiae"
}5. The proposal and its acceptance#
Proposal, revision 1captured from the reference implementation
{
"id": "prop_op_XzdILOmlgiae_r1",
"revision": 1,
"state": "proposed",
"summary": "Cambiar el despacho del pedido P-1042 (Taladro percutor 800 W) del 2026-10-24 al 2026-10-28, a Calle Ejemplo 100, Santiago, sin costo.",
"terms": {
"pedido": "P-1042",
"producto": "Taladro percutor 800 W",
"despacho_actual": "2026-10-24",
"despacho_nuevo": "2026-10-28",
"direccion": "Calle Ejemplo 100, Santiago",
"costo": {
"amount": "0",
"currency": "CLP"
},
"vxp_salt": "hRQxNKbVg-MdR_aCsFbHYQ"
},
"commitment": {
"mode": "firm",
"requires": []
},
"expires_at": "2026-10-22T22:45:29.356Z",
"user_approval_required": true,
"limits": {
"max_revisions": 3,
"revisions_left": 2,
"max_accept_attempts": 3,
"accept_attempts_left": 3
}
}POST /v1/proposals/{id}/accept · bodycaptured from the reference implementation
{
"approved_by": "user"
}6. The result and its proof#
Resultcaptured from the reference implementation
{
"state": "succeeded",
"effects": [
{
"system": "erp",
"change": "despacho 2026-10-24 → 2026-10-28",
"applied": true
}
],
"result": {
"summary": "Listo: el pedido P-1042 se despacha el 2026-10-28 (antes 2026-10-24). Verificado en el sistema de Ferretería Demo.",
"data": {
"pedido": "P-1042",
"despacho": "2026-10-28",
"verificado": "lectura_del_sistema",
"effects": [
{
"system": "erp",
"change": "despacho 2026-10-24 → 2026-10-28",
"applied": true
}
]
}
},
"reason": "read_back_matches",
"proof_url": "https://store.example/e/ferreteria-demo/v1/requests/req_eSTKa7J-MERu/proof"
}The chain (payload bodies)captured from the reference implementation
[
{
"seq": 0,
"kind": "request",
"signer": "operator",
"prev": null,
"body": {
"channel": "vxp",
"client_id": "https://agent.example/agent.json",
"request_digest": "sha-256:mfJleoso5oEyt_pqJS3OtbmYam7cyncRBrAcqbKfIrI"
}
},
{
"seq": 1,
"kind": "terms",
"signer": "company",
"prev": "sha-256:kAO5f-JoCSonqCQnG_1vki1T01wmqh4wDS5YK74U0v4",
"body": {
"capability": "pedido.reprogramar_despacho",
"commitment": {
"mode": "firm",
"requires": []
},
"company_review_required": false,
"expires_at": "2026-10-22T22:45:29.356Z",
"read_back_terms": [
"pedido",
"despacho_nuevo"
],
"revision": 1,
"terms_digest": "sha-256:LexccQ2IrXTwkx-zM3KJ3m2Sf5-YHsqzs-po_QCxAC0",
"user_approval_required": true
}
},
{
"seq": 2,
"kind": "user_approval",
"signer": "operator",
"prev": "sha-256:lCNrubnR6MLwUhwhcNUCWaqAKxFGOVWIlx3Rafs8v08",
"body": {
"method": "agent_asserted",
"revision": 1,
"terms_digest": "sha-256:LexccQ2IrXTwkx-zM3KJ3m2Sf5-YHsqzs-po_QCxAC0"
}
},
{
"seq": 3,
"kind": "execution",
"signer": "operator",
"prev": "sha-256:wk4J9m_VE1zzlLhc1QEZ7l3m7USokQiF9gtICMNft5U",
"body": {
"attempt": 1,
"capability": "pedido.reprogramar_despacho",
"release": "sha-256:u1TBBxJXTKta36K5UI_j_myhQaHzbPP2HcF4rBKGxPA",
"revision": 1,
"terms_digest": "sha-256:LexccQ2IrXTwkx-zM3KJ3m2Sf5-YHsqzs-po_QCxAC0"
}
},
{
"seq": 4,
"kind": "read_back",
"signer": "operator",
"prev": "sha-256:Gs2GOu4azZ6aE1VaKjm2Edj91Zya-VP4zP9Fbc71VJw",
"body": {
"matches_terms": true,
"method": "system_read_back",
"observed": {
"_sd": [
"g1MZFKspn_fcTPBy5COpYIVc6rPjeQYv9bF7QBCrv5g"
],
"despacho_nuevo": "2026-10-28",
"pedido": "P-1042"
},
"source": "company_system"
}
},
{
"seq": 5,
"kind": "outcome",
"signer": "company",
"prev": "sha-256:jfSCFRNR4QjvnD9VjmaNWdhfAg4ftVxMWy5xLrrT6Jo",
"body": {
"claimed_assurance": [
"issuer_key_attested",
"operator_observed",
"operator_reported_read_back",
"operator_reported_agent_approval"
],
"result_summary_digest": "sha-256:aKs3uy77c1osgD7qSgTqNJ0_YITroc5iwoYHqFmSl6s",
"revision": 1,
"state": "succeeded",
"terms_digest": "sha-256:LexccQ2IrXTwkx-zM3KJ3m2Sf5-YHsqzs-po_QCxAC0",
"third_party": []
}
}
]Verdict of the independent verifiercaptured from the reference implementation
{
"valid": true,
"final_state": "succeeded",
"revision": 1,
"approval": "agent_asserted",
"derived_assurance": [
"issuer_key_attested",
"operator_observed",
"operator_reported_read_back",
"operator_reported_agent_approval"
],
"single_root": "operator",
"custody_declared": "operator_hosted",
"logged": false,
"company": "https://store.example/e/ferreteria-demo",
"anchor": "issuer",
"key_source": "issuer_metadata_live",
"profile": "issuer",
"statements": 6,
"log_inclusion": "ok",
"tree_size": 6,
"live_tree_size": 6,
"consistency": "ok",
"witnesses": 0,
"operation": "matches"
}7. The relationship#
Relationship, as grantedcaptured from the reference implementation
{
"relationship_id": "rel_X9sUhyHhjsLp",
"state": "active",
"actions": [
"despacho.proponer_cambio"
],
"limits": {
"max_per_day": 2
},
"expires_at": "2026-10-22T23:30:29.000Z",
"agreement": "eyJhbGciO…"
}The company starts a request: delivered to the agent's inboxcaptured from the reference implementation
{
"outbox_id": "out_c_bdRdvaL42s",
"delivery": "entregado",
"http": 202,
"content": {
"request_id": "req_1tEWlrG-_6eq",
"request_url": "https://store.example/e/ferreteria-demo/v1/requests/req_1tEWlrG-_6eq",
"proposal_id": "prop_op_wHbfb8mjcZI7_r1",
"operation_id": "op_wHbfb8mjcZI7",
"summary": "Cambiar el despacho del pedido P-1043 (Escalera de aluminio 6 peldaños) del 2026-10-27 al 2026-10-30, a Calle Ejemplo 100, Santiago, sin costo.",
"terms_digest": "sha-256:u-oBOmfP_-UahdQqZhwaNaeQAq1ro4hzhaDCy69JhG8"
}
}The agent accepts the company's proposalcaptured from the reference implementation
{
"state": "succeeded",
"effects": [
{
"system": "erp",
"change": "despacho 2026-10-27 → 2026-10-30",
"applied": true
}
],
"reason": "read_back_matches"
}More examples#
- Failures, on purpose: the conformance validator's run against the reference shows each refusal it checks: a missing
Idempotency-Key, a reused key,terms_changed, a tampered outcome, an answer outside the options, a second answer, and a request after revocation (node conformance/reference/run.ts). - Tampered proofs: the Verify page alters a published proof in five ways and shows each rejection.
- Test vectors:
vectors/vectores-0.1.jsonholds valid chains and negative cases, each with the verdict and error a conforming verifier must return. - Operations with live agents (21 October 2026) are described on the Examples page, with what can and cannot be verified about each.