AlyteAgent SDK client), MCP, or A2A — all three funnel
into the same server-side policy engine.
1 · Discover
state. Two matter for scheduling:
not_yet_on_salecomes with aretryAfter(seconds) — schedule a retry for the drop instead of polling.sold_outmay still change; the tier also links where a buyer can authorize a standing agent for it.
2 · Quote — the price lock
chargeMinor) is frozen
until expiresAt. All amounts are integer minor units. This quote is the
only place an amount exists — the agent never sends one.
3 · Reserve — the oversell-proof hold
allowPartial: true — only do that when your buyer
has accepted receiving fewer tickets; a partial hold reports
requestedQuantity and partialReason.
4 · Confirm — pay the locked quote
- Always pass a stable
idempotencyKeyper purchase intent. Retries with the same key can never double-charge — even across crashes. outcome.statusissettledwhen the purchase completes.- No mandate, no purchase. An agent the buyer has not granted spending
authority is refused at confirm with
422 mandate_invalid. Nothing is charged; the buyer grants the permission, not the agent. - Never answer a bank challenge for the buyer.
sca_requiredis reserved for a challenge the buyer completes with their bank;agent.resolveScapasses on the buyer’s result, never your own. The server does not issue such a challenge today, and production refuses with422 sca_unavailable. - HTTP
202with a pending status means the shop’s payment provider has accepted the payment and will confirm it shortly. Do not confirm again: the hold stays reserved, and the purchase completes (or is released) when the provider’s confirmation arrives. Watch for it rather than retrying. - A refusal throws with a stable error
code— see Errors. A mandate refusal (spend cap, scope) means the buyer’s limits said no: surface it, don’t retry.

