v0.4.1 · Draft

Agent payments API

Register agents, bind principals, verify purchase intent, and request one-use payment capabilities.

A principal is an individual or business on whose behalf an agent acts. Individuals act for themselves; businesses act through an authorized representative. Identity checks use KYC for individuals and KYB for businesses.

Proposed API contract. Endpoints and example base URLs are not live.

Base URL Placeholder · not live
https://sandbox.agentpay.example/v1

Quickstart

Six steps from agent enrollment to payment capability. First onboard the principal with an authorized session; complete hosted KYC / KYB where required before granting spending authority.

  1. Register the agent

    POST /agents

    Register an agent and declare its KYA profile. No bearer token is required.

    A human verifies their email and approves the profile before enrollment credentials can be redeemed.

    1. Register agent
    {
      "name": "ShoppingAgent",
      "email": "operator@example.com",
      "purpose": "Buy books with approval",
      "technology": {"platform": "Custom agent"},
      "environment": {
        "type": "LOCAL", "country": "AT"
      }
    }
  2. Authenticate

    POST /authenticate

    Exchange enrollment credentials, an API key, or a signed assertion for access.

    EMAIL_ENROLLMENT · API_KEY · SIGNED_ASSERTION

  3. Bind agent to principal

    POST /principals/{principalId}/bind

    Bind the verified agent to an individual or business principal.

    Use a trusted PRINCIPAL session or scoped ADMIN / PARTNER channel. Business consent requires verified representative authority and a spending mandate; an agent-supplied acknowledgment cannot establish either.

  4. Create purchase intent

    POST /intents

    Describe what the agent wants to buy, from whom, and under what constraints.

    Use the binding’s principal_reference and binding_id. Requested constraints can only narrow trusted principal authorization.

    4. Create purchase intent
    {
      "principal_reference": "pref_example",
      "binding_id": "bnd_example",
      "purpose": "Buy one book",
      "merchant": {
        "name": "Example Books",
        "domain": "books.example"
      },
      "cart": {
        "items": [{
          "title": "Example book", "quantity": 1,
          "unit_price": {"value": "24.00", "currency": "EUR"},
          "line_total": {"value": "24.00", "currency": "EUR"}
        }],
        "subtotal": {"value": "24.00", "currency": "EUR"},
        "tax_total": {"value": "0.00", "currency": "EUR"},
        "shipping_total": {"value": "0.00", "currency": "EUR"},
        "discount_total": {"value": "0.00", "currency": "EUR"},
        "total": {"value": "24.00", "currency": "EUR"}
      },
      "checkout": {
        "mode": "CLASSIC",
        "merchant_checkout_url": "https://books.example/checkout"
      },
      "requested_constraints": {
        "amount_max": {"value": "24.00", "currency": "EUR"},
        "valid_until": "2026-11-15T12:00:00Z",
        "max_authorizations": 1
      }
    }
  5. Verify intent

    POST /intents/{intentId}/verify

    Evaluate agent identity, delegation, evidence and policy before payment.

    APPROVEDSTEP_UP_REQUIREDDECLINED
  6. Request payment capability

    POST /intents/{intentId}/pay

    Request a one-use payment capability for the verified intent.

    Rails: AUTO, VISA_AGENTIC, MASTERCARD_AGENTIC, EPHEMERAL_CARD. Proposed rail values; partner validation is required.

    6. Request payment capability
    {
      "requested_rail": "AUTO"
    }

    System-controlled initiation window: nominally 60 seconds.

Card secrets, if issuance permits them, appear only in the initial issuance response. GET endpoints remain redacted. Issuance does not confirm a completed purchase.

Authentication & access

POST /agents and POST /authenticate are public entry points. Protected endpoints use HTTP Bearer / JWT with AGENT, PRINCIPAL, ADMIN or PARTNER roles.

A PRINCIPAL session is scoped to the represented individual or business. For a business, the service verifies the authenticated representative’s authority and spending mandate. Role eligibility does not replace resource ownership, binding or partner-scope checks. KYC / KYB does not grant spending authority.

Issuer evaluation uses a mutually authenticated issuer / processor channel (mTLS), with explicit partner permission. Ordinary agent bearer tokens cannot call it.

Mutations with an Idempotency-Key parameter require the same key and payload for retries; reuse with a changed payload returns 409. Expand an endpoint for its required headers and parameters.

API reference

All 30 operations, with exact YAML summaries, access requirements, parameters, response codes and linked schemas.

Contract information, servers and shared components
Contract information, servers and shared components
{
  "openapi": "3.1.0",
  "info": {
    "title": "Agent Pay — Public Agent, Principal, Intent and Payment API",
    "version": "0.4.1-draft",
    "summary": "Individual and business principals, role-scoped onboarding, Know Your Agent, KYC/KYB, intent verification and one-use card issuance",
    "description": "PROPOSED DESIGN — contract under discussion, not a deployed service or network certification.\n\nAuthentication uses a single BearerAuth scheme across role-aware protected endpoints.\nRoles: AGENT, PRINCIPAL, ADMIN, PARTNER. Role eligibility is necessary but never\nsufficient: every resource is checked for ownership, principal binding and partner\nportfolio scope. 401 is missing/invalid authentication; 403 is a valid actor denied\nby RBAC/relationship; some unauthorized resource lookups intentionally return 404.\n\nA principal is the individual or business on whose behalf an agent acts. Each\nprincipal has an immutable principal_type of INDIVIDUAL or BUSINESS and a matching\nindividual or business profile. PRINCIPAL is the role of a trusted principal-scoped\nsession: an individual acts for themselves; a business acts through an authenticated,\nauthorized representative. The service verifies that representative's authority and\nspending mandate server-side. A business profile, contact email or consent flag is\nnot proof of authority. ADMIN/PARTNER access remains explicitly tenant/portfolio scoped.\nIdentity verification is KYC for individuals and KYB for businesses, including required\nrepresentative/ownership checks through the trusted provider. It does not grant spending\nauthority. Verification type is determined from principal_type, never chosen by an agent.\n\nPOST /agents is unauthenticated email-based enrollment. Its opaque one-time enrollment\ncredential is bound to the registration session, valid for a short period, held by\nthe caller and cannot be redeemed until a human verifies email and explicitly approves\nthe agent profile in a trusted hosted flow. /authenticate is a single-call endpoint\nfor initial redemption or ongoing signed-assertion / rotated API-key authentication.\nAgent identity, principal KYC/KYB, agent binding, purchase intent verification and issuer\nauthorization are distinct trust boundaries. Identity and payment credentials are not\npermissions to spend. An AI/risk model may inform review/step-up but cannot override\nhard deterministic restrictions. An agent-provided technology/machine/IP claim is not\nproven runtime identity; compare signed/stable credentials and server-observed signals.\n\nPayment capability creation has a system-controlled nominal 60-second initiation\nwindow (not caller configurable). Each virtual-card payment attempt gets a dedicated\nissuer-processor card identifier stored server-side with credential_id, payment_id and\nintent_id. Issuer authorization matches on the processor card identifier (or agreed\nissuer token reference), not name/CVV/expiry. Distinguish authorization retries,\nreversals and captures to enforce one successful purchase per intent. For network-native\nagentic rails, equivalent one-purchase transaction binding requires partner validation.\n\nPOST /intents/{intentId}/pay may return PAN/expiry/CVV one time to an authorized agent\nin the payment issuance response only, contingent on issuer permissions, PCI-compliant\nprocessing and secure delivery. Never persist CVV after authorization, log payment\ncredentials or repeat sensitive card data from GET requests or idempotent replays.\nA gateway token may be PSP-specific and potentially sensitive; do not treat it as an\nissuer correlation reference. Cardholder name uses sponsor-approved alphabetic values,\nnever a primary correlation key. Provisioning credentials does not prove a purchase.\n\nNormal issuer authorization data includes merchant/amount/MCC/country when available,\nbut not reliably SKU, shipping, billing or PSP checkout URL. Verify these separately\nfrom trusted merchant/PSP evidence where possible. All issuer matching/fail-closed\nbehavior, cardholder formats, 3DS timeouts and settlement require bank/PSP validation.\n",
    "contact": {
      "name": "Agent Pay API design"
    }
  },
  "servers": [
    {
      "url": "https://api.agentpay.example/v1",
      "description": "Placeholder production endpoint, not live"
    },
    {
      "url": "https://sandbox.agentpay.example/v1",
      "description": "Placeholder sandbox endpoint, not live"
    }
  ],
  "jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
  "tags": [
    {
      "name": "Agents",
      "description": "Email-verified enrollment, lifecycle, KYA and principal/agent limits"
    },
    {
      "name": "Authentication",
      "description": "Single-request enrollment redemption or credential-based agent authentication"
    },
    {
      "name": "Principals",
      "description": "Individual/business onboarding, trusted representation and agent binding"
    },
    {
      "name": "Verification",
      "description": "Hosted KYC for individuals and KYB for businesses"
    },
    {
      "name": "Intents",
      "description": "Purchase details and verification against principal authorization"
    },
    {
      "name": "Payments",
      "description": "Payment capability issuance, status and reversal requests"
    },
    {
      "name": "Issuer Integration",
      "description": "Internal issuer/processor-facing, NOT exposed to untrusted agents"
    }
  ],
  "security": [],
  "components": {
    "securitySchemes": {
      "BearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "JWT",
        "description": "Short-lived actor token (roles AGENT, PRINCIPAL, ADMIN or PARTNER). PRINCIPAL scopes an individual session or an authorized representative acting for a business; onboarding additionally requires explicit onboarding authority. Every operation enforces principal binding/ownership, business representative authority and spending mandate where applicable, or explicitly delegated tenant/partner portfolio scope.\n"
      },
      "IssuerMutualTLS": {
        "type": "mutualTLS",
        "description": "Mutually authenticated issuer/processor channel; network and processor trust agreements are additionally required."
      }
    },
    "parameters": {
      "IdempotencyKey": {
        "in": "header",
        "name": "Idempotency-Key",
        "required": true,
        "description": "Repeat the same logical mutation with the same key and same payload; reuse with a changed payload is a 409.",
        "schema": {
          "type": "string",
          "minLength": 16,
          "maxLength": 128
        }
      },
      "AgentId": {
        "name": "agentId",
        "in": "path",
        "required": true,
        "schema": {
          "type": "string",
          "pattern": "^agt_[A-Za-z0-9_-]+$"
        }
      },
      "PrincipalId": {
        "name": "principalId",
        "in": "path",
        "required": true,
        "schema": {
          "type": "string",
          "pattern": "^prn_[A-Za-z0-9_-]+$"
        }
      },
      "IntentId": {
        "name": "intentId",
        "in": "path",
        "required": true,
        "schema": {
          "type": "string",
          "pattern": "^int_[A-Za-z0-9_-]+$"
        }
      },
      "PaymentId": {
        "name": "paymentId",
        "in": "path",
        "required": true,
        "schema": {
          "type": "string",
          "pattern": "^pay_[A-Za-z0-9_-]+$"
        }
      },
      "Cursor": {
        "name": "cursor",
        "in": "query",
        "schema": {
          "type": "string"
        },
        "description": "Opaque server-generated pagination cursor"
      },
      "Limit": {
        "name": "limit",
        "in": "query",
        "schema": {
          "type": "integer",
          "minimum": 1,
          "maximum": 100,
          "default": 25
        }
      }
    },
    "responses": {
      "BadRequest": {
        "description": "Invalid syntax or input",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ApiError"
            }
          }
        }
      },
      "Unauthorized": {
        "description": "No valid authentication for this actor",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ApiError"
            }
          }
        }
      },
      "Forbidden": {
        "description": "Authenticated actor lacks rights to the resource",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ApiError"
            }
          }
        }
      },
      "NotFound": {
        "description": "Not found or deliberately hidden from this actor",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ApiError"
            }
          }
        }
      },
      "Conflict": {
        "description": "State conflict, optimistic lock or idempotency mismatch",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ApiError"
            }
          }
        }
      },
      "Unprocessable": {
        "description": "Well-formed request fails domain or financial validation",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ApiError"
            }
          }
        }
      },
      "RateLimited": {
        "description": "Too many requests",
        "headers": {
          "Retry-After": {
            "description": "Seconds or HTTP date until retry",
            "schema": {
              "type": "string"
            }
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ApiError"
            }
          }
        }
      },
      "Unavailable": {
        "description": "Dependency unavailable; no implicit authorization or approval",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ApiError"
            }
          }
        }
      }
    }
  }
}

Agents

Email-verified enrollment, lifecycle, KYA and principal/agent limits

POST/agentsStart agent signup with email and declared KYA profile (no bearer token)PUBLIC

Public enrollment creates a server-generated agent_id in PENDING_EMAIL_VERIFICATION. A confirmation link is emailed to the address provided. The human must examine and approve the agent purpose and submitted technical profile; email ownership is not proof of agent runtime/framework identity. Response includes an opaque short-lived enrollment credential delivered to the caller only once. It cannot authenticate until email approval is complete, expires, and can be redeemed only once via POST /authenticate. No agent_id, operator_id or bearer token is supplied in this body. Apply bot/rate controls and prevent registration spam and account enumeration.

Authentication
Public · no bearer token
Eligible roles
PUBLIC

Parameters

  • Idempotency-Key · header · required — Repeat the same logical mutation with the same key and same payload; reuse with a changed payload is a 409. · {"type": "string", "minLength": 16, "maxLength": 128}

Request schema

Request body: required.

application/json · RegisterAgentRequest

Responses

  • 201 Pending agent signup and email confirmation instructions

    application/json · AgentEnrollment

  • 400 Invalid syntax or input

    application/json · ApiError

  • 409 State conflict, optimistic lock or idempotency mismatch

    application/json · ApiError

  • 429 Too many requests

    application/json · ApiError

    • Retry-After · Seconds or HTTP date until retry · {"type": "string"}

YAML examples are reproduced as supplied; dates and credential values are illustrative. Where the YAML has no example, a schema-valid example is generated. Examples do not list every optional field; follow the schema links for complete definitions.

Request JSON
{
  "name": "ShoppingAgent",
  "email": "operator@example.com",
  "purpose": "Buy books with principal approval",
  "technology": {
    "platform": "Custom agent"
  },
  "environment": {
    "type": "LOCAL",
    "country": "AT"
  }
}
201 · Pending agent signup and email confirmation instructions
{
  "agent_id": "agt_8fd231",
  "enrollment_id": "enr_a52e11",
  "status": "PENDING_EMAIL_VERIFICATION",
  "email_verification_required": true,
  "enrollment_credential": "enroll_secret_example_one_time",
  "expires_at": "2026-10-08T17:30:00Z",
  "message": "Verification email sent. Approve the agent profile before authenticating."
}

Error responses

  • 400 Invalid syntax or input
  • 409 State conflict, optimistic lock or idempotency mismatch
  • 429 Too many requests
Full OpenAPI operation definition
Full OpenAPI operation definition
{
  "pathItem": {},
  "operation": {
    "tags": [
      "Agents"
    ],
    "operationId": "registerAgent",
    "summary": "Start agent signup with email and declared KYA profile (no bearer token)",
    "description": "Public enrollment creates a server-generated agent_id in PENDING_EMAIL_VERIFICATION.\nA confirmation link is emailed to the address provided. The human must examine and\napprove the agent purpose and submitted technical profile; email ownership is not\nproof of agent runtime/framework identity. Response includes an opaque short-lived\nenrollment credential delivered to the caller only once. It cannot authenticate\nuntil email approval is complete, expires, and can be redeemed only once via\nPOST /authenticate. No agent_id, operator_id or bearer token is supplied in this body.\nApply bot/rate controls and prevent registration spam and account enumeration.\n",
    "security": [],
    "parameters": [
      {
        "$ref": "#/components/parameters/IdempotencyKey"
      }
    ],
    "requestBody": {
      "required": true,
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/RegisterAgentRequest"
          }
        }
      }
    },
    "responses": {
      "201": {
        "description": "Pending agent signup and email confirmation instructions",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/AgentEnrollment"
            },
            "example": {
              "agent_id": "agt_8fd231",
              "enrollment_id": "enr_a52e11",
              "status": "PENDING_EMAIL_VERIFICATION",
              "email_verification_required": true,
              "enrollment_credential": "enroll_secret_example_one_time",
              "expires_at": "2026-10-08T17:30:00Z",
              "message": "Verification email sent. Approve the agent profile before authenticating."
            }
          }
        }
      },
      "400": {
        "$ref": "#/components/responses/BadRequest"
      },
      "409": {
        "$ref": "#/components/responses/Conflict"
      },
      "429": {
        "$ref": "#/components/responses/RateLimited"
      }
    },
    "x-agentpay-roles": [
      "PUBLIC"
    ]
  }
}
GET/agentsList agents bound to the current principal (role-scoped)PRINCIPAL / AGENT / ADMIN / PARTNER

PRINCIPAL sees lightweight entries for agents bound to their principal account. AGENT sees its own registered entry unless granted a more specific delegation. ADMIN sees authorized tenant records, PARTNER sees portfolio-scoped entries. Always enforce row-level relationship checks and pagination.

Authentication
HTTP Bearer / JWT
Eligible roles
PRINCIPAL, AGENT, ADMIN, PARTNER

Only bound agents or explicitly authorized tenancy/portfolio agents.

Parameters

  • limit · query · optional · {"type": "integer", "minimum": 1, "maximum": 100, "default": 25}
  • cursor · query · optional — Opaque server-generated pagination cursor · {"type": "string"}
  • status · query · optional · AgentStatus

Request schema

No request body defined.

Responses

  • 200 Paginated agents

    application/json · AgentSummaryList

  • 401 No valid authentication for this actor

    application/json · ApiError

  • 403 Authenticated actor lacks rights to the resource

    application/json · ApiError

YAML examples are reproduced as supplied; dates and credential values are illustrative. Where the YAML has no example, a schema-valid example is generated. Examples do not list every optional field; follow the schema links for complete definitions.

Request · no JSON body
GET /agents
200 · Paginated agents
{
  "data": [
    {
      "agent_id": "agt_example",
      "name": "ShoppingAgent",
      "technology": "OpenClaw",
      "status": "PENDING_EMAIL_VERIFICATION"
    }
  ],
  "page": {
    "has_more": false
  }
}

Error responses

  • 401 No valid authentication for this actor
  • 403 Authenticated actor lacks rights to the resource
Full OpenAPI operation definition
Full OpenAPI operation definition
{
  "pathItem": {},
  "operation": {
    "tags": [
      "Agents"
    ],
    "operationId": "listAgents",
    "summary": "List agents bound to the current principal (role-scoped)",
    "description": "PRINCIPAL sees lightweight entries for agents bound to their principal account.\nAGENT sees its own registered entry unless granted a more specific delegation.\nADMIN sees authorized tenant records, PARTNER sees portfolio-scoped entries.\nAlways enforce row-level relationship checks and pagination.\n",
    "security": [
      {
        "BearerAuth": []
      }
    ],
    "parameters": [
      {
        "$ref": "#/components/parameters/Limit"
      },
      {
        "$ref": "#/components/parameters/Cursor"
      },
      {
        "name": "status",
        "in": "query",
        "schema": {
          "$ref": "#/components/schemas/AgentStatus"
        }
      }
    ],
    "responses": {
      "200": {
        "description": "Paginated agents",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/AgentSummaryList"
            }
          }
        }
      },
      "401": {
        "$ref": "#/components/responses/Unauthorized"
      },
      "403": {
        "$ref": "#/components/responses/Forbidden"
      }
    },
    "x-agentpay-roles": [
      "PRINCIPAL",
      "AGENT",
      "ADMIN",
      "PARTNER"
    ],
    "x-agentpay-resource-authorization": "Only bound agents or explicitly authorized tenancy/portfolio agents."
  }
}
GET/agents/{agentId}Read agent full profile and observed runtime metadata, access-filteredAGENT / PRINCIPAL / ADMIN / PARTNER

Read agent full profile and observed runtime metadata, access-filtered

Authentication
HTTP Bearer / JWT
Eligible roles
AGENT, PRINCIPAL, ADMIN, PARTNER

Agent itself, bound principal, or portfolio/tenant authority. Redact sensitive metadata by role.

Parameters

  • agentId · path · required · {"type": "string", "pattern": "^agt_[A-Za-z0-9_-]+$"}

Request schema

No request body defined.

Responses

  • 200 Agent details (public-key metadata only)

    application/json · AgentDetails

  • 401 No valid authentication for this actor

    application/json · ApiError

  • 404 Not found or deliberately hidden from this actor

    application/json · ApiError

  • 403 Authenticated actor lacks rights to the resource

    application/json · ApiError

YAML examples are reproduced as supplied; dates and credential values are illustrative. Where the YAML has no example, a schema-valid example is generated. Examples do not list every optional field; follow the schema links for complete definitions.

Request · no JSON body
GET /agents/{agentId}
200 · Agent details (public-key metadata only)
{
  "agent_id": "agt_example",
  "name": "ShoppingAgent",
  "purpose": "Buy books with principal approval",
  "technology": {
    "platform": "Custom agent"
  },
  "status": "PENDING_EMAIL_VERIFICATION",
  "created_at": "2026-11-15T12:00:00Z",
  "updated_at": "2026-11-15T12:00:00Z"
}

Error responses

  • 401 No valid authentication for this actor
  • 404 Not found or deliberately hidden from this actor
  • 403 Authenticated actor lacks rights to the resource
Full OpenAPI operation definition
Full OpenAPI operation definition
{
  "pathItem": {
    "parameters": [
      {
        "$ref": "#/components/parameters/AgentId"
      }
    ]
  },
  "operation": {
    "tags": [
      "Agents"
    ],
    "operationId": "getAgent",
    "summary": "Read agent full profile and observed runtime metadata, access-filtered",
    "security": [
      {
        "BearerAuth": []
      }
    ],
    "responses": {
      "200": {
        "description": "Agent details (public-key metadata only)",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/AgentDetails"
            }
          }
        }
      },
      "401": {
        "$ref": "#/components/responses/Unauthorized"
      },
      "404": {
        "$ref": "#/components/responses/NotFound"
      },
      "403": {
        "$ref": "#/components/responses/Forbidden"
      }
    },
    "x-agentpay-roles": [
      "AGENT",
      "PRINCIPAL",
      "ADMIN",
      "PARTNER"
    ],
    "x-agentpay-resource-authorization": "Agent itself, bound principal, or portfolio/tenant authority. Redact sensitive metadata by role."
  }
}
PUT/agents/{agentId}Update agent configurationAGENT / PRINCIPAL / ADMIN / PARTNER

Update mutable profile settings. Sensitive verified fields (email, owner, trusted KYA state, runtime signing keys) require independent owner consent and a trusted key-rotation workflow. An AGENT may update its own nonprivileged claims, while owner/ADMIN/PARTNER can change fields allowed by their scope. PUT is treated as a replacement of the mutable agent profile; omission clears optional profile fields, never server-managed identity or trusted observations.

Authentication
HTTP Bearer / JWT
Eligible roles
AGENT, PRINCIPAL, ADMIN, PARTNER

Agent self-service only for declared metadata. Bound owner or privileged actor for owner-controlled fields.

Parameters

  • agentId · path · required · {"type": "string", "pattern": "^agt_[A-Za-z0-9_-]+$"}

Request schema

Request body: required.

application/json · UpdateAgentRequest

Responses

  • 200 Updated agent

    application/json · Agent

  • 400 Invalid syntax or input

    application/json · ApiError

  • 403 Authenticated actor lacks rights to the resource

    application/json · ApiError

  • 404 Not found or deliberately hidden from this actor

    application/json · ApiError

  • 409 State conflict, optimistic lock or idempotency mismatch

    application/json · ApiError

  • 401 No valid authentication for this actor

    application/json · ApiError

YAML examples are reproduced as supplied; dates and credential values are illustrative. Where the YAML has no example, a schema-valid example is generated. Examples do not list every optional field; follow the schema links for complete definitions.

Request JSON
{
  "name": "ShoppingAgent",
  "purpose": "Buy books with principal approval"
}
200 · Updated agent
{
  "agent_id": "agt_example",
  "name": "ShoppingAgent",
  "purpose": "Buy books with principal approval",
  "technology": {
    "platform": "Custom agent"
  },
  "status": "PENDING_EMAIL_VERIFICATION",
  "created_at": "2026-11-15T12:00:00Z",
  "updated_at": "2026-11-15T12:00:00Z"
}

Error responses

  • 400 Invalid syntax or input
  • 403 Authenticated actor lacks rights to the resource
  • 404 Not found or deliberately hidden from this actor
  • 409 State conflict, optimistic lock or idempotency mismatch
  • 401 No valid authentication for this actor
Full OpenAPI operation definition
Full OpenAPI operation definition
{
  "pathItem": {
    "parameters": [
      {
        "$ref": "#/components/parameters/AgentId"
      }
    ]
  },
  "operation": {
    "tags": [
      "Agents"
    ],
    "operationId": "updateAgent",
    "summary": "Update agent configuration",
    "description": "Update mutable profile settings. Sensitive verified fields (email, owner,\ntrusted KYA state, runtime signing keys) require independent owner consent and a\ntrusted key-rotation workflow. An AGENT may update its own nonprivileged claims,\nwhile owner/ADMIN/PARTNER can change fields allowed by their scope. PUT is treated\nas a replacement of the mutable agent profile; omission clears optional profile\nfields, never server-managed identity or trusted observations.\n",
    "security": [
      {
        "BearerAuth": []
      }
    ],
    "requestBody": {
      "required": true,
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/UpdateAgentRequest"
          }
        }
      }
    },
    "responses": {
      "200": {
        "description": "Updated agent",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Agent"
            }
          }
        }
      },
      "400": {
        "$ref": "#/components/responses/BadRequest"
      },
      "403": {
        "$ref": "#/components/responses/Forbidden"
      },
      "404": {
        "$ref": "#/components/responses/NotFound"
      },
      "409": {
        "$ref": "#/components/responses/Conflict"
      },
      "401": {
        "$ref": "#/components/responses/Unauthorized"
      }
    },
    "x-agentpay-roles": [
      "AGENT",
      "PRINCIPAL",
      "ADMIN",
      "PARTNER"
    ],
    "x-agentpay-resource-authorization": "Agent self-service only for declared metadata. Bound owner or privileged actor for owner-controlled fields."
  }
}
POST/agents/{agentId}/disableDisable an agent and prevent further spendingPRINCIPAL / ADMIN / PARTNER

Blocks new tokens and capabilities; invalidates active agent sessions/capabilities where operationally possible. Does not unwind already authorized purchases.

Authentication
HTTP Bearer / JWT
Eligible roles
PRINCIPAL, ADMIN, PARTNER

Only verified agent owner or authorized administrator/partner.

Parameters

  • agentId · path · required · {"type": "string", "pattern": "^agt_[A-Za-z0-9_-]+$"}
  • Idempotency-Key · header · required — Repeat the same logical mutation with the same key and same payload; reuse with a changed payload is a 409. · {"type": "string", "minLength": 16, "maxLength": 128}

Request schema

No request body defined.

Responses

  • 200 Agent disabled

    application/json · Agent

  • 403 Authenticated actor lacks rights to the resource

    application/json · ApiError

  • 404 Not found or deliberately hidden from this actor

    application/json · ApiError

  • 409 State conflict, optimistic lock or idempotency mismatch

    application/json · ApiError

  • 401 No valid authentication for this actor

    application/json · ApiError

YAML examples are reproduced as supplied; dates and credential values are illustrative. Where the YAML has no example, a schema-valid example is generated. Examples do not list every optional field; follow the schema links for complete definitions.

Request · no JSON body
POST /agents/{agentId}/disable
200 · Agent disabled
{
  "agent_id": "agt_example",
  "name": "ShoppingAgent",
  "purpose": "Buy books with principal approval",
  "technology": {
    "platform": "Custom agent"
  },
  "status": "DISABLED",
  "created_at": "2026-11-15T12:00:00Z",
  "updated_at": "2026-11-15T12:00:00Z"
}

Error responses

  • 403 Authenticated actor lacks rights to the resource
  • 404 Not found or deliberately hidden from this actor
  • 409 State conflict, optimistic lock or idempotency mismatch
  • 401 No valid authentication for this actor
