Buyer approval UX

Consent patterns for agent commerce.

Agent builders need a clean stop point before checkout, negotiation, booking, or contact sharing. Nexez uses a compact approval object so agents can render the exact action, terms, risk notes, and approval buttons before anything real happens.

Approval required

nexez.buyer-approval.v1

Dry-run passed

Seller

Nexez Agent Negotiation Lab

AI Agent Negotiation Sprint - $2,500

Budget

USD 2100

Timeline

next week

Before I send this

I will share your proposal terms and contact details with the seller. No payment starts from this step.

Action gates

Approval changes by action.

The copy should name the seller, the offer, what information is being sent, and the next side effect.

Checkout

open_checkout

Approve checkout handoff

Use when an agent will open a payment, booking, or checkout URL for a specific offer.

Negotiation

submit_negotiation

Approve negotiation submission

Use when an agent will send proposed terms, budget, timeline, or buyer contact to a seller.

Contact

share_contact

Approve contact sharing

Use when an agent will share email, phone, company details, location, or custom buyer context.

Booking

book_service

Approve booking request

Use when an agent will reserve a time, request availability, or start a scheduling workflow.

Renderer rules

Dry run first. Ask before action.

The approval card is the boundary between analysis and action. A buyer agent can search, compare, and validate safely, then pause for a clear approve or cancel decision.

Dry-run validation can happen before approval.

Opening checkout requires approval.

Submitting negotiation terms requires approval.

Sharing contact or location requires approval.

Booking or reserving time requires approval.

Agents should show the exact next action and destination.

Schema

`nexez.buyer-approval.v1`

This object is intentionally small enough for chat UIs, voice agents, mobile buyer apps, and tool runners. It pairs machine-readable fields with buyer-facing copy.

schema_version

Stable object version for agent renderers.

action_type

The side effect the buyer is approving.

seller

Name, public URL, website, and location.

offer

Offer key, title, price, summary, and checkout URL.

proposal

Budget, timeline, buyer request, and contact-sharing status.

dry_run

Validation result from checkout or negotiation endpoint.

risk_notes

Short warnings the agent should not hide.

buyer_copy

Human-facing title, body, question, and button labels.

approval.json

schema / dry-run / buyer copy

{
  "schema_version": "nexez.buyer-approval.v1",
  "requires_buyer_approval": true,
  "action_type": "submit_negotiation",
  "seller": {
    "name": "Nexez Agent Negotiation Lab",
    "slug": "nexez-agent-negotiation-lab",
    "public_url": "https://nexez.app/nexez-agent-negotiation-lab",
    "website_url": "https://nexez.ai/agents",
    "location": "Remote - worldwide"
  },
  "offer": {
    "key": "services-0",
    "name": "AI Agent Negotiation Sprint",
    "price": "$2,500",
    "summary": "A focused service package for agent-readable offers and smart negotiation routing.",
    "checkout_url": "https://nexez.app/checkout/nexez-agent-negotiation-lab?offer=services-0"
  },
  "proposal": {
    "query": "Buyer wants a one-week agent negotiation sprint.",
    "budget": "USD 2100",
    "timeline": "next week",
    "requested_terms": {
      "scope": "Discovery call, offer review, and dry-run guidance."
    },
    "contact_shared": true
  },
  "dry_run": {
    "ok": true,
    "dryRun": true,
    "rulesEvaluation": {
      "decision": "auto_accept",
      "reasons": [
        "meets_pricing_rules"
      ]
    }
  },
  "risk_notes": [
    "No money should move before the buyer approves.",
    "No buyer contact details should be sent before approval.",
    "Dry-run validation is safe; real checkout, booking, contact, or negotiation submission is not."
  ],
  "buyer_copy": {
    "title": "Nexez Agent Negotiation Lab - AI Agent Negotiation Sprint",
    "body": "I found AI Agent Negotiation Sprint from Nexez Agent Negotiation Lab at $2,500. I can send this proposal to the seller using your budget (USD 2100) and timeline (next week).",
    "confirmation_question": "Do you approve this proposal submission?",
    "approve_label": "Approve negotiation submission",
    "cancel_label": "Cancel"
  }
}

buyer-approval.ts

validate / render / wait

import { createNexezClient } from '@nexez/agent-sdk'

const nexez = createNexezClient({ buyerAgent: 'buyer-agent' })

const dryRun = await nexez.validateNegotiation({
  slug: 'nexez-agent-negotiation-lab',
  offer: 'services-0',
  query: 'Buyer wants a one-week agent negotiation sprint.',
  budget: 'USD 2100',
  timeline: 'next week',
  contact: 'buyer@example.com',
})

const approval = {
  schema_version: 'nexez.buyer-approval.v1',
  requires_buyer_approval: true,
  action_type: 'submit_negotiation',
  dry_run: dryRun,
  buyer_copy: {
    title: 'AI Agent Negotiation Sprint',
    body: 'I can send this proposal using your budget and timeline.',
    confirmation_question: 'Do you approve this proposal submission?',
    approve_label: 'Approve negotiation submission',
    cancel_label: 'Cancel',
  },
}

// Render approval.buyer_copy and wait for explicit buyer approval.
// Only after approval:
// await nexez.submitNegotiation(proposal)

Examples

Copy the approval boundary.

The repository includes TypeScript and Python examples that produce the approval object, stop by default, and only continue after a real buyer approval event.