Full OpenAPI operation definition
Full OpenAPI operation definition
{
  "pathItem": {
    "parameters": [
      {
        "$ref": "#/components/parameters/AgentId"
      }
    ]
  },
  "operation": {
    "tags": [
      "Agents"
    ],
    "operationId": "disableAgent",
    "summary": "Disable an agent and prevent further spending",
    "description": "Blocks new tokens and capabilities; invalidates active agent sessions/capabilities where operationally possible. Does not unwind already authorized purchases.",
    "security": [
      {
        "BearerAuth": []
      }
    ],
    "parameters": [
      {
        "$ref": "#/components/parameters/IdempotencyKey"
      }
    ],
    "responses": {
      "200": {
        "description": "Agent disabled",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Agent"
            }
          }
        }
      },
      "403": {
        "$ref": "#/components/responses/Forbidden"
      },
      "404": {
        "$ref": "#/components/responses/NotFound"
      },
      "409": {
        "$ref": "#/components/responses/Conflict"
      },
      "401": {
        "$ref": "#/components/responses/Unauthorized"
      }
    },
    "x-agentpay-roles": [
      "PRINCIPAL",
      "ADMIN",
      "PARTNER"
    ],
    "x-agentpay-resource-authorization": "Only verified agent owner or authorized administrator/partner."
  }
}
POST/agents/{agentId}/enableEnable a verified, previously disabled agentPRINCIPAL / ADMIN / PARTNER

Re-enablement requires the original operator to remain verified; deleted/revoked agents cannot be re-enabled this way.

Authentication
HTTP Bearer / JWT
Eligible roles
PRINCIPAL, ADMIN, PARTNER

Only verified agent owner or authorized administrator/partner.

Parameters

  • agentId · path · required · {"type": "string", "pattern": "^agt_[A-Za-z0-9_-]+$"}
  • Idempotency-Key · header · required — Repeat the same logical mutation with the same key and same payload; reuse with a changed payload is a 409. · {"type": "string", "minLength": 16, "maxLength": 128}

Request schema

No request body defined.

Responses

  • 200 Agent enabled

    application/json · Agent

  • 403 Authenticated actor lacks rights to the resource

    application/json · ApiError

  • 404 Not found or deliberately hidden from this actor

    application/json · ApiError

  • 409 State conflict, optimistic lock or idempotency mismatch

    application/json · ApiError

  • 401 No valid authentication for this actor

    application/json · ApiError

YAML examples are reproduced as supplied; dates and credential values are illustrative. Where the YAML has no example, a schema-valid example is generated. Examples do not list every optional field; follow the schema links for complete definitions.

Request · no JSON body
POST /agents/{agentId}/enable
200 · Agent enabled
{
  "agent_id": "agt_example",
  "name": "ShoppingAgent",
  "purpose": "Buy books with principal approval",
  "technology": {
    "platform": "Custom agent"
  },
  "status": "ACTIVE",
  "created_at": "2026-11-15T12:00:00Z",
  "updated_at": "2026-11-15T12:00:00Z"
}

Error responses

  • 403 Authenticated actor lacks rights to the resource
  • 404 Not found or deliberately hidden from this actor
  • 409 State conflict, optimistic lock or idempotency mismatch
  • 401 No valid authentication for this actor
Full OpenAPI operation definition
Full OpenAPI operation definition
{
  "pathItem": {
    "parameters": [
      {
        "$ref": "#/components/parameters/AgentId"
      }
    ]
  },
  "operation": {
    "tags": [
      "Agents"
    ],
    "operationId": "enableAgent",
    "summary": "Enable a verified, previously disabled agent",
    "description": "Re-enablement requires the original operator to remain verified; deleted/revoked agents cannot be re-enabled this way.",
    "security": [
      {
        "BearerAuth": []
      }
    ],
    "parameters": [
      {
        "$ref": "#/components/parameters/IdempotencyKey"
      }
    ],
    "responses": {
      "200": {
        "description": "Agent enabled",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Agent"
            }
          }
        }
      },
      "403": {
        "$ref": "#/components/responses/Forbidden"
      },
      "404": {
        "$ref": "#/components/responses/NotFound"
      },
      "409": {
        "$ref": "#/components/responses/Conflict"
      },
      "401": {
        "$ref": "#/components/responses/Unauthorized"
      }
    },
    "x-agentpay-roles": [
      "PRINCIPAL",
      "ADMIN",
      "PARTNER"
    ],
    "x-agentpay-resource-authorization": "Only verified agent owner or authorized administrator/partner."
  }
}
POST/agents/{agentId}/deleteLogically delete an agentPRINCIPAL / ADMIN / PARTNER

Soft delete (tombstone), revoke credentials, disable bindings and unused capabilities. Immutable payment and audit records must be retained where required. POST is retained as explicitly requested; this is not physical deletion and cannot be undone by /enable.

Authentication
HTTP Bearer / JWT
Eligible roles
PRINCIPAL, ADMIN, PARTNER

Only verified agent owner or authorized administrator/partner.

Parameters

  • agentId · path · required · {"type": "string", "pattern": "^agt_[A-Za-z0-9_-]+$"}
  • Idempotency-Key · header · required — Repeat the same logical mutation with the same key and same payload; reuse with a changed payload is a 409. · {"type": "string", "minLength": 16, "maxLength": 128}

Request schema

No request body defined.

Responses

  • 200 Agent deleted (tombstoned)

    application/json · Agent

  • 403 Authenticated actor lacks rights to the resource

    application/json · ApiError

  • 404 Not found or deliberately hidden from this actor

    application/json · ApiError

  • 401 No valid authentication for this actor

    application/json · ApiError

YAML examples are reproduced as supplied; dates and credential values are illustrative. Where the YAML has no example, a schema-valid example is generated. Examples do not list every optional field; follow the schema links for complete definitions.

Request · no JSON body
POST /agents/{agentId}/delete
200 · Agent deleted (tombstoned)
{
  "agent_id": "agt_example",
  "name": "ShoppingAgent",
  "purpose": "Buy books with principal approval",
  "technology": {
    "platform": "Custom agent"
  },
  "status": "DELETED",
  "created_at": "2026-11-15T12:00:00Z",
  "updated_at": "2026-11-15T12:00:00Z"
}

Error responses

  • 403 Authenticated actor lacks rights to the resource
  • 404 Not found or deliberately hidden from this actor
  • 401 No valid authentication for this actor
Full OpenAPI operation definition
Full OpenAPI operation definition
{
  "pathItem": {
    "parameters": [
      {
        "$ref": "#/components/parameters/AgentId"
      }
    ]
  },
  "operation": {
    "tags": [
      "Agents"
    ],
    "operationId": "deleteAgent",
    "summary": "Logically delete an agent",
    "description": "Soft delete (tombstone), revoke credentials, disable bindings and unused\ncapabilities. Immutable payment and audit records must be retained where\nrequired. POST is retained as explicitly requested; this is not physical\ndeletion and cannot be undone by /enable.\n",
    "security": [
      {
        "BearerAuth": []
      }
    ],
    "parameters": [
      {
        "$ref": "#/components/parameters/IdempotencyKey"
      }
    ],
    "responses": {
      "200": {
        "description": "Agent deleted (tombstoned)",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Agent"
            }
          }
        }
      },
      "403": {
        "$ref": "#/components/responses/Forbidden"
      },
      "404": {
        "$ref": "#/components/responses/NotFound"
      },
      "401": {
        "$ref": "#/components/responses/Unauthorized"
      }
    },
    "x-agentpay-roles": [
      "PRINCIPAL",
      "ADMIN",
      "PARTNER"
    ],
    "x-agentpay-resource-authorization": "Only verified agent owner or authorized administrator/partner."
  }
}
GET/agents/{agentId}/kyaRead the agent Know Your Agent (KYA) assessmentAGENT / PRINCIPAL / ADMIN / PARTNER

Separate self-declared information, verified operator/key proofs and server-observed runtime/IP risk signals. Sensitive details may be redacted by role.

Authentication
HTTP Bearer / JWT
Eligible roles
AGENT, PRINCIPAL, ADMIN, PARTNER

Self, bound principal or administrative/partner scope.

Parameters

  • agentId · path · required · {"type": "string", "pattern": "^agt_[A-Za-z0-9_-]+$"}

Request schema

No request body defined.

Responses

  • 200 KYA profile and evidence

    application/json · AgentKya

  • 401 No valid authentication for this actor

    application/json · ApiError

  • 403 Authenticated actor lacks rights to the resource

    application/json · ApiError

  • 404 Not found or deliberately hidden from this actor

    application/json · ApiError

YAML examples are reproduced as supplied; dates and credential values are illustrative. Where the YAML has no example, a schema-valid example is generated. Examples do not list every optional field; follow the schema links for complete definitions.

Request · no JSON body
GET /agents/{agentId}/kya
200 · KYA profile and evidence
{
  "agent_id": "agt_example",
  "status": "VERIFIED",
  "declared": {
    "name": "ShoppingAgent",
    "purpose": "Buy books with principal approval",
    "technology": {
      "platform": "Custom agent"
    },
    "environment": {
      "type": "LOCAL",
      "country": "AT"
    }
  },
  "assurance_level": "EMAIL_VERIFIED"
}

Error responses

  • 401 No valid authentication for this actor
  • 403 Authenticated actor lacks rights to the resource
  • 404 Not found or deliberately hidden from this actor
Full OpenAPI operation definition
Full OpenAPI operation definition
{
  "pathItem": {
    "parameters": [
      {
        "$ref": "#/components/parameters/AgentId"
      }
    ]
  },
  "operation": {
    "tags": [
      "Agents"
    ],
    "operationId": "getAgentKya",
    "summary": "Read the agent Know Your Agent (KYA) assessment",
    "description": "Separate self-declared information, verified operator/key proofs and server-observed runtime/IP risk signals. Sensitive details may be redacted by role.",
    "security": [
      {
        "BearerAuth": []
      }
    ],
    "x-agentpay-roles": [
      "AGENT",
      "PRINCIPAL",
      "ADMIN",
      "PARTNER"
    ],
    "x-agentpay-resource-authorization": "Self, bound principal or administrative/partner scope.",
    "responses": {
      "200": {
        "description": "KYA profile and evidence",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/AgentKya"
            }
          }
        }
      },
      "401": {
        "$ref": "#/components/responses/Unauthorized"
      },
      "403": {
        "$ref": "#/components/responses/Forbidden"
      },
      "404": {
        "$ref": "#/components/responses/NotFound"
      }
    }
  }
}
POST/agents/{agentId}/limitsSet initial per-principal agent purchase/weekly/total limitsPRINCIPAL / ADMIN / PARTNER

Limits are scoped to the authenticated principal's binding with this agent; a PARTNER or ADMIN must supply the permitted principal_reference where acting on behalf of a principal. Agent self-service cannot create or raise spending authority. All limits cap a separately authenticated principal spending mandate; they do not grant spending authority themselves. Weekly period is a rolling 7 days.

Authentication
HTTP Bearer / JWT
Eligible roles
PRINCIPAL, ADMIN, PARTNER

Bound principal or explicitly authorized principal portfolio.

Parameters

  • agentId · path · required · {"type": "string", "pattern": "^agt_[A-Za-z0-9_-]+$"}
  • Idempotency-Key · header · required — Repeat the same logical mutation with the same key and same payload; reuse with a changed payload is a 409. · {"type": "string", "minLength": 16, "maxLength": 128}

Request schema

Request body: required.

application/json · SetAgentLimitsRequest

Responses

  • 201 Limits established

    application/json · AgentLimits

  • 400 Invalid syntax or input

    application/json · ApiError

  • 401 No valid authentication for this actor

    application/json · ApiError

  • 403 Authenticated actor lacks rights to the resource

    application/json · ApiError

  • 404 Not found or deliberately hidden from this actor

    application/json · ApiError

  • 409 State conflict, optimistic lock or idempotency mismatch

    application/json · ApiError

YAML examples are reproduced as supplied; dates and credential values are illustrative. Where the YAML has no example, a schema-valid example is generated. Examples do not list every optional field; follow the schema links for complete definitions.

Request JSON
{
  "per_purchase": {
    "value": "24.00",
    "currency": "EUR"
  },
  "weekly": {
    "value": "24.00",
    "currency": "EUR"
  },
  "total": {
    "value": "24.00",
    "currency": "EUR"
  }
}
201 · Limits established
{
  "agent_id": "agt_example",
  "principal_reference": "pref_example",
  "per_purchase": {
    "value": "24.00",
    "currency": "EUR"
  },
  "weekly": {
    "value": "24.00",
    "currency": "EUR"
  },
  "total": {
    "value": "24.00",
    "currency": "EUR"
  },
  "weekly_window": "ROLLING_7_DAYS",
  "weekly_usage": {
    "spent": {
      "value": "0.00",
      "currency": "EUR"
    },
    "reserved": {
      "value": "0.00",
      "currency": "EUR"
    },
    "available": {
      "value": "24.00",
      "currency": "EUR"
    }
  },
  "total_usage": {
    "spent": {
      "value": "0.00",
      "currency": "EUR"
    },
    "reserved": {
      "value": "0.00",
      "currency": "EUR"
    },
    "available": {
      "value": "24.00",
      "currency": "EUR"
    }
  },
  "updated_at": "2026-11-15T12:00:00Z"
}

Error responses

  • 400 Invalid syntax or input
  • 401 No valid authentication for this actor
  • 403 Authenticated actor lacks rights to the resource
  • 404 Not found or deliberately hidden from this actor
  • 409 State conflict, optimistic lock or idempotency mismatch
Full OpenAPI operation definition
Full OpenAPI operation definition
{
  "pathItem": {
    "parameters": [
      {
        "$ref": "#/components/parameters/AgentId"
      }
    ]
  },
  "operation": {
    "tags": [
      "Agents"
    ],
    "operationId": "createAgentLimits",
    "summary": "Set initial per-principal agent purchase/weekly/total limits",
    "description": "Limits are scoped to the authenticated principal's binding with this agent; a PARTNER or ADMIN must supply the permitted principal_reference where acting on behalf of a principal. Agent self-service cannot create or raise spending authority. All limits cap a separately authenticated principal spending mandate; they do not grant spending authority themselves. Weekly period is a rolling 7 days.\n",
    "security": [
      {
        "BearerAuth": []
      }
    ],
    "x-agentpay-roles": [
      "PRINCIPAL",
      "ADMIN",
      "PARTNER"
    ],
    "x-agentpay-resource-authorization": "Bound principal or explicitly authorized principal portfolio.",
    "parameters": [
      {
        "$ref": "#/components/parameters/IdempotencyKey"
      }
    ],
    "requestBody": {
      "required": true,
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/SetAgentLimitsRequest"
          }
        }
      }
    },
    "responses": {
      "201": {
        "description": "Limits established",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/AgentLimits"
            }
          }
        }
      },
      "400": {
        "$ref": "#/components/responses/BadRequest"
      },
      "401": {
        "$ref": "#/components/responses/Unauthorized"
      },
      "403": {
        "$ref": "#/components/responses/Forbidden"
      },
      "404": {
        "$ref": "#/components/responses/NotFound"
      },
      "409": {
        "$ref": "#/components/responses/Conflict"
      }
    }
  }
}
GET/agents/{agentId}/limitsRetrieve current limits and usage for one principal-agent bindingAGENT / PRINCIPAL / ADMIN / PARTNER

PRINCIPAL scope comes from bearer identity. AGENT must supply a bound principal_reference if bound to more than one principal; only authorized data returned. Outstanding reservations count against spend ceilings.

Authentication
HTTP Bearer / JWT
Eligible roles
AGENT, PRINCIPAL, ADMIN, PARTNER

Bound principal or approved portfolio; no cross-principal leakage.

Parameters

  • agentId · path · required · {"type": "string", "pattern": "^agt_[A-Za-z0-9_-]+$"}
  • principal_reference · query · optional — Required for an agent with multiple principal bindings and for privileged delegated reads · {"type": "string"}

Request schema

No request body defined.

Responses

  • 200 Limits, spend and reservations

    application/json · AgentLimits

  • 400 Invalid syntax or input

    application/json · ApiError

  • 403 Authenticated actor lacks rights to the resource

    application/json · ApiError

  • 404 Not found or deliberately hidden from this actor

    application/json · ApiError

  • 401 No valid authentication for this actor

    application/json · ApiError

YAML examples are reproduced as supplied; dates and credential values are illustrative. Where the YAML has no example, a schema-valid example is generated. Examples do not list every optional field; follow the schema links for complete definitions.

Request · no JSON body
GET /agents/{agentId}/limits
200 · Limits, spend and reservations
{
  "agent_id": "agt_example",
  "principal_reference": "pref_example",
  "per_purchase": {
    "value": "24.00",
    "currency": "EUR"
  },
  "weekly": {
    "value": "24.00",
    "currency": "EUR"
  },
  "total": {
    "value": "24.00",
    "currency": "EUR"
  },
  "weekly_window": "ROLLING_7_DAYS",
  "weekly_usage": {
    "spent": {
      "value": "0.00",
      "currency": "EUR"
    },
    "reserved": {
      "value": "0.00",
      "currency": "EUR"
    },
    "available": {
      "value": "24.00",
      "currency": "EUR"
    }
  },
  "total_usage": {
    "spent": {
      "value": "0.00",
      "currency": "EUR"
    },
    "reserved": {
      "value": "0.00",
      "currency": "EUR"
    },
    "available": {
      "value": "24.00",
      "currency": "EUR"
    }
  },
  "updated_at": "2026-11-15T12:00:00Z"
}

Error responses

  • 400 Invalid syntax or input
  • 403 Authenticated actor lacks rights to the resource
  • 404 Not found or deliberately hidden from this actor
  • 401 No valid authentication for this actor
Full OpenAPI operation definition
Full OpenAPI operation definition
{
  "pathItem": {
    "parameters": [
      {
        "$ref": "#/components/parameters/AgentId"
      }
    ]
  },
  "operation": {
    "tags": [
      "Agents"
    ],
    "operationId": "getAgentLimits",
    "summary": "Retrieve current limits and usage for one principal-agent binding",
    "description": "PRINCIPAL scope comes from bearer identity. AGENT must supply a bound principal_reference if bound to more than one principal; only authorized data returned. Outstanding reservations count against spend ceilings.\n",
    "security": [
      {
        "BearerAuth": []
      }
    ],
    "x-agentpay-roles": [
      "AGENT",
      "PRINCIPAL",
      "ADMIN",
      "PARTNER"
    ],
    "x-agentpay-resource-authorization": "Bound principal or approved portfolio; no cross-principal leakage.",
    "parameters": [
      {
        "name": "principal_reference",
        "in": "query",
        "description": "Required for an agent with multiple principal bindings and for privileged delegated reads",
        "schema": {
          "type": "string"
        }
      }
    ],
    "responses": {
      "200": {
        "description": "Limits, spend and reservations",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/AgentLimits"
            }
          }
        }
      },
      "400": {
        "$ref": "#/components/responses/BadRequest"
      },
      "403": {
        "$ref": "#/components/responses/Forbidden"
      },
      "404": {
        "$ref": "#/components/responses/NotFound"
      },
      "401": {
        "$ref": "#/components/responses/Unauthorized"
      }
    }
  }
}
PUT/agents/{agentId}/limitsReplace configured purchase/weekly/total limitsPRINCIPAL / ADMIN / PARTNER

A change to any limit does not authorize spending by itself. Concurrent reservations and already approved intents remain constrained; enforcement uses the strictest applicable principal/issuer/agent ceiling. All changes audited.

Authentication
HTTP Bearer / JWT
Eligible roles
PRINCIPAL, ADMIN, PARTNER

Bound principal or approved portfolio. Agent bearer cannot increase limits.

Parameters

  • agentId · path · required · {"type": "string", "pattern": "^agt_[A-Za-z0-9_-]+$"}
  • Idempotency-Key · header · required — Repeat the same logical mutation with the same key and same payload; reuse with a changed payload is a 409. · {"type": "string", "minLength": 16, "maxLength": 128}

Request schema

Request body: required.

application/json · SetAgentLimitsRequest

Responses

  • 200 Updated limits

    application/json · AgentLimits

  • 400 Invalid syntax or input

    application/json · ApiError

  • 403 Authenticated actor lacks rights to the resource

    application/json · ApiError

  • 404 Not found or deliberately hidden from this actor

    application/json · ApiError

  • 409 State conflict, optimistic lock or idempotency mismatch

    application/json · ApiError

  • 401 No valid authentication for this actor

    application/json · ApiError

YAML examples are reproduced as supplied; dates and credential values are illustrative. Where the YAML has no example, a schema-valid example is generated. Examples do not list every optional field; follow the schema links for complete definitions.

Request JSON
{
  "per_purchase": {
    "value": "24.00",
    "currency": "EUR"
  },
  "weekly": {
    "value": "24.00",
    "currency": "EUR"
  },
  "total": {
    "value": "24.00",
    "currency": "EUR"
  }
}
200 · Updated limits
{
  "agent_id": "agt_example",
  "principal_reference": "pref_example",
  "per_purchase": {
    "value": "24.00",
    "currency": "EUR"
  },
  "weekly": {
    "value": "24.00",
    "currency": "EUR"
  },
  "total": {
    "value": "24.00",
    "currency": "EUR"
  },
  "weekly_window": "ROLLING_7_DAYS",
  "weekly_usage": {
    "spent": {
      "value": "0.00",
      "currency": "EUR"
    },
    "reserved": {
      "value": "0.00",
      "currency": "EUR"
    },
    "available": {
      "value": "24.00",
      "currency": "EUR"
    }
  },
  "total_usage": {
    "spent": {
      "value": "0.00",
      "currency": "EUR"
    },
    "reserved": {
      "value": "0.00",
      "currency": "EUR"
    },
    "available": {
      "value": "24.00",
      "currency": "EUR"
    }
  },
  "updated_at": "2026-11-15T12:00:00Z"
}

Error responses

  • 400 Invalid syntax or input
  • 403 Authenticated actor lacks rights to the resource
  • 404 Not found or deliberately hidden from this actor
  • 409 State conflict, optimistic lock or idempotency mismatch
  • 401 No valid authentication for this actor
Full OpenAPI operation definition
Full OpenAPI operation definition
{
  "pathItem": {
    "parameters": [
      {
        "$ref": "#/components/parameters/AgentId"
      }
    ]
  },
  "operation": {
    "tags": [
      "Agents"
    ],
    "operationId": "updateAgentLimits",
    "summary": "Replace configured purchase/weekly/total limits",
    "description": "A change to any limit does not authorize spending by itself. Concurrent reservations and already approved intents remain constrained; enforcement uses the strictest applicable principal/issuer/agent ceiling. All changes audited.\n",
    "security": [
      {
        "BearerAuth": []
      }
    ],
    "x-agentpay-roles": [
      "PRINCIPAL",
      "ADMIN",
      "PARTNER"
    ],
    "x-agentpay-resource-authorization": "Bound principal or approved portfolio. Agent bearer cannot increase limits.",
    "parameters": [
      {
        "$ref": "#/components/parameters/IdempotencyKey"
      }
    ],
    "requestBody": {
      "required": true,
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/SetAgentLimitsRequest"
          }
        }
      }
    },
    "responses": {
      "200": {
        "description": "Updated limits",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/AgentLimits"
            }
          }
        }
      },
      "400": {
        "$ref": "#/components/responses/BadRequest"
      },
      "403": {
        "$ref": "#/components/responses/Forbidden"
      },
      "404": {
        "$ref": "#/components/responses/NotFound"
      },
      "409": {
        "$ref": "#/components/responses/Conflict"
      },
      "401": {
        "$ref": "#/components/responses/Unauthorized"
      }
    }
  }
}

Authentication

Single-request enrollment redemption or credential-based agent authentication

POST/authenticateAuthenticate agent in one call (email enrollment, API key, signed assertion)PUBLIC

Initial EMAIL_ENROLLMENT redemption accepts the one-time enrollment credential returned by POST /agents, but only after an owner has verified email and approved the requested profile via the trusted hosted link. Redemption is atomic and issues short-lived access_token, role=AGENT, plus an agent_api_key only once. Never send these credentials by email. Subsequent authentication uses API_KEY (rotatable, revocable and rate limited) or SIGNED_ASSERTION with a registered public key. credential is authentication proof, NEVER a private key. Signed assertions must be fresh, audience-bound and replay protected. A production sender-constrained access token (e.g. DPoP/mTLS) is preferable to a reusable bearer token alone.

Authentication
Public · no bearer token
Eligible roles
PUBLIC

Parameters

No path, query or header parameters defined.

Request schema

Request body: required.

application/json · AuthRequest

Responses

  • 200 Short-lived agent access token

    application/json · AuthResponse

  • 400 Invalid syntax or input

    application/json · ApiError

  • 401 No valid authentication for this actor

    application/json · ApiError

  • 429 Too many requests

    application/json · ApiError

    • Retry-After · Seconds or HTTP date until retry · {"type": "string"}

YAML examples are reproduced as supplied; dates and credential values are illustrative. Where the YAML has no example, a schema-valid example is generated. Examples do not list every optional field; follow the schema links for complete definitions.

Request JSON
{
  "agent_id": "agt_8fd231",
  "authentication_method": "SIGNED_ASSERTION",
  "credential": "eyJhbGciOiJFUzI1NiIsImtpZCI6ImtleS0xIn0..."
}
200 · Short-lived agent access token
{
  "access_token": "<short-lived access token>",
  "token_type": "Bearer",
  "expires_in": 1,
  "agent_id": "agt_example",
  "role": "AGENT"
}

Error responses

  • 400 Invalid syntax or input
  • 401 No valid authentication for this actor
  • 429 Too many requests
Full OpenAPI operation definition
Full OpenAPI operation definition
{
  "pathItem": {},
  "operation": {
    "tags": [
      "Authentication"
    ],
    "operationId": "authenticateAgent",
    "summary": "Authenticate agent in one call (email enrollment, API key, signed assertion)",
    "description": "Initial EMAIL_ENROLLMENT redemption accepts the one-time enrollment credential\nreturned by POST /agents, but only after an owner has verified email and approved\nthe requested profile via the trusted hosted link. Redemption is atomic and issues\nshort-lived access_token, role=AGENT, plus an agent_api_key only once. Never send\nthese credentials by email. Subsequent authentication uses API_KEY (rotatable,\nrevocable and rate limited) or SIGNED_ASSERTION with a registered public key.\ncredential is authentication proof, NEVER a private key. Signed assertions must be\nfresh, audience-bound and replay protected. A production sender-constrained access\ntoken (e.g. DPoP/mTLS) is preferable to a reusable bearer token alone.\n",
    "security": [],
    "requestBody": {
      "required": true,
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/AuthRequest"
          },
          "example": {
            "agent_id": "agt_8fd231",
            "authentication_method": "SIGNED_ASSERTION",
            "credential": "eyJhbGciOiJFUzI1NiIsImtpZCI6ImtleS0xIn0..."
          }
        }
      }
    },
    "responses": {
      "200": {
        "description": "Short-lived agent access token",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/AuthResponse"
            }
          }
        }
      },
      "400": {
        "$ref": "#/components/responses/BadRequest"
      },
      "401": {
        "$ref": "#/components/responses/Unauthorized"
      },
      "429": {
        "$ref": "#/components/responses/RateLimited"
      }
    },
    "x-agentpay-roles": [
      "PUBLIC"
    ]
  }
}

Principals

Individual/business onboarding, trusted representation and agent binding

POST/principalsOnboard an individual or business principalPRINCIPAL / ADMIN / PARTNER

Principal ID is server generated; it is NOT submitted. Idempotency-Key is a retry header, not a bearer credential. An authenticated principal session with explicit onboarding authority or trusted partner/admin channel can create a principal. principal_type selects either an individual or business profile, never both. A business must have a verified authorized representative; contact details do not establish that authority. KYC/KYB verification is a separate process and spending remains blocked where identity verification is required.

Authentication
HTTP Bearer / JWT
Eligible roles
PRINCIPAL, ADMIN, PARTNER

Individual self-onboarding, verified business-representative authority, or explicitly delegated administrative/partner onboarding.

Parameters

  • Idempotency-Key · header · required — Repeat the same logical mutation with the same key and same payload; reuse with a changed payload is a 409. · {"type": "string", "minLength": 16, "maxLength": 128}

Request schema

Request body: required.

application/json · CreatePrincipalRequest

Responses

  • 201 Principal profile created

    application/json · Principal

  • 400 Invalid syntax or input

    application/json · ApiError

  • 401 No valid authentication for this actor

    application/json · ApiError

  • 403 Authenticated actor lacks rights to the resource

    application/json · ApiError

  • 409 State conflict, optimistic lock or idempotency mismatch

    application/json · ApiError

YAML examples are reproduced as supplied; dates and credential values are illustrative. Where the YAML has no example, a schema-valid example is generated. Examples do not list every optional field; follow the schema links for complete definitions.

Request JSON
{
  "principal_type": "INDIVIDUAL",
  "email": "person@example.com",
  "individual": {
    "first_name": "Example",
    "last_name": "Person"
  }
}
201 · Principal profile created
{
  "principal_id": "prn_example",
  "principal_type": "INDIVIDUAL",
  "email": "person@example.com",
  "individual": {
    "first_name": "Example",
    "last_name": "Person"
  },
  "verification_status": "PENDING",
  "created_at": "2026-11-15T12:00:00Z",
  "updated_at": "2026-11-15T12:00:00Z"
}

Business principal

Use a business profile instead of an individual profile. Declared registration details do not prove representative authority or grant spending permission.

BUSINESS · request JSON
{
  "principal_type": "BUSINESS",
  "email": "representative@example.com",
  "business": {
    "legal_name": "Example Business",
    "registration_country": "AT",
    "registration_number": "EXAMPLE-REGISTRATION"
  }
}
201 · BUSINESS principal
{
  "principal_id": "prn_example",
  "principal_type": "BUSINESS",
  "email": "representative@example.com",
  "business": {
    "legal_name": "Example Business",
    "registration_country": "AT",
    "registration_number": "EXAMPLE-REGISTRATION"
  },
  "verification_status": "PENDING",
  "created_at": "2026-11-15T12:00:00Z",
  "updated_at": "2026-11-15T12:00:00Z"
}

Error responses

  • 400 Invalid syntax or input
  • 401 No valid authentication for this actor
  • 403 Authenticated actor lacks rights to the resource
  • 409 State conflict, optimistic lock or idempotency mismatch
Full OpenAPI operation definition
Full OpenAPI operation definition
{
  "pathItem": {},
  "operation": {
    "tags": [
      "Principals"
    ],
    "operationId": "createPrincipal",
    "summary": "Onboard an individual or business principal",
    "description": "Principal ID is server generated; it is NOT submitted. Idempotency-Key is a retry\nheader, not a bearer credential. An authenticated principal session with explicit\nonboarding authority or trusted partner/admin channel can create a principal.\nprincipal_type selects either an individual or business profile, never both.\nA business must have a verified authorized representative; contact details do\nnot establish that authority. KYC/KYB verification is a\nseparate process and spending remains blocked where identity verification is required.\n",
    "security": [
      {
        "BearerAuth": []
      }
    ],
    "parameters": [
      {
        "$ref": "#/components/parameters/IdempotencyKey"
      }
    ],
    "requestBody": {
      "required": true,
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/CreatePrincipalRequest"
          }
        }
      }
    },
    "responses": {
      "201": {
        "description": "Principal profile created",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Principal"
            }
          }
        }
      },
      "400": {
        "$ref": "#/components/responses/BadRequest"
      },
      "401": {
        "$ref": "#/components/responses/Unauthorized"
      },
      "403": {
        "$ref": "#/components/responses/Forbidden"
      },
      "409": {
        "$ref": "#/components/responses/Conflict"
      }
    },
    "x-agentpay-roles": [
      "PRINCIPAL",
      "ADMIN",
      "PARTNER"
    ],
    "x-agentpay-resource-authorization": "Individual self-onboarding, verified business-representative authority, or explicitly delegated administrative/partner onboarding."
  }
}
GET/principals/{principalId}Retrieve principal profilePRINCIPAL / ADMIN / PARTNER

Only the individual, an authorized representative of the subject business, or an explicitly scoped administrative/partner channel may read sensitive profile fields. A contact email does not establish business authority.

Authentication
HTTP Bearer / JWT
Eligible roles
PRINCIPAL, ADMIN, PARTNER

Self or explicit tenant/portfolio access; no cross-principal read/write.

Parameters

  • principalId · path · required · {"type": "string", "pattern": "^prn_[A-Za-z0-9_-]+$"}

Request schema

No request body defined.

Responses

  • 200 Principal profile

    application/json · Principal

  • 401 No valid authentication for this actor

    application/json · ApiError

  • 403 Authenticated actor lacks rights to the resource

    application/json · ApiError

  • 404 Not found or deliberately hidden from this actor

    application/json · ApiError

YAML examples are reproduced as supplied; dates and credential values are illustrative. Where the YAML has no example, a schema-valid example is generated. Examples do not list every optional field; follow the schema links for complete definitions.

Request · no JSON body
GET /principals/{principalId}
200 · Principal profile
{
  "principal_id": "prn_example",
  "principal_type": "INDIVIDUAL",
  "email": "person@example.com",
  "individual": {
    "first_name": "Example",
    "last_name": "Person"
  },
  "verification_status": "PENDING",
  "created_at": "2026-11-15T12:00:00Z",
  "updated_at": "2026-11-15T12:00:00Z"
}

Error responses

  • 401 No valid authentication for this actor
  • 403 Authenticated actor lacks rights to the resource
  • 404 Not found or deliberately hidden from this actor
Full OpenAPI operation definition
Full OpenAPI operation definition
{
  "pathItem": {
    "parameters": [
      {
        "$ref": "#/components/parameters/PrincipalId"
      }
    ]
  },
  "operation": {
    "tags": [
      "Principals"
    ],
    "operationId": "getPrincipal",
    "summary": "Retrieve principal profile",
    "description": "Only the individual, an authorized representative of the subject business, or an explicitly scoped administrative/partner channel may read sensitive profile fields. A contact email does not establish business authority.",
    "security": [
      {
        "BearerAuth": []
      }
    ],
    "responses": {
      "200": {
        "description": "Principal profile",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Principal"
            }
          }
        }
      },
      "401": {
        "$ref": "#/components/responses/Unauthorized"
      },
      "403": {
        "$ref": "#/components/responses/Forbidden"
      },
      "404": {
        "$ref": "#/components/responses/NotFound"
      }
    },
    "x-agentpay-roles": [
      "PRINCIPAL",
      "ADMIN",
      "PARTNER"
    ],
    "x-agentpay-resource-authorization": "Self or explicit tenant/portfolio access; no cross-principal read/write."
  }
}
PUT/principals/{principalId}Modify principal detailsPRINCIPAL / ADMIN / PARTNER

Does not accept changes to principal_id, principal_type, verification_status, identity_verification_status, representative authority or externally approved consent. Only the profile matching the stored principal_type can be updated; profile changes may require renewed verification and do not silently update previously verified intents.

Authentication
HTTP Bearer / JWT
Eligible roles
PRINCIPAL, ADMIN, PARTNER

Self or explicit tenant/portfolio access; no cross-principal read/write.

Parameters

  • principalId · path · required · {"type": "string", "pattern": "^prn_[A-Za-z0-9_-]+$"}

Request schema

Request body: required.

application/json · UpdatePrincipalRequest

Responses

  • 200 Updated principal

    application/json · Principal

  • 400 Invalid syntax or input

    application/json · ApiError

  • 403 Authenticated actor lacks rights to the resource

    application/json · ApiError

  • 404 Not found or deliberately hidden from this actor

    application/json · ApiError

  • 409 State conflict, optimistic lock or idempotency mismatch

    application/json · ApiError

  • 401 No valid authentication for this actor

    application/json · ApiError

YAML examples are reproduced as supplied; dates and credential values are illustrative. Where the YAML has no example, a schema-valid example is generated. Examples do not list every optional field; follow the schema links for complete definitions.

Request JSON
{
  "individual": {
    "first_name": "Example",
    "last_name": "Person"
  }
}
200 · Updated principal
{
  "principal_id": "prn_example",
  "principal_type": "INDIVIDUAL",
  "email": "person@example.com",
  "individual": {
    "first_name": "Example",
    "last_name": "Person"
  },
  "verification_status": "PENDING",
  "created_at": "2026-11-15T12:00:00Z",
  "updated_at": "2026-11-15T12:00:00Z"
}

Error responses

  • 400 Invalid syntax or input
  • 403 Authenticated actor lacks rights to the resource
  • 404 Not found or deliberately hidden from this actor
  • 409 State conflict, optimistic lock or idempotency mismatch
  • 401 No valid authentication for this actor
Full OpenAPI operation definition
Full OpenAPI operation definition
{
  "pathItem": {
    "parameters": [
      {
        "$ref": "#/components/parameters/PrincipalId"
      }
    ]
  },
  "operation": {
    "tags": [
      "Principals"
    ],
    "operationId": "updatePrincipal",
    "summary": "Modify principal details",
    "description": "Does not accept changes to principal_id, principal_type, verification_status, identity_verification_status, representative authority or externally approved consent. Only the profile matching the stored principal_type can be updated; profile changes may require renewed verification and do not silently update previously verified intents.",
    "security": [
      {
        "BearerAuth": []
      }
    ],
    "requestBody": {
      "required": true,
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/UpdatePrincipalRequest"
          }
        }
      }
    },
    "responses": {
      "200": {
        "description": "Updated principal",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Principal"
            }
          }
        }
      },
      "400": {
        "$ref": "#/components/responses/BadRequest"
      },
      "403": {
        "$ref": "#/components/responses/Forbidden"
      },
      "404": {
        "$ref": "#/components/responses/NotFound"
      },
      "409": {
        "$ref": "#/components/responses/Conflict"
      },
      "401": {
        "$ref": "#/components/responses/Unauthorized"
      }
    },
    "x-agentpay-roles": [
      "PRINCIPAL",
      "ADMIN",
      "PARTNER"
    ],
    "x-agentpay-resource-authorization": "Self or explicit tenant/portfolio access; no cross-principal read/write."
  }
}
POST/principals/{principalId}/bindBind the authenticated principal to a specified agentPRINCIPAL / ADMIN / PARTNER

Principal-controlled action performed through a trusted channel. Records an explicit consent to establish an association with the agent; it does NOT create carte blanche to spend. The server verifies the authenticated session is scoped to the requested principal and that the agent is eligible. For BUSINESS principals, independently verify the authenticated representative's authority and applicable business spending mandate. An agent cannot approve its own binding or nominate a business representative as proof of consent. A stable, opaque agent-scoped principal_reference is returned.

Authentication
HTTP Bearer / JWT
Eligible roles
PRINCIPAL, ADMIN, PARTNER

Principal consent mandatory; admins/partners cannot silently fabricate principal spend approval.

Parameters

  • principalId · path · required · {"type": "string", "pattern": "^prn_[A-Za-z0-9_-]+$"}
  • Idempotency-Key · header · required — Repeat the same logical mutation with the same key and same payload; reuse with a changed payload is a 409. · {"type": "string", "minLength": 16, "maxLength": 128}

Request schema

Request body: required.

application/json · BindPrincipalRequest

Responses

  • 201 Principal-agent binding recorded

    application/json · PrincipalBinding

  • 400 Invalid syntax or input

    application/json · ApiError

  • 403 Authenticated actor lacks rights to the resource

    application/json · ApiError

  • 404 Not found or deliberately hidden from this actor

    application/json · ApiError

  • 409 State conflict, optimistic lock or idempotency mismatch

    application/json · ApiError

  • 401 No valid authentication for this actor

    application/json · ApiError

YAML examples are reproduced as supplied; dates and credential values are illustrative. Where the YAML has no example, a schema-valid example is generated. Examples do not list every optional field; follow the schema links for complete definitions.

Request JSON
{
  "agent_id": "agt_example",
  "consent_acknowledged": true
}
201 · Principal-agent binding recorded
{
  "binding_id": "bnd_example",
  "principal_id": "prn_example",
  "principal_type": "INDIVIDUAL",
  "agent_id": "agt_example",
  "principal_reference": "pref_example",
  "status": "ACTIVE",
  "bound_at": "2026-11-15T12:00:00Z"
}

Error responses

  • 400 Invalid syntax or input
  • 403 Authenticated actor lacks rights to the resource
  • 404 Not found or deliberately hidden from this actor
  • 409 State conflict, optimistic lock or idempotency mismatch
  • 401 No valid authentication for this actor
Full OpenAPI operation definition
Full OpenAPI operation definition
{
  "pathItem": {
    "parameters": [
      {
        "$ref": "#/components/parameters/PrincipalId"
      }
    ]
  },
  "operation": {
    "tags": [
      "Principals"
    ],
    "operationId": "bindPrincipalToAgent",
    "summary": "Bind the authenticated principal to a specified agent",
    "description": "Principal-controlled action performed through a trusted channel. Records\nan explicit consent to establish an association with the agent; it does\nNOT create carte blanche to spend. The server verifies the authenticated\nsession is scoped to the requested principal and that the agent is eligible.\nFor BUSINESS principals, independently verify the authenticated representative's\nauthority and applicable business spending mandate. An agent cannot approve\nits own binding or nominate a business representative as proof of consent.\nA stable, opaque agent-scoped principal_reference is returned.\n",
    "security": [
      {
        "BearerAuth": []
      }
    ],
    "parameters": [
      {
        "$ref": "#/components/parameters/IdempotencyKey"
      }
    ],
    "requestBody": {
      "required": true,
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/BindPrincipalRequest"
          }
        }
      }
    },
    "responses": {
      "201": {
        "description": "Principal-agent binding recorded",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/PrincipalBinding"
            }
          }
        }
      },
      "400": {
        "$ref": "#/components/responses/BadRequest"
      },
      "403": {
        "$ref": "#/components/responses/Forbidden"
      },
      "404": {
        "$ref": "#/components/responses/NotFound"
      },
      "409": {
        "$ref": "#/components/responses/Conflict"
      },
      "401": {
        "$ref": "#/components/responses/Unauthorized"
      }
    },
    "x-agentpay-roles": [
      "PRINCIPAL",
      "ADMIN",
      "PARTNER"
    ],
    "x-agentpay-resource-authorization": "Principal consent mandatory; admins/partners cannot silently fabricate principal spend approval."
  }
}
GET/principals/{principalId}/bindingsList the principal's agent bindingsPRINCIPAL / ADMIN / PARTNER

List the principal's agent bindings

Authentication
HTTP Bearer / JWT
Eligible roles
PRINCIPAL, ADMIN, PARTNER

Principal consent mandatory; admins/partners cannot silently fabricate principal spend approval.

Parameters

  • principalId · path · required · {"type": "string", "pattern": "^prn_[A-Za-z0-9_-]+$"}
  • limit · query · optional · {"type": "integer", "minimum": 1, "maximum": 100, "default": 25}
  • cursor · query · optional — Opaque server-generated pagination cursor · {"type": "string"}

Request schema

No request body defined.

Responses

  • 200 Paginated principal bindings

    application/json · PrincipalBindingList

  • 403 Authenticated actor lacks rights to the resource

    application/json · ApiError

  • 404 Not found or deliberately hidden from this actor

    application/json · ApiError

  • 401 No valid authentication for this actor

    application/json · ApiError

YAML examples are reproduced as supplied; dates and credential values are illustrative. Where the YAML has no example, a schema-valid example is generated. Examples do not list every optional field; follow the schema links for complete definitions.

Request · no JSON body
GET /principals/{principalId}/bindings
200 · Paginated principal bindings
{
  "data": [
    {
      "binding_id": "bnd_example",
      "principal_id": "prn_example",
      "principal_type": "INDIVIDUAL",
      "agent_id": "agt_example",
      "principal_reference": "pref_example",
      "status": "ACTIVE",
      "bound_at": "2026-11-15T12:00:00Z"
    }
  ],
  "page": {
    "has_more": false
  }
}

Error responses

  • 403 Authenticated actor lacks rights to the resource
  • 404 Not found or deliberately hidden from this actor
  • 401 No valid authentication for this actor
Full OpenAPI operation definition
Full OpenAPI operation definition
{
  "pathItem": {
    "parameters": [
      {
        "$ref": "#/components/parameters/PrincipalId"
      }
    ]
  },
  "operation": {
    "tags": [
      "Principals"
    ],
    "operationId": "listPrincipalBindings",
    "summary": "List the principal's agent bindings",
    "security": [
      {
        "BearerAuth": []
      }
    ],
    "parameters": [
      {
        "$ref": "#/components/parameters/Limit"
      },
      {
        "$ref": "#/components/parameters/Cursor"
      }
    ],
    "responses": {
      "200": {
        "description": "Paginated principal bindings",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/PrincipalBindingList"
            }
          }
        }
      },
      "403": {
        "$ref": "#/components/responses/Forbidden"
      },
      "404": {
        "$ref": "#/components/responses/NotFound"
      },
      "401": {
        "$ref": "#/components/responses/Unauthorized"
      }
    },
    "x-agentpay-roles": [
      "PRINCIPAL",
      "ADMIN",
      "PARTNER"
    ],
    "x-agentpay-resource-authorization": "Principal consent mandatory; admins/partners cannot silently fabricate principal spend approval."
  }
}
DELETE/principals/{principalId}/bindings/{agentId}Revoke an agent bindingPRINCIPAL / ADMIN / PARTNER

Disables future intents and unused capabilities under this binding; already-authorized transactions may need separate reversal/refund steps. Audit and transaction records are retained as required.

Authentication
HTTP Bearer / JWT
Eligible roles
PRINCIPAL, ADMIN, PARTNER

Principal consent mandatory; admins/partners cannot silently fabricate principal spend approval.

Parameters

  • principalId · path · required · {"type": "string", "pattern": "^prn_[A-Za-z0-9_-]+$"}
  • agentId · path · required · {"type": "string", "pattern": "^agt_[A-Za-z0-9_-]+$"}

Request schema

No request body defined.

Responses

  • 204 Binding revoked
  • 403 Authenticated actor lacks rights to the resource

    application/json · ApiError

  • 404 Not found or deliberately hidden from this actor

    application/json · ApiError

  • 409 State conflict, optimistic lock or idempotency mismatch

    application/json · ApiError

  • 401 No valid authentication for this actor

    application/json · ApiError

YAML examples are reproduced as supplied; dates and credential values are illustrative. Where the YAML has no example, a schema-valid example is generated. Examples do not list every optional field; follow the schema links for complete definitions.

Request · no JSON body
DELETE /principals/{principalId}/bindings/{agentId}
204 · Binding revoked
No response body.

Error responses

  • 403 Authenticated actor lacks rights to the resource
  • 404 Not found or deliberately hidden from this actor
  • 409 State conflict, optimistic lock or idempotency mismatch
  • 401 No valid authentication for this actor
Full OpenAPI operation definition
Full OpenAPI operation definition
{
  "pathItem": {
    "parameters": [
      {
        "$ref": "#/components/parameters/PrincipalId"
      },
      {
        "$ref": "#/components/parameters/AgentId"
      }
    ]
  },
  "operation": {
    "tags": [
      "Principals"
    ],
    "operationId": "unbindPrincipalFromAgent",
    "summary": "Revoke an agent binding",
    "description": "Disables future intents and unused capabilities under this binding;\nalready-authorized transactions may need separate reversal/refund steps.\nAudit and transaction records are retained as required.\n",
    "security": [
      {
        "BearerAuth": []
      }
    ],
    "responses": {
      "204": {
        "description": "Binding revoked"
      },
      "403": {
        "$ref": "#/components/responses/Forbidden"
      },
      "404": {
        "$ref": "#/components/responses/NotFound"
      },
      "409": {
        "$ref": "#/components/responses/Conflict"
      },
      "401": {
        "$ref": "#/components/responses/Unauthorized"
      }
    },
    "x-agentpay-roles": [
      "PRINCIPAL",
      "ADMIN",
      "PARTNER"
    ],
    "x-agentpay-resource-authorization": "Principal consent mandatory; admins/partners cannot silently fabricate principal spend approval."
  }
}

Verification

Hosted KYC for individuals and KYB for businesses

POST/principals/{principalId}/verification-sessionCreate a hosted KYC or KYB verification session for a principalPRINCIPAL / ADMIN / PARTNER

Returns a short-lived hosted verification URL. The authenticated individual or authorized business representative completes verification with a trusted provider, not with the agent. The server selects KYC for INDIVIDUAL or KYB for BUSINESS from the stored principal_type. Business verification includes required representative/ownership checks; a passed KYB result is not a spending mandate. The service accepts verification decisions only from an authenticated provider integration; it must not accept agent-supplied VERIFIED flags. Do not expose PII or submitted identity-document images through these endpoints.

Authentication
HTTP Bearer / JWT
Eligible roles
PRINCIPAL, ADMIN, PARTNER

Subject principal or explicitly authorized onboarding partner.

Parameters

  • principalId · path · required · {"type": "string", "pattern": "^prn_[A-Za-z0-9_-]+$"}
  • Idempotency-Key · header · required — Repeat the same logical mutation with the same key and same payload; reuse with a changed payload is a 409. · {"type": "string", "minLength": 16, "maxLength": 128}

Request schema

Request body: optional.

application/json · CreatePrincipalVerificationSessionRequest

Responses

  • 201 Hosted principal verification session created

    application/json · PrincipalVerificationSession

  • 400 Invalid syntax or input

    application/json · ApiError

  • 401 No valid authentication for this actor

    application/json · ApiError

  • 403 Authenticated actor lacks rights to the resource

    application/json · ApiError

  • 404 Not found or deliberately hidden from this actor

    application/json · ApiError

  • 409 State conflict, optimistic lock or idempotency mismatch

    application/json · ApiError

YAML examples are reproduced as supplied; dates and credential values are illustrative. Where the YAML has no example, a schema-valid example is generated. Examples do not list every optional field; follow the schema links for complete definitions.

Request JSON
{
  "locale": "de-AT"
}
201 · Hosted principal verification session created
{
  "verification_id": "ver_123456",
  "principal_id": "prn_example",
  "verification_type": "KYC",
  "status": "PENDING",
  "verification_url": "https://verification.example/session",
  "expires_at": "2026-11-15T12:00:00Z"
}
201 · BUSINESS verification session
{
  "verification_id": "ver_123456",
  "principal_id": "prn_example",
  "verification_type": "KYB",
  "status": "PENDING",
  "verification_url": "https://verification.example/session",
  "expires_at": "2026-11-15T12:00:00Z"
}

Error responses

  • 400 Invalid syntax or input
  • 401 No valid authentication for this actor
  • 403 Authenticated actor lacks rights to the resource
  • 404 Not found or deliberately hidden from this actor
  • 409 State conflict, optimistic lock or idempotency mismatch
Full OpenAPI operation definition
Full OpenAPI operation definition
{
  "pathItem": {
    "parameters": [
      {
        "$ref": "#/components/parameters/PrincipalId"
      }
    ]
  },
  "operation": {
    "tags": [
      "Verification"
    ],
    "operationId": "createPrincipalVerificationSession",
    "summary": "Create a hosted KYC or KYB verification session for a principal",
    "description": "Returns a short-lived hosted verification URL. The authenticated individual or authorized business representative completes verification with a trusted provider, not with the agent. The server selects KYC for INDIVIDUAL or KYB for BUSINESS from the stored principal_type. Business verification includes required representative/ownership checks; a passed KYB result is not a spending mandate. The service accepts verification decisions only from an authenticated provider integration; it must not accept agent-supplied VERIFIED flags. Do not expose PII or submitted identity-document images through these endpoints.\n",
    "security": [
      {
        "BearerAuth": []
      }
    ],
    "x-agentpay-roles": [
      "PRINCIPAL",
      "ADMIN",
      "PARTNER"
    ],
    "x-agentpay-resource-authorization": "Subject principal or explicitly authorized onboarding partner.",
    "parameters": [
      {
        "$ref": "#/components/parameters/IdempotencyKey"
      }
    ],
    "requestBody": {
      "required": false,
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/CreatePrincipalVerificationSessionRequest"
          }
        }
      }
    },
    "responses": {
      "201": {
        "description": "Hosted principal verification session created",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/PrincipalVerificationSession"
            }
          }
        }
      },
      "400": {
        "$ref": "#/components/responses/BadRequest"
      },
      "401": {
        "$ref": "#/components/responses/Unauthorized"
      },
      "403": {
        "$ref": "#/components/responses/Forbidden"
      },
      "404": {
        "$ref": "#/components/responses/NotFound"
      },
      "409": {
        "$ref": "#/components/responses/Conflict"
      }
    }
  }
}
GET/principals/{principalId}/verificationRead principal KYC/KYB status without disclosing underlying identity documentsPRINCIPAL / ADMIN / PARTNER

Read principal KYC/KYB status without disclosing underlying identity documents

Authentication
HTTP Bearer / JWT
Eligible roles
PRINCIPAL, ADMIN, PARTNER

Subject principal or authorized onboarding/compliance partner.

Parameters

  • principalId · path · required · {"type": "string", "pattern": "^prn_[A-Za-z0-9_-]+$"}

Request schema

No request body defined.

Responses

  • 200 Current identity verification result

    application/json · PrincipalVerification

  • 401 No valid authentication for this actor

    application/json · ApiError

  • 403 Authenticated actor lacks rights to the resource

    application/json · ApiError

  • 404 Not found or deliberately hidden from this actor

    application/json · ApiError

YAML examples are reproduced as supplied; dates and credential values are illustrative. Where the YAML has no example, a schema-valid example is generated. Examples do not list every optional field; follow the schema links for complete definitions.

Request · no JSON body
GET /principals/{principalId}/verification
200 · Current identity verification result
{
  "principal_id": "prn_example",
  "verification_type": "KYC",
  "status": "NOT_STARTED"
}
200 · BUSINESS verification status
{
  "principal_id": "prn_example",
  "verification_type": "KYB",
  "status": "NOT_STARTED"
}

Error responses

  • 401 No valid authentication for this actor
  • 403 Authenticated actor lacks rights to the resource
  • 404 Not found or deliberately hidden from this actor
Full OpenAPI operation definition
Full OpenAPI operation definition
{
  "pathItem": {
    "parameters": [
      {
        "$ref": "#/components/parameters/PrincipalId"
      }
    ]
  },
  "operation": {
    "tags": [
      "Verification"
    ],
    "operationId": "getPrincipalVerification",
    "summary": "Read principal KYC/KYB status without disclosing underlying identity documents",
    "security": [
      {
        "BearerAuth": []
      }
    ],
    "x-agentpay-roles": [
      "PRINCIPAL",
      "ADMIN",
      "PARTNER"
    ],
    "x-agentpay-resource-authorization": "Subject principal or authorized onboarding/compliance partner.",
    "responses": {
      "200": {
        "description": "Current identity verification result",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/PrincipalVerification"
            }
          }
        }
      },
      "401": {
        "$ref": "#/components/responses/Unauthorized"
      },
      "403": {
        "$ref": "#/components/responses/Forbidden"
      },
      "404": {
        "$ref": "#/components/responses/NotFound"
      }
    }
  }
}

Intents

Purchase details and verification against principal authorization

POST/intentsSubmit comprehensive proposed purchase detailsAGENT / PRINCIPAL / ADMIN / PARTNER

An agent submits its understanding of merchant, basket, prices, billing, shipping, checkout channel, PSP and principal authorization reference. Values in this request are agent-declared and must not be treated as verified merchant/issuer evidence. The agent identity is derived from the access token. Principal approval cannot be self-asserted by an agent. The server validates order arithmetic, currency consistency and ownership. Creating an intent neither approves it nor issues a card/token.

Authentication
HTTP Bearer / JWT
Eligible roles
AGENT, PRINCIPAL, ADMIN, PARTNER

Agent self and bound principal; ADMIN/PARTNER only within authorized scope. Verify cannot replace principal consent.

Parameters

  • Idempotency-Key · header · required — Repeat the same logical mutation with the same key and same payload; reuse with a changed payload is a 409. · {"type": "string", "minLength": 16, "maxLength": 128}

Request schema

Request body: required.

application/json · CreateIntentRequest

Responses

  • 201 Draft intent created; nothing has been authorized or funded

    application/json · Intent

  • 400 Invalid syntax or input

    application/json · ApiError

  • 401 No valid authentication for this actor

    application/json · ApiError

  • 403 Authenticated actor lacks rights to the resource

    application/json · ApiError

  • 409 State conflict, optimistic lock or idempotency mismatch

    application/json · ApiError

  • 422 Well-formed request fails domain or financial validation

    application/json · ApiError

YAML examples are reproduced as supplied; dates and credential values are illustrative. Where the YAML has no example, a schema-valid example is generated. Examples do not list every optional field; follow the schema links for complete definitions.

Request JSON
{
  "principal_reference": "pref_agent_abc123",
  "binding_id": "bnd_123",
  "purpose": "Purchase two books from a named merchant",
  "merchant": {
    "name": "Example Books",
    "domain": "books.example",
    "website_url": "https://books.example",
    "merchant_reference": "books-store-42",
    "country": "AT",
    "mcc": "5942"
  },
  "cart": {
    "items": [
      {
        "sku": "BOOK-123",
        "title": "Introduction to Computing",
        "category": "BOOKS",
        "kind": "PHYSICAL",
        "quantity": 2,
        "unit_price": {
          "value": "18.00",
          "currency": "EUR"
        },
        "line_total": {
          "value": "36.00",
          "currency": "EUR"
        }
      }
    ],
    "subtotal": {
      "value": "36.00",
      "currency": "EUR"
    },
    "tax_total": {
      "value": "3.60",
      "currency": "EUR"
    },
    "shipping_total": {
      "value": "4.90",
      "currency": "EUR"
    },
    "discount_total": {
      "value": "0.00",
      "currency": "EUR"
    },
    "total": {
      "value": "44.50",
      "currency": "EUR"
    }
  },
  "billing": {
    "name": "Example Principal",
    "address": {
      "address_line1": "Test Street 1",
      "city": "Vienna",
      "postal_code": "1010",
      "country": "AT"
    }
  },
  "shipping": {
    "recipient_name": "Example Principal",
    "address": {
      "address_line1": "Test Street 1",
      "city": "Vienna",
      "postal_code": "1010",
      "country": "AT"
    },
    "method": "STANDARD"
  },
  "checkout": {
    "mode": "CLASSIC",
    "merchant_checkout_url": "https://books.example/checkout",
    "psp": {
      "name": "Example PSP",
      "payment_page_url": "https://checkout.psp.example/session/xyz"
    },
    "merchant_order_reference": "cart-42"
  },
  "requested_constraints": {
    "amount_max": {
      "value": "44.50",
      "currency": "EUR"
    },
    "max_authorizations": 1,
    "valid_until": "2026-10-08T15:00:00Z"
  }
}
201 · Draft intent created; nothing has been authorized or funded
{
  "intent_id": "int_example",
  "agent_id": "agt_example",
  "principal_reference": "pref_example",
  "binding_id": "bnd_example",
  "status": "DRAFT",
  "purchase": {
    "principal_reference": "pref_example",
    "binding_id": "bnd_example",
    "purpose": "Buy one book",
    "merchant": {
      "name": "Example Books",
      "domain": "books.example"
    },
    "cart": {
      "items": [
        {
          "title": "Example book",
          "quantity": 1,
          "unit_price": {
            "value": "24.00",
            "currency": "EUR"
          },
          "line_total": {
            "value": "24.00",
            "currency": "EUR"
          }
        }
      ],
      "subtotal": {
        "value": "24.00",
        "currency": "EUR"
      },
      "tax_total": {
        "value": "0.00",
        "currency": "EUR"
      },
      "shipping_total": {
        "value": "0.00",
        "currency": "EUR"
      },
      "discount_total": {
        "value": "0.00",
        "currency": "EUR"
      },
      "total": {
        "value": "24.00",
        "currency": "EUR"
      }
    },
    "checkout": {
      "mode": "CLASSIC",
      "merchant_checkout_url": "https://books.example/checkout"
    },
    "requested_constraints": {
      "amount_max": {
        "value": "24.00",
        "currency": "EUR"
      },
      "valid_until": "2026-11-15T12:00:00Z",
      "max_authorizations": 1
    }
  },
  "created_at": "2026-11-15T12:00:00Z",
  "updated_at": "2026-11-15T12:00:00Z"
}

Error responses

  • 400 Invalid syntax or input
  • 401 No valid authentication for this actor
  • 403 Authenticated actor lacks rights to the resource
  • 409 State conflict, optimistic lock or idempotency mismatch
  • 422 Well-formed request fails domain or financial validation
Full OpenAPI operation definition
Full OpenAPI operation definition
{
  "pathItem": {},
  "operation": {
    "tags": [
      "Intents"
    ],
    "operationId": "createIntent",
    "summary": "Submit comprehensive proposed purchase details",
    "description": "An agent submits its understanding of merchant, basket, prices, billing,\nshipping, checkout channel, PSP and principal authorization reference.\nValues in this request are agent-declared and must not be treated as\nverified merchant/issuer evidence. The agent identity is derived from\nthe access token. Principal approval cannot be self-asserted by an agent.\nThe server validates order arithmetic, currency consistency and ownership.\nCreating an intent neither approves it nor issues a card/token.\n",
    "security": [
      {
        "BearerAuth": []
      }
    ],
    "parameters": [
      {
        "$ref": "#/components/parameters/IdempotencyKey"
      }
    ],
    "requestBody": {
      "required": true,
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/CreateIntentRequest"
          },
          "examples": {
            "physicalOrder": {
              "summary": "A classic browser checkout for a physical product",
              "value": {
                "principal_reference": "pref_agent_abc123",
                "binding_id": "bnd_123",
                "purpose": "Purchase two books from a named merchant",
                "merchant": {
                  "name": "Example Books",
                  "domain": "books.example",
                  "website_url": "https://books.example",
                  "merchant_reference": "books-store-42",
                  "country": "AT",
                  "mcc": "5942"
                },
                "cart": {
                  "items": [
                    {
                      "sku": "BOOK-123",
                      "title": "Introduction to Computing",
                      "category": "BOOKS",
                      "kind": "PHYSICAL",
                      "quantity": 2,
                      "unit_price": {
                        "value": "18.00",
                        "currency": "EUR"
                      },
                      "line_total": {
                        "value": "36.00",
                        "currency": "EUR"
                      }
                    }
                  ],
                  "subtotal": {
                    "value": "36.00",
                    "currency": "EUR"
                  },
                  "tax_total": {
                    "value": "3.60",
                    "currency": "EUR"
                  },
                  "shipping_total": {
                    "value": "4.90",
                    "currency": "EUR"
                  },
                  "discount_total": {
                    "value": "0.00",
                    "currency": "EUR"
                  },
                  "total": {
                    "value": "44.50",
                    "currency": "EUR"
                  }
                },
                "billing": {
                  "name": "Example Principal",
                  "address": {
                    "address_line1": "Test Street 1",
                    "city": "Vienna",
                    "postal_code": "1010",
                    "country": "AT"
                  }
                },
                "shipping": {
                  "recipient_name": "Example Principal",
                  "address": {
                    "address_line1": "Test Street 1",
                    "city": "Vienna",
                    "postal_code": "1010",
                    "country": "AT"
                  },
                  "method": "STANDARD"
                },
                "checkout": {
                  "mode": "CLASSIC",
                  "merchant_checkout_url": "https://books.example/checkout",
                  "psp": {
                    "name": "Example PSP",
                    "payment_page_url": "https://checkout.psp.example/session/xyz"
                  },
                  "merchant_order_reference": "cart-42"
                },
                "requested_constraints": {
                  "amount_max": {
                    "value": "44.50",
                    "currency": "EUR"
                  },
                  "max_authorizations": 1,
                  "valid_until": "2026-10-08T15:00:00Z"
                }
              }
            }
          }
        }
      }
    },
    "responses": {
      "201": {
        "description": "Draft intent created; nothing has been authorized or funded",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Intent"
            }
          }
        }
      },
      "400": {
        "$ref": "#/components/responses/BadRequest"
      },
      "401": {
        "$ref": "#/components/responses/Unauthorized"
      },
      "403": {
        "$ref": "#/components/responses/Forbidden"
      },
      "409": {
        "$ref": "#/components/responses/Conflict"
      },
      "422": {
        "$ref": "#/components/responses/Unprocessable"
      }
    },
    "x-agentpay-roles": [
      "AGENT",
      "PRINCIPAL",
      "ADMIN",
      "PARTNER"
    ],
    "x-agentpay-resource-authorization": "Agent self and bound principal; ADMIN/PARTNER only within authorized scope. Verify cannot replace principal consent."
  }
}
GET/intentsList intents accessible to the authenticated agentAGENT / PRINCIPAL / ADMIN / PARTNER

Scoped to the agent and its explicitly delegated resources; no cross-principal enumeration.

Authentication
HTTP Bearer / JWT
Eligible roles
AGENT, PRINCIPAL, ADMIN, PARTNER

Agent self and bound principal; ADMIN/PARTNER only within authorized scope. Verify cannot replace principal consent.

Parameters

  • limit · query · optional · {"type": "integer", "minimum": 1, "maximum": 100, "default": 25}
  • cursor · query · optional — Opaque server-generated pagination cursor · {"type": "string"}
  • status · query · optional · IntentStatus
  • principal_reference · query · optional · {"type": "string"}

Request schema

No request body defined.

Responses

  • 200 Paginated intents

    application/json · IntentList

  • 401 No valid authentication for this actor

    application/json · ApiError

  • 403 Authenticated actor lacks rights to the resource

    application/json · ApiError

YAML examples are reproduced as supplied; dates and credential values are illustrative. Where the YAML has no example, a schema-valid example is generated. Examples do not list every optional field; follow the schema links for complete definitions.

Request · no JSON body
GET /intents
200 · Paginated intents
{
  "data": [
    {
      "intent_id": "int_example",
      "agent_id": "agt_example",
      "principal_reference": "pref_example",
      "binding_id": "bnd_example",
      "status": "DRAFT",
      "purchase": {
        "principal_reference": "pref_example",
        "binding_id": "bnd_example",
        "purpose": "Buy one book",
        "merchant": {
          "name": "Example Books",
          "domain": "books.example"
        },
        "cart": {
          "items": [
            {
              "title": "Example book",
              "quantity": 1,
              "unit_price": {
                "value": "24.00",
                "currency": "EUR"
              },
              "line_total": {
                "value": "24.00",
                "currency": "EUR"
              }
            }
          ],
          "subtotal": {
            "value": "24.00",
            "currency": "EUR"
          },
          "tax_total": {
            "value": "0.00",
            "currency": "EUR"
          },
          "shipping_total": {
            "value": "0.00",
            "currency": "EUR"
          },
          "discount_total": {
            "value": "0.00",
            "currency": "EUR"
          },
          "total": {
            "value": "24.00",
            "currency": "EUR"
          }
        },
        "checkout": {
          "mode": "CLASSIC",
          "merchant_checkout_url": "https://books.example/checkout"
        },
        "requested_constraints": {
          "amount_max": {
            "value": "24.00",
            "currency": "EUR"
          },
          "valid_until": "2026-11-15T12:00:00Z",
          "max_authorizations": 1
        }
      },
      "created_at": "2026-11-15T12:00:00Z",
      "updated_at": "2026-11-15T12:00:00Z"
    }
  ],
  "page": {
    "has_more": false
  }
}

Error responses

  • 401 No valid authentication for this actor
  • 403 Authenticated actor lacks rights to the resource
Full OpenAPI operation definition
Full OpenAPI operation definition
{
  "pathItem": {},
  "operation": {
    "tags": [
      "Intents"
    ],
    "operationId": "listIntents",
    "summary": "List intents accessible to the authenticated agent",
    "description": "Scoped to the agent and its explicitly delegated resources; no cross-principal enumeration.",
    "security": [
      {
        "BearerAuth": []
      }
    ],
    "parameters": [
      {
        "$ref": "#/components/parameters/Limit"
      },
      {
        "$ref": "#/components/parameters/Cursor"
      },
      {
        "name": "status",
        "in": "query",
        "schema": {
          "$ref": "#/components/schemas/IntentStatus"
        }
      },
      {
        "name": "principal_reference",
        "in": "query",
        "schema": {
          "type": "string"
        }
      }
    ],
    "responses": {
      "200": {
        "description": "Paginated intents",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/IntentList"
            }
          }
        }
      },
      "401": {
        "$ref": "#/components/responses/Unauthorized"
      },
      "403": {
        "$ref": "#/components/responses/Forbidden"
      }
    },
    "x-agentpay-roles": [
      "AGENT",
      "PRINCIPAL",
      "ADMIN",
      "PARTNER"
    ],
    "x-agentpay-resource-authorization": "Agent self and bound principal; ADMIN/PARTNER only within authorized scope. Verify cannot replace principal consent."
  }
}
GET/intents/{intentId}Retrieve intent, verification status and policy reasonsAGENT / PRINCIPAL / ADMIN / PARTNER

Retrieve intent, verification status and policy reasons

Authentication
HTTP Bearer / JWT
Eligible roles
AGENT, PRINCIPAL, ADMIN, PARTNER

Agent self and bound principal; ADMIN/PARTNER only within authorized scope. Verify cannot replace principal consent.

Parameters

  • intentId · path · required · {"type": "string", "pattern": "^int_[A-Za-z0-9_-]+$"}

Request schema

No request body defined.

Responses

  • 200 Intent state and immutable verification evidence references

    application/json · Intent

  • 403 Authenticated actor lacks rights to the resource

    application/json · ApiError

  • 404 Not found or deliberately hidden from this actor

    application/json · ApiError

  • 401 No valid authentication for this actor

    application/json · ApiError

YAML examples are reproduced as supplied; dates and credential values are illustrative. Where the YAML has no example, a schema-valid example is generated. Examples do not list every optional field; follow the schema links for complete definitions.

Request · no JSON body
GET /intents/{intentId}
200 · Intent state and immutable verification evidence references
{
  "intent_id": "int_example",
  "agent_id": "agt_example",
  "principal_reference": "pref_example",
  "binding_id": "bnd_example",
  "status": "DRAFT",
  "purchase": {
    "principal_reference": "pref_example",
    "binding_id": "bnd_example",
    "purpose": "Buy one book",
    "merchant": {
      "name": "Example Books",
      "domain": "books.example"
    },
    "cart": {
      "items": [
        {
          "title": "Example book",
          "quantity": 1,
          "unit_price": {
            "value": "24.00",
            "currency": "EUR"
          },
          "line_total": {
            "value": "24.00",
            "currency": "EUR"
          }
        }
      ],
      "subtotal": {
        "value": "24.00",
        "currency": "EUR"
      },
      "tax_total": {
        "value": "0.00",
        "currency": "EUR"
      },
      "shipping_total": {
        "value": "0.00",
        "currency": "EUR"
      },
      "discount_total": {
        "value": "0.00",
        "currency": "EUR"
      },
      "total": {
        "value": "24.00",
        "currency": "EUR"
      }
    },
    "checkout": {
      "mode": "CLASSIC",
      "merchant_checkout_url": "https://books.example/checkout"
    },
    "requested_constraints": {
      "amount_max": {
        "value": "24.00",
        "currency": "EUR"
      },
      "valid_until": "2026-11-15T12:00:00Z",
      "max_authorizations": 1
    }
  },
  "created_at": "2026-11-15T12:00:00Z",
  "updated_at": "2026-11-15T12:00:00Z"
}

Error responses

  • 403 Authenticated actor lacks rights to the resource
  • 404 Not found or deliberately hidden from this actor
  • 401 No valid authentication for this actor
Full OpenAPI operation definition
Full OpenAPI operation definition
{
  "pathItem": {
    "parameters": [
      {
        "$ref": "#/components/parameters/IntentId"
      }
    ]
  },
  "operation": {
    "tags": [
      "Intents"
    ],
    "operationId": "getIntent",
    "summary": "Retrieve intent, verification status and policy reasons",
    "security": [
      {
        "BearerAuth": []
      }
    ],
    "responses": {
      "200": {
        "description": "Intent state and immutable verification evidence references",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Intent"
            }
          }
        }
      },
      "403": {
        "$ref": "#/components/responses/Forbidden"
      },
      "404": {
        "$ref": "#/components/responses/NotFound"
      },
      "401": {
        "$ref": "#/components/responses/Unauthorized"
      }
    },
    "x-agentpay-roles": [
      "AGENT",
      "PRINCIPAL",
      "ADMIN",
      "PARTNER"
    ],
    "x-agentpay-resource-authorization": "Agent self and bound principal; ADMIN/PARTNER only within authorized scope. Verify cannot replace principal consent."
  }
}
PUT/intents/{intentId}Replace an unverified draft intentAGENT / PRINCIPAL / ADMIN / PARTNER

Only allowed for DRAFT or CHANGES_REQUESTED; replaces the mutable purchase details. Any prior verification result is invalidated. Once verified, the signed purchase snapshot is immutable: create a new intent to change material merchant, amount, product, address or checkout fields.

Authentication
HTTP Bearer / JWT
Eligible roles
AGENT, PRINCIPAL, ADMIN, PARTNER

Agent self and bound principal; ADMIN/PARTNER only within authorized scope. Verify cannot replace principal consent.

Parameters

  • intentId · path · required · {"type": "string", "pattern": "^int_[A-Za-z0-9_-]+$"}

Request schema

Request body: required.

application/json · CreateIntentRequest

Responses

  • 200 Updated draft intent

    application/json · Intent

  • 400 Invalid syntax or input

    application/json · ApiError

  • 403 Authenticated actor lacks rights to the resource

    application/json · ApiError

  • 404 Not found or deliberately hidden from this actor

    application/json · ApiError

  • 409 State conflict, optimistic lock or idempotency mismatch

    application/json · ApiError

  • 401 No valid authentication for this actor

    application/json · ApiError

YAML examples are reproduced as supplied; dates and credential values are illustrative. Where the YAML has no example, a schema-valid example is generated. Examples do not list every optional field; follow the schema links for complete definitions.

Request JSON
{
  "principal_reference": "pref_example",
  "binding_id": "bnd_example",
  "purpose": "Buy one book",
  "merchant": {
    "name": "Example Books",
    "domain": "books.example"
  },
  "cart": {
    "items": [
      {
        "title": "Example book",
        "quantity": 1,
        "unit_price": {
          "value": "24.00",
          "currency": "EUR"
        },
        "line_total": {
          "value": "24.00",
          "currency": "EUR"
        }
      }
    ],
    "subtotal": {
      "value": "24.00",
      "currency": "EUR"
    },
    "tax_total": {
      "value": "0.00",
      "currency": "EUR"
    },
    "shipping_total": {
      "value": "0.00",
      "currency": "EUR"
    },
    "discount_total": {
      "value": "0.00",
      "currency": "EUR"
    },
    "total": {
      "value": "24.00",
      "currency": "EUR"
    }
  },
  "checkout": {
    "mode": "CLASSIC",
    "merchant_checkout_url": "https://books.example/checkout"
  },
  "requested_constraints": {
    "amount_max": {
      "value": "24.00",
      "currency": "EUR"
    },
    "valid_until": "2026-11-15T12:00:00Z",
    "max_authorizations": 1
  }
}
200 · Updated draft intent
{
  "intent_id": "int_example",
  "agent_id": "agt_example",
  "principal_reference": "pref_example",
  "binding_id": "bnd_example",
  "status": "DRAFT",
  "purchase": {
    "principal_reference": "pref_example",
    "binding_id": "bnd_example",
    "purpose": "Buy one book",
    "merchant": {
      "name": "Example Books",
      "domain": "books.example"
    },
    "cart": {
      "items": [
        {
          "title": "Example book",
          "quantity": 1,
          "unit_price": {
            "value": "24.00",
            "currency": "EUR"
          },
          "line_total": {
            "value": "24.00",
            "currency": "EUR"
          }
        }
      ],
      "subtotal": {
        "value": "24.00",
        "currency": "EUR"
      },
      "tax_total": {
        "value": "0.00",
        "currency": "EUR"
      },
      "shipping_total": {
        "value": "0.00",
        "currency": "EUR"
      },
      "discount_total": {
        "value": "0.00",
        "currency": "EUR"
      },
      "total": {
        "value": "24.00",
        "currency": "EUR"
      }
    },
    "checkout": {
      "mode": "CLASSIC",
      "merchant_checkout_url": "https://books.example/checkout"
    },
    "requested_constraints": {
      "amount_max": {
        "value": "24.00",
        "currency": "EUR"
      },
      "valid_until": "2026-11-15T12:00:00Z",
      "max_authorizations": 1
    }
  },
  "created_at": "2026-11-15T12:00:00Z",
  "updated_at": "2026-11-15T12:00:00Z"
}

Error responses

  • 400 Invalid syntax or input
  • 403 Authenticated actor lacks rights to the resource
  • 404 Not found or deliberately hidden from this actor
  • 409 State conflict, optimistic lock or idempotency mismatch
  • 401 No valid authentication for this actor
Full OpenAPI operation definition
Full OpenAPI operation definition
{
  "pathItem": {
    "parameters": [
      {
        "$ref": "#/components/parameters/IntentId"
      }
    ]
  },
  "operation": {
    "tags": [
      "Intents"
    ],
    "operationId": "updateIntent",
    "summary": "Replace an unverified draft intent",
    "description": "Only allowed for DRAFT or CHANGES_REQUESTED; replaces the mutable\npurchase details. Any prior verification result is invalidated. Once\nverified, the signed purchase snapshot is immutable: create a new intent\nto change material merchant, amount, product, address or checkout fields.\n",
    "security": [
      {
        "BearerAuth": []
      }
    ],
    "requestBody": {
      "required": true,
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/CreateIntentRequest"
          }
        }
      }
    },
    "responses": {
      "200": {
        "description": "Updated draft intent",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Intent"
            }
          }
        }
      },
      "400": {
        "$ref": "#/components/responses/BadRequest"
      },
      "403": {
        "$ref": "#/components/responses/Forbidden"
      },
      "404": {
        "$ref": "#/components/responses/NotFound"
      },
      "409": {
        "$ref": "#/components/responses/Conflict"
      },
      "401": {
        "$ref": "#/components/responses/Unauthorized"
      }
    },
    "x-agentpay-roles": [
      "AGENT",
      "PRINCIPAL",
      "ADMIN",
      "PARTNER"
    ],
    "x-agentpay-resource-authorization": "Agent self and bound principal; ADMIN/PARTNER only within authorized scope. Verify cannot replace principal consent."
  }
}
POST/intents/{intentId}/verifyVerify checkout intent against delegation, trusted consent, evidence and policyAGENT / PRINCIPAL / ADMIN / PARTNER

Separate explicit step from payment credential issuance. Looks up principal-agent binding and actual consent/mandate in a trusted system; a client-supplied consent reference is never independent proof. Performs deterministic hard-rule checks (agent, principal, amount, currency, merchant allowlist, goods/geography, validity, frequency and prior use). Probabilistic risk or AI-based signals may only inform a manual review or step-up decision, not override hard restrictions. If principal approval is missing, returns STEP_UP_REQUIRED with a secure principal action URL. VERIFIED is only set once all required consent and verification succeed. Product, address, and PSP claims can be assessed before checkout using independent evidence where available; they are not assumed observable during standard issuer authorization. Where identity verification is required, an unverified principal cannot receive spend authority; return STEP_UP_REQUIRED with a KYC/KYB verification action, or domain error identity_verification_required as appropriate. Agent KYA and principal/agent limits are independently enforced and untrusted agent profile mismatches inform risk.

Authentication
HTTP Bearer / JWT
Eligible roles
AGENT, PRINCIPAL, ADMIN, PARTNER

Agent self and bound principal; ADMIN/PARTNER only within authorized scope. Verify cannot replace principal consent.

Parameters

  • intentId · path · required · {"type": "string", "pattern": "^int_[A-Za-z0-9_-]+$"}
  • Idempotency-Key · header · required — Repeat the same logical mutation with the same key and same payload; reuse with a changed payload is a 409. · {"type": "string", "minLength": 16, "maxLength": 128}

Request schema

Request body: optional.

application/json · VerifyIntentRequest

Responses

  • 200 Verification decision (including decline or principal step-up)

    application/json · IntentVerification

  • 400 Invalid syntax or input

    application/json · ApiError

  • 403 Authenticated actor lacks rights to the resource

    application/json · ApiError

  • 404 Not found or deliberately hidden from this actor

    application/json · ApiError

  • 409 State conflict, optimistic lock or idempotency mismatch

    application/json · ApiError

  • 503 Dependency unavailable; no implicit authorization or approval

    application/json · ApiError

  • 401 No valid authentication for this actor

    application/json · ApiError

YAML examples are reproduced as supplied; dates and credential values are illustrative. Where the YAML has no example, a schema-valid example is generated. Examples do not list every optional field; follow the schema links for complete definitions.

Request JSON
{
  "note": "Principal approval is available for review"
}
200 · Verification decision (including decline or principal step-up)
{
  "verification_id": "vrf_123",
  "intent_id": "int_123",
  "decision": "APPROVED",
  "intent_status": "VERIFIED",
  "policy_version": "0.3.0",
  "reason_codes": [
    "AGENT_ACTIVE",
    "BINDING_ACTIVE",
    "PRINCIPAL_AUTHORIZED",
    "AMOUNT_WITHIN_LIMIT"
  ],
  "verified_snapshot_hash": "sha256:0123456789abcdef",
  "evidence_id": "ev_123",
  "verified_at": "2026-10-08T14:00:00Z"
}
needsStepUp · YAML example
{
  "verification_id": "vrf_124",
  "intent_id": "int_123",
  "decision": "STEP_UP_REQUIRED",
  "intent_status": "STEP_UP_REQUIRED",
  "policy_version": "0.3.0",
  "reason_codes": [
    "PRINCIPAL_APPROVAL_REQUIRED"
  ],
  "principal_action": {
    "authorization_url": "https://consent.agentpay.example/approve/opaque",
    "expires_at": "2026-10-08T14:05:00Z"
  },
  "evidence_id": "ev_124"
}

Error responses

  • 400 Invalid syntax or input
  • 403 Authenticated actor lacks rights to the resource
  • 404 Not found or deliberately hidden from this actor
  • 409 State conflict, optimistic lock or idempotency mismatch
  • 503 Dependency unavailable; no implicit authorization or approval
  • 401 No valid authentication for this actor
Full OpenAPI operation definition
Full OpenAPI operation definition
{
  "pathItem": {
    "parameters": [
      {
        "$ref": "#/components/parameters/IntentId"
      }
    ]
  },
  "operation": {
    "tags": [
      "Intents"
    ],
    "operationId": "verifyIntent",
    "summary": "Verify checkout intent against delegation, trusted consent, evidence and policy",
    "description": "Separate explicit step from payment credential issuance. Looks up\nprincipal-agent binding and actual consent/mandate in a trusted system;\na client-supplied consent reference is never independent proof. Performs\ndeterministic hard-rule checks (agent, principal, amount, currency,\nmerchant allowlist, goods/geography, validity, frequency and prior use).\nProbabilistic risk or AI-based signals may only inform a manual review or\nstep-up decision, not override hard restrictions. If principal approval\nis missing, returns STEP_UP_REQUIRED with a secure principal action URL.\nVERIFIED is only set once all required consent and verification succeed.\nProduct, address, and PSP claims can be assessed before checkout using\nindependent evidence where available; they are not assumed observable\nduring standard issuer authorization.\nWhere identity verification is required, an unverified principal cannot receive\nspend authority; return STEP_UP_REQUIRED with a KYC/KYB verification action, or domain error\nidentity_verification_required as appropriate. Agent KYA and principal/agent limits\nare independently enforced and untrusted agent profile mismatches inform risk.\n",
    "security": [
      {
        "BearerAuth": []
      }
    ],
    "parameters": [
      {
        "$ref": "#/components/parameters/IdempotencyKey"
      }
    ],
    "requestBody": {
      "required": false,
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/VerifyIntentRequest"
          }
        }
      }
    },
    "responses": {
      "200": {
        "description": "Verification decision (including decline or principal step-up)",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/IntentVerification"
            },
            "examples": {
              "verified": {
                "value": {
                  "verification_id": "vrf_123",
                  "intent_id": "int_123",
                  "decision": "APPROVED",
                  "intent_status": "VERIFIED",
                  "policy_version": "0.3.0",
                  "reason_codes": [
                    "AGENT_ACTIVE",
                    "BINDING_ACTIVE",
                    "PRINCIPAL_AUTHORIZED",
                    "AMOUNT_WITHIN_LIMIT"
                  ],
                  "verified_snapshot_hash": "sha256:0123456789abcdef",
                  "evidence_id": "ev_123",
                  "verified_at": "2026-10-08T14:00:00Z"
                }
              },
              "needsStepUp": {
                "value": {
                  "verification_id": "vrf_124",
                  "intent_id": "int_123",
                  "decision": "STEP_UP_REQUIRED",
                  "intent_status": "STEP_UP_REQUIRED",
                  "policy_version": "0.3.0",
                  "reason_codes": [
                    "PRINCIPAL_APPROVAL_REQUIRED"
                  ],
                  "principal_action": {
                    "authorization_url": "https://consent.agentpay.example/approve/opaque",
                    "expires_at": "2026-10-08T14:05:00Z"
                  },
                  "evidence_id": "ev_124"
                }
              }
            }
          }
        }
      },
      "400": {
        "$ref": "#/components/responses/BadRequest"
      },
      "403": {
        "$ref": "#/components/responses/Forbidden"
      },
      "404": {
        "$ref": "#/components/responses/NotFound"
      },
      "409": {
        "$ref": "#/components/responses/Conflict"
      },
      "503": {
        "$ref": "#/components/responses/Unavailable"
      },
      "401": {
        "$ref": "#/components/responses/Unauthorized"
      }
    },
    "x-agentpay-roles": [
      "AGENT",
      "PRINCIPAL",
      "ADMIN",
      "PARTNER"
    ],
    "x-agentpay-resource-authorization": "Agent self and bound principal; ADMIN/PARTNER only within authorized scope. Verify cannot replace principal consent."
  }
}

Payments

Payment capability issuance, status and reversal requests

POST/intents/{intentId}/payRequest a one-use payment method for a verified intentAGENT / PRINCIPAL / ADMIN / PARTNER

Creates one payment attempt for a previously VERIFIED purchase intent. No client TTL parameter. Server sets nominal 60-second one-use capability window. For VIRTUAL_CARD (existing EPHEMERAL_CARD rail) issuer processor issues one unique card identifier per attempt; Agent Pay stores immutable credential_id -> payment_id -> intent_id and issuer processor_card_id mappings. Agent may receive a ONE-TIME sensitive card object (PAN, CVV, expiry, sponsor-approved alphabetic cardholder name) in this POST response if issuance and PCI delivery permit it. All GET endpoints and idempotent replays provide redacted card metadata ONLY. Never log/store CVV after authorization. Network agentic rails can return a separate restricted token handoff; equivalent issuer-token-to-intent binding must be confirmed. Checkout/merchant charges happen outside this API; successful credential issuance does not imply authorization. One intent may have failed/expired payment attempts, but only one distinct successful purchase; issuer auth retries and lifecycle events are deduplicated atomically.

Authentication
HTTP Bearer / JWT
Eligible roles
AGENT, PRINCIPAL, ADMIN, PARTNER

Only authorized agent or specifically delegated permitted actor; principal approval and verified intent remain mandatory.

Parameters

  • intentId · path · required · {"type": "string", "pattern": "^int_[A-Za-z0-9_-]+$"}
  • Idempotency-Key · header · required — Repeat the same logical mutation with the same key and same payload; reuse with a changed payload is a 409. · {"type": "string", "minLength": 16, "maxLength": 128}

Request schema

Request body: required.

application/json · RequestPaymentCapability

Responses

  • 201 One-time issued payment payload; sensitive card fields ONLY on first eligible response

    application/json · PaymentIssuanceResponse

    • Cache-Control · Sensitive responses must have no-store · {"type": "string"} · example: no-store
  • 403 Authenticated actor lacks rights to the resource

    application/json · ApiError

  • 404 Not found or deliberately hidden from this actor

    application/json · ApiError

  • 409 State conflict, optimistic lock or idempotency mismatch

    application/json · ApiError

  • 422 Includes identity_verification_required when principal KYC/KYB is incomplete

    application/json · ApiError

  • 503 Dependency unavailable; no implicit authorization or approval

    application/json · ApiError

  • 401 No valid authentication for this actor

    application/json · ApiError

YAML examples are reproduced as supplied; dates and credential values are illustrative. Where the YAML has no example, a schema-valid example is generated. Examples do not list every optional field; follow the schema links for complete definitions.

Request JSON
{
  "requested_rail": "AUTO"
}
201 · One-time issued payment payload; sensitive card fields ONLY on first eligible response
{
  "payment": {
    "payment_id": "pay_456",
    "intent_id": "int_123",
    "status": "CREDENTIAL_ISSUED",
    "decision": "APPROVED",
    "rail": "EPHEMERAL_CARD",
    "amount": {
      "value": "49.99",
      "currency": "EUR"
    },
    "correlation_id": "corr_123",
    "capability_id": "cap_123",
    "capability_expires_at": "2026-10-08T17:31:00Z",
    "card": {
      "credential_id": "cred_789",
      "last4": "1111",
      "gateway_token": {
        "provider": "example_psp",
        "token_id": "gtw_abc123"
      }
    },
    "created_at": "2026-10-08T17:30:00Z",
    "updated_at": "2026-10-08T17:30:00Z"
  },
  "card": {
    "credential_id": "cred_789",
    "pan": "4111111111111111",
    "cvv": "123",
    "expiry_month": "10",
    "expiry_year": "2027",
    "cardholder_name": "AGENTPAY RIVER",
    "last4": "1111",
    "gateway_token": {
      "provider": "example_psp",
      "token_id": "gtw_abc123"
    }
  }
}

Error responses

  • 403 Authenticated actor lacks rights to the resource
  • 404 Not found or deliberately hidden from this actor
  • 409 State conflict, optimistic lock or idempotency mismatch
  • 422 Includes identity_verification_required when principal KYC/KYB is incomplete · identity_verification_required
  • 503 Dependency unavailable; no implicit authorization or approval
  • 401 No valid authentication for this actor

Card secrets, if issuance permits them, appear only in the initial issuance response. GET endpoints and idempotent replays remain redacted. The nominal 60-second initiation window is system controlled. Issuance does not confirm a purchase; outcome requires trusted processor events.

Full OpenAPI operation definition
Full OpenAPI operation definition
{
  "pathItem": {
    "parameters": [
      {
        "$ref": "#/components/parameters/IntentId"
      }
    ]
  },
  "operation": {
    "tags": [
      "Payments"
    ],
    "operationId": "requestPaymentCapability",
    "summary": "Request a one-use payment method for a verified intent",
    "description": "Creates one payment attempt for a previously VERIFIED purchase intent.\nNo client TTL parameter. Server sets nominal 60-second one-use capability window.\nFor VIRTUAL_CARD (existing EPHEMERAL_CARD rail) issuer processor issues one unique\ncard identifier per attempt; Agent Pay stores immutable credential_id -> payment_id\n-> intent_id and issuer processor_card_id mappings. Agent may receive a ONE-TIME\nsensitive card object (PAN, CVV, expiry, sponsor-approved alphabetic cardholder name)\nin this POST response if issuance and PCI delivery permit it. All GET endpoints and\nidempotent replays provide redacted card metadata ONLY. Never log/store CVV after\nauthorization. Network agentic rails can return a separate restricted token handoff;\nequivalent issuer-token-to-intent binding must be confirmed. Checkout/merchant charges\nhappen outside this API; successful credential issuance does not imply authorization.\nOne intent may have failed/expired payment attempts, but only one distinct successful\npurchase; issuer auth retries and lifecycle events are deduplicated atomically.\n",
    "security": [
      {
        "BearerAuth": []
      }
    ],
    "parameters": [
      {
        "$ref": "#/components/parameters/IdempotencyKey"
      }
    ],
    "requestBody": {
      "required": true,
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/RequestPaymentCapability"
          },
          "example": {
            "requested_rail": "AUTO"
          }
        }
      }
    },
    "responses": {
      "201": {
        "description": "One-time issued payment payload; sensitive card fields ONLY on first eligible response",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/PaymentIssuanceResponse"
            },
            "example": {
              "payment": {
                "payment_id": "pay_456",
                "intent_id": "int_123",
                "status": "CREDENTIAL_ISSUED",
                "decision": "APPROVED",
                "rail": "EPHEMERAL_CARD",
                "amount": {
                  "value": "49.99",
                  "currency": "EUR"
                },
                "correlation_id": "corr_123",
                "capability_id": "cap_123",
                "capability_expires_at": "2026-10-08T17:31:00Z",
                "card": {
                  "credential_id": "cred_789",
                  "last4": "1111",
                  "gateway_token": {
                    "provider": "example_psp",
                    "token_id": "gtw_abc123"
                  }
                },
                "created_at": "2026-10-08T17:30:00Z",
                "updated_at": "2026-10-08T17:30:00Z"
              },
              "card": {
                "credential_id": "cred_789",
                "pan": "4111111111111111",
                "cvv": "123",
                "expiry_month": "10",
                "expiry_year": "2027",
                "cardholder_name": "AGENTPAY RIVER",
                "last4": "1111",
                "gateway_token": {
                  "provider": "example_psp",
                  "token_id": "gtw_abc123"
                }
              }
            }
          }
        },
        "headers": {
          "Cache-Control": {
            "description": "Sensitive responses must have no-store",
            "schema": {
              "type": "string"
            },
            "example": "no-store"
          }
        }
      },
      "403": {
        "$ref": "#/components/responses/Forbidden"
      },
      "404": {
        "$ref": "#/components/responses/NotFound"
      },
      "409": {
        "$ref": "#/components/responses/Conflict"
      },
      "422": {
        "description": "Includes identity_verification_required when principal KYC/KYB is incomplete",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ApiError"
            },
            "example": {
              "code": "identity_verification_required",
              "message": "Principal must complete hosted identity verification before spending.",
              "correlation_id": "corr_123",
              "retryable": false
            }
          }
        }
      },
      "503": {
        "$ref": "#/components/responses/Unavailable"
      },
      "401": {
        "$ref": "#/components/responses/Unauthorized"
      }
    },
    "x-agentpay-roles": [
      "AGENT",
      "PRINCIPAL",
      "ADMIN",
      "PARTNER"
    ],
    "x-agentpay-resource-authorization": "Only authorized agent or specifically delegated permitted actor; principal approval and verified intent remain mandatory."
  }
}
GET/intents/{intentId}/payList payment IDs, rails, statuses and timestamps (no card secrets)AGENT / PRINCIPAL / ADMIN / PARTNER

List payment IDs, rails, statuses and timestamps (no card secrets)

Authentication
HTTP Bearer / JWT
Eligible roles
AGENT, PRINCIPAL, ADMIN, PARTNER

Bound agent, principal or authorized portfolio. Never reveal another principal’s payment details.

Parameters

  • intentId · path · required · {"type": "string", "pattern": "^int_[A-Za-z0-9_-]+$"}
  • limit · query · optional · {"type": "integer", "minimum": 1, "maximum": 100, "default": 25}
  • cursor · query · optional — Opaque server-generated pagination cursor · {"type": "string"}

Request schema

No request body defined.

Responses

  • 200 Paginated payment attempts

    application/json · PaymentSummaryList

  • 403 Authenticated actor lacks rights to the resource

    application/json · ApiError

  • 404 Not found or deliberately hidden from this actor

    application/json · ApiError

  • 401 No valid authentication for this actor

    application/json · ApiError

YAML examples are reproduced as supplied; dates and credential values are illustrative. Where the YAML has no example, a schema-valid example is generated. Examples do not list every optional field; follow the schema links for complete definitions.

Request · no JSON body
GET /intents/{intentId}/pay
200 · Paginated payment attempts
{
  "data": [
    {
      "payment_id": "pay_example",
      "intent_id": "int_example",
      "rail": "VISA_AGENTIC",
      "status": "CREATED",
      "created_at": "2026-11-15T12:00:00Z"
    }
  ],
  "page": {
    "has_more": false
  }
}

Error responses

  • 403 Authenticated actor lacks rights to the resource
  • 404 Not found or deliberately hidden from this actor
  • 401 No valid authentication for this actor

Card secrets, if issuance permits them, appear only in the initial issuance response. GET endpoints and idempotent replays remain redacted. The nominal 60-second initiation window is system controlled. Issuance does not confirm a purchase; outcome requires trusted processor events.

Full OpenAPI operation definition
Full OpenAPI operation definition
{
  "pathItem": {
    "parameters": [
      {
        "$ref": "#/components/parameters/IntentId"
      }
    ]
  },
  "operation": {
    "tags": [
      "Payments"
    ],
    "operationId": "listIntentPayments",
    "summary": "List payment IDs, rails, statuses and timestamps (no card secrets)",
    "security": [
      {
        "BearerAuth": []
      }
    ],
    "parameters": [
      {
        "$ref": "#/components/parameters/Limit"
      },
      {
        "$ref": "#/components/parameters/Cursor"
      }
    ],
    "responses": {
      "200": {
        "description": "Paginated payment attempts",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/PaymentSummaryList"
            }
          }
        }
      },
      "403": {
        "$ref": "#/components/responses/Forbidden"
      },
      "404": {
        "$ref": "#/components/responses/NotFound"
      },
      "401": {
        "$ref": "#/components/responses/Unauthorized"
      }
    },
    "x-agentpay-roles": [
      "AGENT",
      "PRINCIPAL",
      "ADMIN",
      "PARTNER"
    ],
    "x-agentpay-resource-authorization": "Bound agent, principal or authorized portfolio. Never reveal another principal’s payment details."
  }
}
GET/intents/{intentId}/pay/{paymentId}Get complete payment record with only token ID and PAN last4AGENT / PRINCIPAL / ADMIN / PARTNER

Returns authorized payment metadata, rail, processor-confirmed status, issuer authorization references, safe card details (credential_id, last4 and scope-authorized PSP gateway token ID), but NEVER PAN, CVV or expiration date. The PSP token is not the canonical issuer correlation ID and may still be sensitive. Captured/settled status requires trusted processor events, not agent declaration.

Authentication
HTTP Bearer / JWT
Eligible roles
AGENT, PRINCIPAL, ADMIN, PARTNER

Bound agent, principal or authorized portfolio. Never reveal another principal’s payment details.

Parameters

  • intentId · path · required · {"type": "string", "pattern": "^int_[A-Za-z0-9_-]+$"}
  • paymentId · path · required · {"type": "string", "pattern": "^pay_[A-Za-z0-9_-]+$"}

Request schema

No request body defined.

Responses

  • 200 Payment attempt

    application/json · Payment

  • 403 Authenticated actor lacks rights to the resource

    application/json · ApiError

  • 404 Not found or deliberately hidden from this actor

    application/json · ApiError

  • 401 No valid authentication for this actor

    application/json · ApiError

YAML examples are reproduced as supplied; dates and credential values are illustrative. Where the YAML has no example, a schema-valid example is generated. Examples do not list every optional field; follow the schema links for complete definitions.

Request · no JSON body
GET /intents/{intentId}/pay/{paymentId}
200 · Payment attempt
{
  "payment_id": "pay_example",
  "intent_id": "int_example",
  "status": "CREATED",
  "decision": "APPROVED",
  "amount": {
    "value": "24.00",
    "currency": "EUR"
  },
  "correlation_id": "corr_example",
  "created_at": "2026-11-15T12:00:00Z",
  "updated_at": "2026-11-15T12:00:00Z"
}

Error responses

  • 403 Authenticated actor lacks rights to the resource
  • 404 Not found or deliberately hidden from this actor
  • 401 No valid authentication for this actor

Card secrets, if issuance permits them, appear only in the initial issuance response. GET endpoints and idempotent replays remain redacted. The nominal 60-second initiation window is system controlled. Issuance does not confirm a purchase; outcome requires trusted processor events.

Full OpenAPI operation definition
Full OpenAPI operation definition
{
  "pathItem": {
    "parameters": [
      {
        "$ref": "#/components/parameters/IntentId"
      },
      {
        "$ref": "#/components/parameters/PaymentId"
      }
    ]
  },
  "operation": {
    "tags": [
      "Payments"
    ],
    "operationId": "getIntentPayment",
    "summary": "Get complete payment record with only token ID and PAN last4",
    "description": "Returns authorized payment metadata, rail, processor-confirmed status,\nissuer authorization references, safe card details (credential_id, last4 and\nscope-authorized PSP gateway token ID), but NEVER PAN, CVV or expiration date.\nThe PSP token is not the canonical issuer correlation ID and may still be sensitive.\nCaptured/settled status requires trusted processor events, not agent declaration.\n",
    "security": [
      {
        "BearerAuth": []
      }
    ],
    "responses": {
      "200": {
        "description": "Payment attempt",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Payment"
            }
          }
        }
      },
      "403": {
        "$ref": "#/components/responses/Forbidden"
      },
      "404": {
        "$ref": "#/components/responses/NotFound"
      },
      "401": {
        "$ref": "#/components/responses/Unauthorized"
      }
    },
    "x-agentpay-roles": [
      "AGENT",
      "PRINCIPAL",
      "ADMIN",
      "PARTNER"
    ],
    "x-agentpay-resource-authorization": "Bound agent, principal or authorized portfolio. Never reveal another principal’s payment details."
  }
}
POST/intents/{intentId}/pay/{paymentId}/reverseRequest capability cancellation, authorization reversal or merchant refundAGENT / PRINCIPAL / ADMIN / PARTNER

An unused capability can be cancelled. Reversing an authorization depends on sponsor/issuer/processor support. A captured/settled transaction may require a separate merchant refund, not a card authorization reversal; REFUND_REQUEST is only offered where a permitted integration exists. A success here means a reversal operation was accepted, not that funds were returned. Use the returned status and check actual rail events. API retains /reverse as explicitly requested.

Authentication
HTTP Bearer / JWT
Eligible roles
AGENT, PRINCIPAL, ADMIN, PARTNER

Bound agent, principal or authorized portfolio. Never reveal another principal’s payment details.

Parameters

  • intentId · path · required · {"type": "string", "pattern": "^int_[A-Za-z0-9_-]+$"}
  • paymentId · path · required · {"type": "string", "pattern": "^pay_[A-Za-z0-9_-]+$"}
  • Idempotency-Key · header · required — Repeat the same logical mutation with the same key and same payload; reuse with a changed payload is a 409. · {"type": "string", "minLength": 16, "maxLength": 128}

Request schema

Request body: required.

application/json · ReversePaymentRequest

Responses

  • 202 Reversal request received for asynchronous processing

    application/json · ReversalOperation

  • 400 Invalid syntax or input

    application/json · ApiError

  • 403 Authenticated actor lacks rights to the resource

    application/json · ApiError

  • 404 Not found or deliberately hidden from this actor

    application/json · ApiError

  • 409 State conflict, optimistic lock or idempotency mismatch

    application/json · ApiError

  • 422 Well-formed request fails domain or financial validation

    application/json · ApiError

  • 401 No valid authentication for this actor

    application/json · ApiError

YAML examples are reproduced as supplied; dates and credential values are illustrative. Where the YAML has no example, a schema-valid example is generated. Examples do not list every optional field; follow the schema links for complete definitions.

Request JSON
{
  "requested_action": "CANCEL_UNUSED_CAPABILITY",
  "reason": "PRINCIPAL_REQUEST"
}
202 · Reversal request received for asynchronous processing
{
  "operation_id": "example",
  "payment_id": "pay_example",
  "requested_action": "CANCEL_UNUSED_CAPABILITY",
  "status": "PENDING",
  "requested_at": "2026-11-15T12:00:00Z"
}

Error responses

  • 400 Invalid syntax or input
  • 403 Authenticated actor lacks rights to the resource
  • 404 Not found or deliberately hidden from this actor
  • 409 State conflict, optimistic lock or idempotency mismatch
  • 422 Well-formed request fails domain or financial validation
  • 401 No valid authentication for this actor

Card secrets, if issuance permits them, appear only in the initial issuance response. GET endpoints and idempotent replays remain redacted. The nominal 60-second initiation window is system controlled. Issuance does not confirm a purchase; outcome requires trusted processor events.

Full OpenAPI operation definition
Full OpenAPI operation definition
{
  "pathItem": {
    "parameters": [
      {
        "$ref": "#/components/parameters/IntentId"
      },
      {
        "$ref": "#/components/parameters/PaymentId"
      }
    ]
  },
  "operation": {
    "tags": [
      "Payments"
    ],
    "operationId": "reverseIntentPayment",
    "summary": "Request capability cancellation, authorization reversal or merchant refund",
    "description": "An unused capability can be cancelled. Reversing an authorization depends\non sponsor/issuer/processor support. A captured/settled transaction may\nrequire a separate merchant refund, not a card authorization reversal;\nREFUND_REQUEST is only offered where a permitted integration exists.\nA success here means a reversal operation was accepted, not that funds\nwere returned. Use the returned status and check actual rail events.\nAPI retains /reverse as explicitly requested.\n",
    "security": [
      {
        "BearerAuth": []
      }
    ],
    "parameters": [
      {
        "$ref": "#/components/parameters/IdempotencyKey"
      }
    ],
    "requestBody": {
      "required": true,
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/ReversePaymentRequest"
          }
        }
      }
    },
    "responses": {
      "202": {
        "description": "Reversal request received for asynchronous processing",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ReversalOperation"
            }
          }
        }
      },
      "400": {
        "$ref": "#/components/responses/BadRequest"
      },
      "403": {
        "$ref": "#/components/responses/Forbidden"
      },
      "404": {
        "$ref": "#/components/responses/NotFound"
      },
      "409": {
        "$ref": "#/components/responses/Conflict"
      },
      "422": {
        "$ref": "#/components/responses/Unprocessable"
      },
      "401": {
        "$ref": "#/components/responses/Unauthorized"
      }
    },
    "x-agentpay-roles": [
      "AGENT",
      "PRINCIPAL",
      "ADMIN",
      "PARTNER"
    ],
    "x-agentpay-resource-authorization": "Bound agent, principal or authorized portfolio. Never reveal another principal’s payment details."
  }
}

Issuer Integration

Internal issuer/processor-facing, NOT exposed to untrusted agents

POST/issuer/authorizations/evaluateCompare an issuer-reported card authorization with a verified intentPARTNER · mTLS

Trusted issuer/processor callback. Resolve processor_card_id or agreed credential_reference to one internally issued credential -> payment -> intent. Never use CVV, expiry, cardholder name or gateway token as issuer matching key. Atomically reserve/consume one successful purchase per intent, distinguishing retries/reversals and partial authorizations. Compare actual amount, currency, merchant/MID/MCC/country as available, verified snapshot and system expiry. Shipping, product SKUs, billing address and PSP URL are typically unavailable in an authorization; evidence must be sourced separately, with provenance. No agent API token can call this endpoint. Fail-closed/timeout policy is issuer-agreed.

Authentication
Mutual TLS · issuer/processor channel · permission issuer.authorizations.evaluate
Eligible roles
PARTNER

Required permission: issuer.authorizations.evaluate

Parameters

  • Idempotency-Key · header · required — Repeat the same logical mutation with the same key and same payload; reuse with a changed payload is a 409. · {"type": "string", "minLength": 16, "maxLength": 128}

Request schema

Request body: required.

application/json · IssuerAuthorizationEvent

Responses

  • 200 Deterministic approve/decline recommendation within agreed issuer integration

    application/json · IssuerAuthorizationDecision

  • 400 Invalid syntax or input

    application/json · ApiError

  • 401 No valid authentication for this actor

    application/json · ApiError

  • 409 State conflict, optimistic lock or idempotency mismatch

    application/json · ApiError

  • 503 Dependency unavailable; no implicit authorization or approval

    application/json · ApiError

YAML examples are reproduced as supplied; dates and credential values are illustrative. Where the YAML has no example, a schema-valid example is generated. Examples do not list every optional field; follow the schema links for complete definitions.

Request JSON
{
  "issuer_event_id": "example",
  "amount": {
    "value": "24.00",
    "currency": "EUR"
  },
  "merchant": {
    "descriptor": "EXAMPLE BOOKS"
  },
  "occurred_at": "2026-11-15T12:00:00Z",
  "processor_card_id": "example"
}
200 · Deterministic approve/decline recommendation within agreed issuer integration
{
  "issuer_event_id": "example",
  "decision": "APPROVED",
  "reason_codes": [],
  "correlation_id": "corr_example",
  "evidence_id": "example",
  "policy_version": "example-policy"
}

Error responses

  • 400 Invalid syntax or input
  • 401 No valid authentication for this actor
  • 409 State conflict, optimistic lock or idempotency mismatch
  • 503 Dependency unavailable; no implicit authorization or approval
Full OpenAPI operation definition
Full OpenAPI operation definition
{
  "pathItem": {},
  "operation": {
    "tags": [
      "Issuer Integration"
    ],
    "operationId": "evaluateIssuerAuthorization",
    "summary": "Compare an issuer-reported card authorization with a verified intent",
    "description": "Trusted issuer/processor callback. Resolve processor_card_id or agreed\ncredential_reference to one internally issued credential -> payment -> intent.\nNever use CVV, expiry, cardholder name or gateway token as issuer matching key.\nAtomically reserve/consume one successful purchase per intent, distinguishing\nretries/reversals and partial authorizations. Compare actual amount, currency,\nmerchant/MID/MCC/country as available, verified snapshot and system expiry.\nShipping, product SKUs, billing address and PSP URL are typically unavailable\nin an authorization; evidence must be sourced separately, with provenance.\nNo agent API token can call this endpoint. Fail-closed/timeout policy is issuer-agreed.\n",
    "security": [
      {
        "IssuerMutualTLS": []
      }
    ],
    "parameters": [
      {
        "$ref": "#/components/parameters/IdempotencyKey"
      }
    ],
    "requestBody": {
      "required": true,
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/IssuerAuthorizationEvent"
          }
        }
      }
    },
    "responses": {
      "200": {
        "description": "Deterministic approve/decline recommendation within agreed issuer integration",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/IssuerAuthorizationDecision"
            }
          }
        }
      },
      "400": {
        "$ref": "#/components/responses/BadRequest"
      },
      "401": {
        "$ref": "#/components/responses/Unauthorized"
      },
      "409": {
        "$ref": "#/components/responses/Conflict"
      },
      "503": {
        "$ref": "#/components/responses/Unavailable"
      }
    },
    "x-agentpay-roles": [
      "PARTNER"
    ],
    "x-agentpay-required-permission": "issuer.authorizations.evaluate"
  }
}

Schemas

All request and response schemas from the YAML, including optional fields, enums and validation constraints.

ApiError

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

ApiError fields
FieldPresenceDefinition
coderequired{"type": "string", "example": "INTENT_NOT_VERIFIED"}
messagerequired{"type": "string"}
correlation_idrequired{"type": "string"}
retryableoptional{"type": "boolean", "default": false}
detailsoptional{"type": "array", "items": {"type": "object", "properties": {"field": {"type": "string"}, "reason": {"type": "string"}}}}
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "code",
    "message",
    "correlation_id"
  ],
  "properties": {
    "code": {
      "type": "string",
      "example": "INTENT_NOT_VERIFIED"
    },
    "message": {
      "type": "string"
    },
    "correlation_id": {
      "type": "string"
    },
    "retryable": {
      "type": "boolean",
      "default": false
    },
    "details": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "field": {
            "type": "string"
          },
          "reason": {
            "type": "string"
          }
        }
      }
    }
  }
}

PageInfo

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

PageInfo fields
FieldPresenceDefinition
has_morerequired{"type": "boolean"}
next_cursoroptional{"type": "string"}
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "has_more"
  ],
  "properties": {
    "has_more": {
      "type": "boolean"
    },
    "next_cursor": {
      "type": "string"
    }
  }
}

AgentStatus

Full JSON Schema definition
Full JSON Schema definition
{
  "type": "string",
  "enum": [
    "PENDING_EMAIL_VERIFICATION",
    "PENDING_VERIFICATION",
    "ACTIVE",
    "DISABLED",
    "SUSPENDED",
    "REVOKED",
    "DELETED"
  ]
}

PublicJWK

Public JSON Web Key; must be structurally validated against allowed algorithms; private JWK attributes are forbidden.

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

PublicJWK fields
FieldPresenceDefinition
ktyrequired{"type": "string", "enum": ["EC", "RSA", "OKP"]}
kidrequired{"type": "string"}
crvoptional{"type": "string"}
xoptional{"type": "string"}
yoptional{"type": "string"}
noptional{"type": "string"}
eoptional{"type": "string"}
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "description": "Public JSON Web Key; must be structurally validated against allowed algorithms; private JWK attributes are forbidden.",
  "required": [
    "kty",
    "kid"
  ],
  "properties": {
    "kty": {
      "type": "string",
      "enum": [
        "EC",
        "RSA",
        "OKP"
      ]
    },
    "kid": {
      "type": "string"
    },
    "crv": {
      "type": "string"
    },
    "x": {
      "type": "string"
    },
    "y": {
      "type": "string"
    },
    "n": {
      "type": "string"
    },
    "e": {
      "type": "string"
    }
  },
  "additionalProperties": false
}

RegisterAgentRequest

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

RegisterAgentRequest fields
FieldPresenceDefinition
namerequired{"type": "string", "minLength": 1, "maxLength": 120, "example": "Hermes"}
emailrequired{"type": "string", "format": "email", "description": "Human operator email that will receive signup confirmation"}

Human operator email that will receive signup confirmation

purposerequired{"type": "string", "minLength": 1, "maxLength": 2000, "example": "Personal shopping assistant"}
descriptionoptional{"type": "string", "maxLength": 2000}
technologyrequiredAgentTechnology
environmentrequiredAgentEnvironment
capabilitiesoptional{"type": "array", "uniqueItems": true, "items": {"type": "string", "enum": ["SHOPPING", "BROWSER_AUTOMATION", "API_CHECKOUT", "PROCUREMENT", "OTHER"]}}
signing_public_keyoptionalPublicJWK
metadataoptional{"type": "object", "additionalProperties": {"type": "string"}}
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "name",
    "email",
    "purpose",
    "technology",
    "environment"
  ],
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 120,
      "example": "Hermes"
    },
    "email": {
      "type": "string",
      "format": "email",
      "description": "Human operator email that will receive signup confirmation"
    },
    "purpose": {
      "type": "string",
      "minLength": 1,
      "maxLength": 2000,
      "example": "Personal shopping assistant"
    },
    "description": {
      "type": "string",
      "maxLength": 2000
    },
    "technology": {
      "$ref": "#/components/schemas/AgentTechnology"
    },
    "environment": {
      "$ref": "#/components/schemas/AgentEnvironment"
    },
    "capabilities": {
      "type": "array",
      "uniqueItems": true,
      "items": {
        "type": "string",
        "enum": [
          "SHOPPING",
          "BROWSER_AUTOMATION",
          "API_CHECKOUT",
          "PROCUREMENT",
          "OTHER"
        ]
      }
    },
    "signing_public_key": {
      "$ref": "#/components/schemas/PublicJWK"
    },
    "metadata": {
      "type": "object",
      "additionalProperties": {
        "type": "string"
      }
    }
  }
}

UpdateAgentRequest

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

UpdateAgentRequest fields
FieldPresenceDefinition
nameoptional{"type": "string", "minLength": 1}
purposeoptional{"type": "string", "minLength": 1}
descriptionoptional{"type": "string"}
technologyoptionalAgentTechnology
environmentoptionalAgentEnvironment
capabilitiesoptional{"type": "array", "items": {"type": "string"}}
metadataoptional{"type": "object", "additionalProperties": {"type": "string"}}
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "minProperties": 1,
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1
    },
    "purpose": {
      "type": "string",
      "minLength": 1
    },
    "description": {
      "type": "string"
    },
    "technology": {
      "$ref": "#/components/schemas/AgentTechnology"
    },
    "environment": {
      "$ref": "#/components/schemas/AgentEnvironment"
    },
    "capabilities": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "metadata": {
      "type": "object",
      "additionalProperties": {
        "type": "string"
      }
    }
  }
}

Agent

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

Agent fields
FieldPresenceDefinition
agent_idrequired{"type": "string", "example": "agt_8fd231", "readOnly": true}
namerequired{"type": "string"}
purposerequired{"type": "string"}
descriptionoptional{"type": "string"}
technologyrequiredAgentTechnology
environmentoptionalAgentEnvironment
capabilitiesoptional{"type": "array", "items": {"type": "string"}}
statusrequiredAgentStatus
email_verifiedoptional{"type": "boolean"}
owner_emailoptional{"type": "string", "format": "email", "description": "Redacted for nonowner roles"}

Redacted for nonowner roles

created_atrequired{"type": "string", "format": "date-time"}
updated_atrequired{"type": "string", "format": "date-time"}
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "agent_id",
    "name",
    "purpose",
    "technology",
    "status",
    "created_at",
    "updated_at"
  ],
  "properties": {
    "agent_id": {
      "type": "string",
      "example": "agt_8fd231",
      "readOnly": true
    },
    "name": {
      "type": "string"
    },
    "purpose": {
      "type": "string"
    },
    "description": {
      "type": "string"
    },
    "technology": {
      "$ref": "#/components/schemas/AgentTechnology"
    },
    "environment": {
      "$ref": "#/components/schemas/AgentEnvironment"
    },
    "capabilities": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "status": {
      "$ref": "#/components/schemas/AgentStatus"
    },
    "email_verified": {
      "type": "boolean"
    },
    "owner_email": {
      "type": "string",
      "format": "email",
      "description": "Redacted for nonowner roles"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    },
    "updated_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}

AgentList

Legacy list shape retained only for backward compatibility; GET /agents now returns AgentSummaryList.

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

AgentList fields
FieldPresenceDefinition
datarequired{"type": "array", "items": {"$ref": "#/components/schemas/Agent"}}
pagerequiredPageInfo
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "required": [
    "data",
    "page"
  ],
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/Agent"
      }
    },
    "page": {
      "$ref": "#/components/schemas/PageInfo"
    }
  },
  "description": "Legacy list shape retained only for backward compatibility; GET /agents now returns AgentSummaryList."
}

AuthRequest

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

AuthRequest fields
FieldPresenceDefinition
agent_idrequired{"type": "string", "example": "agt_8fd231"}
authentication_methodrequiredAuthenticationMethod
credentialrequired{"type": "string", "minLength": 1, "writeOnly": true, "description": "EMAIL_ENROLLMENT = single-use registration credential after owner email approval; API_KEY = registered revocable API key; SIGNED_ASSERTION = short-lived JWS/JWT signed using registered private key (never submit the private key itself).\n"}

EMAIL_ENROLLMENT = single-use registration credential after owner email approval; API_KEY = registered revocable API key; SIGNED_ASSERTION = short-lived JWS/JWT signed using registered private key (never submit the private key itself).

Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "agent_id",
    "authentication_method",
    "credential"
  ],
  "properties": {
    "agent_id": {
      "type": "string",
      "example": "agt_8fd231"
    },
    "authentication_method": {
      "$ref": "#/components/schemas/AuthenticationMethod"
    },
    "credential": {
      "type": "string",
      "minLength": 1,
      "writeOnly": true,
      "description": "EMAIL_ENROLLMENT = single-use registration credential after owner email approval; API_KEY = registered revocable API key; SIGNED_ASSERTION = short-lived JWS/JWT signed using registered private key (never submit the private key itself).\n"
    }
  }
}

AuthResponse

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

AuthResponse fields
FieldPresenceDefinition
access_tokenrequired{"type": "string", "description": "Short-lived bearer access token; never log"}

Short-lived bearer access token; never log

token_typerequired{"type": "string", "const": "Bearer"}
expires_inrequired{"type": "integer", "minimum": 1, "example": 3600}
agent_idrequired{"type": "string"}
rolerequired{"type": "string", "const": "AGENT"}
scopeoptional{"type": "string"}
agent_api_keyoptional{"type": "string", "description": "ONLY returned once at successful first EMAIL_ENROLLMENT; store securely, revocable/rotatable; never returned by GET APIs", "x-sensitive": true}

ONLY returned once at successful first EMAIL_ENROLLMENT; store securely, revocable/rotatable; never returned by GET APIs

Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "access_token",
    "token_type",
    "expires_in",
    "agent_id",
    "role"
  ],
  "properties": {
    "access_token": {
      "type": "string",
      "description": "Short-lived bearer access token; never log"
    },
    "token_type": {
      "type": "string",
      "const": "Bearer"
    },
    "expires_in": {
      "type": "integer",
      "minimum": 1,
      "example": 3600
    },
    "agent_id": {
      "type": "string"
    },
    "role": {
      "type": "string",
      "const": "AGENT"
    },
    "scope": {
      "type": "string"
    },
    "agent_api_key": {
      "type": "string",
      "description": "ONLY returned once at successful first EMAIL_ENROLLMENT; store securely, revocable/rotatable; never returned by GET APIs",
      "x-sensitive": true
    }
  }
}

Address

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

Address fields
FieldPresenceDefinition
address_line1required{"type": "string", "minLength": 1}
address_line2optional{"type": "string"}
cityrequired{"type": "string"}
regionoptional{"type": "string"}
postal_codeoptional{"type": "string"}
countryrequired{"type": "string", "pattern": "^[A-Z]{2}$", "description": "ISO 3166-1 alpha-2"}

ISO 3166-1 alpha-2

Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "address_line1",
    "city",
    "country"
  ],
  "properties": {
    "address_line1": {
      "type": "string",
      "minLength": 1
    },
    "address_line2": {
      "type": "string"
    },
    "city": {
      "type": "string"
    },
    "region": {
      "type": "string"
    },
    "postal_code": {
      "type": "string"
    },
    "country": {
      "type": "string",
      "pattern": "^[A-Z]{2}$",
      "description": "ISO 3166-1 alpha-2"
    }
  }
}

PrincipalType

The represented individual or business; immutable after onboarding.

Full JSON Schema definition
Full JSON Schema definition
{
  "type": "string",
  "enum": [
    "INDIVIDUAL",
    "BUSINESS"
  ],
  "description": "The represented individual or business; immutable after onboarding."
}

IndividualPrincipalProfile

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

IndividualPrincipalProfile fields
FieldPresenceDefinition
first_namerequired{"type": "string", "minLength": 1}
last_namerequired{"type": "string", "minLength": 1}
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "first_name",
    "last_name"
  ],
  "properties": {
    "first_name": {
      "type": "string",
      "minLength": 1
    },
    "last_name": {
      "type": "string",
      "minLength": 1
    }
  }
}

BusinessPrincipalProfile

Declared business identity, not proof of verification or representative authority. Required evidence is resolved by the trusted KYB provider and policy.

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

BusinessPrincipalProfile fields
FieldPresenceDefinition
legal_namerequired{"type": "string", "minLength": 1}
trading_nameoptional{"type": "string", "minLength": 1}
registration_countryrequired{"type": "string", "pattern": "^[A-Z]{2}$"}
registration_numberoptional{"type": "string", "minLength": 1}
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "legal_name",
    "registration_country"
  ],
  "description": "Declared business identity, not proof of verification or representative authority. Required evidence is resolved by the trusted KYB provider and policy.",
  "properties": {
    "legal_name": {
      "type": "string",
      "minLength": 1
    },
    "trading_name": {
      "type": "string",
      "minLength": 1
    },
    "registration_country": {
      "type": "string",
      "pattern": "^[A-Z]{2}$"
    },
    "registration_number": {
      "type": "string",
      "minLength": 1
    }
  }
}

CreatePrincipalRequest

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

CreatePrincipalRequest fields
FieldPresenceDefinition
principal_typerequiredPrincipalType
individualconditionalIndividualPrincipalProfile
businessconditionalBusinessPrincipalProfile
emailrequired{"type": "string", "format": "email"}
phoneoptional{"type": "string", "description": "E.164 preferred"}

E.164 preferred

billing_addressoptionalAddress
shipping_addressoptionalAddress
localeoptional{"type": "string", "example": "de-AT"}
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "principal_type",
    "email"
  ],
  "properties": {
    "principal_type": {
      "$ref": "#/components/schemas/PrincipalType"
    },
    "individual": {
      "$ref": "#/components/schemas/IndividualPrincipalProfile"
    },
    "business": {
      "$ref": "#/components/schemas/BusinessPrincipalProfile"
    },
    "email": {
      "type": "string",
      "format": "email"
    },
    "phone": {
      "type": "string",
      "description": "E.164 preferred"
    },
    "billing_address": {
      "$ref": "#/components/schemas/Address"
    },
    "shipping_address": {
      "$ref": "#/components/schemas/Address"
    },
    "locale": {
      "type": "string",
      "example": "de-AT"
    }
  },
  "oneOf": [
    {
      "properties": {
        "principal_type": {
          "const": "INDIVIDUAL"
        }
      },
      "required": [
        "individual"
      ],
      "not": {
        "required": [
          "business"
        ]
      }
    },
    {
      "properties": {
        "principal_type": {
          "const": "BUSINESS"
        }
      },
      "required": [
        "business"
      ],
      "not": {
        "required": [
          "individual"
        ]
      }
    }
  ]
}

UpdatePrincipalRequest

Only the nested profile matching the existing principal_type may be supplied. That match is enforced against the stored principal server-side; principal_type and trusted verification/authority fields are immutable through this request.

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

UpdatePrincipalRequest fields
FieldPresenceDefinition
individualoptionalIndividualPrincipalProfile
businessoptionalBusinessPrincipalProfile
emailoptional{"type": "string", "format": "email"}
phoneoptional{"type": "string"}
billing_addressoptionalAddress
shipping_addressoptionalAddress
localeoptional{"type": "string"}
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "minProperties": 1,
  "properties": {
    "individual": {
      "$ref": "#/components/schemas/IndividualPrincipalProfile"
    },
    "business": {
      "$ref": "#/components/schemas/BusinessPrincipalProfile"
    },
    "email": {
      "type": "string",
      "format": "email"
    },
    "phone": {
      "type": "string"
    },
    "billing_address": {
      "$ref": "#/components/schemas/Address"
    },
    "shipping_address": {
      "$ref": "#/components/schemas/Address"
    },
    "locale": {
      "type": "string"
    }
  },
  "not": {
    "required": [
      "individual",
      "business"
    ]
  },
  "description": "Only the nested profile matching the existing principal_type may be supplied. That match is enforced against the stored principal server-side; principal_type and trusted verification/authority fields are immutable through this request."
}

Principal

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

Principal fields
FieldPresenceDefinition
principal_idrequired{"type": "string", "example": "prn_123"}
principal_typerequiredPrincipalType
individualconditionalIndividualPrincipalProfile
businessconditionalBusinessPrincipalProfile
emailrequired{"type": "string", "format": "email"}
phoneoptional{"type": "string"}
billing_addressoptionalAddress
shipping_addressoptionalAddress
localeoptional{"type": "string"}
verification_statusrequired{"type": "string", "enum": ["PENDING", "VERIFIED", "RESTRICTED"], "description": "Trusted principal onboarding status; never supplied by an agent or self-declared representative. Identity verification and spending authority remain separate checks."}

Trusted principal onboarding status; never supplied by an agent or self-declared representative. Identity verification and spending authority remain separate checks.

created_atrequired{"type": "string", "format": "date-time"}
updated_atrequired{"type": "string", "format": "date-time"}
identity_verification_statusoptionalPrincipalVerificationStatus
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "principal_id",
    "principal_type",
    "email",
    "verification_status",
    "created_at",
    "updated_at"
  ],
  "properties": {
    "principal_id": {
      "type": "string",
      "example": "prn_123"
    },
    "principal_type": {
      "$ref": "#/components/schemas/PrincipalType"
    },
    "individual": {
      "$ref": "#/components/schemas/IndividualPrincipalProfile"
    },
    "business": {
      "$ref": "#/components/schemas/BusinessPrincipalProfile"
    },
    "email": {
      "type": "string",
      "format": "email"
    },
    "phone": {
      "type": "string"
    },
    "billing_address": {
      "$ref": "#/components/schemas/Address"
    },
    "shipping_address": {
      "$ref": "#/components/schemas/Address"
    },
    "locale": {
      "type": "string"
    },
    "verification_status": {
      "type": "string",
      "enum": [
        "PENDING",
        "VERIFIED",
        "RESTRICTED"
      ],
      "description": "Trusted principal onboarding status; never supplied by an agent or self-declared representative. Identity verification and spending authority remain separate checks."
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    },
    "updated_at": {
      "type": "string",
      "format": "date-time"
    },
    "identity_verification_status": {
      "$ref": "#/components/schemas/PrincipalVerificationStatus"
    }
  },
  "oneOf": [
    {
      "properties": {
        "principal_type": {
          "const": "INDIVIDUAL"
        }
      },
      "required": [
        "individual"
      ],
      "not": {
        "required": [
          "business"
        ]
      }
    },
    {
      "properties": {
        "principal_type": {
          "const": "BUSINESS"
        }
      },
      "required": [
        "business"
      ],
      "not": {
        "required": [
          "individual"
        ]
      }
    }
  ]
}

BindPrincipalRequest

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

BindPrincipalRequest fields
FieldPresenceDefinition
agent_idrequired{"type": "string", "example": "agt_123"}
consent_acknowledgedrequired{"type": "boolean", "const": true, "description": "UX acknowledgment; not standalone proof. The trusted principal session and consent record are verified server-side."}

UX acknowledgment; not standalone proof. The trusted principal session and consent record are verified server-side.

requested_binding_labeloptional{"type": "string", "description": "Friendly label visible to principal"}

Friendly label visible to principal

Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "agent_id",
    "consent_acknowledged"
  ],
  "properties": {
    "agent_id": {
      "type": "string",
      "example": "agt_123"
    },
    "consent_acknowledged": {
      "type": "boolean",
      "const": true,
      "description": "UX acknowledgment; not standalone proof. The trusted principal session and consent record are verified server-side."
    },
    "requested_binding_label": {
      "type": "string",
      "description": "Friendly label visible to principal"
    }
  }
}

PrincipalBinding

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

PrincipalBinding fields
FieldPresenceDefinition
binding_idrequired{"type": "string", "example": "bnd_123"}
principal_idrequired{"type": "string"}
principal_typerequiredPrincipalType
agent_idrequired{"type": "string"}
principal_referencerequired{"type": "string", "description": "Opaque, agent-scoped pseudonymous identifier usable in POST /intents"}

Opaque, agent-scoped pseudonymous identifier usable in POST /intents

statusrequired{"type": "string", "enum": ["ACTIVE", "REVOKED", "SUSPENDED"]}
binding_labeloptional{"type": "string"}
consent_evidence_idoptional{"type": "string"}
bound_atrequired{"type": "string", "format": "date-time"}
revoked_atoptional{"type": "string", "format": "date-time"}
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "binding_id",
    "principal_id",
    "principal_type",
    "agent_id",
    "principal_reference",
    "status",
    "bound_at"
  ],
  "properties": {
    "binding_id": {
      "type": "string",
      "example": "bnd_123"
    },
    "principal_id": {
      "type": "string"
    },
    "principal_type": {
      "$ref": "#/components/schemas/PrincipalType",
      "readOnly": true
    },
    "agent_id": {
      "type": "string"
    },
    "principal_reference": {
      "type": "string",
      "description": "Opaque, agent-scoped pseudonymous identifier usable in POST /intents"
    },
    "status": {
      "type": "string",
      "enum": [
        "ACTIVE",
        "REVOKED",
        "SUSPENDED"
      ]
    },
    "binding_label": {
      "type": "string"
    },
    "consent_evidence_id": {
      "type": "string"
    },
    "bound_at": {
      "type": "string",
      "format": "date-time"
    },
    "revoked_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}

PrincipalBindingList

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

PrincipalBindingList fields
FieldPresenceDefinition
datarequired{"type": "array", "items": {"$ref": "#/components/schemas/PrincipalBinding"}}
pagerequiredPageInfo
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "required": [
    "data",
    "page"
  ],
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/PrincipalBinding"
      }
    },
    "page": {
      "$ref": "#/components/schemas/PageInfo"
    }
  }
}

Money

Decimal string to avoid floating point rounding. Enforce ISO 4217 minor-unit precision at runtime (not every currency has two decimal places).

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

Money fields
FieldPresenceDefinition
valuerequired{"type": "string", "pattern": "^(0|[1-9][0-9]*)(\\.[0-9]+)?$", "example": "44.50"}
currencyrequired{"type": "string", "pattern": "^[A-Z]{3}$", "example": "EUR"}
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "value",
    "currency"
  ],
  "description": "Decimal string to avoid floating point rounding. Enforce ISO 4217 minor-unit precision at runtime (not every currency has two decimal places).",
  "properties": {
    "value": {
      "type": "string",
      "pattern": "^(0|[1-9][0-9]*)(\\.[0-9]+)?$",
      "example": "44.50"
    },
    "currency": {
      "type": "string",
      "pattern": "^[A-Z]{3}$",
      "example": "EUR"
    }
  }
}

Merchant

Agent-declared merchant attributes; verified MID/acquirer fields may differ at issuer authorization time.

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

Merchant fields
FieldPresenceDefinition
namerequired{"type": "string"}
domainrequired{"type": "string", "example": "books.example"}
website_urloptional{"type": "string", "format": "uri"}
merchant_referenceoptional{"type": "string", "description": "Merchant-provided commerce-system reference"}

Merchant-provided commerce-system reference

merchant_idoptional{"type": "string", "description": "Acquirer/PSP MID if known; not assumed trustworthy"}

Acquirer/PSP MID if known; not assumed trustworthy

descriptoroptional{"type": "string", "description": "Anticipated card statement descriptor if known"}

Anticipated card statement descriptor if known

acquirer_idoptional{"type": "string"}
mccoptional{"type": "string", "pattern": "^[0-9]{4}$"}
countryoptional{"type": "string", "pattern": "^[A-Z]{2}$"}
addressoptionalAddress
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "name",
    "domain"
  ],
  "description": "Agent-declared merchant attributes; verified MID/acquirer fields may differ at issuer authorization time.",
  "properties": {
    "name": {
      "type": "string"
    },
    "domain": {
      "type": "string",
      "example": "books.example"
    },
    "website_url": {
      "type": "string",
      "format": "uri"
    },
    "merchant_reference": {
      "type": "string",
      "description": "Merchant-provided commerce-system reference"
    },
    "merchant_id": {
      "type": "string",
      "description": "Acquirer/PSP MID if known; not assumed trustworthy"
    },
    "descriptor": {
      "type": "string",
      "description": "Anticipated card statement descriptor if known"
    },
    "acquirer_id": {
      "type": "string"
    },
    "mcc": {
      "type": "string",
      "pattern": "^[0-9]{4}$"
    },
    "country": {
      "type": "string",
      "pattern": "^[A-Z]{2}$"
    },
    "address": {
      "$ref": "#/components/schemas/Address"
    }
  }
}

CartItem

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

CartItem fields
FieldPresenceDefinition
skuoptional{"type": "string"}
merchant_product_idoptional{"type": "string"}
titlerequired{"type": "string", "minLength": 1}
descriptionoptional{"type": "string"}
product_urloptional{"type": "string", "format": "uri"}
categoryoptional{"type": "string"}
kindoptional{"type": "string", "enum": ["PHYSICAL", "DIGITAL", "SERVICE", "SUBSCRIPTION", "OTHER"]}
quantityrequired{"type": "integer", "minimum": 1}
unit_pricerequiredMoney
line_totalrequiredMoney
tax_amountoptionalMoney
attributesoptional{"type": "object", "additionalProperties": {"type": "string"}}
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "title",
    "quantity",
    "unit_price",
    "line_total"
  ],
  "properties": {
    "sku": {
      "type": "string"
    },
    "merchant_product_id": {
      "type": "string"
    },
    "title": {
      "type": "string",
      "minLength": 1
    },
    "description": {
      "type": "string"
    },
    "product_url": {
      "type": "string",
      "format": "uri"
    },
    "category": {
      "type": "string"
    },
    "kind": {
      "type": "string",
      "enum": [
        "PHYSICAL",
        "DIGITAL",
        "SERVICE",
        "SUBSCRIPTION",
        "OTHER"
      ]
    },
    "quantity": {
      "type": "integer",
      "minimum": 1
    },
    "unit_price": {
      "$ref": "#/components/schemas/Money"
    },
    "line_total": {
      "$ref": "#/components/schemas/Money"
    },
    "tax_amount": {
      "$ref": "#/components/schemas/Money"
    },
    "attributes": {
      "type": "object",
      "additionalProperties": {
        "type": "string"
      }
    }
  }
}

Cart

Verify arithmetic across items and totals server-side. Do not accept agent-provided totals at face value.

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

Cart fields
FieldPresenceDefinition
itemsrequired{"type": "array", "minItems": 1, "items": {"$ref": "#/components/schemas/CartItem"}}
subtotalrequiredMoney
tax_totalrequiredMoney
shipping_totalrequiredMoney
discount_totalrequiredMoney
totalrequiredMoney
coupon_codeoptional{"type": "string"}
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "items",
    "subtotal",
    "tax_total",
    "shipping_total",
    "discount_total",
    "total"
  ],
  "description": "Verify arithmetic across items and totals server-side. Do not accept agent-provided totals at face value.",
  "properties": {
    "items": {
      "type": "array",
      "minItems": 1,
      "items": {
        "$ref": "#/components/schemas/CartItem"
      }
    },
    "subtotal": {
      "$ref": "#/components/schemas/Money"
    },
    "tax_total": {
      "$ref": "#/components/schemas/Money"
    },
    "shipping_total": {
      "$ref": "#/components/schemas/Money"
    },
    "discount_total": {
      "$ref": "#/components/schemas/Money"
    },
    "total": {
      "$ref": "#/components/schemas/Money"
    },
    "coupon_code": {
      "type": "string"
    }
  }
}

BillingDetails

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

BillingDetails fields
FieldPresenceDefinition
namerequired{"type": "string"}
emailoptional{"type": "string", "format": "email"}
phoneoptional{"type": "string"}
addressrequiredAddress
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "name",
    "address"
  ],
  "properties": {
    "name": {
      "type": "string"
    },
    "email": {
      "type": "string",
      "format": "email"
    },
    "phone": {
      "type": "string"
    },
    "address": {
      "$ref": "#/components/schemas/Address"
    }
  }
}

ShippingDetails

Contains sensitive principal information; may be absent for digital or pickup orders. Not reliably observable from standard card authorization.

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

ShippingDetails fields
FieldPresenceDefinition
recipient_namerequired{"type": "string"}
recipient_emailoptional{"type": "string", "format": "email"}
recipient_phoneoptional{"type": "string"}
addressrequiredAddress
methodoptional{"type": "string", "example": "STANDARD"}
carrieroptional{"type": "string"}
pickup_location_referenceoptional{"type": "string"}
delivery_instructionsoptional{"type": "string"}
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "recipient_name",
    "address"
  ],
  "description": "Contains sensitive principal information; may be absent for digital or pickup orders. Not reliably observable from standard card authorization.",
  "properties": {
    "recipient_name": {
      "type": "string"
    },
    "recipient_email": {
      "type": "string",
      "format": "email"
    },
    "recipient_phone": {
      "type": "string"
    },
    "address": {
      "$ref": "#/components/schemas/Address"
    },
    "method": {
      "type": "string",
      "example": "STANDARD"
    },
    "carrier": {
      "type": "string"
    },
    "pickup_location_reference": {
      "type": "string"
    },
    "delivery_instructions": {
      "type": "string"
    }
  }
}

PSPDetails

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

PSPDetails fields
FieldPresenceDefinition
nameoptional{"type": "string", "example": "Example PSP"}
merchant_psp_idoptional{"type": "string"}
psp_transaction_referenceoptional{"type": "string"}
payment_page_urloptional{"type": "string", "format": "uri", "description": "Agent-observed PSP checkout URL, not available in normal issuer auth"}

Agent-observed PSP checkout URL, not available in normal issuer auth

api_originoptional{"type": "string", "format": "uri"}
flow_referenceoptional{"type": "string"}
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "name": {
      "type": "string",
      "example": "Example PSP"
    },
    "merchant_psp_id": {
      "type": "string"
    },
    "psp_transaction_reference": {
      "type": "string"
    },
    "payment_page_url": {
      "type": "string",
      "format": "uri",
      "description": "Agent-observed PSP checkout URL, not available in normal issuer auth"
    },
    "api_origin": {
      "type": "string",
      "format": "uri"
    },
    "flow_reference": {
      "type": "string"
    }
  }
}

Checkout

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

Checkout fields
FieldPresenceDefinition
moderequired{"type": "string", "enum": ["AGENTIC", "CLASSIC"], "description": "Agentic-compatible protocol checkout vs ordinary merchant web/PSP checkout."}

Agentic-compatible protocol checkout vs ordinary merchant web/PSP checkout.

merchant_checkout_urlrequired{"type": "string", "format": "uri"}
cart_urloptional{"type": "string", "format": "uri"}
merchant_order_referenceoptional{"type": "string"}
checkout_session_idoptional{"type": "string"}
pspoptionalPSPDetails
agentic_protocoloptional{"type": "string", "example": "AP2", "description": "Optional declared protocol label; not proof of compliance"}

Optional declared protocol label; not proof of compliance

requested_payment_methodsoptional{"type": "array", "items": {"type": "string", "enum": ["CARD", "NETWORK_AGENTIC_TOKEN", "OTHER"]}}
three_ds_expectedoptional{"type": "boolean", "description": "Informational only; actual 3DS is issuer/PSP controlled"}

Informational only; actual 3DS is issuer/PSP controlled

callback_urloptional{"type": "string", "format": "uri", "description": "Pre-authorized webhook/callback target only; must be allowlisted"}

Pre-authorized webhook/callback target only; must be allowlisted

Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "mode",
    "merchant_checkout_url"
  ],
  "properties": {
    "mode": {
      "type": "string",
      "enum": [
        "AGENTIC",
        "CLASSIC"
      ],
      "description": "Agentic-compatible protocol checkout vs ordinary merchant web/PSP checkout."
    },
    "merchant_checkout_url": {
      "type": "string",
      "format": "uri"
    },
    "cart_url": {
      "type": "string",
      "format": "uri"
    },
    "merchant_order_reference": {
      "type": "string"
    },
    "checkout_session_id": {
      "type": "string"
    },
    "psp": {
      "$ref": "#/components/schemas/PSPDetails"
    },
    "agentic_protocol": {
      "type": "string",
      "example": "AP2",
      "description": "Optional declared protocol label; not proof of compliance"
    },
    "requested_payment_methods": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "CARD",
          "NETWORK_AGENTIC_TOKEN",
          "OTHER"
        ]
      }
    },
    "three_ds_expected": {
      "type": "boolean",
      "description": "Informational only; actual 3DS is issuer/PSP controlled"
    },
    "callback_url": {
      "type": "string",
      "format": "uri",
      "description": "Pre-authorized webhook/callback target only; must be allowlisted"
    }
  }
}

IntentConstraints

Proposed limits can only narrow a separately trusted principal authorization, never expand it.

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

IntentConstraints fields
FieldPresenceDefinition
amount_maxrequiredMoney
max_authorizationsrequired{"type": "integer", "minimum": 1, "default": 1}
valid_fromoptional{"type": "string", "format": "date-time"}
valid_untilrequired{"type": "string", "format": "date-time"}
merchant_domainsoptional{"type": "array", "items": {"type": "string"}}
merchant_idsoptional{"type": "array", "items": {"type": "string"}}
mcc_allowoptional{"type": "array", "items": {"type": "string", "pattern": "^[0-9]{4}$"}}
country_allowoptional{"type": "array", "items": {"type": "string", "pattern": "^[A-Z]{2}$"}}
item_category_allowoptional{"type": "array", "items": {"type": "string"}}
require_exact_shipping_address_matchoptional{"type": "boolean", "description": "Can only be enforced if authenticated checkout evidence exists; not from typical card authorization"}

Can only be enforced if authenticated checkout evidence exists; not from typical card authorization

require_exact_products_matchoptional{"type": "boolean", "description": "Can only be enforced if authenticated checkout evidence exists; not from typical card authorization"}

Can only be enforced if authenticated checkout evidence exists; not from typical card authorization

Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "amount_max",
    "valid_until",
    "max_authorizations"
  ],
  "description": "Proposed limits can only narrow a separately trusted principal authorization, never expand it.",
  "properties": {
    "amount_max": {
      "$ref": "#/components/schemas/Money"
    },
    "max_authorizations": {
      "type": "integer",
      "minimum": 1,
      "default": 1
    },
    "valid_from": {
      "type": "string",
      "format": "date-time"
    },
    "valid_until": {
      "type": "string",
      "format": "date-time"
    },
    "merchant_domains": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "merchant_ids": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "mcc_allow": {
      "type": "array",
      "items": {
        "type": "string",
        "pattern": "^[0-9]{4}$"
      }
    },
    "country_allow": {
      "type": "array",
      "items": {
        "type": "string",
        "pattern": "^[A-Z]{2}$"
      }
    },
    "item_category_allow": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "require_exact_shipping_address_match": {
      "type": "boolean",
      "description": "Can only be enforced if authenticated checkout evidence exists; not from typical card authorization"
    },
    "require_exact_products_match": {
      "type": "boolean",
      "description": "Can only be enforced if authenticated checkout evidence exists; not from typical card authorization"
    }
  }
}

AuthorizationReference

Reference to trusted principal authorization. References supplied by agents must be resolved server-side; self-asserted approvals are not valid.

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

AuthorizationReference fields
FieldPresenceDefinition
mandate_referenceoptional{"type": "string", "description": "Existing bank or AP2-style mandate, if supported"}

Existing bank or AP2-style mandate, if supported

consent_referenceoptional{"type": "string", "description": "Agent Pay-approved specific principal consent, if available"}

Agent Pay-approved specific principal consent, if available

principal_approval_contextoptional{"type": "string", "description": "Non-authoritative human-readable explanation shown to principal"}

Non-authoritative human-readable explanation shown to principal

Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "description": "Reference to trusted principal authorization. References supplied by agents must be resolved server-side; self-asserted approvals are not valid.",
  "properties": {
    "mandate_reference": {
      "type": "string",
      "description": "Existing bank or AP2-style mandate, if supported"
    },
    "consent_reference": {
      "type": "string",
      "description": "Agent Pay-approved specific principal consent, if available"
    },
    "principal_approval_context": {
      "type": "string",
      "description": "Non-authoritative human-readable explanation shown to principal"
    }
  }
}

EvidenceReference

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

EvidenceReference fields
FieldPresenceDefinition
typerequired{"type": "string", "enum": ["MERCHANT_SIGNED_CART", "CHECKOUT_SESSION", "CART_HASH", "AP2_MANDATE", "PSP_SESSION", "OTHER"]}
referencerequired{"type": "string", "description": "Opaque reference or pre-registered evidence URI; content fetched and authenticated by trusted integrations"}

Opaque reference or pre-registered evidence URI; content fetched and authenticated by trusted integrations

digestoptional{"type": "string", "description": "Optional sha256 digest; digest alone does not prove source authenticity"}

Optional sha256 digest; digest alone does not prove source authenticity

issueroptional{"type": "string", "description": "Claimed issuer of evidence; must be independently verified"}

Claimed issuer of evidence; must be independently verified

Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "type",
    "reference"
  ],
  "properties": {
    "type": {
      "type": "string",
      "enum": [
        "MERCHANT_SIGNED_CART",
        "CHECKOUT_SESSION",
        "CART_HASH",
        "AP2_MANDATE",
        "PSP_SESSION",
        "OTHER"
      ]
    },
    "reference": {
      "type": "string",
      "description": "Opaque reference or pre-registered evidence URI; content fetched and authenticated by trusted integrations"
    },
    "digest": {
      "type": "string",
      "description": "Optional sha256 digest; digest alone does not prove source authenticity"
    },
    "issuer": {
      "type": "string",
      "description": "Claimed issuer of evidence; must be independently verified"
    }
  }
}

CreateIntentRequest

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

CreateIntentRequest fields
FieldPresenceDefinition
principal_referencerequired{"type": "string", "description": "Agent-scoped identifier from principal binding, not arbitrary principal account ID"}

Agent-scoped identifier from principal binding, not arbitrary principal account ID

binding_idrequired{"type": "string"}
purposerequired{"type": "string", "minLength": 1, "maxLength": 2000}
merchantrequiredMerchant
cartrequiredCart
billingoptionalBillingDetails
shippingoptionalShippingDetails
checkoutrequiredCheckout
requested_constraintsrequiredIntentConstraints
authorization_referenceoptionalAuthorizationReference
supporting_evidenceoptional{"type": "array", "items": {"$ref": "#/components/schemas/EvidenceReference"}}
metadataoptional{"type": "object", "description": "Non-authoritative agent-provided metadata; never used directly as an authorization rule.", "additionalProperties": {"type": "string"}}

Non-authoritative agent-provided metadata; never used directly as an authorization rule.

Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "principal_reference",
    "binding_id",
    "purpose",
    "merchant",
    "cart",
    "checkout",
    "requested_constraints"
  ],
  "properties": {
    "principal_reference": {
      "type": "string",
      "description": "Agent-scoped identifier from principal binding, not arbitrary principal account ID"
    },
    "binding_id": {
      "type": "string"
    },
    "purpose": {
      "type": "string",
      "minLength": 1,
      "maxLength": 2000
    },
    "merchant": {
      "$ref": "#/components/schemas/Merchant"
    },
    "cart": {
      "$ref": "#/components/schemas/Cart"
    },
    "billing": {
      "$ref": "#/components/schemas/BillingDetails"
    },
    "shipping": {
      "$ref": "#/components/schemas/ShippingDetails"
    },
    "checkout": {
      "$ref": "#/components/schemas/Checkout"
    },
    "requested_constraints": {
      "$ref": "#/components/schemas/IntentConstraints"
    },
    "authorization_reference": {
      "$ref": "#/components/schemas/AuthorizationReference"
    },
    "supporting_evidence": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/EvidenceReference"
      }
    },
    "metadata": {
      "type": "object",
      "description": "Non-authoritative agent-provided metadata; never used directly as an authorization rule.",
      "additionalProperties": {
        "type": "string"
      }
    }
  }
}

IntentStatus

Full JSON Schema definition
Full JSON Schema definition
{
  "type": "string",
  "enum": [
    "DRAFT",
    "CHANGES_REQUESTED",
    "STEP_UP_REQUIRED",
    "VERIFIED",
    "DECLINED",
    "EXPIRED",
    "CONSUMED",
    "REVOKED"
  ]
}

Intent

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

Intent fields
FieldPresenceDefinition
intent_idrequired{"type": "string", "example": "int_123"}
agent_idrequired{"type": "string", "description": "From authenticated agent token"}

From authenticated agent token

principal_referencerequired{"type": "string"}
binding_idrequired{"type": "string"}
statusrequiredIntentStatus
purchaserequiredCreateIntentRequest
verificationoptionalIntentVerification
snapshot_versionoptional{"type": "integer", "minimum": 1}
created_atrequired{"type": "string", "format": "date-time"}
updated_atrequired{"type": "string", "format": "date-time"}
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "intent_id",
    "agent_id",
    "principal_reference",
    "binding_id",
    "status",
    "purchase",
    "created_at",
    "updated_at"
  ],
  "properties": {
    "intent_id": {
      "type": "string",
      "example": "int_123"
    },
    "agent_id": {
      "type": "string",
      "description": "From authenticated agent token"
    },
    "principal_reference": {
      "type": "string"
    },
    "binding_id": {
      "type": "string"
    },
    "status": {
      "$ref": "#/components/schemas/IntentStatus"
    },
    "purchase": {
      "$ref": "#/components/schemas/CreateIntentRequest"
    },
    "verification": {
      "$ref": "#/components/schemas/IntentVerification"
    },
    "snapshot_version": {
      "type": "integer",
      "minimum": 1
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    },
    "updated_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}

IntentList

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

IntentList fields
FieldPresenceDefinition
datarequired{"type": "array", "items": {"$ref": "#/components/schemas/Intent"}}
pagerequiredPageInfo
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "required": [
    "data",
    "page"
  ],
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/Intent"
      }
    },
    "page": {
      "$ref": "#/components/schemas/PageInfo"
    }
  }
}

VerifyIntentRequest

Optional request to rerun verification after principal approval or supporting evidence has changed.

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

VerifyIntentRequest fields
FieldPresenceDefinition
evidence_referencesoptional{"type": "array", "items": {"$ref": "#/components/schemas/EvidenceReference"}}
noteoptional{"type": "string", "maxLength": 500}
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "description": "Optional request to rerun verification after principal approval or supporting evidence has changed.",
  "properties": {
    "evidence_references": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/EvidenceReference"
      }
    },
    "note": {
      "type": "string",
      "maxLength": 500
    }
  }
}

PrincipalAction

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

PrincipalAction fields
FieldPresenceDefinition
authorization_urlrequired{"type": "string", "format": "uri", "description": "Hosted HTTPS principal/bank approval page for the individual or authorized business representative; agent may display but cannot approve"}

Hosted HTTPS principal/bank approval page for the individual or authorized business representative; agent may display but cannot approve

expires_atrequired{"type": "string", "format": "date-time"}
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "authorization_url",
    "expires_at"
  ],
  "properties": {
    "authorization_url": {
      "type": "string",
      "format": "uri",
      "description": "Hosted HTTPS principal/bank approval page for the individual or authorized business representative; agent may display but cannot approve"
    },
    "expires_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}

IntentVerification

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

IntentVerification fields
FieldPresenceDefinition
verification_idrequired{"type": "string"}
intent_idrequired{"type": "string"}
decisionrequired{"type": "string", "enum": ["APPROVED", "STEP_UP_REQUIRED", "DECLINED"]}
intent_statusrequiredIntentStatus
policy_versionrequired{"type": "string"}
reason_codesrequired{"type": "array", "items": {"type": "string"}}
principal_actionoptionalPrincipalAction
verified_snapshot_hashoptional{"type": "string", "description": "Server-generated digest of canonical immutable approved purchase snapshot"}

Server-generated digest of canonical immutable approved purchase snapshot

checked_evidenceoptional{"type": "array", "items": {"$ref": "#/components/schemas/EvidenceAssessment"}}
evidence_idrequired{"type": "string"}
verified_atoptional{"type": "string", "format": "date-time"}
expires_atoptional{"type": "string", "format": "date-time"}
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "verification_id",
    "intent_id",
    "decision",
    "intent_status",
    "policy_version",
    "reason_codes",
    "evidence_id"
  ],
  "properties": {
    "verification_id": {
      "type": "string"
    },
    "intent_id": {
      "type": "string"
    },
    "decision": {
      "type": "string",
      "enum": [
        "APPROVED",
        "STEP_UP_REQUIRED",
        "DECLINED"
      ]
    },
    "intent_status": {
      "$ref": "#/components/schemas/IntentStatus"
    },
    "policy_version": {
      "type": "string"
    },
    "reason_codes": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "principal_action": {
      "$ref": "#/components/schemas/PrincipalAction"
    },
    "verified_snapshot_hash": {
      "type": "string",
      "description": "Server-generated digest of canonical immutable approved purchase snapshot"
    },
    "checked_evidence": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/EvidenceAssessment"
      }
    },
    "evidence_id": {
      "type": "string"
    },
    "verified_at": {
      "type": "string",
      "format": "date-time"
    },
    "expires_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}

EvidenceAssessment

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

EvidenceAssessment fields
FieldPresenceDefinition
field_grouprequired{"type": "string", "enum": ["MERCHANT", "CART", "BILLING", "SHIPPING", "CHECKOUT", "PRINCIPAL_CONSENT", "OTHER"]}
assurancerequired{"type": "string", "enum": ["DECLARED_ONLY", "MATCHED_TO_TRUSTED_SOURCE", "CRYPTOGRAPHICALLY_VERIFIED", "UNAVAILABLE"]}
source_referenceoptional{"type": "string"}
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "field_group",
    "assurance"
  ],
  "properties": {
    "field_group": {
      "type": "string",
      "enum": [
        "MERCHANT",
        "CART",
        "BILLING",
        "SHIPPING",
        "CHECKOUT",
        "PRINCIPAL_CONSENT",
        "OTHER"
      ]
    },
    "assurance": {
      "type": "string",
      "enum": [
        "DECLARED_ONLY",
        "MATCHED_TO_TRUSTED_SOURCE",
        "CRYPTOGRAPHICALLY_VERIFIED",
        "UNAVAILABLE"
      ]
    },
    "source_reference": {
      "type": "string"
    }
  }
}

PaymentRail

Full JSON Schema definition
Full JSON Schema definition
{
  "type": "string",
  "enum": [
    "AUTO",
    "VISA_AGENTIC",
    "MASTERCARD_AGENTIC",
    "EPHEMERAL_CARD"
  ]
}

RequestPaymentCapability

No TTL field; issuance window is system-controlled.

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

RequestPaymentCapability fields
FieldPresenceDefinition
requested_railoptional{"allOf": [{"$ref": "#/components/schemas/PaymentRail"}], "default": "AUTO", "description": "Optional preference, actual rail determined by Agent Pay policy and availability."}

Optional preference, actual rail determined by Agent Pay policy and availability.

Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "requested_rail": {
      "allOf": [
        {
          "$ref": "#/components/schemas/PaymentRail"
        }
      ],
      "default": "AUTO",
      "description": "Optional preference, actual rail determined by Agent Pay policy and availability."
    }
  },
  "description": "No TTL field; issuance window is system-controlled."
}

PaymentStatus

Full JSON Schema definition
Full JSON Schema definition
{
  "type": "string",
  "enum": [
    "CREATED",
    "STEP_UP_REQUIRED",
    "DECLINED",
    "CREDENTIAL_ISSUED",
    "AUTHORIZATION_PENDING",
    "AUTHORIZED",
    "CAPTURED",
    "SETTLED",
    "EXPIRED",
    "CANCELLED",
    "REVERSED",
    "REFUND_PENDING",
    "REFUNDED",
    "FAILED",
    "OUTCOME_UNKNOWN"
  ]
}

CheckoutHandoff

Short-lived opaque credential broker handoff, never reusable PAN/CVV. Secure handoff is limited to authorized execution origin.

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

CheckoutHandoff fields
FieldPresenceDefinition
typerequired{"type": "string", "enum": ["BROKERED_CHECKOUT_TOKEN", "NETWORK_AGENTIC_TOKEN_REFERENCE"]}
referencerequired{"type": "string"}
expires_atoptional{"type": "string", "format": "date-time"}
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "type",
    "reference"
  ],
  "description": "Short-lived opaque credential broker handoff, never reusable PAN/CVV. Secure handoff is limited to authorized execution origin.",
  "properties": {
    "type": {
      "type": "string",
      "enum": [
        "BROKERED_CHECKOUT_TOKEN",
        "NETWORK_AGENTIC_TOKEN_REFERENCE"
      ]
    },
    "reference": {
      "type": "string"
    },
    "expires_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}

Payment

Card metadata is redacted. Only token_id (if scope permits) and PAN last4 may be exposed. No PAN, CVV, expiry or cardholder name on GET. One-use virtual card credentials are emitted only on initial POST /pay. Issuer outcomes must be processor-confirmed.

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

Payment fields
FieldPresenceDefinition
payment_idrequired{"type": "string", "example": "pay_123"}
intent_idrequired{"type": "string"}
correlation_idrequired{"type": "string"}
statusrequiredPaymentStatus
decisionrequired{"type": "string", "enum": ["APPROVED", "STEP_UP_REQUIRED", "DECLINED"]}
amountrequiredMoney
railoptional{"type": "string", "enum": ["VISA_AGENTIC", "MASTERCARD_AGENTIC", "EPHEMERAL_CARD"]}
capability_idoptional{"type": "string"}
capability_expires_atoptional{"type": "string", "format": "date-time"}
checkout_handoffoptionalCheckoutHandoff
issuer_authorization_referenceoptional{"type": "string", "description": "Issuer-originated authorization outcome reference"}

Issuer-originated authorization outcome reference

merchant_order_referenceoptional{"type": "string", "description": "Merchant-confirmed only if provenance authenticated; otherwise agent-declared"}

Merchant-confirmed only if provenance authenticated; otherwise agent-declared

funding_statusoptional{"type": "string", "enum": ["NOT_APPLICABLE", "PENDING", "FUNDED", "RESERVED", "RELEASED", "FAILED"], "description": "Optional rail-specific funding, not implied by capability issuance"}

Optional rail-specific funding, not implied by capability issuance

reason_codesoptional{"type": "array", "items": {"type": "string"}}
evidence_idoptional{"type": "string"}
created_atrequired{"type": "string", "format": "date-time"}
updated_atrequired{"type": "string", "format": "date-time"}
cardoptionalRedactedCard
credential_idoptional{"type": "string", "description": "Internal public opaque identifier, maps issuer processor card to intent server-side"}

Internal public opaque identifier, maps issuer processor card to intent server-side

processor_match_statusoptional{"type": "string", "enum": ["NOT_SEEN", "MATCHED", "MISMATCHED", "REVIEW_REQUIRED"]}
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "payment_id",
    "intent_id",
    "status",
    "decision",
    "amount",
    "correlation_id",
    "created_at",
    "updated_at"
  ],
  "properties": {
    "payment_id": {
      "type": "string",
      "example": "pay_123"
    },
    "intent_id": {
      "type": "string"
    },
    "correlation_id": {
      "type": "string"
    },
    "status": {
      "$ref": "#/components/schemas/PaymentStatus"
    },
    "decision": {
      "type": "string",
      "enum": [
        "APPROVED",
        "STEP_UP_REQUIRED",
        "DECLINED"
      ]
    },
    "amount": {
      "$ref": "#/components/schemas/Money"
    },
    "rail": {
      "type": "string",
      "enum": [
        "VISA_AGENTIC",
        "MASTERCARD_AGENTIC",
        "EPHEMERAL_CARD"
      ]
    },
    "capability_id": {
      "type": "string"
    },
    "capability_expires_at": {
      "type": "string",
      "format": "date-time"
    },
    "checkout_handoff": {
      "$ref": "#/components/schemas/CheckoutHandoff"
    },
    "issuer_authorization_reference": {
      "type": "string",
      "description": "Issuer-originated authorization outcome reference"
    },
    "merchant_order_reference": {
      "type": "string",
      "description": "Merchant-confirmed only if provenance authenticated; otherwise agent-declared"
    },
    "funding_status": {
      "type": "string",
      "enum": [
        "NOT_APPLICABLE",
        "PENDING",
        "FUNDED",
        "RESERVED",
        "RELEASED",
        "FAILED"
      ],
      "description": "Optional rail-specific funding, not implied by capability issuance"
    },
    "reason_codes": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "evidence_id": {
      "type": "string"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    },
    "updated_at": {
      "type": "string",
      "format": "date-time"
    },
    "card": {
      "$ref": "#/components/schemas/RedactedCard"
    },
    "credential_id": {
      "type": "string",
      "description": "Internal public opaque identifier, maps issuer processor card to intent server-side"
    },
    "processor_match_status": {
      "type": "string",
      "enum": [
        "NOT_SEEN",
        "MATCHED",
        "MISMATCHED",
        "REVIEW_REQUIRED"
      ]
    }
  },
  "description": "Card metadata is redacted. Only token_id (if scope permits) and PAN last4 may be exposed. No PAN, CVV, expiry or cardholder name on GET. One-use virtual card credentials are emitted only on initial POST /pay. Issuer outcomes must be processor-confirmed."
}

PaymentList

Legacy detailed list retained for compatibility; GET /pay now returns PaymentSummaryList.

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

PaymentList fields
FieldPresenceDefinition
datarequired{"type": "array", "items": {"$ref": "#/components/schemas/Payment"}}
pagerequiredPageInfo
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "required": [
    "data",
    "page"
  ],
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/Payment"
      }
    },
    "page": {
      "$ref": "#/components/schemas/PageInfo"
    }
  },
  "description": "Legacy detailed list retained for compatibility; GET /pay now returns PaymentSummaryList."
}

ReversePaymentRequest

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

ReversePaymentRequest fields
FieldPresenceDefinition
requested_actionrequired{"type": "string", "enum": ["CANCEL_UNUSED_CAPABILITY", "AUTHORIZATION_REVERSAL", "REFUND_REQUEST"], "description": "Explicitly distinguishes cancellation, auth reversal and captured transaction refund."}

Explicitly distinguishes cancellation, auth reversal and captured transaction refund.

reasonrequired{"type": "string", "enum": ["PRINCIPAL_REQUEST", "DUPLICATE", "MERCHANT_CANCELLED", "ERROR", "SUSPECTED_FRAUD", "OTHER"]}
reason_detailoptional{"type": "string", "maxLength": 500}
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "requested_action",
    "reason"
  ],
  "properties": {
    "requested_action": {
      "type": "string",
      "enum": [
        "CANCEL_UNUSED_CAPABILITY",
        "AUTHORIZATION_REVERSAL",
        "REFUND_REQUEST"
      ],
      "description": "Explicitly distinguishes cancellation, auth reversal and captured transaction refund."
    },
    "reason": {
      "type": "string",
      "enum": [
        "PRINCIPAL_REQUEST",
        "DUPLICATE",
        "MERCHANT_CANCELLED",
        "ERROR",
        "SUSPECTED_FRAUD",
        "OTHER"
      ]
    },
    "reason_detail": {
      "type": "string",
      "maxLength": 500
    }
  }
}

ReversalOperation

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

ReversalOperation fields
FieldPresenceDefinition
operation_idrequired{"type": "string"}
payment_idrequired{"type": "string"}
requested_actionrequired{"type": "string", "enum": ["CANCEL_UNUSED_CAPABILITY", "AUTHORIZATION_REVERSAL", "REFUND_REQUEST"]}
statusrequired{"type": "string", "enum": ["PENDING", "COMPLETED", "REJECTED", "FAILED"]}
reason_codesoptional{"type": "array", "items": {"type": "string"}}
requested_atrequired{"type": "string", "format": "date-time"}
completed_atoptional{"type": "string", "format": "date-time"}
processor_referenceoptional{"type": "string"}
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "operation_id",
    "payment_id",
    "requested_action",
    "status",
    "requested_at"
  ],
  "properties": {
    "operation_id": {
      "type": "string"
    },
    "payment_id": {
      "type": "string"
    },
    "requested_action": {
      "type": "string",
      "enum": [
        "CANCEL_UNUSED_CAPABILITY",
        "AUTHORIZATION_REVERSAL",
        "REFUND_REQUEST"
      ]
    },
    "status": {
      "type": "string",
      "enum": [
        "PENDING",
        "COMPLETED",
        "REJECTED",
        "FAILED"
      ]
    },
    "reason_codes": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "requested_at": {
      "type": "string",
      "format": "date-time"
    },
    "completed_at": {
      "type": "string",
      "format": "date-time"
    },
    "processor_reference": {
      "type": "string"
    }
  }
}

IssuerAuthorizationEvent

The issuer sends its actually available authorization data only; do not invent billing/shipping or product fields. Merchant MID and descriptor matching may need acquirer mappings. Missing mandatory context follows bank-agreed fail-closed rules.

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

IssuerAuthorizationEvent fields
FieldPresenceDefinition
issuer_event_idrequired{"type": "string", "description": "Unique issuer/processor event for deduplication"}

Unique issuer/processor event for deduplication

processor_card_idconditional{"type": "string", "description": "Issuer-processor internal card ID; preferred stable one-attempt-to-one-intent lookup for disposable cards; never a PAN"}

Issuer-processor internal card ID; preferred stable one-attempt-to-one-intent lookup for disposable cards; never a PAN

credential_referenceconditional{"type": "string", "description": "Fallback opaque issuer network-token or card reference when processor_card_id is not supplied; NOT gateway token ID"}

Fallback opaque issuer network-token or card reference when processor_card_id is not supplied; NOT gateway token ID

amountrequiredMoney
merchantrequired{"type": "object", "additionalProperties": false, "required": ["descriptor"], "properties": {"descriptor": {"type": "string"}, "merchant_id": {"type": "string"}, "acquirer_id": {"type": "string"}, "mcc": {"type": "string", "pattern": "^[0-9]{4}$"}, "country": {"type": "string", "pattern": "^[A-Z]{2}$"}, "terminal_id": {"type": "string"}}}
card_auth_referenceoptional{"type": "string"}
network_transaction_idoptional{"type": "string"}
network_agentic_indicatoroptional{"type": "boolean"}
three_dsoptional{"type": "object", "additionalProperties": false, "description": "Issuer-observed 3DS result signals, where available; no assumption of addresses or cart data.", "properties": {"eci": {"type": "string"}, "authentication_status": {"type": "string"}, "ds_transaction_id": {"type": "string"}}}

Issuer-observed 3DS result signals, where available; no assumption of addresses or cart data.

optional_enrichmentoptional{"type": "object", "description": "Out-of-band evidence only. The engine must verify the provider, origin and signature before using it as a trusted match signal.", "additionalProperties": false, "properties": {"provenance": {"type": "string", "enum": ["MERCHANT_SIGNED", "PSP_SIGNED", "UNKNOWN"]}, "evidence_reference": {"type": "string"}}}

Out-of-band evidence only. The engine must verify the provider, origin and signature before using it as a trusted match signal.

occurred_atrequired{"type": "string", "format": "date-time"}
authorization_typeoptional{"type": "string", "enum": ["INITIAL", "RETRY", "INCREMENTAL", "REVERSAL_ADVICE"], "description": "Distinguishes a repeat network event from a second purchase; issuer-specific lifecycle mapping required"}

Distinguishes a repeat network event from a second purchase; issuer-specific lifecycle mapping required

original_authorization_referenceoptional{"type": "string", "description": "Stable prior authorization reference, when applicable"}

Stable prior authorization reference, when applicable

Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "issuer_event_id",
    "amount",
    "merchant",
    "occurred_at"
  ],
  "description": "The issuer sends its actually available authorization data only;\ndo not invent billing/shipping or product fields. Merchant MID and descriptor\nmatching may need acquirer mappings. Missing mandatory context follows\nbank-agreed fail-closed rules.\n",
  "properties": {
    "issuer_event_id": {
      "type": "string",
      "description": "Unique issuer/processor event for deduplication"
    },
    "processor_card_id": {
      "type": "string",
      "description": "Issuer-processor internal card ID; preferred stable one-attempt-to-one-intent lookup for disposable cards; never a PAN"
    },
    "credential_reference": {
      "type": "string",
      "description": "Fallback opaque issuer network-token or card reference when processor_card_id is not supplied; NOT gateway token ID"
    },
    "amount": {
      "$ref": "#/components/schemas/Money"
    },
    "merchant": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "descriptor"
      ],
      "properties": {
        "descriptor": {
          "type": "string"
        },
        "merchant_id": {
          "type": "string"
        },
        "acquirer_id": {
          "type": "string"
        },
        "mcc": {
          "type": "string",
          "pattern": "^[0-9]{4}$"
        },
        "country": {
          "type": "string",
          "pattern": "^[A-Z]{2}$"
        },
        "terminal_id": {
          "type": "string"
        }
      }
    },
    "card_auth_reference": {
      "type": "string"
    },
    "network_transaction_id": {
      "type": "string"
    },
    "network_agentic_indicator": {
      "type": "boolean"
    },
    "three_ds": {
      "type": "object",
      "additionalProperties": false,
      "description": "Issuer-observed 3DS result signals, where available; no assumption of addresses or cart data.",
      "properties": {
        "eci": {
          "type": "string"
        },
        "authentication_status": {
          "type": "string"
        },
        "ds_transaction_id": {
          "type": "string"
        }
      }
    },
    "optional_enrichment": {
      "type": "object",
      "description": "Out-of-band evidence only. The engine must verify the provider, origin and signature before using it as a trusted match signal.",
      "additionalProperties": false,
      "properties": {
        "provenance": {
          "type": "string",
          "enum": [
            "MERCHANT_SIGNED",
            "PSP_SIGNED",
            "UNKNOWN"
          ]
        },
        "evidence_reference": {
          "type": "string"
        }
      }
    },
    "occurred_at": {
      "type": "string",
      "format": "date-time"
    },
    "authorization_type": {
      "type": "string",
      "enum": [
        "INITIAL",
        "RETRY",
        "INCREMENTAL",
        "REVERSAL_ADVICE"
      ],
      "description": "Distinguishes a repeat network event from a second purchase; issuer-specific lifecycle mapping required"
    },
    "original_authorization_reference": {
      "type": "string",
      "description": "Stable prior authorization reference, when applicable"
    }
  },
  "anyOf": [
    {
      "required": [
        "processor_card_id"
      ]
    },
    {
      "required": [
        "credential_reference"
      ]
    }
  ]
}

IssuerAuthorizationDecision

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

IssuerAuthorizationDecision fields
FieldPresenceDefinition
issuer_event_idrequired{"type": "string"}
decisionrequired{"type": "string", "enum": ["APPROVED", "DECLINED"], "description": "Real-time authorization decision; challenge/3DS occurs outside this synchronous issuer contract."}

Real-time authorization decision; challenge/3DS occurs outside this synchronous issuer contract.

reason_codesrequired{"type": "array", "items": {"type": "string"}}
correlation_idrequired{"type": "string"}
intent_idoptional{"type": "string"}
payment_idoptional{"type": "string"}
evidence_idrequired{"type": "string"}
policy_versionrequired{"type": "string"}
checked_fieldsoptional{"type": "array", "items": {"type": "string"}}
unavailable_fieldsoptional{"type": "array", "items": {"type": "string"}, "example": ["product_skus", "billing_address", "shipping_address", "checkout_url"]}
credential_idoptional{"type": "string", "description": "Issuer-side resolution to Agent Pay credential mapping; not raw card number"}

Issuer-side resolution to Agent Pay credential mapping; not raw card number

Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "issuer_event_id",
    "decision",
    "reason_codes",
    "correlation_id",
    "evidence_id",
    "policy_version"
  ],
  "properties": {
    "issuer_event_id": {
      "type": "string"
    },
    "decision": {
      "type": "string",
      "enum": [
        "APPROVED",
        "DECLINED"
      ],
      "description": "Real-time authorization decision; challenge/3DS occurs outside this synchronous issuer contract."
    },
    "reason_codes": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "correlation_id": {
      "type": "string"
    },
    "intent_id": {
      "type": "string"
    },
    "payment_id": {
      "type": "string"
    },
    "evidence_id": {
      "type": "string"
    },
    "policy_version": {
      "type": "string"
    },
    "checked_fields": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "unavailable_fields": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "example": [
        "product_skus",
        "billing_address",
        "shipping_address",
        "checkout_url"
      ]
    },
    "credential_id": {
      "type": "string",
      "description": "Issuer-side resolution to Agent Pay credential mapping; not raw card number"
    }
  }
}

AgentTechnology

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

AgentTechnology fields
FieldPresenceDefinition
platformrequired{"type": "string", "minLength": 1, "example": "Hermes", "description": "Registered technology/platform (Hermes, OpenClaw, Dots etc.)"}

Registered technology/platform (Hermes, OpenClaw, Dots etc.)

frameworkoptional{"type": "string", "example": "Custom Agentic Framework"}
modeloptional{"type": "string", "example": "GPT-6"}
versionoptional{"type": "string", "example": "1.4.0"}
provideroptional{"type": "string"}
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "platform"
  ],
  "properties": {
    "platform": {
      "type": "string",
      "minLength": 1,
      "example": "Hermes",
      "description": "Registered technology/platform (Hermes, OpenClaw, Dots etc.)"
    },
    "framework": {
      "type": "string",
      "example": "Custom Agentic Framework"
    },
    "model": {
      "type": "string",
      "example": "GPT-6"
    },
    "version": {
      "type": "string",
      "example": "1.4.0"
    },
    "provider": {
      "type": "string"
    }
  }
}

AgentEnvironment

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

AgentEnvironment fields
FieldPresenceDefinition
typerequired{"type": "string", "enum": ["LOCAL", "CLOUD", "HOSTED", "HYBRID", "OTHER"]}
operating_systemoptional{"type": "string", "example": "macOS"}
architectureoptional{"type": "string", "example": "ARM64"}
countryrequired{"type": "string", "pattern": "^[A-Z]{2}$"}
regionoptional{"type": "string"}
cityoptional{"type": "string"}
hostnameoptional{"type": "string", "description": "Optional self-declared machine hostname, not proof"}

Optional self-declared machine hostname, not proof

machine_fingerprintoptional{"type": "string", "description": "Optional privacy-preserving salted fingerprint, not a device attestation"}

Optional privacy-preserving salted fingerprint, not a device attestation

Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "type",
    "country"
  ],
  "properties": {
    "type": {
      "type": "string",
      "enum": [
        "LOCAL",
        "CLOUD",
        "HOSTED",
        "HYBRID",
        "OTHER"
      ]
    },
    "operating_system": {
      "type": "string",
      "example": "macOS"
    },
    "architecture": {
      "type": "string",
      "example": "ARM64"
    },
    "country": {
      "type": "string",
      "pattern": "^[A-Z]{2}$"
    },
    "region": {
      "type": "string"
    },
    "city": {
      "type": "string"
    },
    "hostname": {
      "type": "string",
      "description": "Optional self-declared machine hostname, not proof"
    },
    "machine_fingerprint": {
      "type": "string",
      "description": "Optional privacy-preserving salted fingerprint, not a device attestation"
    }
  }
}

AgentEnrollment

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

AgentEnrollment fields
FieldPresenceDefinition
agent_idrequired{"type": "string"}
enrollment_idrequired{"type": "string"}
statusrequired{"type": "string", "const": "PENDING_EMAIL_VERIFICATION"}
email_verification_requiredrequired{"type": "boolean", "const": true}
enrollment_credentialrequired{"type": "string", "description": "Single-use secret retained by the registering runtime, redeemable ONLY after verified email approval; never sent in email", "x-sensitive": true}

Single-use secret retained by the registering runtime, redeemable ONLY after verified email approval; never sent in email

expires_atrequired{"type": "string", "format": "date-time"}
messagerequired{"type": "string"}
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "agent_id",
    "enrollment_id",
    "status",
    "email_verification_required",
    "enrollment_credential",
    "expires_at",
    "message"
  ],
  "properties": {
    "agent_id": {
      "type": "string"
    },
    "enrollment_id": {
      "type": "string"
    },
    "status": {
      "type": "string",
      "const": "PENDING_EMAIL_VERIFICATION"
    },
    "email_verification_required": {
      "type": "boolean",
      "const": true
    },
    "enrollment_credential": {
      "type": "string",
      "description": "Single-use secret retained by the registering runtime, redeemable ONLY after verified email approval; never sent in email",
      "x-sensitive": true
    },
    "expires_at": {
      "type": "string",
      "format": "date-time"
    },
    "message": {
      "type": "string"
    }
  }
}

AgentObservedRuntime

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

AgentObservedRuntime fields
FieldPresenceDefinition
last_seen_ipoptional{"type": "string", "description": "Server-observed ingress IP. Proxies require trusted forwarding configuration."}

Server-observed ingress IP. Proxies require trusted forwarding configuration.

last_seen_atoptional{"type": "string", "format": "date-time"}
ip_countryoptional{"type": "string", "pattern": "^[A-Z]{2}$"}
observed_environment_mismatchoptional{"type": "boolean"}
last_authentication_methodoptional{"type": "string"}
machine_attestation_statusoptional{"type": "string", "enum": ["UNAVAILABLE", "UNVERIFIED", "VERIFIED", "REJECTED"]}
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "last_seen_ip": {
      "type": "string",
      "description": "Server-observed ingress IP. Proxies require trusted forwarding configuration."
    },
    "last_seen_at": {
      "type": "string",
      "format": "date-time"
    },
    "ip_country": {
      "type": "string",
      "pattern": "^[A-Z]{2}$"
    },
    "observed_environment_mismatch": {
      "type": "boolean"
    },
    "last_authentication_method": {
      "type": "string"
    },
    "machine_attestation_status": {
      "type": "string",
      "enum": [
        "UNAVAILABLE",
        "UNVERIFIED",
        "VERIFIED",
        "REJECTED"
      ]
    }
  }
}

AgentKya

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

AgentKya fields
FieldPresenceDefinition
agent_idrequired{"type": "string"}
statusrequired{"type": "string", "enum": ["PENDING", "VERIFIED", "UNDER_REVIEW", "RESTRICTED", "REVOKED"]}
assurance_levelrequired{"type": "string", "enum": ["SELF_DECLARED", "EMAIL_VERIFIED", "KEY_BOUND", "ATTESTED"]}
declaredrequired{"type": "object", "additionalProperties": false, "properties": {"name": {"type": "string"}, "purpose": {"type": "string"}, "technology": {"$ref": "#/components/schemas/AgentTechnology"}, "environment": {"$ref": "#/components/schemas/AgentEnvironment"}}}
verifiedoptional{"type": "object", "additionalProperties": false, "properties": {"email_verified": {"type": "boolean"}, "signing_key_bound": {"type": "boolean"}, "runtime_attested": {"type": "boolean"}, "operator_verification_method": {"type": "string"}}}
observed_runtimeoptionalAgentObservedRuntime
risk_signalsoptional{"type": "array", "items": {"type": "string"}, "description": "May affect policy but not a substitute for hard rules"}

May affect policy but not a substitute for hard rules

outstanding_actionsoptional{"type": "array", "items": {"type": "string"}}
assessed_atoptional{"type": "string", "format": "date-time"}
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "agent_id",
    "status",
    "declared",
    "assurance_level"
  ],
  "properties": {
    "agent_id": {
      "type": "string"
    },
    "status": {
      "type": "string",
      "enum": [
        "PENDING",
        "VERIFIED",
        "UNDER_REVIEW",
        "RESTRICTED",
        "REVOKED"
      ]
    },
    "assurance_level": {
      "type": "string",
      "enum": [
        "SELF_DECLARED",
        "EMAIL_VERIFIED",
        "KEY_BOUND",
        "ATTESTED"
      ]
    },
    "declared": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "name": {
          "type": "string"
        },
        "purpose": {
          "type": "string"
        },
        "technology": {
          "$ref": "#/components/schemas/AgentTechnology"
        },
        "environment": {
          "$ref": "#/components/schemas/AgentEnvironment"
        }
      }
    },
    "verified": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "email_verified": {
          "type": "boolean"
        },
        "signing_key_bound": {
          "type": "boolean"
        },
        "runtime_attested": {
          "type": "boolean"
        },
        "operator_verification_method": {
          "type": "string"
        }
      }
    },
    "observed_runtime": {
      "$ref": "#/components/schemas/AgentObservedRuntime"
    },
    "risk_signals": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "May affect policy but not a substitute for hard rules"
    },
    "outstanding_actions": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "assessed_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}

AgentSummary

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

AgentSummary fields
FieldPresenceDefinition
agent_idrequired{"type": "string"}
namerequired{"type": "string"}
technologyrequired{"type": "string", "example": "OpenClaw", "description": "Platform label only for list display"}

Platform label only for list display

statusrequiredAgentStatus
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "agent_id",
    "name",
    "technology",
    "status"
  ],
  "properties": {
    "agent_id": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "technology": {
      "type": "string",
      "example": "OpenClaw",
      "description": "Platform label only for list display"
    },
    "status": {
      "$ref": "#/components/schemas/AgentStatus"
    }
  }
}

AgentSummaryList

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

AgentSummaryList fields
FieldPresenceDefinition
datarequired{"type": "array", "items": {"$ref": "#/components/schemas/AgentSummary"}}
pagerequiredPageInfo
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "data",
    "page"
  ],
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/AgentSummary"
      }
    },
    "page": {
      "$ref": "#/components/schemas/PageInfo"
    }
  }
}

AgentDetails

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

AgentDetails fields
FieldPresenceDefinition
agent_idrequired{"type": "string"}
namerequired{"type": "string"}
purposerequired{"type": "string"}
descriptionoptional{"type": "string"}
technologyrequiredAgentTechnology
environmentoptionalAgentEnvironment
capabilitiesoptional{"type": "array", "items": {"type": "string"}}
statusrequiredAgentStatus
owner_emailoptional{"type": "string", "format": "email"}
kyaoptionalAgentKya
observed_runtimeoptionalAgentObservedRuntime
created_atrequired{"type": "string", "format": "date-time"}
updated_atrequired{"type": "string", "format": "date-time"}
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "agent_id",
    "name",
    "purpose",
    "technology",
    "status",
    "created_at",
    "updated_at"
  ],
  "properties": {
    "agent_id": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "purpose": {
      "type": "string"
    },
    "description": {
      "type": "string"
    },
    "technology": {
      "$ref": "#/components/schemas/AgentTechnology"
    },
    "environment": {
      "$ref": "#/components/schemas/AgentEnvironment"
    },
    "capabilities": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "status": {
      "$ref": "#/components/schemas/AgentStatus"
    },
    "owner_email": {
      "type": "string",
      "format": "email"
    },
    "kya": {
      "$ref": "#/components/schemas/AgentKya"
    },
    "observed_runtime": {
      "$ref": "#/components/schemas/AgentObservedRuntime"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    },
    "updated_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}

SetAgentLimitsRequest

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

SetAgentLimitsRequest fields
FieldPresenceDefinition
principal_referenceoptional{"type": "string", "description": "Only allowed for privileged/agent-scoped delegated context; principal token already determines the principal"}

Only allowed for privileged/agent-scoped delegated context; principal token already determines the principal

per_purchaserequiredMoney
weeklyrequiredMoney
totalrequiredMoney
weekly_windowoptional{"type": "string", "const": "ROLLING_7_DAYS", "default": "ROLLING_7_DAYS"}
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "per_purchase",
    "weekly",
    "total"
  ],
  "properties": {
    "principal_reference": {
      "type": "string",
      "description": "Only allowed for privileged/agent-scoped delegated context; principal token already determines the principal"
    },
    "per_purchase": {
      "$ref": "#/components/schemas/Money"
    },
    "weekly": {
      "$ref": "#/components/schemas/Money"
    },
    "total": {
      "$ref": "#/components/schemas/Money"
    },
    "weekly_window": {
      "type": "string",
      "const": "ROLLING_7_DAYS",
      "default": "ROLLING_7_DAYS"
    }
  }
}

SpendUsage

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

SpendUsage fields
FieldPresenceDefinition
spentrequiredMoney
reservedrequiredMoney
availablerequiredMoney
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "spent",
    "reserved",
    "available"
  ],
  "properties": {
    "spent": {
      "$ref": "#/components/schemas/Money"
    },
    "reserved": {
      "$ref": "#/components/schemas/Money"
    },
    "available": {
      "$ref": "#/components/schemas/Money"
    }
  }
}

AgentLimits

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

AgentLimits fields
FieldPresenceDefinition
agent_idrequired{"type": "string"}
principal_referencerequired{"type": "string"}
per_purchaserequiredMoney
weeklyrequiredMoney
totalrequiredMoney
weekly_windowrequired{"type": "string", "const": "ROLLING_7_DAYS"}
weekly_usagerequiredSpendUsage
total_usagerequiredSpendUsage
policy_versionoptional{"type": "string"}
updated_atrequired{"type": "string", "format": "date-time"}
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "agent_id",
    "principal_reference",
    "per_purchase",
    "weekly",
    "total",
    "weekly_window",
    "weekly_usage",
    "total_usage",
    "updated_at"
  ],
  "properties": {
    "agent_id": {
      "type": "string"
    },
    "principal_reference": {
      "type": "string"
    },
    "per_purchase": {
      "$ref": "#/components/schemas/Money"
    },
    "weekly": {
      "$ref": "#/components/schemas/Money"
    },
    "total": {
      "$ref": "#/components/schemas/Money"
    },
    "weekly_window": {
      "type": "string",
      "const": "ROLLING_7_DAYS"
    },
    "weekly_usage": {
      "$ref": "#/components/schemas/SpendUsage"
    },
    "total_usage": {
      "$ref": "#/components/schemas/SpendUsage"
    },
    "policy_version": {
      "type": "string"
    },
    "updated_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}

AuthenticationMethod

How the agent proves its identity; never send private keys.

Full JSON Schema definition
Full JSON Schema definition
{
  "type": "string",
  "enum": [
    "EMAIL_ENROLLMENT",
    "API_KEY",
    "SIGNED_ASSERTION"
  ],
  "description": "How the agent proves its identity; never send private keys."
}

PrincipalVerificationStatus

Full JSON Schema definition
Full JSON Schema definition
{
  "type": "string",
  "enum": [
    "NOT_STARTED",
    "PENDING",
    "IN_REVIEW",
    "VERIFIED",
    "REJECTED",
    "EXPIRED"
  ]
}

PrincipalVerificationType

Server-selected KYC for an INDIVIDUAL or KYB for a BUSINESS; verification does not establish spending authority.

Full JSON Schema definition
Full JSON Schema definition
{
  "type": "string",
  "enum": [
    "KYC",
    "KYB"
  ],
  "readOnly": true,
  "description": "Server-selected KYC for an INDIVIDUAL or KYB for a BUSINESS; verification does not establish spending authority."
}

CreatePrincipalVerificationSessionRequest

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

CreatePrincipalVerificationSessionRequest fields
FieldPresenceDefinition
return_urloptional{"type": "string", "format": "uri", "description": "Optional allowlisted front-end return URL, never an arbitrary redirect target"}

Optional allowlisted front-end return URL, never an arbitrary redirect target

localeoptional{"type": "string", "example": "de-AT"}
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "return_url": {
      "type": "string",
      "format": "uri",
      "description": "Optional allowlisted front-end return URL, never an arbitrary redirect target"
    },
    "locale": {
      "type": "string",
      "example": "de-AT"
    }
  }
}

PrincipalVerificationSession

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

PrincipalVerificationSession fields
FieldPresenceDefinition
verification_idrequired{"type": "string", "example": "ver_123456"}
principal_idrequired{"type": "string"}
verification_typerequiredPrincipalVerificationType
statusrequiredPrincipalVerificationStatus
verification_urlrequired{"type": "string", "format": "uri", "description": "Hosted provider/Agent Pay verification link for the individual or authorized business representative, never completed by the agent"}

Hosted provider/Agent Pay verification link for the individual or authorized business representative, never completed by the agent

expires_atrequired{"type": "string", "format": "date-time"}
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "verification_id",
    "principal_id",
    "verification_type",
    "status",
    "verification_url",
    "expires_at"
  ],
  "properties": {
    "verification_id": {
      "type": "string",
      "example": "ver_123456"
    },
    "principal_id": {
      "type": "string"
    },
    "verification_type": {
      "$ref": "#/components/schemas/PrincipalVerificationType"
    },
    "status": {
      "$ref": "#/components/schemas/PrincipalVerificationStatus"
    },
    "verification_url": {
      "type": "string",
      "format": "uri",
      "description": "Hosted provider/Agent Pay verification link for the individual or authorized business representative, never completed by the agent"
    },
    "expires_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}

PrincipalVerification

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

PrincipalVerification fields
FieldPresenceDefinition
principal_idrequired{"type": "string"}
verification_typerequiredPrincipalVerificationType
statusrequiredPrincipalVerificationStatus
verification_idoptional{"type": "string"}
verified_atoptional{"type": "string", "format": "date-time"}
reviewed_atoptional{"type": "string", "format": "date-time"}
next_actionoptional{"type": "string", "enum": ["NONE", "START_VERIFICATION", "RESUBMIT", "WAIT_FOR_REVIEW"]}
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "principal_id",
    "verification_type",
    "status"
  ],
  "properties": {
    "principal_id": {
      "type": "string"
    },
    "verification_type": {
      "$ref": "#/components/schemas/PrincipalVerificationType"
    },
    "status": {
      "$ref": "#/components/schemas/PrincipalVerificationStatus"
    },
    "verification_id": {
      "type": "string"
    },
    "verified_at": {
      "type": "string",
      "format": "date-time"
    },
    "reviewed_at": {
      "type": "string",
      "format": "date-time"
    },
    "next_action": {
      "type": "string",
      "enum": [
        "NONE",
        "START_VERIFICATION",
        "RESUBMIT",
        "WAIT_FOR_REVIEW"
      ]
    }
  }
}

GatewayToken

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

GatewayToken fields
FieldPresenceDefinition
providerrequired{"type": "string", "description": "Specific PSP or payment gateway whose token this is"}

Specific PSP or payment gateway whose token this is

token_idrequired{"type": "string", "description": "PSP-specific gateway token; may be reusable/sensitive; only return to authorized actors"}

PSP-specific gateway token; may be reusable/sensitive; only return to authorized actors

usage_scopeoptional{"type": "string", "description": "Optional PSP token domain and scope"}

Optional PSP token domain and scope

Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "provider",
    "token_id"
  ],
  "properties": {
    "provider": {
      "type": "string",
      "description": "Specific PSP or payment gateway whose token this is"
    },
    "token_id": {
      "type": "string",
      "description": "PSP-specific gateway token; may be reusable/sensitive; only return to authorized actors"
    },
    "usage_scope": {
      "type": "string",
      "description": "Optional PSP token domain and scope"
    }
  }
}

RedactedCard

Safe payment card reference. No full PAN, CVV, expiry or cardholder name.

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

RedactedCard fields
FieldPresenceDefinition
credential_idrequired{"type": "string", "description": "Agent Pay credential mapping reference"}

Agent Pay credential mapping reference

last4required{"type": "string", "pattern": "^[0-9]{4}$"}
gateway_tokenoptionalGatewayToken
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "credential_id",
    "last4"
  ],
  "description": "Safe payment card reference. No full PAN, CVV, expiry or cardholder name.",
  "properties": {
    "credential_id": {
      "type": "string",
      "description": "Agent Pay credential mapping reference"
    },
    "last4": {
      "type": "string",
      "pattern": "^[0-9]{4}$"
    },
    "gateway_token": {
      "$ref": "#/components/schemas/GatewayToken"
    }
  }
}

OneTimeVirtualCard

HIGHLY SENSITIVE: returned at most once on authorized initial POST /pay over controlled PCI-compliant delivery. Never exposed by GET, logs, analytics or replay. CVV must not be stored post authorization. This schema increases PCI scope.

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

OneTimeVirtualCard fields
FieldPresenceDefinition
credential_idrequired{"type": "string"}
panrequired{"type": "string", "pattern": "^[0-9]{12,19}$", "description": "Card number for one-use checkout; sample data only in docs", "x-sensitive": true}

Card number for one-use checkout; sample data only in docs

cvvrequired{"type": "string", "pattern": "^[0-9]{3,4}$", "description": "Transient card security value; never log or store after authorization", "x-sensitive": true}

Transient card security value; never log or store after authorization

expiry_monthrequired{"type": "string", "pattern": "^(0[1-9]|1[0-2])$"}
expiry_yearrequired{"type": "string", "pattern": "^[0-9]{4}$"}
cardholder_namerequired{"type": "string", "pattern": "^[A-Z ]+$", "example": "AGENTPAY RIVER", "description": "Sponsor-approved alphabetic dictionary value; not used for transaction binding"}

Sponsor-approved alphabetic dictionary value; not used for transaction binding

last4required{"type": "string", "pattern": "^[0-9]{4}$"}
gateway_tokenoptionalGatewayToken
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "credential_id",
    "pan",
    "cvv",
    "expiry_month",
    "expiry_year",
    "cardholder_name",
    "last4"
  ],
  "description": "HIGHLY SENSITIVE: returned at most once on authorized initial POST /pay over controlled PCI-compliant delivery. Never exposed by GET, logs, analytics or replay. CVV must not be stored post authorization. This schema increases PCI scope.\n",
  "properties": {
    "credential_id": {
      "type": "string"
    },
    "pan": {
      "type": "string",
      "pattern": "^[0-9]{12,19}$",
      "description": "Card number for one-use checkout; sample data only in docs",
      "x-sensitive": true
    },
    "cvv": {
      "type": "string",
      "pattern": "^[0-9]{3,4}$",
      "description": "Transient card security value; never log or store after authorization",
      "x-sensitive": true
    },
    "expiry_month": {
      "type": "string",
      "pattern": "^(0[1-9]|1[0-2])$"
    },
    "expiry_year": {
      "type": "string",
      "pattern": "^[0-9]{4}$"
    },
    "cardholder_name": {
      "type": "string",
      "pattern": "^[A-Z ]+$",
      "example": "AGENTPAY RIVER",
      "description": "Sponsor-approved alphabetic dictionary value; not used for transaction binding"
    },
    "last4": {
      "type": "string",
      "pattern": "^[0-9]{4}$"
    },
    "gateway_token": {
      "$ref": "#/components/schemas/GatewayToken"
    }
  }
}

PaymentIssuanceResponse

Payment record and optional ONE-TIME card payload for virtual-card rail. When creating a network-native agentic token, network_capability may be returned instead of card. No full credentials on repeat requests or GET responses.

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

PaymentIssuanceResponse fields
FieldPresenceDefinition
paymentrequiredPayment
cardoptionalOneTimeVirtualCard
network_capabilityoptionalCheckoutHandoff
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "payment"
  ],
  "description": "Payment record and optional ONE-TIME card payload for virtual-card rail. When creating a network-native agentic token, network_capability may be returned instead of card. No full credentials on repeat requests or GET responses.\n",
  "properties": {
    "payment": {
      "$ref": "#/components/schemas/Payment"
    },
    "card": {
      "$ref": "#/components/schemas/OneTimeVirtualCard"
    },
    "network_capability": {
      "$ref": "#/components/schemas/CheckoutHandoff"
    }
  }
}

PaymentSummary

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

PaymentSummary fields
FieldPresenceDefinition
payment_idrequired{"type": "string"}
intent_idrequired{"type": "string"}
railrequired{"type": "string", "enum": ["VISA_AGENTIC", "MASTERCARD_AGENTIC", "EPHEMERAL_CARD"]}
statusrequiredPaymentStatus
created_atrequired{"type": "string", "format": "date-time"}
updated_atoptional{"type": "string", "format": "date-time"}
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "payment_id",
    "intent_id",
    "rail",
    "status",
    "created_at"
  ],
  "properties": {
    "payment_id": {
      "type": "string"
    },
    "intent_id": {
      "type": "string"
    },
    "rail": {
      "type": "string",
      "enum": [
        "VISA_AGENTIC",
        "MASTERCARD_AGENTIC",
        "EPHEMERAL_CARD"
      ]
    },
    "status": {
      "$ref": "#/components/schemas/PaymentStatus"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    },
    "updated_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}

PaymentSummaryList

Required fields are unconditional. Conditional fields depend on a schema branch; full conditions and nested constraints are in the definition below.

PaymentSummaryList fields
FieldPresenceDefinition
datarequired{"type": "array", "items": {"$ref": "#/components/schemas/PaymentSummary"}}
pagerequiredPageInfo
Full JSON Schema definition
Full JSON Schema definition
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "data",
    "page"
  ],
  "properties": {
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/PaymentSummary"
      }
    },
    "page": {
      "$ref": "#/components/schemas/PageInfo"
    }
  }
}
Download OpenAPI v0.4.1YAML format · OpenAPI 3.1 · 0.4.1-draft